@dudousxd/nestjs-catalog 0.30.0 → 0.32.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.
@@ -63,6 +63,87 @@ export declare const CATALOG_SOURCE_TYPE_KEY = "objectType";
63
63
  * refusal nobody can see the cause of.
64
64
  */
65
65
  export declare function workflowSourceObjectType(node: WorkflowNode | Record<string, unknown>): string | undefined;
66
+ /**
67
+ * The config key a `catalog` source names **one snapshot** in.
68
+ *
69
+ * ## Why the key is not called `snapshotId`
70
+ *
71
+ * Because `snapshotId` is already taken, by something that is not this, in a
72
+ * place a person reads on the same afternoon. A run body carries a `snapshotId`
73
+ * and it is the **durable run id** — reusing one that already succeeded replays
74
+ * that run and returns its old counts as a fresh success. The two are especially
75
+ * confusable because they are frequently the *same string*: a snapshot's id is
76
+ * caller-supplied and a durable pipeline passes its run id (see
77
+ * {@link SnapshotRef.id}), so `snapshotId` in one field means "run this again"
78
+ * and in the other means "read that load", and nothing about the spelling says
79
+ * which. `objectSnapshot` pairs with {@link CATALOG_SOURCE_TYPE_KEY} instead —
80
+ * the two fields of this kind read as one sentence, *this object type, this
81
+ * snapshot of it* — and cannot be pasted into each other's place by accident.
82
+ *
83
+ * Absent is the ordinary case and means the snapshot the type is **currently
84
+ * serving**, resolved when the node runs. That default is not spelled: there is
85
+ * no `objectSnapshot: "current"`, because a second spelling of the default is a
86
+ * second thing to keep in step, and because the words it would be spelled with
87
+ * are exactly the ones {@link catalogSnapshotRefusal} refuses.
88
+ */
89
+ export declare const CATALOG_SOURCE_SNAPSHOT_KEY = "objectSnapshot";
90
+ /**
91
+ * The words a snapshot may not be named by, whatever a store's ids look like.
92
+ *
93
+ * Two different mistakes, refused together because they are refused for one
94
+ * reason — that a name here has to mean the same load on every run:
95
+ *
96
+ * - **Relative references.** `previous`, `last`, `newest`. The thing somebody
97
+ * actually wants when diffing, and the property a graph must not have: it
98
+ * resolves against whatever has been committed by the time the node runs, so
99
+ * the same stored graph reads different data on Tuesday than it did on Monday
100
+ * while its {@link workflowGraphHash} says nothing changed. And it is not
101
+ * merely unstable, it is unstable *per node*: a diff graph with one source on
102
+ * `current` and one on `previous` resolves them at two different instants, so
103
+ * a commit landing between the two probes leaves both pointing at the same
104
+ * load — an empty diff, reported as success, which is the exact green-and-
105
+ * silent failure this kind was built to end. The friction they would have
106
+ * saved is answered by the picker instead: the inspector lists the snapshots,
107
+ * so an id is chosen from a list rather than looked up.
108
+ * - **Anything that could mean "all of them".** `all`, `*`, `%`. The measurement
109
+ * in {@link CONNECTOR_KINDS} is what a read of every retained snapshot at once
110
+ * looks like — 89,440 rows where 44,720 were current, `succeeded`, every `SUM`
111
+ * doubled — and the whole reason this kind names a type rather than a table is
112
+ * that a type cannot be named that way. A snapshot must not reintroduce it.
113
+ *
114
+ * Folded to lower case before comparison, so `Latest` is refused too. An id that
115
+ * genuinely *is* one of these words cannot be named here, and that is the trade:
116
+ * a handful of unusable ids against a name whose meaning a reader cannot get
117
+ * wrong.
118
+ */
119
+ export declare const CATALOG_SNAPSHOT_RESERVED_NAMES: readonly ["current", "latest", "newest", "head", "previous", "prior", "last", "oldest", "first", "all", "any", "none"];
120
+ /**
121
+ * Why a snapshot name cannot be used, or `undefined` when it can.
122
+ *
123
+ * A sentence rather than a boolean because three callers say it — the canvas,
124
+ * `validateWorkflow`, and `fetchCatalog` at the moment of the read — and three
125
+ * hand-written phrasings of one rule is how a refusal on the canvas stops
126
+ * matching the refusal on the run.
127
+ *
128
+ * A blank name is not a refusal: absent means the current snapshot, which is the
129
+ * default and the overwhelmingly common case.
130
+ */
131
+ export declare function catalogSnapshotRefusal(named: string): string | undefined;
132
+ /**
133
+ * Which snapshot a `catalog` source reads, when it names one rather than taking
134
+ * the current one.
135
+ *
136
+ * `undefined` covers "not that kind", "no snapshot named", and "named as blank
137
+ * space", and every caller wants the same thing from all three: read whatever
138
+ * the type is serving. Trimmed for the reason {@link workflowSourceObjectType}
139
+ * trims — an id differing from a real one by a trailing space resolves nothing,
140
+ * and the refusal it earns names a string that looks correct.
141
+ *
142
+ * Deliberately **not** validating: a name this returns may still be one
143
+ * {@link catalogSnapshotRefusal} refuses. Splitting the two is what lets the
144
+ * canvas show the field's contents while telling somebody why it will not run.
145
+ */
146
+ export declare function workflowSourceSnapshot(node: WorkflowNode | Record<string, unknown>): string | undefined;
66
147
  /**
67
148
  * How the bytes behind a `file` or `s3` connector are read as records.
68
149
  *
@@ -3982,7 +4063,7 @@ export interface CallableWorkflowBlock {
3982
4063
  }
3983
4064
  export declare function callableWorkflowBlock(ref: CallableWorkflowRef): CallableWorkflowBlock | undefined;
3984
4065
  /** Every way a graph can be refused. Exported so a canvas can key off the code. */
3985
- export declare const WORKFLOW_ISSUE_CODES: readonly ["empty", "invalid-node-id", "duplicate-node-id", "edge-endpoint-missing", "self-edge", "duplicate-edge", "cycle", "no-source", "source-has-input", "no-sink", "duplicate-sink-type", "sink-has-output", "unreachable", "dead-end", "transform-not-named", "source-type-not-named", "call-not-named", "call-plain-has-output", "if-not-named", "if-threshold-invalid", "if-needs-one-input", "branch-not-labelled", "branch-on-plain-edge", "filter-predicate-invalid", "filter-narrows-unacknowledged", "filter-narrows-nothing", "rename-invalid", "aggregate-invalid", "lookup-invalid", "lookup-reference-not-wired", "lookup-nothing-to-enrich", "column-not-produced", "version-pin-invalid"];
4066
+ export declare const WORKFLOW_ISSUE_CODES: readonly ["empty", "invalid-node-id", "duplicate-node-id", "edge-endpoint-missing", "self-edge", "duplicate-edge", "cycle", "no-source", "source-has-input", "no-sink", "duplicate-sink-type", "sink-has-output", "unreachable", "dead-end", "transform-not-named", "source-type-not-named", "source-snapshot-not-an-id", "call-not-named", "call-plain-has-output", "if-not-named", "if-threshold-invalid", "if-needs-one-input", "branch-not-labelled", "branch-on-plain-edge", "filter-predicate-invalid", "filter-narrows-unacknowledged", "filter-narrows-nothing", "rename-invalid", "aggregate-invalid", "lookup-invalid", "lookup-reference-not-wired", "lookup-nothing-to-enrich", "column-not-produced", "version-pin-invalid"];
3986
4067
  export type WorkflowIssueCode = (typeof WORKFLOW_ISSUE_CODES)[number];
3987
4068
  export interface WorkflowValidationIssue {
3988
4069
  code: WorkflowIssueCode;
@@ -9,10 +9,12 @@
9
9
  * systems each believing they decide when a load runs.
10
10
  */
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.REDACTED_SECRET = exports.CATALOG_PIPELINE_STORE = exports.WORKFLOW_ISSUE_CODES = exports.WORKFLOW_CALL_CONTRACT = exports.WORKFLOW_EXECUTION_MODES = exports.WORKFLOW_STATUSES = exports.WORKFLOW_BRANCH_LABELS = exports.NODE_KIND_IS_REUSABLE = exports.REUSABLE_NODE_KINDS = exports.WORKFLOW_LOOKUP_MAX_REFERENCE_ROWS = exports.WORKFLOW_LOOKUP_MAX_FIELDS = exports.WORKFLOW_AGGREGATE_DEFAULT_SEPARATOR = exports.WORKFLOW_AGGREGATE_MAX_SEPARATOR = exports.WORKFLOW_AGGREGATE_JOIN_LENGTH_CEILING = exports.WORKFLOW_AGGREGATE_JOIN_MAX_LENGTH = exports.WORKFLOW_AGGREGATE_GROUPS_CEILING = exports.WORKFLOW_AGGREGATE_MAX_GROUPS = exports.WORKFLOW_AGGREGATE_MAX_AGGREGATES = exports.WORKFLOW_AGGREGATE_MAX_GROUP_BY = exports.WORKFLOW_LOOKUP_UNMATCHED = exports.WORKFLOW_AGGREGATE_FUNCTIONS = exports.WORKFLOW_RENAME_MAX_COLUMNS = exports.WORKFLOW_RENAME_UNNAMED = exports.WORKFLOW_FILTER_MAX_VALUES = exports.WORKFLOW_FILTER_MAX_DEPTH = exports.WORKFLOW_FILTER_COLUMN_PATTERN = exports.WORKFLOW_FILTER_OPERATORS = exports.WORKFLOW_FILTER_PREDICATE_KINDS = exports.WORKFLOW_PREDICATE_KINDS = exports.WORKFLOW_CALL_MODES = exports.WORKFLOW_ROW_GAP = exports.WORKFLOW_COLUMN_GAP = exports.WORKFLOW_NODE_HEIGHT = exports.WORKFLOW_NODE_WIDTH = exports.WORKFLOW_NODE_ID_PATTERN = exports.WORKFLOW_NODE_KINDS = exports.WORKFLOW_SKIP_REASONS = exports.CODE_CONTEXT_CONTRACT = exports.TRANSFORM_RUNNER = exports.TRANSFORM_MODES = exports.TRANSFORM_LANGUAGES = exports.SOURCE_FORMATS = exports.CATALOG_SOURCE_TYPE_KEY = exports.CONNECTOR_KINDS = void 0;
12
+ exports.REDACTED_SECRET = exports.CATALOG_PIPELINE_STORE = exports.WORKFLOW_ISSUE_CODES = exports.WORKFLOW_CALL_CONTRACT = exports.WORKFLOW_EXECUTION_MODES = exports.WORKFLOW_STATUSES = exports.WORKFLOW_BRANCH_LABELS = exports.NODE_KIND_IS_REUSABLE = exports.REUSABLE_NODE_KINDS = exports.WORKFLOW_LOOKUP_MAX_REFERENCE_ROWS = exports.WORKFLOW_LOOKUP_MAX_FIELDS = exports.WORKFLOW_AGGREGATE_DEFAULT_SEPARATOR = exports.WORKFLOW_AGGREGATE_MAX_SEPARATOR = exports.WORKFLOW_AGGREGATE_JOIN_LENGTH_CEILING = exports.WORKFLOW_AGGREGATE_JOIN_MAX_LENGTH = exports.WORKFLOW_AGGREGATE_GROUPS_CEILING = exports.WORKFLOW_AGGREGATE_MAX_GROUPS = exports.WORKFLOW_AGGREGATE_MAX_AGGREGATES = exports.WORKFLOW_AGGREGATE_MAX_GROUP_BY = exports.WORKFLOW_LOOKUP_UNMATCHED = exports.WORKFLOW_AGGREGATE_FUNCTIONS = exports.WORKFLOW_RENAME_MAX_COLUMNS = exports.WORKFLOW_RENAME_UNNAMED = exports.WORKFLOW_FILTER_MAX_VALUES = exports.WORKFLOW_FILTER_MAX_DEPTH = exports.WORKFLOW_FILTER_COLUMN_PATTERN = exports.WORKFLOW_FILTER_OPERATORS = exports.WORKFLOW_FILTER_PREDICATE_KINDS = exports.WORKFLOW_PREDICATE_KINDS = exports.WORKFLOW_CALL_MODES = exports.WORKFLOW_ROW_GAP = exports.WORKFLOW_COLUMN_GAP = exports.WORKFLOW_NODE_HEIGHT = exports.WORKFLOW_NODE_WIDTH = exports.WORKFLOW_NODE_ID_PATTERN = exports.WORKFLOW_NODE_KINDS = exports.WORKFLOW_SKIP_REASONS = exports.CODE_CONTEXT_CONTRACT = exports.TRANSFORM_RUNNER = exports.TRANSFORM_MODES = exports.TRANSFORM_LANGUAGES = exports.SOURCE_FORMATS = exports.CATALOG_SNAPSHOT_RESERVED_NAMES = exports.CATALOG_SOURCE_SNAPSHOT_KEY = exports.CATALOG_SOURCE_TYPE_KEY = exports.CONNECTOR_KINDS = void 0;
13
13
  exports.isConnectorKind = isConnectorKind;
14
14
  exports.unreachableConnectorKind = unreachableConnectorKind;
15
15
  exports.workflowSourceObjectType = workflowSourceObjectType;
16
+ exports.catalogSnapshotRefusal = catalogSnapshotRefusal;
17
+ exports.workflowSourceSnapshot = workflowSourceSnapshot;
16
18
  exports.isSourceFormat = isSourceFormat;
17
19
  exports.unreachableSourceFormat = unreachableSourceFormat;
18
20
  exports.isTransformLanguage = isTransformLanguage;
@@ -156,6 +158,12 @@ exports.CONNECTOR_KINDS = [
156
158
  * snapshot it serves, and a type with nothing committed is refused rather
157
159
  * than read as zero rows. See `fetchCatalog` in the pipeline package.
158
160
  *
161
+ * A node may instead name **one snapshot by id** — see
162
+ * {@link CATALOG_SOURCE_SNAPSHOT_KEY}, which is how a graph diffs two versions
163
+ * of a type or reprocesses an old one without leaving the model. It is an id
164
+ * and only an id: nothing relative, and nothing that could mean "all of them",
165
+ * which is the reading that produced the measurement above.
166
+ *
159
167
  * Not connectable — see `CONNECTION_KINDS` in the react package. A connection
160
168
  * is an address and a credential shared by several loads, and this kind has
161
169
  * neither.
@@ -227,6 +235,127 @@ function workflowSourceObjectType(node) {
227
235
  const trimmed = named.trim();
228
236
  return trimmed.length === 0 ? undefined : trimmed;
229
237
  }
238
+ /**
239
+ * The config key a `catalog` source names **one snapshot** in.
240
+ *
241
+ * ## Why the key is not called `snapshotId`
242
+ *
243
+ * Because `snapshotId` is already taken, by something that is not this, in a
244
+ * place a person reads on the same afternoon. A run body carries a `snapshotId`
245
+ * and it is the **durable run id** — reusing one that already succeeded replays
246
+ * that run and returns its old counts as a fresh success. The two are especially
247
+ * confusable because they are frequently the *same string*: a snapshot's id is
248
+ * caller-supplied and a durable pipeline passes its run id (see
249
+ * {@link SnapshotRef.id}), so `snapshotId` in one field means "run this again"
250
+ * and in the other means "read that load", and nothing about the spelling says
251
+ * which. `objectSnapshot` pairs with {@link CATALOG_SOURCE_TYPE_KEY} instead —
252
+ * the two fields of this kind read as one sentence, *this object type, this
253
+ * snapshot of it* — and cannot be pasted into each other's place by accident.
254
+ *
255
+ * Absent is the ordinary case and means the snapshot the type is **currently
256
+ * serving**, resolved when the node runs. That default is not spelled: there is
257
+ * no `objectSnapshot: "current"`, because a second spelling of the default is a
258
+ * second thing to keep in step, and because the words it would be spelled with
259
+ * are exactly the ones {@link catalogSnapshotRefusal} refuses.
260
+ */
261
+ exports.CATALOG_SOURCE_SNAPSHOT_KEY = 'objectSnapshot';
262
+ /**
263
+ * The words a snapshot may not be named by, whatever a store's ids look like.
264
+ *
265
+ * Two different mistakes, refused together because they are refused for one
266
+ * reason — that a name here has to mean the same load on every run:
267
+ *
268
+ * - **Relative references.** `previous`, `last`, `newest`. The thing somebody
269
+ * actually wants when diffing, and the property a graph must not have: it
270
+ * resolves against whatever has been committed by the time the node runs, so
271
+ * the same stored graph reads different data on Tuesday than it did on Monday
272
+ * while its {@link workflowGraphHash} says nothing changed. And it is not
273
+ * merely unstable, it is unstable *per node*: a diff graph with one source on
274
+ * `current` and one on `previous` resolves them at two different instants, so
275
+ * a commit landing between the two probes leaves both pointing at the same
276
+ * load — an empty diff, reported as success, which is the exact green-and-
277
+ * silent failure this kind was built to end. The friction they would have
278
+ * saved is answered by the picker instead: the inspector lists the snapshots,
279
+ * so an id is chosen from a list rather than looked up.
280
+ * - **Anything that could mean "all of them".** `all`, `*`, `%`. The measurement
281
+ * in {@link CONNECTOR_KINDS} is what a read of every retained snapshot at once
282
+ * looks like — 89,440 rows where 44,720 were current, `succeeded`, every `SUM`
283
+ * doubled — and the whole reason this kind names a type rather than a table is
284
+ * that a type cannot be named that way. A snapshot must not reintroduce it.
285
+ *
286
+ * Folded to lower case before comparison, so `Latest` is refused too. An id that
287
+ * genuinely *is* one of these words cannot be named here, and that is the trade:
288
+ * a handful of unusable ids against a name whose meaning a reader cannot get
289
+ * wrong.
290
+ */
291
+ exports.CATALOG_SNAPSHOT_RESERVED_NAMES = [
292
+ 'current',
293
+ 'latest',
294
+ 'newest',
295
+ 'head',
296
+ 'previous',
297
+ 'prior',
298
+ 'last',
299
+ 'oldest',
300
+ 'first',
301
+ 'all',
302
+ 'any',
303
+ 'none',
304
+ ];
305
+ /**
306
+ * Why a snapshot name cannot be used, or `undefined` when it can.
307
+ *
308
+ * A sentence rather than a boolean because three callers say it — the canvas,
309
+ * `validateWorkflow`, and `fetchCatalog` at the moment of the read — and three
310
+ * hand-written phrasings of one rule is how a refusal on the canvas stops
311
+ * matching the refusal on the run.
312
+ *
313
+ * A blank name is not a refusal: absent means the current snapshot, which is the
314
+ * default and the overwhelmingly common case.
315
+ */
316
+ function catalogSnapshotRefusal(named) {
317
+ const trimmed = named.trim();
318
+ if (trimmed.length === 0)
319
+ return undefined;
320
+ const folded = trimmed.toLowerCase();
321
+ if (exports.CATALOG_SNAPSHOT_RESERVED_NAMES.some((reserved) => reserved === folded)) {
322
+ return `"${trimmed}" is not a snapshot id, it is a way of describing one. A source reads the snapshot with the id it names, and nothing else: a relative reference would resolve against whatever had been committed by the time the node ran, so the same graph would read different data on different days with no version change to show for it — and two nodes resolving "current" and "previous" a second apart can end up on the same load and report an empty diff as success. Leave this blank for the snapshot the type is currently serving, or name one id from the list. The reserved words are ${exports.CATALOG_SNAPSHOT_RESERVED_NAMES.join(', ')}.`;
323
+ }
324
+ // A wildcard is the "all of them" reading wearing punctuation, and a leading
325
+ // `-`, `~` or `^` is how every version-control system in the world spells "one
326
+ // before". Both are refused by shape rather than by membership, because there
327
+ // is no end to the list of ways to write them.
328
+ if (/[*%?]/.test(trimmed) || /^[-~^+]/.test(trimmed)) {
329
+ return `"${trimmed}" cannot name a snapshot. A wildcard or an offset would either match several loads at once — which is the read this source kind exists to make impossible, because the physical table holds every load ever committed — or resolve to a different one on every run. Name one snapshot id, or leave this blank for the one the type is currently serving.`;
330
+ }
331
+ return undefined;
332
+ }
333
+ /**
334
+ * Which snapshot a `catalog` source reads, when it names one rather than taking
335
+ * the current one.
336
+ *
337
+ * `undefined` covers "not that kind", "no snapshot named", and "named as blank
338
+ * space", and every caller wants the same thing from all three: read whatever
339
+ * the type is serving. Trimmed for the reason {@link workflowSourceObjectType}
340
+ * trims — an id differing from a real one by a trailing space resolves nothing,
341
+ * and the refusal it earns names a string that looks correct.
342
+ *
343
+ * Deliberately **not** validating: a name this returns may still be one
344
+ * {@link catalogSnapshotRefusal} refuses. Splitting the two is what lets the
345
+ * canvas show the field's contents while telling somebody why it will not run.
346
+ */
347
+ function workflowSourceSnapshot(node) {
348
+ if (Reflect.get(node, 'sourceKind') !== 'catalog')
349
+ return undefined;
350
+ const config = Reflect.get(node, 'config');
351
+ if (typeof config !== 'object' || config === null)
352
+ return undefined;
353
+ const named = Reflect.get(config, exports.CATALOG_SOURCE_SNAPSHOT_KEY);
354
+ if (typeof named !== 'string')
355
+ return undefined;
356
+ const trimmed = named.trim();
357
+ return trimmed.length === 0 ? undefined : trimmed;
358
+ }
230
359
  /**
231
360
  * How the bytes behind a `file` or `s3` connector are read as records.
232
361
  *
@@ -2429,6 +2558,16 @@ exports.WORKFLOW_ISSUE_CODES = [
2429
2558
  * type to guess, and guessing would read somebody else's data.
2430
2559
  */
2431
2560
  'source-type-not-named',
2561
+ /**
2562
+ * A `catalog` source whose named snapshot is not a name — a relative
2563
+ * reference, or something that could match several loads.
2564
+ *
2565
+ * Its own code rather than part of `source-type-not-named`, because the node
2566
+ * is not missing anything: it names a type and it names a snapshot, and the
2567
+ * snapshot is the wrong *kind* of thing. See {@link catalogSnapshotRefusal}
2568
+ * for both mistakes and why one graph must not be able to make either.
2569
+ */
2570
+ 'source-snapshot-not-an-id',
2432
2571
  'call-not-named',
2433
2572
  /**
2434
2573
  * A plain call wired into something. See {@link WORKFLOW_CALL_MODES}: a plain
@@ -2939,20 +3078,8 @@ function nodeIsUnconfigured(node) {
2939
3078
  message: `Transform node "${node.name}" (${node.id}) names no transform, so there is no code for it to run.`,
2940
3079
  };
2941
3080
  }
2942
- if (node.kind === 'source' && node.sourceKind === 'catalog') {
2943
- // Only this kind, and only from the config: every other kind's address is
2944
- // allowed to arrive from a named connection, so a blank field on the node is
2945
- // not evidence of anything. A `catalog` source has no connection to borrow
2946
- // from — the type name is the whole configuration — so a blank one is
2947
- // decidable here.
2948
- if (workflowSourceObjectType(node) === undefined) {
2949
- return {
2950
- code: 'source-type-not-named',
2951
- nodeIds: [node.id],
2952
- message: `Source "${node.name}" (${node.id}) reads from the catalog but does not say which object type, so there is nothing for it to read. Name the type on the node; there is no default, because a default would read somebody else's data.`,
2953
- };
2954
- }
2955
- }
3081
+ if (node.kind === 'source')
3082
+ return sourceIsUnconfigured(node);
2956
3083
  if (node.kind === 'call')
2957
3084
  return callIsUnnamed(node);
2958
3085
  if (node.kind === 'if')
@@ -2967,6 +3094,45 @@ function nodeIsUnconfigured(node) {
2967
3094
  return lookupIsUnconfigured(node);
2968
3095
  return undefined;
2969
3096
  }
3097
+ /**
3098
+ * A source whose own config cannot be run, which is only ever a `catalog` one.
3099
+ *
3100
+ * Every other kind's address is allowed to arrive from a named connection, so a
3101
+ * blank field on the node is not evidence of anything — a `sql` source with no
3102
+ * url is the normal shape of one reading through a connection. A `catalog`
3103
+ * source has no connection to borrow from, so both of its fields are decidable
3104
+ * from the node alone.
3105
+ *
3106
+ * Its own function beside the ones every other configured kind has, rather than
3107
+ * inline in the dispatcher, for the reason `canonicalSource` is one: a
3108
+ * dispatcher that carries one case inline is where the next case gets written
3109
+ * inline too.
3110
+ */
3111
+ function sourceIsUnconfigured(node) {
3112
+ if (node.sourceKind !== 'catalog')
3113
+ return undefined;
3114
+ if (workflowSourceObjectType(node) === undefined) {
3115
+ return {
3116
+ code: 'source-type-not-named',
3117
+ nodeIds: [node.id],
3118
+ message: `Source "${node.name}" (${node.id}) reads from the catalog but does not say which object type, so there is nothing for it to read. Name the type on the node; there is no default, because a default would read somebody else's data.`,
3119
+ };
3120
+ }
3121
+ // A named snapshot, when there is one. Refused here rather than only at the
3122
+ // moment of the read for the reason the type name is: a source that cannot
3123
+ // resolve what it names fails inside a durable step halfway through a load,
3124
+ // and the graph it fails on is one somebody was allowed to save.
3125
+ const snapshot = workflowSourceSnapshot(node);
3126
+ const refusal = snapshot === undefined ? undefined : catalogSnapshotRefusal(snapshot);
3127
+ if (refusal !== undefined) {
3128
+ return {
3129
+ code: 'source-snapshot-not-an-id',
3130
+ nodeIds: [node.id],
3131
+ message: `Source "${node.name}" (${node.id}) cannot read the snapshot it names. ${refusal}`,
3132
+ };
3133
+ }
3134
+ return undefined;
3135
+ }
2970
3136
  /**
2971
3137
  * An aggregate this service will not store.
2972
3138
  *
@@ -3698,6 +3864,18 @@ function canonicalSource(node) {
3698
3864
  node.mode ?? 'full',
3699
3865
  // Sorted keys, so a canvas that rewrites the object in a different order
3700
3866
  // does not look like an edit.
3867
+ //
3868
+ // This is also where `objectSnapshot` enters the fingerprint, and it needs
3869
+ // no line of its own to do it: a config key that is absent contributes
3870
+ // nothing, so every source drawn before a snapshot could be named hashes to
3871
+ // exactly the string it always did, and a node repointed from the current
3872
+ // load to a named one is a new version of the graph — which it is, as surely
3873
+ // as repointing a SQL source at another query. The rule the rest of this
3874
+ // file applies by appending optional components only when set, this case
3875
+ // gets for free. What it does NOT get for free is the empty string: a form
3876
+ // that stored `objectSnapshot: ""` for a blank field would renumber every
3877
+ // graph it touched while meaning "the current one", which is why
3878
+ // `sourceConfigFrom` in the react package omits the key instead.
3701
3879
  sortedEntries(node.config),
3702
3880
  // Appended only when there is a reference, exactly as `edge.branch` above
3703
3881
  // is appended only when there is a label, and for the same reason: adding
@@ -4161,6 +4339,34 @@ function lookupProducedColumns(node, upstream) {
4161
4339
  * names — `fetchCatalog` asks for exactly those and the store returns exactly
4162
4340
  * those — so the set is closed in the sense {@link workflowKnownColumns}
4163
4341
  * requires: an upper bound that holds whatever is upstream, since nothing is.
4342
+ *
4343
+ * ## …and it stops answering the moment the node names a snapshot
4344
+ *
4345
+ * This is the subtle one, and the answer went the other way at first. The
4346
+ * argument for keeping the published set is that the store selects the type's
4347
+ * *declared* properties whatever snapshot is being read, so the record keys come
4348
+ * back the same either way — a property added after the old load simply arrives
4349
+ * null. On that reading the set is still an upper bound and still closed.
4350
+ *
4351
+ * It is wrong, and it is wrong in **both** directions, which is what settles it.
4352
+ * The published properties describe the type as it is declared *now*; the
4353
+ * snapshot was written under whatever was declared *then*, and nothing in the
4354
+ * graph, the registry or this function can say whether those are the same
4355
+ * declaration. Rename a property — publish `unit_mel`, load, republish as
4356
+ * `unitMel` — and reading the old snapshot gives:
4357
+ *
4358
+ * - a filter on `unitMel` **allowed**, because the published set has it, that
4359
+ * matches no row, because that column is null for every row of that load. The
4360
+ * graph comes out empty and green: the failure this whole check exists to
4361
+ * catch, waved through by the check itself.
4362
+ * - a filter on `unit_mel` **refused**, because the published set no longer has
4363
+ * it — a wrong refusal of a graph that is right about the load it named.
4364
+ *
4365
+ * So the published schema is a claim about the type and not about the snapshot,
4366
+ * and the two are the same claim only for the snapshot the type is serving.
4367
+ * Where a claim cannot be proved this file says `undefined` and stays silent
4368
+ * — the answer it already gives for four kinds — rather than a set that is
4369
+ * confidently the wrong shape.
4164
4370
  */
4165
4371
  function sourceProducedColumns(node, knowledge) {
4166
4372
  const kind = node.sourceKind;
@@ -4168,6 +4374,10 @@ function sourceProducedColumns(node, knowledge) {
4168
4374
  return undefined;
4169
4375
  }
4170
4376
  if (kind === 'catalog') {
4377
+ // A named snapshot is a load whose shape the published type does not
4378
+ // describe. See the docblock: silence, not the current property set.
4379
+ if (workflowSourceSnapshot(node) !== undefined)
4380
+ return undefined;
4171
4381
  const named = workflowSourceObjectType(node);
4172
4382
  if (named === undefined || knowledge === undefined)
4173
4383
  return undefined;
@@ -9,6 +9,77 @@ import type { CatalogObjectQuery, CatalogObjectTypeDef } from './catalog.types';
9
9
  * the application's own tables, a separate warehouse schema, or a column store,
10
10
  * without the screens above it changing.
11
11
  */
12
+ /**
13
+ * Where a snapshot's rows have been copied to, outside the database.
14
+ *
15
+ * **Vocabulary only — this package writes none of these and reads none of them.**
16
+ * It is declared here because it belongs on {@link SnapshotRef}, and a
17
+ * `SnapshotRef` is what every screen and every caller already holds. The
18
+ * machinery that produces an archive lives in
19
+ * `@dudousxd/nestjs-catalog-pipeline`, which is the package already allowed to
20
+ * know what a bucket is; the catalog itself stays unable to name one.
21
+ *
22
+ * ## What its presence means, and what it does not
23
+ *
24
+ * Present means *a verified copy of this snapshot exists at `path`*. It says
25
+ * nothing about whether the rows are still in the database — those are two
26
+ * independent facts and a caller that conflates them gets the dangerous reading
27
+ * in both directions. Which is why "are the rows still there" is a *different*
28
+ * field, {@link SnapshotRef.droppedAt}, and the two compose as a grid rather
29
+ * than as one ladder:
30
+ *
31
+ * - **neither** — the snapshot is in the database and nowhere else.
32
+ * - **`archive` only** — copied, not moved. Reads are unchanged and cost what
33
+ * they always did.
34
+ * - **`droppedAt` only** — a tombstone. The record survives so run history
35
+ * stays resolvable; the data does not, and no read of it can succeed.
36
+ * - **both** — the snapshot lives in object storage. Still identified, still
37
+ * recoverable, and **not** the same price as a read of a hot snapshot.
38
+ * {@link bytes} is here so a screen can say which it is about to do rather
39
+ * than presenting the two as one click.
40
+ *
41
+ * A snapshot with no `SnapshotRef` at all is the fifth state, and it is the
42
+ * only one that means *gone*: nothing left to name it, and every
43
+ * `catalog_connector_run` that produced it now points at nothing.
44
+ */
45
+ export interface SnapshotArchiveRef {
46
+ /** The only format written today. Named rather than assumed, so a second one can arrive. */
47
+ format: 'parquet';
48
+ /**
49
+ * The disk the bytes went to, when a host named one.
50
+ *
51
+ * Absent means `path` is resolved by whatever wrote it — a filesystem path in
52
+ * a test, a bucket a host configured. The disk is recorded rather than
53
+ * inferred because a deployment may mount several and "which one" is not
54
+ * recoverable from the path.
55
+ */
56
+ disk?: string;
57
+ /** The directory holding this snapshot's parts and its manifest, without a trailing slash. */
58
+ path: string;
59
+ /** Rows in the archive. Compared against the snapshot's own count when it was written. */
60
+ rowCount: number;
61
+ /** Size on the far end, for a screen that has to say what a read will cost. */
62
+ bytes: number;
63
+ /**
64
+ * SHA-256 over the row stream in `_row` order, as the manifest records it.
65
+ *
66
+ * A row count catches a truncated archive and nothing else: an archive with
67
+ * every row present and one value corrupted has exactly the right count. This
68
+ * is the check that fails for that, and it is only meaningful because the
69
+ * stream is ordered — see the store's `streamSnapshot`.
70
+ */
71
+ checksum: string;
72
+ writtenAt: string;
73
+ /**
74
+ * When the archive was last read back and found to match.
75
+ *
76
+ * Separate from {@link writtenAt} because they answer different questions and
77
+ * a caller about to delete rows needs the second one. Absent means written but
78
+ * not confirmed readable, which is exactly the state in which nothing may be
79
+ * deleted.
80
+ */
81
+ verifiedAt?: string;
82
+ }
12
83
  /** A point-in-time view of one object type. */
13
84
  export interface SnapshotRef {
14
85
  /**
@@ -27,6 +98,51 @@ export interface SnapshotRef {
27
98
  principalId: string;
28
99
  /** Free-form provenance: which base, which file, which workflow run. */
29
100
  labels?: Record<string, string>;
101
+ /**
102
+ * Where this snapshot's rows have been copied to, if anywhere.
103
+ *
104
+ * Optional, and absent is the answer for every snapshot in every deployment
105
+ * that archives nothing — which is all of them until a host asks. See
106
+ * {@link SnapshotArchiveRef} for the states it composes into.
107
+ */
108
+ archive?: SnapshotArchiveRef;
109
+ /**
110
+ * When this snapshot's rows were deleted, if they have been.
111
+ *
112
+ * Present makes this ref a **tombstone**: the record of the load survives —
113
+ * who wrote it, when, under which labels, and how many rows it held — while
114
+ * the rows themselves are gone. Absent is the answer for every snapshot that
115
+ * still has its data, which is every snapshot until something drops one.
116
+ *
117
+ * ## Why the record is kept rather than deleted with the rows
118
+ *
119
+ * A snapshot is a whole version of an object type, and committing a new one
120
+ * leaves the old rows in place beside the new ones. Nothing removed them, so
121
+ * a type loaded daily holds every day it has ever been loaded; one deployment
122
+ * reached 441 retained snapshots and 100 GB and the database then refused
123
+ * connections. The obvious repair — drop old snapshots — was blocked by a
124
+ * real objection, that `catalog_connector_run` records the snapshot each run
125
+ * produced, so deleting the snapshot turns the run history into a list of
126
+ * pointers to nothing.
127
+ *
128
+ * The objection is about the *record*, and the disk is held by the *rows*.
129
+ * They are separable, and separating them is the whole of this field: the
130
+ * bytes can go while the run that produced them stays answerable. It says
131
+ * nothing about *when* anything should be dropped — there is no retention
132
+ * policy anywhere in this package and this field does not imply one.
133
+ *
134
+ * ## What it obliges a reader to do
135
+ *
136
+ * Refuse, out loud. A read of a tombstoned snapshot must fail with a sentence
137
+ * naming the drop and its date; it must never come back as zero rows, which
138
+ * is indistinguishable from a load that collapsed and is the failure this
139
+ * codebase refuses everywhere else. The store enforces the one invariant that
140
+ * keeps ordinary reads free of the question: **the snapshot a type is serving
141
+ * can never be tombstoned**, so only an explicit read of history can meet one.
142
+ *
143
+ * ISO-8601, like {@link createdAt}.
144
+ */
145
+ droppedAt?: string;
30
146
  }
31
147
  /**
32
148
  * How a store holds history. One list, so nothing narrows a stored or
@@ -290,6 +406,59 @@ export interface CatalogSnapshotStreamStore extends CatalogReadStore {
290
406
  }
291
407
  /** A store that can stream a whole snapshot. See {@link CatalogSnapshotStreamStore}. */
292
408
  export declare function supportsSnapshotStreams(store: unknown): store is CatalogSnapshotStreamStore;
409
+ /** Where one snapshot id turned out to live. */
410
+ export interface CatalogSnapshotLocation {
411
+ /** The object type the snapshot belongs to. */
412
+ typeName: string;
413
+ /** The snapshot itself, tombstone and archive included. */
414
+ snapshot: SnapshotRef;
415
+ }
416
+ /**
417
+ * A store that can say what a snapshot id refers to, without being told the type.
418
+ *
419
+ * ## Why this is a question and not an inference
420
+ *
421
+ * Because a caller naming a snapshot has exactly one thing — a string — and
422
+ * every wrong answer about it is silent. {@link CatalogReadStore.read} given an
423
+ * id that does not exist returns `{ rows: [], total: 0 }`, which is the same
424
+ * answer it gives for a snapshot that is genuinely empty, for a filter that
425
+ * excluded everything, and for a load that collapsed. Existence cannot be
426
+ * inferred from a count.
427
+ *
428
+ * {@link CatalogReadStore.listSnapshots} answers *most* of it: the snapshot is
429
+ * in the type's list or it is not, and the ref carries {@link
430
+ * SnapshotRef.droppedAt} and {@link SnapshotRef.archive}. What it cannot answer
431
+ * is the third case, and the third case is the one somebody actually hits — an
432
+ * id copied off the wrong type's history, or off a run that loaded something
433
+ * else. "There is no such snapshot" and "that snapshot belongs to
434
+ * AfFleetReplica" send a person to two different places, and only a lookup that
435
+ * is not scoped to one type can tell them apart.
436
+ *
437
+ * A list rather than an option, because ids are caller-supplied: a run that
438
+ * loads two types under one durable run id gives both snapshots the same id, and
439
+ * reporting one of them would be reporting a coin toss.
440
+ *
441
+ * ## Optional, like every other capability here
442
+ *
443
+ * The caller degrades rather than refuses when it is absent — `listSnapshots`
444
+ * still separates missing from tombstoned, and the refusal simply stops claiming
445
+ * to have checked the other types. Adapters are free to skip it; today the only
446
+ * store that implements {@link CatalogSnapshotStreamStore} is the only one that
447
+ * can serve a `catalog` source at all, and it is the one that implements this.
448
+ */
449
+ export interface CatalogSnapshotLookupStore extends CatalogReadStore {
450
+ /**
451
+ * Every snapshot in this store carrying `snapshotId`, whatever its type.
452
+ *
453
+ * Empty means no type has one. This is an **identity** question and not a
454
+ * read: it must answer for a tombstoned snapshot exactly as it answers for a
455
+ * live one, because a caller that cannot see the tombstone is a caller that
456
+ * reports it as missing.
457
+ */
458
+ locateSnapshot(snapshotId: string): Promise<CatalogSnapshotLocation[]>;
459
+ }
460
+ /** A store that can resolve a snapshot id. See {@link CatalogSnapshotLookupStore}. */
461
+ export declare function supportsSnapshotLookup(store: unknown): store is CatalogSnapshotLookupStore;
293
462
  /** A store that owns its copy of the data and can be loaded into. */
294
463
  export interface CatalogWriteStore extends CatalogReadStore {
295
464
  /**
@@ -347,7 +516,25 @@ export interface CatalogWriteStore extends CatalogReadStore {
347
516
  * indistinguishable from a completed one that happened to lose rows.
348
517
  */
349
518
  commit(type: CatalogObjectTypeDef, snapshotId: string): Promise<SnapshotRef>;
350
- /** Drop a snapshot. Refuses the currently-committed one. */
519
+ /**
520
+ * Drop a snapshot's rows. Refuses the currently-committed one.
521
+ *
522
+ * **The rows, and not necessarily the record.** A store that keeps a snapshot
523
+ * list should keep the entry and mark it {@link SnapshotRef.droppedAt} rather
524
+ * than removing it, because the entry is what makes a connector run that
525
+ * names this snapshot still answerable — see that field for the argument in
526
+ * full. A store whose record and rows are the same object has nothing to
527
+ * keep, and reports no `droppedAt` because it has none to report.
528
+ *
529
+ * Idempotent: dropping a snapshot whose rows are already gone is a no-op that
530
+ * leaves the original drop time standing, so a retried step does not rewrite
531
+ * history to the moment of its retry.
532
+ *
533
+ * Two refusals follow from a tombstone existing, and both belong to the store
534
+ * because it is the only thing that can see the state: a tombstoned snapshot
535
+ * may not be {@link commit}ted — that is exactly how a published type comes to
536
+ * serve nothing — and a read of one must fail rather than return zero rows.
537
+ */
351
538
  dropSnapshot(type: CatalogObjectTypeDef, snapshotId: string): Promise<void>;
352
539
  /**
353
540
  * Which snapshot this store is serving for `type`, or `undefined` when it has
@@ -4,6 +4,7 @@ exports.CATALOG_STORE = exports.CatalogColumnCollisionError = exports.UnsafeIden
4
4
  exports.isCatalogStoreCapabilities = isCatalogStoreCapabilities;
5
5
  exports.supportsObjectFilters = supportsObjectFilters;
6
6
  exports.supportsSnapshotStreams = supportsSnapshotStreams;
7
+ exports.supportsSnapshotLookup = supportsSnapshotLookup;
7
8
  exports.isReservedColumn = isReservedColumn;
8
9
  exports.findColumnCollisions = findColumnCollisions;
9
10
  exports.assertNoColumnCollisions = assertNoColumnCollisions;
@@ -60,6 +61,12 @@ function supportsSnapshotStreams(store) {
60
61
  store !== null &&
61
62
  typeof Reflect.get(store, 'streamSnapshot') === 'function');
62
63
  }
64
+ /** A store that can resolve a snapshot id. See {@link CatalogSnapshotLookupStore}. */
65
+ function supportsSnapshotLookup(store) {
66
+ return (typeof store === 'object' &&
67
+ store !== null &&
68
+ typeof Reflect.get(store, 'locateSnapshot') === 'function');
69
+ }
63
70
  /**
64
71
  * The columns a snapshot-emulating store adds to every object table.
65
72
  *
package/dist/client.d.ts CHANGED
@@ -155,7 +155,7 @@ export declare const catalogRoutes: {
155
155
  };
156
156
  export type { CatalogConnection, CatalogConnector, ConnectionCheck, CatalogTransform, CatalogTransformFunction, CatalogTransformInput, CatalogRecordTransformFunction, CatalogRecordTransformInput, CatalogWorkflow, CatalogWorkflowCapabilities, CatalogWorkflowRelease, ConnectorKind, ConnectorRun, TransformLanguage, TransformMode, TransformResult, CallableWorkflowRef, WorkflowBranchLabel, WorkflowCallEnvelope, WorkflowCallMode, WorkflowCallNode, WorkflowCallOutput, WorkflowEdge, WorkflowExecutionMode, WorkflowFilterAll, WorkflowFilterAny, WorkflowAggregate, WorkflowAggregateFunction, WorkflowAggregateNode, WorkflowFilterComparison, WorkflowFilterGroup, WorkflowFilterNode, WorkflowFilterOneOf, WorkflowFilterOperator, WorkflowFilterPredicate, WorkflowFilterPredicateKind, WorkflowFilterPresence, WorkflowFilterValue, WorkflowGraph, WorkflowEnvPredicate, WorkflowIfNode, WorkflowIfPredicate, WorkflowIssueCode, WorkflowNode, WorkflowNodeKind, WorkflowNodeOutcome, WorkflowPredicateKind, WorkflowInputFilter, WorkflowLookupNode, WorkflowLookupUnmatched, WorkflowRenameNode, WorkflowRenameUnnamed, WorkflowRowCountPredicate, WorkflowRunOrderEntry, WorkflowSinkNode, WorkflowSkipReason, WorkflowSourceNode, WorkflowStageRef, WorkflowTransformNode, WorkflowValidationIssue, CatalogReusableNode, CatalogReusableNodeUse, ReusableNodeBody, ReusableNodeKind, ReusableNodeRef, ReusableSinkBody, ReusableSourceBody, SourceFormat, VersionPinCopy, } from './catalog.pipeline';
157
157
  export { type TransformShape, transformDeclaresModule, transformShape, } from './transform-shape';
158
- export { CATALOG_SOURCE_TYPE_KEY, CONNECTOR_KINDS, isConnectorKind, isSourceFormat, isTransformLanguage, isTransformMode, TRANSFORM_MODES, transformMode, recordModeRefusal, SOURCE_FORMATS, isWorkflowEdge, isWorkflowNode, liveWorkflowVersion, REDACTED_SECRET, TRANSFORM_LANGUAGES, readWorkflowCallOutput, WORKFLOW_CALL_CONTRACT, WORKFLOW_CALL_MODES, isWorkflowCallMode, unreachableCallMode, workflowCallMode, applyReusableNode, reusableNodeBodyOf, isReusableNodeBody, isReusableNodeKind, REUSABLE_NODE_KINDS, NODE_KIND_IS_REUSABLE, nodeKindIsReusable, unreachableReusableNodeKind, describeLiveVersion, describeVersionPin, } from './catalog.pipeline';
158
+ export { CATALOG_SOURCE_TYPE_KEY, CATALOG_SNAPSHOT_RESERVED_NAMES, CATALOG_SOURCE_SNAPSHOT_KEY, catalogSnapshotRefusal, CONNECTOR_KINDS, isConnectorKind, isSourceFormat, isTransformLanguage, isTransformMode, TRANSFORM_MODES, transformMode, recordModeRefusal, SOURCE_FORMATS, isWorkflowEdge, isWorkflowNode, liveWorkflowVersion, REDACTED_SECRET, TRANSFORM_LANGUAGES, readWorkflowCallOutput, WORKFLOW_CALL_CONTRACT, WORKFLOW_CALL_MODES, isWorkflowCallMode, unreachableCallMode, workflowCallMode, applyReusableNode, reusableNodeBodyOf, isReusableNodeBody, isReusableNodeKind, REUSABLE_NODE_KINDS, NODE_KIND_IS_REUSABLE, nodeKindIsReusable, unreachableReusableNodeKind, describeLiveVersion, describeVersionPin, } from './catalog.pipeline';
159
159
  /**
160
160
  * The workflow validator, shipped to the browser deliberately.
161
161
  *
@@ -183,7 +183,7 @@ export { CATALOG_SOURCE_TYPE_KEY, CONNECTOR_KINDS, isConnectorKind, isSourceForm
183
183
  * ends up drawn with its boxes overlapping — which is exactly what happened.
184
184
  */
185
185
  export { WORKFLOW_COLUMN_GAP, WORKFLOW_NODE_HEIGHT, WORKFLOW_NODE_WIDTH, WORKFLOW_ROW_GAP, workflowColumnX, workflowRowY, } from './catalog.pipeline';
186
- export { validateWorkflow, WORKFLOW_EXECUTION_MODES, WORKFLOW_ISSUE_CODES, WORKFLOW_NODE_ID_PATTERN, WORKFLOW_NODE_KINDS, WORKFLOW_BRANCH_LABELS, WORKFLOW_PREDICATE_KINDS, WORKFLOW_FILTER_COLUMN_PATTERN, WORKFLOW_FILTER_MAX_DEPTH, WORKFLOW_FILTER_MAX_VALUES, WORKFLOW_FILTER_OPERATORS, WORKFLOW_FILTER_PREDICATE_KINDS, WORKFLOW_LOOKUP_MAX_FIELDS, WORKFLOW_LOOKUP_MAX_REFERENCE_ROWS, WORKFLOW_LOOKUP_UNMATCHED, WORKFLOW_RENAME_MAX_COLUMNS, WORKFLOW_RENAME_UNNAMED, WORKFLOW_AGGREGATE_DEFAULT_SEPARATOR, WORKFLOW_AGGREGATE_FUNCTIONS, WORKFLOW_AGGREGATE_GROUPS_CEILING, WORKFLOW_AGGREGATE_JOIN_LENGTH_CEILING, WORKFLOW_AGGREGATE_JOIN_MAX_LENGTH, WORKFLOW_AGGREGATE_MAX_AGGREGATES, WORKFLOW_AGGREGATE_MAX_GROUP_BY, WORKFLOW_AGGREGATE_MAX_GROUPS, WORKFLOW_AGGREGATE_MAX_SEPARATOR, WORKFLOW_SKIP_REASONS, isWorkflowBranchLabel, isWorkflowFilterOperator, isWorkflowFilterPredicate, isWorkflowFilterPredicateKind, isWorkflowFilterValue, isWorkflowIfPredicate, isWorkflowPredicateKind, isWorkflowAggregateFunction, isWorkflowAggregates, isWorkflowLookupFields, isWorkflowLookupUnmatched, isWorkflowRenameColumns, isWorkflowRenameUnnamed, isWorkflowSkipReason, workflowFilterColumns, workflowFilterMatches, renameColumnRefusals, workflowRenameUnnamed, aggregateRefusals, workflowAggregateColumns, workflowAggregateJoinMaxLength, workflowAggregateMaxGroups, workflowAggregateNeedsColumn, workflowAggregateOutputColumns, workflowAggregateSeparator, lookupConfigRefusals, workflowLookupColumns, workflowLookupKey, workflowLookupUnmatched, workflowKnownColumns, workflowSourceObjectType, workflowNarrowedTypes, workflowNodeRuns, unreachableFilterOperator, unreachableFilterPredicateKind, unreachableConnectorKind, unreachableNodeKind, unreachableLookupUnmatched, unreachablePredicateKind, unreachableAggregateFunction, unreachableRenameUnnamed, WORKFLOW_STATUSES, workflowGraphHash, workflowRunOrder, isWorkflowExecutionMode, isWorkflowNodeKind, isWorkflowStatus, callableWorkflowBlock, } from './catalog.pipeline';
186
+ export { validateWorkflow, WORKFLOW_EXECUTION_MODES, WORKFLOW_ISSUE_CODES, WORKFLOW_NODE_ID_PATTERN, WORKFLOW_NODE_KINDS, WORKFLOW_BRANCH_LABELS, WORKFLOW_PREDICATE_KINDS, WORKFLOW_FILTER_COLUMN_PATTERN, WORKFLOW_FILTER_MAX_DEPTH, WORKFLOW_FILTER_MAX_VALUES, WORKFLOW_FILTER_OPERATORS, WORKFLOW_FILTER_PREDICATE_KINDS, WORKFLOW_LOOKUP_MAX_FIELDS, WORKFLOW_LOOKUP_MAX_REFERENCE_ROWS, WORKFLOW_LOOKUP_UNMATCHED, WORKFLOW_RENAME_MAX_COLUMNS, WORKFLOW_RENAME_UNNAMED, WORKFLOW_AGGREGATE_DEFAULT_SEPARATOR, WORKFLOW_AGGREGATE_FUNCTIONS, WORKFLOW_AGGREGATE_GROUPS_CEILING, WORKFLOW_AGGREGATE_JOIN_LENGTH_CEILING, WORKFLOW_AGGREGATE_JOIN_MAX_LENGTH, WORKFLOW_AGGREGATE_MAX_AGGREGATES, WORKFLOW_AGGREGATE_MAX_GROUP_BY, WORKFLOW_AGGREGATE_MAX_GROUPS, WORKFLOW_AGGREGATE_MAX_SEPARATOR, WORKFLOW_SKIP_REASONS, isWorkflowBranchLabel, isWorkflowFilterOperator, isWorkflowFilterPredicate, isWorkflowFilterPredicateKind, isWorkflowFilterValue, isWorkflowIfPredicate, isWorkflowPredicateKind, isWorkflowAggregateFunction, isWorkflowAggregates, isWorkflowLookupFields, isWorkflowLookupUnmatched, isWorkflowRenameColumns, isWorkflowRenameUnnamed, isWorkflowSkipReason, workflowFilterColumns, workflowFilterMatches, renameColumnRefusals, workflowRenameUnnamed, aggregateRefusals, workflowAggregateColumns, workflowAggregateJoinMaxLength, workflowAggregateMaxGroups, workflowAggregateNeedsColumn, workflowAggregateOutputColumns, workflowAggregateSeparator, lookupConfigRefusals, workflowLookupColumns, workflowLookupKey, workflowLookupUnmatched, workflowKnownColumns, workflowSourceObjectType, workflowSourceSnapshot, workflowNarrowedTypes, workflowNodeRuns, unreachableFilterOperator, unreachableFilterPredicateKind, unreachableConnectorKind, unreachableNodeKind, unreachableLookupUnmatched, unreachablePredicateKind, unreachableAggregateFunction, unreachableRenameUnnamed, WORKFLOW_STATUSES, workflowGraphHash, workflowRunOrder, isWorkflowExecutionMode, isWorkflowNodeKind, isWorkflowStatus, callableWorkflowBlock, } from './catalog.pipeline';
187
187
  export type { CallableWorkflowBlock, CallableWorkflowDisagreement, WorkflowColumnKnowledge, WorkflowStatus, } from './catalog.pipeline';
188
188
  export type { CatalogTrace, CatalogTraceList, CatalogTraceOutcome, CatalogTraceSpan, TraceQuery, } from './catalog.workspace';
189
189
  export type { CatalogLoadExpectations, DeleteReconciliation, LoadExpectation, RowCountBound, StoredLoadExpectation, } from './catalog.pipeline';
package/dist/client.js CHANGED
@@ -11,9 +11,9 @@
11
11
  * types are.
12
12
  */
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.describeVersionPin = exports.describeLiveVersion = exports.unreachableReusableNodeKind = exports.nodeKindIsReusable = exports.NODE_KIND_IS_REUSABLE = exports.REUSABLE_NODE_KINDS = exports.isReusableNodeKind = exports.isReusableNodeBody = exports.reusableNodeBodyOf = exports.applyReusableNode = exports.workflowCallMode = exports.unreachableCallMode = exports.isWorkflowCallMode = exports.WORKFLOW_CALL_MODES = exports.WORKFLOW_CALL_CONTRACT = exports.readWorkflowCallOutput = exports.TRANSFORM_LANGUAGES = exports.REDACTED_SECRET = exports.liveWorkflowVersion = exports.isWorkflowNode = exports.isWorkflowEdge = exports.SOURCE_FORMATS = exports.recordModeRefusal = exports.transformMode = exports.TRANSFORM_MODES = exports.isTransformMode = exports.isTransformLanguage = exports.isSourceFormat = exports.isConnectorKind = exports.CONNECTOR_KINDS = exports.CATALOG_SOURCE_TYPE_KEY = exports.transformShape = exports.transformDeclaresModule = exports.catalogRoutes = exports.UnsafeIdentifierError = exports.physicalColumn = exports.outputAlias = exports.isSafeIdentifier = exports.VALUELESS_FILTER_OPERATORS = exports.resolveObjectFilters = exports.parseObjectFilter = exports.offeredFilterOperators = exports.isCatalogFilterOperator = exports.filterOperatorsFor = exports.filterOperatorTakesValue = exports.encodeObjectFilter = exports.coerceFilterValue = exports.CATALOG_FILTER_OPERATORS = exports.CATALOG_FILTER_LIMIT = exports.CATALOG_REVISION_LIMIT = void 0;
15
- exports.renameColumnRefusals = exports.workflowFilterMatches = exports.workflowFilterColumns = exports.isWorkflowSkipReason = exports.isWorkflowRenameUnnamed = exports.isWorkflowRenameColumns = exports.isWorkflowLookupUnmatched = exports.isWorkflowLookupFields = exports.isWorkflowAggregates = exports.isWorkflowAggregateFunction = exports.isWorkflowPredicateKind = exports.isWorkflowIfPredicate = exports.isWorkflowFilterValue = exports.isWorkflowFilterPredicateKind = exports.isWorkflowFilterPredicate = exports.isWorkflowFilterOperator = exports.isWorkflowBranchLabel = exports.WORKFLOW_SKIP_REASONS = exports.WORKFLOW_AGGREGATE_MAX_SEPARATOR = exports.WORKFLOW_AGGREGATE_MAX_GROUPS = exports.WORKFLOW_AGGREGATE_MAX_GROUP_BY = exports.WORKFLOW_AGGREGATE_MAX_AGGREGATES = exports.WORKFLOW_AGGREGATE_JOIN_MAX_LENGTH = exports.WORKFLOW_AGGREGATE_JOIN_LENGTH_CEILING = exports.WORKFLOW_AGGREGATE_GROUPS_CEILING = exports.WORKFLOW_AGGREGATE_FUNCTIONS = exports.WORKFLOW_AGGREGATE_DEFAULT_SEPARATOR = exports.WORKFLOW_RENAME_UNNAMED = exports.WORKFLOW_RENAME_MAX_COLUMNS = exports.WORKFLOW_LOOKUP_UNMATCHED = exports.WORKFLOW_LOOKUP_MAX_REFERENCE_ROWS = exports.WORKFLOW_LOOKUP_MAX_FIELDS = exports.WORKFLOW_FILTER_PREDICATE_KINDS = exports.WORKFLOW_FILTER_OPERATORS = exports.WORKFLOW_FILTER_MAX_VALUES = exports.WORKFLOW_FILTER_MAX_DEPTH = exports.WORKFLOW_FILTER_COLUMN_PATTERN = exports.WORKFLOW_PREDICATE_KINDS = exports.WORKFLOW_BRANCH_LABELS = exports.WORKFLOW_NODE_KINDS = exports.WORKFLOW_NODE_ID_PATTERN = exports.WORKFLOW_ISSUE_CODES = exports.WORKFLOW_EXECUTION_MODES = exports.validateWorkflow = exports.workflowRowY = exports.workflowColumnX = exports.WORKFLOW_ROW_GAP = exports.WORKFLOW_NODE_WIDTH = exports.WORKFLOW_NODE_HEIGHT = exports.WORKFLOW_COLUMN_GAP = void 0;
16
- exports.DELETE_RECONCILIATION_STRATEGIES = exports.callableWorkflowBlock = exports.isWorkflowStatus = exports.isWorkflowNodeKind = exports.isWorkflowExecutionMode = exports.workflowRunOrder = exports.workflowGraphHash = exports.WORKFLOW_STATUSES = exports.unreachableRenameUnnamed = exports.unreachableAggregateFunction = exports.unreachablePredicateKind = exports.unreachableLookupUnmatched = exports.unreachableNodeKind = exports.unreachableConnectorKind = exports.unreachableFilterPredicateKind = exports.unreachableFilterOperator = exports.workflowNodeRuns = exports.workflowNarrowedTypes = exports.workflowSourceObjectType = exports.workflowKnownColumns = exports.workflowLookupUnmatched = exports.workflowLookupKey = exports.workflowLookupColumns = exports.lookupConfigRefusals = exports.workflowAggregateSeparator = exports.workflowAggregateOutputColumns = exports.workflowAggregateNeedsColumn = exports.workflowAggregateMaxGroups = exports.workflowAggregateJoinMaxLength = exports.workflowAggregateColumns = exports.aggregateRefusals = exports.workflowRenameUnnamed = void 0;
14
+ exports.nodeKindIsReusable = exports.NODE_KIND_IS_REUSABLE = exports.REUSABLE_NODE_KINDS = exports.isReusableNodeKind = exports.isReusableNodeBody = exports.reusableNodeBodyOf = exports.applyReusableNode = exports.workflowCallMode = exports.unreachableCallMode = exports.isWorkflowCallMode = exports.WORKFLOW_CALL_MODES = exports.WORKFLOW_CALL_CONTRACT = exports.readWorkflowCallOutput = exports.TRANSFORM_LANGUAGES = exports.REDACTED_SECRET = exports.liveWorkflowVersion = exports.isWorkflowNode = exports.isWorkflowEdge = exports.SOURCE_FORMATS = exports.recordModeRefusal = exports.transformMode = exports.TRANSFORM_MODES = exports.isTransformMode = exports.isTransformLanguage = exports.isSourceFormat = exports.isConnectorKind = exports.CONNECTOR_KINDS = exports.catalogSnapshotRefusal = exports.CATALOG_SOURCE_SNAPSHOT_KEY = exports.CATALOG_SNAPSHOT_RESERVED_NAMES = exports.CATALOG_SOURCE_TYPE_KEY = exports.transformShape = exports.transformDeclaresModule = exports.catalogRoutes = exports.UnsafeIdentifierError = exports.physicalColumn = exports.outputAlias = exports.isSafeIdentifier = exports.VALUELESS_FILTER_OPERATORS = exports.resolveObjectFilters = exports.parseObjectFilter = exports.offeredFilterOperators = exports.isCatalogFilterOperator = exports.filterOperatorsFor = exports.filterOperatorTakesValue = exports.encodeObjectFilter = exports.coerceFilterValue = exports.CATALOG_FILTER_OPERATORS = exports.CATALOG_FILTER_LIMIT = exports.CATALOG_REVISION_LIMIT = void 0;
15
+ exports.isWorkflowSkipReason = exports.isWorkflowRenameUnnamed = exports.isWorkflowRenameColumns = exports.isWorkflowLookupUnmatched = exports.isWorkflowLookupFields = exports.isWorkflowAggregates = exports.isWorkflowAggregateFunction = exports.isWorkflowPredicateKind = exports.isWorkflowIfPredicate = exports.isWorkflowFilterValue = exports.isWorkflowFilterPredicateKind = exports.isWorkflowFilterPredicate = exports.isWorkflowFilterOperator = exports.isWorkflowBranchLabel = exports.WORKFLOW_SKIP_REASONS = exports.WORKFLOW_AGGREGATE_MAX_SEPARATOR = exports.WORKFLOW_AGGREGATE_MAX_GROUPS = exports.WORKFLOW_AGGREGATE_MAX_GROUP_BY = exports.WORKFLOW_AGGREGATE_MAX_AGGREGATES = exports.WORKFLOW_AGGREGATE_JOIN_MAX_LENGTH = exports.WORKFLOW_AGGREGATE_JOIN_LENGTH_CEILING = exports.WORKFLOW_AGGREGATE_GROUPS_CEILING = exports.WORKFLOW_AGGREGATE_FUNCTIONS = exports.WORKFLOW_AGGREGATE_DEFAULT_SEPARATOR = exports.WORKFLOW_RENAME_UNNAMED = exports.WORKFLOW_RENAME_MAX_COLUMNS = exports.WORKFLOW_LOOKUP_UNMATCHED = exports.WORKFLOW_LOOKUP_MAX_REFERENCE_ROWS = exports.WORKFLOW_LOOKUP_MAX_FIELDS = exports.WORKFLOW_FILTER_PREDICATE_KINDS = exports.WORKFLOW_FILTER_OPERATORS = exports.WORKFLOW_FILTER_MAX_VALUES = exports.WORKFLOW_FILTER_MAX_DEPTH = exports.WORKFLOW_FILTER_COLUMN_PATTERN = exports.WORKFLOW_PREDICATE_KINDS = exports.WORKFLOW_BRANCH_LABELS = exports.WORKFLOW_NODE_KINDS = exports.WORKFLOW_NODE_ID_PATTERN = exports.WORKFLOW_ISSUE_CODES = exports.WORKFLOW_EXECUTION_MODES = exports.validateWorkflow = exports.workflowRowY = exports.workflowColumnX = exports.WORKFLOW_ROW_GAP = exports.WORKFLOW_NODE_WIDTH = exports.WORKFLOW_NODE_HEIGHT = exports.WORKFLOW_COLUMN_GAP = exports.describeVersionPin = exports.describeLiveVersion = exports.unreachableReusableNodeKind = void 0;
16
+ exports.DELETE_RECONCILIATION_STRATEGIES = exports.callableWorkflowBlock = exports.isWorkflowStatus = exports.isWorkflowNodeKind = exports.isWorkflowExecutionMode = exports.workflowRunOrder = exports.workflowGraphHash = exports.WORKFLOW_STATUSES = exports.unreachableRenameUnnamed = exports.unreachableAggregateFunction = exports.unreachablePredicateKind = exports.unreachableLookupUnmatched = exports.unreachableNodeKind = exports.unreachableConnectorKind = exports.unreachableFilterPredicateKind = exports.unreachableFilterOperator = exports.workflowNodeRuns = exports.workflowNarrowedTypes = exports.workflowSourceSnapshot = exports.workflowSourceObjectType = exports.workflowKnownColumns = exports.workflowLookupUnmatched = exports.workflowLookupKey = exports.workflowLookupColumns = exports.lookupConfigRefusals = exports.workflowAggregateSeparator = exports.workflowAggregateOutputColumns = exports.workflowAggregateNeedsColumn = exports.workflowAggregateMaxGroups = exports.workflowAggregateJoinMaxLength = exports.workflowAggregateColumns = exports.aggregateRefusals = exports.workflowRenameUnnamed = exports.renameColumnRefusals = exports.workflowFilterMatches = exports.workflowFilterColumns = void 0;
17
17
  exports.isDeleteReconciliationStrategy = isDeleteReconciliationStrategy;
18
18
  exports.pipelineExpectationRoutes = pipelineExpectationRoutes;
19
19
  // A value, not a type: a screen saying how far back the history goes should read
@@ -144,6 +144,12 @@ var catalog_pipeline_1 = require("./catalog.pipeline");
144
144
  // The config key a `catalog` source names its object type in, so the
145
145
  // inspector writing it and the fetcher reading it cannot spell it differently.
146
146
  Object.defineProperty(exports, "CATALOG_SOURCE_TYPE_KEY", { enumerable: true, get: function () { return catalog_pipeline_1.CATALOG_SOURCE_TYPE_KEY; } });
147
+ // …and the key it names one snapshot of that type in, plus the one rule about
148
+ // what may go in it. The inspector refuses a relative reference with the same
149
+ // sentence the validator and the fetcher do, because it is the same function.
150
+ Object.defineProperty(exports, "CATALOG_SNAPSHOT_RESERVED_NAMES", { enumerable: true, get: function () { return catalog_pipeline_1.CATALOG_SNAPSHOT_RESERVED_NAMES; } });
151
+ Object.defineProperty(exports, "CATALOG_SOURCE_SNAPSHOT_KEY", { enumerable: true, get: function () { return catalog_pipeline_1.CATALOG_SOURCE_SNAPSHOT_KEY; } });
152
+ Object.defineProperty(exports, "catalogSnapshotRefusal", { enumerable: true, get: function () { return catalog_pipeline_1.catalogSnapshotRefusal; } });
147
153
  Object.defineProperty(exports, "CONNECTOR_KINDS", { enumerable: true, get: function () { return catalog_pipeline_1.CONNECTOR_KINDS; } });
148
154
  Object.defineProperty(exports, "isConnectorKind", { enumerable: true, get: function () { return catalog_pipeline_1.isConnectorKind; } });
149
155
  Object.defineProperty(exports, "isSourceFormat", { enumerable: true, get: function () { return catalog_pipeline_1.isSourceFormat; } });
@@ -355,6 +361,9 @@ Object.defineProperty(exports, "workflowKnownColumns", { enumerable: true, get:
355
361
  // Which object type a `catalog` source reads, read off the node by the one
356
362
  // function the validator and the fetcher also use.
357
363
  Object.defineProperty(exports, "workflowSourceObjectType", { enumerable: true, get: function () { return catalog_pipeline_3.workflowSourceObjectType; } });
364
+ // …and which snapshot of it, when the node names one rather than reading
365
+ // whatever is being served.
366
+ Object.defineProperty(exports, "workflowSourceSnapshot", { enumerable: true, get: function () { return catalog_pipeline_3.workflowSourceSnapshot; } });
358
367
  // Which published types a filter stands in front of. The console has to offer
359
368
  // the same acknowledgements the validator requires, and a canvas computing its
360
369
  // own answer would offer a set the server then refuses.
package/dist/index.d.ts CHANGED
@@ -8,7 +8,7 @@ export { type CatalogOverlayStore, FileCatalogOverlayStore, InMemoryCatalogOverl
8
8
  export { CATALOG_OVERLAY_STORE } from './catalog.overlay-store.token';
9
9
  export { MikroOrmCatalogRegistry } from './catalog.registry';
10
10
  export { CatalogRegistry } from './catalog.registry.base';
11
- export { CATALOG_PIPELINE_STORE, CODE_CONTEXT_CONTRACT, type CatalogCodeContext, type CatalogConnection, type CatalogConnector, type ConnectionCheck, CATALOG_SOURCE_TYPE_KEY, CONNECTOR_KINDS, type CatalogLoadExpectations, type CatalogLoadExpectationStore, type CatalogPipelineStore, type CatalogStageStore, type CatalogRecordTransformFunction, type CatalogRecordTransformInput, type CatalogTransform, type CatalogTransformFunction, type CatalogTransformInput, type CatalogWorkflow, type CatalogWorkflowCapabilities, type CatalogWorkflowRelease, type CatalogWorkflowReleaseStore, type CatalogWorkflowStore, type CallableWorkflowBlock, type CallableWorkflowDisagreement, type CallableWorkflowRef, callableWorkflowBlock, type ConnectorKind, type ConnectorRun, type DeleteReconciliation, isConnectorKind, isPipelineStore, isSourceFormat, isTransformLanguage, isTransformMode, type LoadExpectation, type RowCountBound, SOURCE_FORMATS, type SourceFormat, unreachableSourceFormat, type StoredLoadExpectation, readWorkflowCallOutput, REDACTED_SECRET, supportsLoadExpectations, supportsReusableNodes, supportsTransformPins, supportsTransformRevisions, supportsTransformStreaming, applyReusableNode, type CatalogReusableNode, type CatalogReusableNodeStore, type CatalogReusableNodeUse, describeLiveVersion, describeVersionPin, isReusableNodeBody, isReusableNodeKind, NODE_KIND_IS_REUSABLE, nodeKindIsReusable, REUSABLE_NODE_KINDS, type ReusableNodeBody, type ReusableNodeKind, type ReusableNodeRef, type ReusableSinkBody, type ReusableSourceBody, reusableNodeBodyOf, unreachableReusableNodeKind, type VersionPinCopy, isWorkflowBranchLabel, isWorkflowEdge, isWorkflowExecutionMode, isWorkflowFilterOperator, isWorkflowFilterPredicate, isWorkflowFilterPredicateKind, isWorkflowFilterValue, isWorkflowIfPredicate, isWorkflowNode, isWorkflowCallMode, isWorkflowNodeKind, isWorkflowPredicateKind, isWorkflowLookupFields, isWorkflowLookupUnmatched, isWorkflowRenameColumns, isWorkflowRenameUnnamed, isWorkflowSkipReason, isWorkflowStatus, liveWorkflowVersion, supportsWorkflowReleases, supportsWorkflows, supportsWorkflowStages, supportsStagePayloads, TRANSFORM_RUNNER, TRANSFORM_LANGUAGES, TRANSFORM_MODES, recordModeRefusal, transformMode, type TransformLanguage, type TransformMode, type TransformResult, type TransformRunner, type TransformStream, type TransformStreamSummary, unreachableFilterOperator, unreachableTransformMode, unreachableFilterPredicateKind, unreachableCallMode, unreachableConnectorKind, unreachableNodeKind, unreachablePredicateKind, unreachableLookupUnmatched, unreachableRenameUnnamed, validateWorkflow, WORKFLOW_BRANCH_LABELS, WORKFLOW_CALL_CONTRACT, WORKFLOW_CALL_MODES, WORKFLOW_COLUMN_GAP, WORKFLOW_EXECUTION_MODES, WORKFLOW_FILTER_COLUMN_PATTERN, WORKFLOW_FILTER_MAX_DEPTH, WORKFLOW_FILTER_MAX_VALUES, WORKFLOW_FILTER_OPERATORS, WORKFLOW_FILTER_PREDICATE_KINDS, WORKFLOW_ISSUE_CODES, WORKFLOW_NODE_HEIGHT, WORKFLOW_NODE_ID_PATTERN, WORKFLOW_NODE_KINDS, WORKFLOW_NODE_WIDTH, WORKFLOW_PREDICATE_KINDS, WORKFLOW_RENAME_MAX_COLUMNS, WORKFLOW_RENAME_UNNAMED, WORKFLOW_ROW_GAP, WORKFLOW_SKIP_REASONS, WORKFLOW_STATUSES, type WorkflowBranchLabel, type WorkflowColumnKnowledge, workflowColumnX, workflowRowY, type WorkflowCallEnvelope, type WorkflowCallMode, workflowCallMode, type WorkflowCallNode, type WorkflowCallOutput, type WorkflowEdge, type WorkflowExecutionMode, type WorkflowFilterAll, type WorkflowFilterAny, type WorkflowFilterComparison, type WorkflowFilterGroup, workflowFilterColumns, workflowFilterMatches, type WorkflowFilterNode, type WorkflowFilterOneOf, type WorkflowFilterOperator, type WorkflowFilterPredicate, type WorkflowFilterPredicateKind, type WorkflowFilterPresence, type WorkflowFilterValue, type WorkflowGraph, workflowGraphHash, type WorkflowEnvPredicate, type WorkflowIfNode, type WorkflowIfPredicate, type WorkflowIssueCode, type WorkflowNode, type WorkflowNodeKind, workflowKnownColumns, workflowNarrowedTypes, workflowSourceObjectType, type WorkflowNodeOutcome, workflowNodeRuns, type WorkflowNodeStepInput, type WorkflowNodeStepOutput, workflowRunOrder, type WorkflowRunOrderEntry, type WorkflowPredicateKind, lookupConfigRefusals, type WorkflowInputFilter, type WorkflowLookupNode, type WorkflowLookupUnmatched, workflowLookupColumns, workflowLookupKey, workflowLookupUnmatched, WORKFLOW_LOOKUP_MAX_FIELDS, WORKFLOW_LOOKUP_MAX_REFERENCE_ROWS, WORKFLOW_LOOKUP_UNMATCHED, renameColumnRefusals, type WorkflowRenameNode, type WorkflowRenameUnnamed, workflowRenameUnnamed, type WorkflowRowCountPredicate, type WorkflowSinkNode, type WorkflowSkipReason, type WorkflowSourceNode, type WorkflowStageRef, type WorkflowStatus, type WorkflowTransformNode, type WorkflowValidationIssue, aggregateRefusals, isWorkflowAggregateFunction, isWorkflowAggregates, unreachableAggregateFunction, WORKFLOW_AGGREGATE_DEFAULT_SEPARATOR, WORKFLOW_AGGREGATE_FUNCTIONS, WORKFLOW_AGGREGATE_GROUPS_CEILING, WORKFLOW_AGGREGATE_JOIN_LENGTH_CEILING, WORKFLOW_AGGREGATE_JOIN_MAX_LENGTH, WORKFLOW_AGGREGATE_MAX_AGGREGATES, WORKFLOW_AGGREGATE_MAX_GROUP_BY, WORKFLOW_AGGREGATE_MAX_GROUPS, WORKFLOW_AGGREGATE_MAX_SEPARATOR, type WorkflowAggregate, workflowAggregateColumns, type WorkflowAggregateFunction, workflowAggregateJoinMaxLength, workflowAggregateMaxGroups, workflowAggregateNeedsColumn, type WorkflowAggregateNode, workflowAggregateOutputColumns, workflowAggregateSeparator, } from './catalog.pipeline';
11
+ export { CATALOG_PIPELINE_STORE, CODE_CONTEXT_CONTRACT, type CatalogCodeContext, type CatalogConnection, type CatalogConnector, type ConnectionCheck, CATALOG_SNAPSHOT_RESERVED_NAMES, CATALOG_SOURCE_SNAPSHOT_KEY, CATALOG_SOURCE_TYPE_KEY, catalogSnapshotRefusal, CONNECTOR_KINDS, type CatalogLoadExpectations, type CatalogLoadExpectationStore, type CatalogPipelineStore, type CatalogStageStore, type CatalogRecordTransformFunction, type CatalogRecordTransformInput, type CatalogTransform, type CatalogTransformFunction, type CatalogTransformInput, type CatalogWorkflow, type CatalogWorkflowCapabilities, type CatalogWorkflowRelease, type CatalogWorkflowReleaseStore, type CatalogWorkflowStore, type CallableWorkflowBlock, type CallableWorkflowDisagreement, type CallableWorkflowRef, callableWorkflowBlock, type ConnectorKind, type ConnectorRun, type DeleteReconciliation, isConnectorKind, isPipelineStore, isSourceFormat, isTransformLanguage, isTransformMode, type LoadExpectation, type RowCountBound, SOURCE_FORMATS, type SourceFormat, unreachableSourceFormat, type StoredLoadExpectation, readWorkflowCallOutput, REDACTED_SECRET, supportsLoadExpectations, supportsReusableNodes, supportsTransformPins, supportsTransformRevisions, supportsTransformStreaming, applyReusableNode, type CatalogReusableNode, type CatalogReusableNodeStore, type CatalogReusableNodeUse, describeLiveVersion, describeVersionPin, isReusableNodeBody, isReusableNodeKind, NODE_KIND_IS_REUSABLE, nodeKindIsReusable, REUSABLE_NODE_KINDS, type ReusableNodeBody, type ReusableNodeKind, type ReusableNodeRef, type ReusableSinkBody, type ReusableSourceBody, reusableNodeBodyOf, unreachableReusableNodeKind, type VersionPinCopy, isWorkflowBranchLabel, isWorkflowEdge, isWorkflowExecutionMode, isWorkflowFilterOperator, isWorkflowFilterPredicate, isWorkflowFilterPredicateKind, isWorkflowFilterValue, isWorkflowIfPredicate, isWorkflowNode, isWorkflowCallMode, isWorkflowNodeKind, isWorkflowPredicateKind, isWorkflowLookupFields, isWorkflowLookupUnmatched, isWorkflowRenameColumns, isWorkflowRenameUnnamed, isWorkflowSkipReason, isWorkflowStatus, liveWorkflowVersion, supportsWorkflowReleases, supportsWorkflows, supportsWorkflowStages, supportsStagePayloads, TRANSFORM_RUNNER, TRANSFORM_LANGUAGES, TRANSFORM_MODES, recordModeRefusal, transformMode, type TransformLanguage, type TransformMode, type TransformResult, type TransformRunner, type TransformStream, type TransformStreamSummary, unreachableFilterOperator, unreachableTransformMode, unreachableFilterPredicateKind, unreachableCallMode, unreachableConnectorKind, unreachableNodeKind, unreachablePredicateKind, unreachableLookupUnmatched, unreachableRenameUnnamed, validateWorkflow, WORKFLOW_BRANCH_LABELS, WORKFLOW_CALL_CONTRACT, WORKFLOW_CALL_MODES, WORKFLOW_COLUMN_GAP, WORKFLOW_EXECUTION_MODES, WORKFLOW_FILTER_COLUMN_PATTERN, WORKFLOW_FILTER_MAX_DEPTH, WORKFLOW_FILTER_MAX_VALUES, WORKFLOW_FILTER_OPERATORS, WORKFLOW_FILTER_PREDICATE_KINDS, WORKFLOW_ISSUE_CODES, WORKFLOW_NODE_HEIGHT, WORKFLOW_NODE_ID_PATTERN, WORKFLOW_NODE_KINDS, WORKFLOW_NODE_WIDTH, WORKFLOW_PREDICATE_KINDS, WORKFLOW_RENAME_MAX_COLUMNS, WORKFLOW_RENAME_UNNAMED, WORKFLOW_ROW_GAP, WORKFLOW_SKIP_REASONS, WORKFLOW_STATUSES, type WorkflowBranchLabel, type WorkflowColumnKnowledge, workflowColumnX, workflowRowY, type WorkflowCallEnvelope, type WorkflowCallMode, workflowCallMode, type WorkflowCallNode, type WorkflowCallOutput, type WorkflowEdge, type WorkflowExecutionMode, type WorkflowFilterAll, type WorkflowFilterAny, type WorkflowFilterComparison, type WorkflowFilterGroup, workflowFilterColumns, workflowFilterMatches, type WorkflowFilterNode, type WorkflowFilterOneOf, type WorkflowFilterOperator, type WorkflowFilterPredicate, type WorkflowFilterPredicateKind, type WorkflowFilterPresence, type WorkflowFilterValue, type WorkflowGraph, workflowGraphHash, type WorkflowEnvPredicate, type WorkflowIfNode, type WorkflowIfPredicate, type WorkflowIssueCode, type WorkflowNode, type WorkflowNodeKind, workflowKnownColumns, workflowNarrowedTypes, workflowSourceObjectType, workflowSourceSnapshot, type WorkflowNodeOutcome, workflowNodeRuns, type WorkflowNodeStepInput, type WorkflowNodeStepOutput, workflowRunOrder, type WorkflowRunOrderEntry, type WorkflowPredicateKind, lookupConfigRefusals, type WorkflowInputFilter, type WorkflowLookupNode, type WorkflowLookupUnmatched, workflowLookupColumns, workflowLookupKey, workflowLookupUnmatched, WORKFLOW_LOOKUP_MAX_FIELDS, WORKFLOW_LOOKUP_MAX_REFERENCE_ROWS, WORKFLOW_LOOKUP_UNMATCHED, renameColumnRefusals, type WorkflowRenameNode, type WorkflowRenameUnnamed, workflowRenameUnnamed, type WorkflowRowCountPredicate, type WorkflowSinkNode, type WorkflowSkipReason, type WorkflowSourceNode, type WorkflowStageRef, type WorkflowStatus, type WorkflowTransformNode, type WorkflowValidationIssue, aggregateRefusals, isWorkflowAggregateFunction, isWorkflowAggregates, unreachableAggregateFunction, WORKFLOW_AGGREGATE_DEFAULT_SEPARATOR, WORKFLOW_AGGREGATE_FUNCTIONS, WORKFLOW_AGGREGATE_GROUPS_CEILING, WORKFLOW_AGGREGATE_JOIN_LENGTH_CEILING, WORKFLOW_AGGREGATE_JOIN_MAX_LENGTH, WORKFLOW_AGGREGATE_MAX_AGGREGATES, WORKFLOW_AGGREGATE_MAX_GROUP_BY, WORKFLOW_AGGREGATE_MAX_GROUPS, WORKFLOW_AGGREGATE_MAX_SEPARATOR, type WorkflowAggregate, workflowAggregateColumns, type WorkflowAggregateFunction, workflowAggregateJoinMaxLength, workflowAggregateMaxGroups, workflowAggregateNeedsColumn, type WorkflowAggregateNode, workflowAggregateOutputColumns, workflowAggregateSeparator, } from './catalog.pipeline';
12
12
  export { AggregateTable, type AggregateTableStats, aggregateInputColumns, WorkflowAggregateError, } from './catalog.aggregate';
13
13
  export { type ColumnarStageBatch, STAGE_ENCODING, STAGE_ENCODING_VERSION, type StagePayload, classifyStagePayload, decodeStageRows, encodeStageRows, isColumnarStageBatch, renameStagePayload, type StageRenamePlan, type StageRenameResult, } from './catalog.stage-encoding';
14
14
  export * from './catalog.environment';
@@ -23,7 +23,7 @@ export { type AuditQuery, CATALOG_REVISION_LIMIT, CATALOG_TRACE_OUTCOMES, CATALO
23
23
  export { CATALOG_PRINCIPAL_RESOLVER, type CatalogActor, type CatalogGrants, type CatalogPrincipal, type CatalogPrincipalResolver, type CatalogScope, composePrincipalId, delegatePrincipal, expandScopes, hasScope, parsePrincipalId, PRINCIPAL_ACTOR_SEPARATOR, maySeeClassification, mayRead, mayWrite, readableObjectPage, StaticKeyPrincipalResolver, } from './catalog.principal';
24
24
  export * from './catalog.access';
25
25
  export * from './catalog.filters';
26
- export { assertNoColumnCollisions, assertSafeIdentifier, CATALOG_RESERVED_COLUMNS, CATALOG_SNAPSHOT_MODES, CATALOG_STORE, type CarryForwardResult, type CatalogColumnCollision, CatalogColumnCollisionError, type CatalogFilteringReadStore, supportsObjectFilters, type CatalogMergeStore, type CatalogReadQuery, type CatalogReadResult, type CatalogReadStore, type CatalogReservedColumn, type CatalogSnapshotMode, type CatalogSnapshotStreamStore, type CatalogStoreCapabilities, type CatalogWriteStore, type ColumnCollisionOptions, findColumnCollisions, isCatalogStoreCapabilities, isReservedColumn, isSafeIdentifier, isWriteStore, outputAlias, physicalColumn, type SnapshotRef, supportsCarryForward, supportsSnapshotStreams, UnsafeIdentifierError, } from './catalog.store';
26
+ export { assertNoColumnCollisions, assertSafeIdentifier, CATALOG_RESERVED_COLUMNS, CATALOG_SNAPSHOT_MODES, CATALOG_STORE, type CarryForwardResult, type CatalogColumnCollision, CatalogColumnCollisionError, type CatalogFilteringReadStore, supportsObjectFilters, type CatalogMergeStore, type CatalogReadQuery, type CatalogReadResult, type CatalogReadStore, type CatalogReservedColumn, type CatalogSnapshotLocation, type CatalogSnapshotLookupStore, type CatalogSnapshotMode, type CatalogSnapshotStreamStore, type CatalogStoreCapabilities, type CatalogWriteStore, type ColumnCollisionOptions, findColumnCollisions, isCatalogStoreCapabilities, isReservedColumn, isSafeIdentifier, isWriteStore, outputAlias, physicalColumn, type SnapshotArchiveRef, type SnapshotRef, supportsCarryForward, supportsSnapshotLookup, supportsSnapshotStreams, UnsafeIdentifierError, } from './catalog.store';
27
27
  export { MikroOrmReadStore } from './stores/mikro-orm-read.store';
28
28
  export type { CatalogGraph, CatalogObjectPage, CatalogObjectQuery, CatalogObjectTypeDef, CatalogOverlay, CatalogPropertyDef, CatalogRelationDef, CatalogSnapshot, RelationKind, ScalarType, } from './catalog.types';
29
29
  export { isRelationKind, RELATION_KINDS } from './catalog.types';
package/dist/index.js CHANGED
@@ -14,11 +14,11 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.unreachableReusableNodeKind = exports.reusableNodeBodyOf = exports.REUSABLE_NODE_KINDS = exports.nodeKindIsReusable = exports.NODE_KIND_IS_REUSABLE = exports.isReusableNodeKind = exports.isReusableNodeBody = exports.describeVersionPin = exports.describeLiveVersion = exports.applyReusableNode = exports.supportsTransformStreaming = exports.supportsTransformRevisions = exports.supportsTransformPins = exports.supportsReusableNodes = exports.supportsLoadExpectations = exports.REDACTED_SECRET = exports.readWorkflowCallOutput = exports.unreachableSourceFormat = exports.SOURCE_FORMATS = exports.isTransformMode = exports.isTransformLanguage = exports.isSourceFormat = exports.isPipelineStore = exports.isConnectorKind = exports.callableWorkflowBlock = exports.CONNECTOR_KINDS = exports.CATALOG_SOURCE_TYPE_KEY = exports.CODE_CONTEXT_CONTRACT = exports.CATALOG_PIPELINE_STORE = exports.CatalogRegistry = exports.MikroOrmCatalogRegistry = exports.CATALOG_OVERLAY_STORE = exports.InMemoryCatalogOverlayStore = exports.FileCatalogOverlayStore = exports.CATALOG_OPTIONS = exports.isStreamingQueryStore = exports.isQueryStore = exports.assertReadOnlyShape = exports.CatalogModule = exports.emitCatalog = exports.curationActor = exports.channelNameFor = exports.catalogEventPhase = exports.UNATTRIBUTED_PRINCIPAL_ID = exports.CATALOG_LIB = exports.CATALOG_EVENTS = exports.CATALOG_EVENT_PHASE_FALLBACK = exports.CATALOG_EVENT_PHASE = exports.CatalogType = exports.CatalogProperty = void 0;
18
- exports.WORKFLOW_NODE_HEIGHT = exports.WORKFLOW_ISSUE_CODES = exports.WORKFLOW_FILTER_PREDICATE_KINDS = exports.WORKFLOW_FILTER_OPERATORS = exports.WORKFLOW_FILTER_MAX_VALUES = exports.WORKFLOW_FILTER_MAX_DEPTH = exports.WORKFLOW_FILTER_COLUMN_PATTERN = exports.WORKFLOW_EXECUTION_MODES = exports.WORKFLOW_COLUMN_GAP = exports.WORKFLOW_CALL_MODES = exports.WORKFLOW_CALL_CONTRACT = exports.WORKFLOW_BRANCH_LABELS = exports.validateWorkflow = exports.unreachableRenameUnnamed = exports.unreachableLookupUnmatched = exports.unreachablePredicateKind = exports.unreachableNodeKind = exports.unreachableConnectorKind = exports.unreachableCallMode = exports.unreachableFilterPredicateKind = exports.unreachableTransformMode = exports.unreachableFilterOperator = exports.transformMode = exports.recordModeRefusal = exports.TRANSFORM_MODES = exports.TRANSFORM_LANGUAGES = exports.TRANSFORM_RUNNER = exports.supportsStagePayloads = exports.supportsWorkflowStages = exports.supportsWorkflows = exports.supportsWorkflowReleases = exports.liveWorkflowVersion = exports.isWorkflowStatus = exports.isWorkflowSkipReason = exports.isWorkflowRenameUnnamed = exports.isWorkflowRenameColumns = exports.isWorkflowLookupUnmatched = exports.isWorkflowLookupFields = exports.isWorkflowPredicateKind = exports.isWorkflowNodeKind = exports.isWorkflowCallMode = exports.isWorkflowNode = exports.isWorkflowIfPredicate = exports.isWorkflowFilterValue = exports.isWorkflowFilterPredicateKind = exports.isWorkflowFilterPredicate = exports.isWorkflowFilterOperator = exports.isWorkflowExecutionMode = exports.isWorkflowEdge = exports.isWorkflowBranchLabel = void 0;
19
- exports.aggregateInputColumns = exports.AggregateTable = exports.workflowAggregateSeparator = exports.workflowAggregateOutputColumns = exports.workflowAggregateNeedsColumn = exports.workflowAggregateMaxGroups = exports.workflowAggregateJoinMaxLength = exports.workflowAggregateColumns = exports.WORKFLOW_AGGREGATE_MAX_SEPARATOR = exports.WORKFLOW_AGGREGATE_MAX_GROUPS = exports.WORKFLOW_AGGREGATE_MAX_GROUP_BY = exports.WORKFLOW_AGGREGATE_MAX_AGGREGATES = exports.WORKFLOW_AGGREGATE_JOIN_MAX_LENGTH = exports.WORKFLOW_AGGREGATE_JOIN_LENGTH_CEILING = exports.WORKFLOW_AGGREGATE_GROUPS_CEILING = exports.WORKFLOW_AGGREGATE_FUNCTIONS = exports.WORKFLOW_AGGREGATE_DEFAULT_SEPARATOR = exports.unreachableAggregateFunction = exports.isWorkflowAggregates = exports.isWorkflowAggregateFunction = exports.aggregateRefusals = exports.workflowRenameUnnamed = exports.renameColumnRefusals = exports.WORKFLOW_LOOKUP_UNMATCHED = exports.WORKFLOW_LOOKUP_MAX_REFERENCE_ROWS = exports.WORKFLOW_LOOKUP_MAX_FIELDS = exports.workflowLookupUnmatched = exports.workflowLookupKey = exports.workflowLookupColumns = exports.lookupConfigRefusals = exports.workflowRunOrder = exports.workflowNodeRuns = exports.workflowSourceObjectType = exports.workflowNarrowedTypes = exports.workflowKnownColumns = exports.workflowGraphHash = exports.workflowFilterMatches = exports.workflowFilterColumns = exports.workflowCallMode = exports.workflowRowY = exports.workflowColumnX = exports.WORKFLOW_STATUSES = exports.WORKFLOW_SKIP_REASONS = exports.WORKFLOW_ROW_GAP = exports.WORKFLOW_RENAME_UNNAMED = exports.WORKFLOW_RENAME_MAX_COLUMNS = exports.WORKFLOW_PREDICATE_KINDS = exports.WORKFLOW_NODE_WIDTH = exports.WORKFLOW_NODE_KINDS = exports.WORKFLOW_NODE_ID_PATTERN = void 0;
20
- exports.CATALOG_RESERVED_COLUMNS = exports.assertSafeIdentifier = exports.assertNoColumnCollisions = exports.StaticKeyPrincipalResolver = exports.readableObjectPage = exports.mayWrite = exports.mayRead = exports.maySeeClassification = exports.PRINCIPAL_ACTOR_SEPARATOR = exports.parsePrincipalId = exports.hasScope = exports.expandScopes = exports.delegatePrincipal = exports.composePrincipalId = exports.CATALOG_PRINCIPAL_RESOLVER = exports.traceOutcomeFilter = exports.supportsSavedQueryRevisions = exports.isWorkspaceStore = exports.isTraceStore = exports.isCatalogTraceOutcome = exports.embeddedVisualization = exports.CATALOG_WORKSPACE_STORE = exports.CATALOG_TRACE_STORE = exports.CATALOG_TRACE_OUTCOMES = exports.CATALOG_REVISION_LIMIT = exports.visibleToPrincipal = exports.searchCatalog = exports.maySearch = exports.emptySearch = exports.bestMatch = exports.MAX_SEARCH_LIMIT = exports.DEFAULT_SEARCH_LIMIT = exports.CatalogService = exports.transformShapeHint = exports.transformShape = exports.transformDeclaresModule = exports.SubprocessTransformRunner = exports.toCsv = exports.guardFormula = exports.csvLines = exports.csvCell = exports.QueryCache = exports.renameStagePayload = exports.isColumnarStageBatch = exports.encodeStageRows = exports.decodeStageRows = exports.classifyStagePayload = exports.STAGE_ENCODING_VERSION = exports.STAGE_ENCODING = exports.WorkflowAggregateError = void 0;
21
- exports.RequireScopes = exports.RequireHuman = exports.REQUIRES_HUMAN = exports.REQUIRED_SCOPES = exports.RELATION_KINDS = exports.isRelationKind = exports.MikroOrmReadStore = exports.UnsafeIdentifierError = exports.supportsSnapshotStreams = exports.supportsCarryForward = exports.physicalColumn = exports.outputAlias = exports.isWriteStore = exports.isSafeIdentifier = exports.isReservedColumn = exports.isCatalogStoreCapabilities = exports.findColumnCollisions = exports.supportsObjectFilters = exports.CatalogColumnCollisionError = exports.CATALOG_STORE = exports.CATALOG_SNAPSHOT_MODES = void 0;
17
+ exports.nodeKindIsReusable = exports.NODE_KIND_IS_REUSABLE = exports.isReusableNodeKind = exports.isReusableNodeBody = exports.describeVersionPin = exports.describeLiveVersion = exports.applyReusableNode = exports.supportsTransformStreaming = exports.supportsTransformRevisions = exports.supportsTransformPins = exports.supportsReusableNodes = exports.supportsLoadExpectations = exports.REDACTED_SECRET = exports.readWorkflowCallOutput = exports.unreachableSourceFormat = exports.SOURCE_FORMATS = exports.isTransformMode = exports.isTransformLanguage = exports.isSourceFormat = exports.isPipelineStore = exports.isConnectorKind = exports.callableWorkflowBlock = exports.CONNECTOR_KINDS = exports.catalogSnapshotRefusal = exports.CATALOG_SOURCE_TYPE_KEY = exports.CATALOG_SOURCE_SNAPSHOT_KEY = exports.CATALOG_SNAPSHOT_RESERVED_NAMES = exports.CODE_CONTEXT_CONTRACT = exports.CATALOG_PIPELINE_STORE = exports.CatalogRegistry = exports.MikroOrmCatalogRegistry = exports.CATALOG_OVERLAY_STORE = exports.InMemoryCatalogOverlayStore = exports.FileCatalogOverlayStore = exports.CATALOG_OPTIONS = exports.isStreamingQueryStore = exports.isQueryStore = exports.assertReadOnlyShape = exports.CatalogModule = exports.emitCatalog = exports.curationActor = exports.channelNameFor = exports.catalogEventPhase = exports.UNATTRIBUTED_PRINCIPAL_ID = exports.CATALOG_LIB = exports.CATALOG_EVENTS = exports.CATALOG_EVENT_PHASE_FALLBACK = exports.CATALOG_EVENT_PHASE = exports.CatalogType = exports.CatalogProperty = void 0;
18
+ exports.WORKFLOW_FILTER_OPERATORS = exports.WORKFLOW_FILTER_MAX_VALUES = exports.WORKFLOW_FILTER_MAX_DEPTH = exports.WORKFLOW_FILTER_COLUMN_PATTERN = exports.WORKFLOW_EXECUTION_MODES = exports.WORKFLOW_COLUMN_GAP = exports.WORKFLOW_CALL_MODES = exports.WORKFLOW_CALL_CONTRACT = exports.WORKFLOW_BRANCH_LABELS = exports.validateWorkflow = exports.unreachableRenameUnnamed = exports.unreachableLookupUnmatched = exports.unreachablePredicateKind = exports.unreachableNodeKind = exports.unreachableConnectorKind = exports.unreachableCallMode = exports.unreachableFilterPredicateKind = exports.unreachableTransformMode = exports.unreachableFilterOperator = exports.transformMode = exports.recordModeRefusal = exports.TRANSFORM_MODES = exports.TRANSFORM_LANGUAGES = exports.TRANSFORM_RUNNER = exports.supportsStagePayloads = exports.supportsWorkflowStages = exports.supportsWorkflows = exports.supportsWorkflowReleases = exports.liveWorkflowVersion = exports.isWorkflowStatus = exports.isWorkflowSkipReason = exports.isWorkflowRenameUnnamed = exports.isWorkflowRenameColumns = exports.isWorkflowLookupUnmatched = exports.isWorkflowLookupFields = exports.isWorkflowPredicateKind = exports.isWorkflowNodeKind = exports.isWorkflowCallMode = exports.isWorkflowNode = exports.isWorkflowIfPredicate = exports.isWorkflowFilterValue = exports.isWorkflowFilterPredicateKind = exports.isWorkflowFilterPredicate = exports.isWorkflowFilterOperator = exports.isWorkflowExecutionMode = exports.isWorkflowEdge = exports.isWorkflowBranchLabel = exports.unreachableReusableNodeKind = exports.reusableNodeBodyOf = exports.REUSABLE_NODE_KINDS = void 0;
19
+ exports.workflowAggregateNeedsColumn = exports.workflowAggregateMaxGroups = exports.workflowAggregateJoinMaxLength = exports.workflowAggregateColumns = exports.WORKFLOW_AGGREGATE_MAX_SEPARATOR = exports.WORKFLOW_AGGREGATE_MAX_GROUPS = exports.WORKFLOW_AGGREGATE_MAX_GROUP_BY = exports.WORKFLOW_AGGREGATE_MAX_AGGREGATES = exports.WORKFLOW_AGGREGATE_JOIN_MAX_LENGTH = exports.WORKFLOW_AGGREGATE_JOIN_LENGTH_CEILING = exports.WORKFLOW_AGGREGATE_GROUPS_CEILING = exports.WORKFLOW_AGGREGATE_FUNCTIONS = exports.WORKFLOW_AGGREGATE_DEFAULT_SEPARATOR = exports.unreachableAggregateFunction = exports.isWorkflowAggregates = exports.isWorkflowAggregateFunction = exports.aggregateRefusals = exports.workflowRenameUnnamed = exports.renameColumnRefusals = exports.WORKFLOW_LOOKUP_UNMATCHED = exports.WORKFLOW_LOOKUP_MAX_REFERENCE_ROWS = exports.WORKFLOW_LOOKUP_MAX_FIELDS = exports.workflowLookupUnmatched = exports.workflowLookupKey = exports.workflowLookupColumns = exports.lookupConfigRefusals = exports.workflowRunOrder = exports.workflowNodeRuns = exports.workflowSourceSnapshot = exports.workflowSourceObjectType = exports.workflowNarrowedTypes = exports.workflowKnownColumns = exports.workflowGraphHash = exports.workflowFilterMatches = exports.workflowFilterColumns = exports.workflowCallMode = exports.workflowRowY = exports.workflowColumnX = exports.WORKFLOW_STATUSES = exports.WORKFLOW_SKIP_REASONS = exports.WORKFLOW_ROW_GAP = exports.WORKFLOW_RENAME_UNNAMED = exports.WORKFLOW_RENAME_MAX_COLUMNS = exports.WORKFLOW_PREDICATE_KINDS = exports.WORKFLOW_NODE_WIDTH = exports.WORKFLOW_NODE_KINDS = exports.WORKFLOW_NODE_ID_PATTERN = exports.WORKFLOW_NODE_HEIGHT = exports.WORKFLOW_ISSUE_CODES = exports.WORKFLOW_FILTER_PREDICATE_KINDS = void 0;
20
+ exports.readableObjectPage = exports.mayWrite = exports.mayRead = exports.maySeeClassification = exports.PRINCIPAL_ACTOR_SEPARATOR = exports.parsePrincipalId = exports.hasScope = exports.expandScopes = exports.delegatePrincipal = exports.composePrincipalId = exports.CATALOG_PRINCIPAL_RESOLVER = exports.traceOutcomeFilter = exports.supportsSavedQueryRevisions = exports.isWorkspaceStore = exports.isTraceStore = exports.isCatalogTraceOutcome = exports.embeddedVisualization = exports.CATALOG_WORKSPACE_STORE = exports.CATALOG_TRACE_STORE = exports.CATALOG_TRACE_OUTCOMES = exports.CATALOG_REVISION_LIMIT = exports.visibleToPrincipal = exports.searchCatalog = exports.maySearch = exports.emptySearch = exports.bestMatch = exports.MAX_SEARCH_LIMIT = exports.DEFAULT_SEARCH_LIMIT = exports.CatalogService = exports.transformShapeHint = exports.transformShape = exports.transformDeclaresModule = exports.SubprocessTransformRunner = exports.toCsv = exports.guardFormula = exports.csvLines = exports.csvCell = exports.QueryCache = exports.renameStagePayload = exports.isColumnarStageBatch = exports.encodeStageRows = exports.decodeStageRows = exports.classifyStagePayload = exports.STAGE_ENCODING_VERSION = exports.STAGE_ENCODING = exports.WorkflowAggregateError = exports.aggregateInputColumns = exports.AggregateTable = exports.workflowAggregateSeparator = exports.workflowAggregateOutputColumns = void 0;
21
+ exports.RequireScopes = exports.RequireHuman = exports.REQUIRES_HUMAN = exports.REQUIRED_SCOPES = exports.RELATION_KINDS = exports.isRelationKind = exports.MikroOrmReadStore = exports.UnsafeIdentifierError = exports.supportsSnapshotStreams = exports.supportsSnapshotLookup = exports.supportsCarryForward = exports.physicalColumn = exports.outputAlias = exports.isWriteStore = exports.isSafeIdentifier = exports.isReservedColumn = exports.isCatalogStoreCapabilities = exports.findColumnCollisions = exports.supportsObjectFilters = exports.CatalogColumnCollisionError = exports.CATALOG_STORE = exports.CATALOG_SNAPSHOT_MODES = exports.CATALOG_RESERVED_COLUMNS = exports.assertSafeIdentifier = exports.assertNoColumnCollisions = exports.StaticKeyPrincipalResolver = void 0;
22
22
  var catalog_decorators_1 = require("./catalog.decorators");
23
23
  Object.defineProperty(exports, "CatalogProperty", { enumerable: true, get: function () { return catalog_decorators_1.CatalogProperty; } });
24
24
  Object.defineProperty(exports, "CatalogType", { enumerable: true, get: function () { return catalog_decorators_1.CatalogType; } });
@@ -60,7 +60,10 @@ Object.defineProperty(exports, "CatalogRegistry", { enumerable: true, get: funct
60
60
  var catalog_pipeline_1 = require("./catalog.pipeline");
61
61
  Object.defineProperty(exports, "CATALOG_PIPELINE_STORE", { enumerable: true, get: function () { return catalog_pipeline_1.CATALOG_PIPELINE_STORE; } });
62
62
  Object.defineProperty(exports, "CODE_CONTEXT_CONTRACT", { enumerable: true, get: function () { return catalog_pipeline_1.CODE_CONTEXT_CONTRACT; } });
63
+ Object.defineProperty(exports, "CATALOG_SNAPSHOT_RESERVED_NAMES", { enumerable: true, get: function () { return catalog_pipeline_1.CATALOG_SNAPSHOT_RESERVED_NAMES; } });
64
+ Object.defineProperty(exports, "CATALOG_SOURCE_SNAPSHOT_KEY", { enumerable: true, get: function () { return catalog_pipeline_1.CATALOG_SOURCE_SNAPSHOT_KEY; } });
63
65
  Object.defineProperty(exports, "CATALOG_SOURCE_TYPE_KEY", { enumerable: true, get: function () { return catalog_pipeline_1.CATALOG_SOURCE_TYPE_KEY; } });
66
+ Object.defineProperty(exports, "catalogSnapshotRefusal", { enumerable: true, get: function () { return catalog_pipeline_1.catalogSnapshotRefusal; } });
64
67
  Object.defineProperty(exports, "CONNECTOR_KINDS", { enumerable: true, get: function () { return catalog_pipeline_1.CONNECTOR_KINDS; } });
65
68
  Object.defineProperty(exports, "callableWorkflowBlock", { enumerable: true, get: function () { return catalog_pipeline_1.callableWorkflowBlock; } });
66
69
  Object.defineProperty(exports, "isConnectorKind", { enumerable: true, get: function () { return catalog_pipeline_1.isConnectorKind; } });
@@ -155,6 +158,7 @@ Object.defineProperty(exports, "workflowGraphHash", { enumerable: true, get: fun
155
158
  Object.defineProperty(exports, "workflowKnownColumns", { enumerable: true, get: function () { return catalog_pipeline_1.workflowKnownColumns; } });
156
159
  Object.defineProperty(exports, "workflowNarrowedTypes", { enumerable: true, get: function () { return catalog_pipeline_1.workflowNarrowedTypes; } });
157
160
  Object.defineProperty(exports, "workflowSourceObjectType", { enumerable: true, get: function () { return catalog_pipeline_1.workflowSourceObjectType; } });
161
+ Object.defineProperty(exports, "workflowSourceSnapshot", { enumerable: true, get: function () { return catalog_pipeline_1.workflowSourceSnapshot; } });
158
162
  Object.defineProperty(exports, "workflowNodeRuns", { enumerable: true, get: function () { return catalog_pipeline_1.workflowNodeRuns; } });
159
163
  Object.defineProperty(exports, "workflowRunOrder", { enumerable: true, get: function () { return catalog_pipeline_1.workflowRunOrder; } });
160
164
  // The lookup vocabulary. `workflowLookupKey` is exported because it is the one
@@ -306,6 +310,7 @@ Object.defineProperty(exports, "isWriteStore", { enumerable: true, get: function
306
310
  Object.defineProperty(exports, "outputAlias", { enumerable: true, get: function () { return catalog_store_1.outputAlias; } });
307
311
  Object.defineProperty(exports, "physicalColumn", { enumerable: true, get: function () { return catalog_store_1.physicalColumn; } });
308
312
  Object.defineProperty(exports, "supportsCarryForward", { enumerable: true, get: function () { return catalog_store_1.supportsCarryForward; } });
313
+ Object.defineProperty(exports, "supportsSnapshotLookup", { enumerable: true, get: function () { return catalog_store_1.supportsSnapshotLookup; } });
309
314
  Object.defineProperty(exports, "supportsSnapshotStreams", { enumerable: true, get: function () { return catalog_store_1.supportsSnapshotStreams; } });
310
315
  Object.defineProperty(exports, "UnsafeIdentifierError", { enumerable: true, get: function () { return catalog_store_1.UnsafeIdentifierError; } });
311
316
  var mikro_orm_read_store_1 = require("./stores/mikro-orm-read.store");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dudousxd/nestjs-catalog",
3
- "version": "0.30.0",
3
+ "version": "0.32.0",
4
4
  "description": "A metadata registry for NestJS: object types, properties and relations, derived from your ORM and enriched with decorators.",
5
5
  "license": "MIT",
6
6
  "author": "Davide Carvalho",