@narrative.io/data-collaboration-sdk-ts 2.64.0 → 2.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/collaboration-policy/core/filter-builder.d.ts +3 -0
- package/build/collaboration-policy/core/filter-builder.js +90 -0
- package/build/collaboration-policy/core/filter-utils.d.ts +6 -0
- package/build/collaboration-policy/core/filter-utils.js +49 -0
- package/build/collaboration-policy/core/policy-traverser.d.ts +4 -0
- package/build/collaboration-policy/core/policy-traverser.js +96 -0
- package/build/collaboration-policy/core/policy-validator.d.ts +11 -0
- package/build/collaboration-policy/core/policy-validator.js +148 -0
- package/build/collaboration-policy/core/sql-builder.d.ts +37 -0
- package/build/collaboration-policy/core/sql-builder.js +173 -0
- package/build/collaboration-policy/core/types.d.ts +24 -0
- package/build/collaboration-policy/core/types.js +1 -0
- package/build/collaboration-policy/index.d.ts +4 -0
- package/build/collaboration-policy/index.js +3 -0
- package/build/collaboration-policy/scripts/generate-policy-schema.d.ts +2 -0
- package/build/collaboration-policy/scripts/generate-policy-schema.js +4 -0
- package/build/collaboration-policy/types/collaboration-policy.d.ts +697 -0
- package/build/collaboration-policy/types/collaboration-policy.js +262 -0
- package/build/collaboration-policy/types/index.d.ts +2 -0
- package/build/collaboration-policy/types/index.js +1 -0
- package/build/collaboration-policy/useCollaborationPolicy.d.ts +8 -0
- package/build/collaboration-policy/useCollaborationPolicy.js +14 -0
- package/build/collaboration-policy/utils/path-helpers.d.ts +4 -0
- package/build/collaboration-policy/utils/path-helpers.js +36 -0
- package/build/collaboration-policy/utils/sql-helpers.d.ts +5 -0
- package/build/collaboration-policy/utils/sql-helpers.js +65 -0
- package/build/datasets/index.d.ts +4 -3
- package/build/datasets/index.js +2 -2
- package/build/index.d.ts +1 -0
- package/build/index.js +1 -0
- package/build/jobs/index.d.ts +3 -0
- package/build/jobs/types.d.ts +7 -0
- package/build/nql/AstParser.js +5 -4
- package/build/nql/NqlBuilder.js +1 -1
- package/build/nql/types.d.ts +13 -0
- package/package.json +11 -11
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import * as z from "zod/v4";
|
|
2
|
+
/** Branded types */
|
|
3
|
+
const CollaborationPolicyIdentifier = z
|
|
4
|
+
.string()
|
|
5
|
+
.regex(/^[a-zA-Z0-9_-]+$/)
|
|
6
|
+
.brand("CollaborationPolicyId")
|
|
7
|
+
.meta({
|
|
8
|
+
id: "collaboration_policy_identifier",
|
|
9
|
+
});
|
|
10
|
+
/** Refresh Schedule Schema */
|
|
11
|
+
const RefreshScheduleSchema = z
|
|
12
|
+
.object({
|
|
13
|
+
max: z.union([
|
|
14
|
+
z.enum(["@hourly", "@daily", "@weekly", "@monthly", "@once"]),
|
|
15
|
+
z
|
|
16
|
+
.string()
|
|
17
|
+
.regex(/^([0-5]?[0-9]|\*) ([01]?[0-9]|2[0-3]|\*) ([0-2]?[0-9]|3[01]|\*) ([0]?[1-9]|1[0-2]|\*) ([0-6]|\*)$/, "Invalid cron expression"),
|
|
18
|
+
]),
|
|
19
|
+
})
|
|
20
|
+
.strict()
|
|
21
|
+
.meta({
|
|
22
|
+
id: "refresh_schedule",
|
|
23
|
+
});
|
|
24
|
+
const CollaborationPolicyDefinitionMetadataSchema = z
|
|
25
|
+
.object({
|
|
26
|
+
tags: z.array(z.string().regex(/^[a-zA-Z0-9_-]+$/)).optional(),
|
|
27
|
+
refresh_schedule: RefreshScheduleSchema.optional(),
|
|
28
|
+
})
|
|
29
|
+
.meta({ id: "metadata" });
|
|
30
|
+
const JsonPointerSchema = z
|
|
31
|
+
.string()
|
|
32
|
+
.regex(/^(#\/|\/).+/, 'JSON Pointer must start with "/" or "#/".')
|
|
33
|
+
.meta({ id: "json-pointer" });
|
|
34
|
+
/** Path can be dot-style or JSON Pointer */
|
|
35
|
+
const PathSchema = z
|
|
36
|
+
.union([
|
|
37
|
+
z
|
|
38
|
+
.object({
|
|
39
|
+
dot: z.string().min(1, "Dot path cannot be empty"),
|
|
40
|
+
})
|
|
41
|
+
.strict(),
|
|
42
|
+
z
|
|
43
|
+
.object({
|
|
44
|
+
pointer: JsonPointerSchema,
|
|
45
|
+
})
|
|
46
|
+
.strict(),
|
|
47
|
+
])
|
|
48
|
+
.meta({ id: "path" });
|
|
49
|
+
/** ---------------------------
|
|
50
|
+
* Base + contextual variants
|
|
51
|
+
* --------------------------*/
|
|
52
|
+
/**
|
|
53
|
+
* BaseAttributeRef:
|
|
54
|
+
* - supports either `attribute_name` (by name) OR `attribute` (by pointer), not both
|
|
55
|
+
* - includes both `additional_required_properties` and `path` (context will prune)
|
|
56
|
+
*/
|
|
57
|
+
const BaseAttributeRef = z
|
|
58
|
+
.object({
|
|
59
|
+
type: z.literal("attribute").meta({ id: "field_type" }),
|
|
60
|
+
// Choose ONE of these identifiers:
|
|
61
|
+
attribute_name: z.string().meta({ id: "attribute_name" }),
|
|
62
|
+
// Context-specific fields (trim in the derived schemas):
|
|
63
|
+
additional_required_properties: z
|
|
64
|
+
.array(PathSchema)
|
|
65
|
+
.optional()
|
|
66
|
+
.meta({ id: "additional_required_properties" }),
|
|
67
|
+
path: PathSchema.optional(),
|
|
68
|
+
})
|
|
69
|
+
.strict()
|
|
70
|
+
.meta({ id: "attribute_reference" });
|
|
71
|
+
/**
|
|
72
|
+
* StructureAttributeRef:
|
|
73
|
+
* - used in your “structure” (the logical tree)
|
|
74
|
+
* - allows: attribute_name + additional_required_properties
|
|
75
|
+
* - forbids: path, attribute (pointer)
|
|
76
|
+
* Example target:
|
|
77
|
+
* field: {
|
|
78
|
+
* type: "attribute",
|
|
79
|
+
* attribute_name: "sha256_hashed_email",
|
|
80
|
+
* additional_required_properties: [{ dot: "type" }],
|
|
81
|
+
* }
|
|
82
|
+
*/
|
|
83
|
+
const StructureAttributeRef = BaseAttributeRef.omit({
|
|
84
|
+
path: true,
|
|
85
|
+
}).meta({ id: "structure_attribute_reference" });
|
|
86
|
+
/**
|
|
87
|
+
* FilterAttributeRef:
|
|
88
|
+
* - used inside filters
|
|
89
|
+
* - allows: attribute (pointer) + optional path
|
|
90
|
+
* - forbids: additional_required_properties, attribute_name
|
|
91
|
+
* Example target:
|
|
92
|
+
* left: {
|
|
93
|
+
* type: "attribute",
|
|
94
|
+
* attribute: "https://api.narrative.io/attributes/iso_3166_1_country",
|
|
95
|
+
* path: { dot: "value" },
|
|
96
|
+
* }
|
|
97
|
+
*/
|
|
98
|
+
const FilterAttributeRef = BaseAttributeRef.omit({
|
|
99
|
+
additional_required_properties: true,
|
|
100
|
+
}).meta({ id: "filter_attribute_reference" });
|
|
101
|
+
// Now Expression can reference Filter without a lazy;
|
|
102
|
+
// the recursive bits inside Filter are handled by getters.
|
|
103
|
+
const Expression = z
|
|
104
|
+
.union([
|
|
105
|
+
z
|
|
106
|
+
.string()
|
|
107
|
+
.refine((s) => !s.startsWith("https://api.narrative.io/attributes/"), "String expression cannot be a JSON pointer; use { type:'attribute', attribute: ... }"),
|
|
108
|
+
z.number(),
|
|
109
|
+
z.boolean(),
|
|
110
|
+
FilterAttributeRef,
|
|
111
|
+
])
|
|
112
|
+
.meta({ id: "expression" });
|
|
113
|
+
const FilterAndOr = z
|
|
114
|
+
.object({
|
|
115
|
+
op: z.enum(["and", "or"]),
|
|
116
|
+
stage: z.literal("generation").default("generation"),
|
|
117
|
+
name: z.string().optional(),
|
|
118
|
+
required: z.boolean().default(true),
|
|
119
|
+
get args() {
|
|
120
|
+
return z.array(Expression).min(2);
|
|
121
|
+
},
|
|
122
|
+
})
|
|
123
|
+
.strict();
|
|
124
|
+
const FilterNot = z
|
|
125
|
+
.object({
|
|
126
|
+
op: z.literal("not"),
|
|
127
|
+
stage: z.literal("generation").default("generation"),
|
|
128
|
+
name: z.string().optional(),
|
|
129
|
+
required: z.boolean().default(true),
|
|
130
|
+
get args() {
|
|
131
|
+
return z.array(Expression).length(1);
|
|
132
|
+
},
|
|
133
|
+
})
|
|
134
|
+
.strict();
|
|
135
|
+
const FilterIsNull = z
|
|
136
|
+
.object({
|
|
137
|
+
op: z.enum(["is_null", "is_not_null"]),
|
|
138
|
+
stage: z.literal("generation").default("generation"),
|
|
139
|
+
name: z.string().optional(),
|
|
140
|
+
required: z.boolean().default(true),
|
|
141
|
+
get left() {
|
|
142
|
+
return Expression;
|
|
143
|
+
},
|
|
144
|
+
})
|
|
145
|
+
.strict();
|
|
146
|
+
const FilterIn = z
|
|
147
|
+
.object({
|
|
148
|
+
op: z.enum(["in", "not in"]),
|
|
149
|
+
stage: z.literal("generation").default("generation"),
|
|
150
|
+
name: z.string().optional(),
|
|
151
|
+
required: z.boolean().default(true),
|
|
152
|
+
get left() {
|
|
153
|
+
return Expression;
|
|
154
|
+
},
|
|
155
|
+
get right() {
|
|
156
|
+
return z.array(Expression).min(1);
|
|
157
|
+
},
|
|
158
|
+
})
|
|
159
|
+
.strict();
|
|
160
|
+
const FilterCompare = z
|
|
161
|
+
.object({
|
|
162
|
+
op: z.enum(["=", "<>", ">", ">=", "<", "<=", "like", "not like"]),
|
|
163
|
+
stage: z.literal("generation").default("generation"),
|
|
164
|
+
name: z.string().optional(),
|
|
165
|
+
required: z.boolean().default(true),
|
|
166
|
+
get left() {
|
|
167
|
+
return Expression;
|
|
168
|
+
},
|
|
169
|
+
get right() {
|
|
170
|
+
return Expression;
|
|
171
|
+
},
|
|
172
|
+
})
|
|
173
|
+
.strict();
|
|
174
|
+
const FilterBetween = z
|
|
175
|
+
.object({
|
|
176
|
+
op: z.literal("between"),
|
|
177
|
+
stage: z.literal("generation").default("generation"),
|
|
178
|
+
name: z.string().optional(),
|
|
179
|
+
required: z.boolean().default(true),
|
|
180
|
+
get operand() {
|
|
181
|
+
return Expression;
|
|
182
|
+
},
|
|
183
|
+
get lower() {
|
|
184
|
+
return Expression;
|
|
185
|
+
},
|
|
186
|
+
get upper() {
|
|
187
|
+
return Expression;
|
|
188
|
+
},
|
|
189
|
+
})
|
|
190
|
+
.strict();
|
|
191
|
+
const Filter = z
|
|
192
|
+
.union([
|
|
193
|
+
FilterAndOr,
|
|
194
|
+
FilterNot,
|
|
195
|
+
FilterIsNull,
|
|
196
|
+
FilterIn,
|
|
197
|
+
FilterCompare,
|
|
198
|
+
FilterBetween,
|
|
199
|
+
])
|
|
200
|
+
.meta({ id: "filter" });
|
|
201
|
+
const logicalTree = (leaf) => {
|
|
202
|
+
const NodeSchema = z.lazy(() => z
|
|
203
|
+
.union([
|
|
204
|
+
z
|
|
205
|
+
.object({
|
|
206
|
+
anyOf: z
|
|
207
|
+
.array(z.union([leaf, NodeSchema]))
|
|
208
|
+
.min(1)
|
|
209
|
+
.meta({ id: "any_of" }),
|
|
210
|
+
})
|
|
211
|
+
.strict()
|
|
212
|
+
.meta({ id: "any_of_object" }),
|
|
213
|
+
z
|
|
214
|
+
.object({
|
|
215
|
+
allOf: z
|
|
216
|
+
.array(z.union([leaf, NodeSchema]))
|
|
217
|
+
.min(1)
|
|
218
|
+
.meta({ id: "all_of" }),
|
|
219
|
+
})
|
|
220
|
+
.strict()
|
|
221
|
+
.meta({ id: "all_of_object" }),
|
|
222
|
+
])
|
|
223
|
+
.meta({ id: "logical_node" }));
|
|
224
|
+
// Top-level can be a leaf T or a logical node.
|
|
225
|
+
return z.union([leaf, NodeSchema]).meta({ id: "logical_tree" });
|
|
226
|
+
};
|
|
227
|
+
const ExtendedAttribute = z
|
|
228
|
+
.object({
|
|
229
|
+
field: StructureAttributeRef,
|
|
230
|
+
filters: z.array(Filter).optional(),
|
|
231
|
+
})
|
|
232
|
+
.meta({ id: "extended_attribute" });
|
|
233
|
+
const CollaborationPolicyDefinitionShape = z
|
|
234
|
+
.object({
|
|
235
|
+
id: CollaborationPolicyIdentifier,
|
|
236
|
+
structure: logicalTree(ExtendedAttribute).meta({ id: "structure" }),
|
|
237
|
+
filters: z.array(Filter).optional(),
|
|
238
|
+
})
|
|
239
|
+
.meta({ id: "shape" });
|
|
240
|
+
const CollaborationPolicyDefinition = z
|
|
241
|
+
.object({
|
|
242
|
+
metadata: CollaborationPolicyDefinitionMetadataSchema,
|
|
243
|
+
definition: CollaborationPolicyDefinitionShape,
|
|
244
|
+
})
|
|
245
|
+
.meta({ id: "policy_definition" });
|
|
246
|
+
const CollaborationPolicy = z
|
|
247
|
+
.object({
|
|
248
|
+
name: CollaborationPolicyIdentifier,
|
|
249
|
+
description: z.string().max(2000).optional(),
|
|
250
|
+
display_name: z.string().max(255),
|
|
251
|
+
policy: CollaborationPolicyDefinition,
|
|
252
|
+
})
|
|
253
|
+
.meta({ id: "policy" });
|
|
254
|
+
// Export the schema for validation
|
|
255
|
+
export { CollaborationPolicy };
|
|
256
|
+
export function buildCollaborationPolicyJsonSchema(options = {}) {
|
|
257
|
+
const override = (options ?? {});
|
|
258
|
+
return z.toJSONSchema(CollaborationPolicy, {
|
|
259
|
+
reused: "ref",
|
|
260
|
+
...override,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { buildCollaborationPolicyJsonSchema, CollaborationPolicy, } from "./collaboration-policy";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Attribute } from "../attributes/types";
|
|
2
|
+
import type { Dataset } from "../datasets/types";
|
|
3
|
+
import type { PolicySqlFragments } from "./core/types";
|
|
4
|
+
import type { CollaborationPolicyType } from "./types";
|
|
5
|
+
export default function useCollaborationPolicy(): {
|
|
6
|
+
getEligibleConnectorsPolicies: (dataset: Dataset, policies: CollaborationPolicyType[], attributes: Attribute[]) => CollaborationPolicyType[];
|
|
7
|
+
buildPolicySqlFragments: (dataset: Dataset, policies: CollaborationPolicyType[], attributes: Attribute[]) => PolicySqlFragments;
|
|
8
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { buildPolicySql, categorizePolicies } from "./core/sql-builder";
|
|
2
|
+
export default function useCollaborationPolicy() {
|
|
3
|
+
const getEligibleConnectorsPolicies = (dataset, policies, attributes) => {
|
|
4
|
+
const { matching } = categorizePolicies(policies, dataset, attributes);
|
|
5
|
+
return matching;
|
|
6
|
+
};
|
|
7
|
+
const buildPolicySqlFragments = (dataset, policies, attributes) => {
|
|
8
|
+
return buildPolicySql(dataset, policies, attributes);
|
|
9
|
+
};
|
|
10
|
+
return {
|
|
11
|
+
getEligibleConnectorsPolicies,
|
|
12
|
+
buildPolicySqlFragments,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Attribute } from "../../attributes/types";
|
|
2
|
+
import type { AttributePathIndex, PathValue } from "../core/types";
|
|
3
|
+
export declare function markAttributePath(index: AttributePathIndex, attribute: Attribute, path: string): void;
|
|
4
|
+
export declare function normalizePathValue(path?: PathValue): string;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function markAttributePath(index, attribute, path) {
|
|
2
|
+
const attributePaths = index.get(attribute.name) ?? new Set();
|
|
3
|
+
const normalized = path || determineDefaultPath(attribute);
|
|
4
|
+
attributePaths.add(normalized);
|
|
5
|
+
index.set(attribute.name, attributePaths);
|
|
6
|
+
}
|
|
7
|
+
function determineDefaultPath(attribute) {
|
|
8
|
+
if (attribute.type === "object" && "properties" in attribute) {
|
|
9
|
+
const properties = attribute.properties ?? {};
|
|
10
|
+
if ("value" in properties) {
|
|
11
|
+
return "value";
|
|
12
|
+
}
|
|
13
|
+
const [firstKey] = Object.keys(properties);
|
|
14
|
+
if (firstKey) {
|
|
15
|
+
return firstKey;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return "";
|
|
19
|
+
}
|
|
20
|
+
export function normalizePathValue(path) {
|
|
21
|
+
if (!path) {
|
|
22
|
+
return "";
|
|
23
|
+
}
|
|
24
|
+
if ("dot" in path) {
|
|
25
|
+
return path.dot;
|
|
26
|
+
}
|
|
27
|
+
const pointer = path.pointer;
|
|
28
|
+
let trimmed = pointer.startsWith("#/") ? pointer.slice(2) : pointer;
|
|
29
|
+
if (trimmed.startsWith("/")) {
|
|
30
|
+
trimmed = trimmed.slice(1);
|
|
31
|
+
}
|
|
32
|
+
const parts = trimmed
|
|
33
|
+
.split("/")
|
|
34
|
+
.map((segment) => segment.replace(/~1/g, "/").replace(/~0/g, "~"));
|
|
35
|
+
return parts.join(".");
|
|
36
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Attribute } from "../../attributes/types";
|
|
2
|
+
export declare function resolveAttributeExpression(attribute: Attribute, path: string, datasetName: string): string;
|
|
3
|
+
export declare function buildSelectAlias(attributeName: string, path: string): string;
|
|
4
|
+
export declare function buildPolicyWhereGroups(policyWhereClauses: string[][]): string[];
|
|
5
|
+
export declare function formatWhereClause(policyWhereClauses: string[][]): string;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export function resolveAttributeExpression(attribute, path, datasetName) {
|
|
2
|
+
// Use standardized company_data format with proper SQL identifier quoting
|
|
3
|
+
const quotedDatasetName = quoteIdentifier(datasetName);
|
|
4
|
+
const quotedRosettaStone = quoteIdentifier("_rosetta_stone");
|
|
5
|
+
const quotedAttributeName = quoteIdentifier(attribute.name);
|
|
6
|
+
const basePath = `company_data.${quotedDatasetName}.${quotedRosettaStone}.${quotedAttributeName}`;
|
|
7
|
+
if (!path) {
|
|
8
|
+
return basePath;
|
|
9
|
+
}
|
|
10
|
+
// Handle different path formats and quote each path segment
|
|
11
|
+
let pathSegments;
|
|
12
|
+
if (path.includes(".")) {
|
|
13
|
+
// Already dot notation (e.g., "some.nested.path")
|
|
14
|
+
pathSegments = path.split(".");
|
|
15
|
+
}
|
|
16
|
+
else if (path.includes("/")) {
|
|
17
|
+
// JSON pointer format was normalized but still has slashes
|
|
18
|
+
// This shouldn't happen after normalizePathValue, but handle it just in case
|
|
19
|
+
pathSegments = path.split("/");
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
// Simple property name (e.g., "value", "type")
|
|
23
|
+
pathSegments = [path];
|
|
24
|
+
}
|
|
25
|
+
// Quote each path segment and join with dots
|
|
26
|
+
const quotedPathSegments = pathSegments
|
|
27
|
+
.filter((segment) => segment.length > 0)
|
|
28
|
+
.map((segment) => quoteIdentifier(segment));
|
|
29
|
+
return `${basePath}.${quotedPathSegments.join(".")}`;
|
|
30
|
+
}
|
|
31
|
+
export function buildSelectAlias(attributeName, path) {
|
|
32
|
+
if (!path) {
|
|
33
|
+
return quoteIdentifier(attributeName);
|
|
34
|
+
}
|
|
35
|
+
const suffix = path.replace(/[^a-zA-Z0-9]+/g, "_");
|
|
36
|
+
return quoteIdentifier(`${attributeName}_${suffix}`);
|
|
37
|
+
}
|
|
38
|
+
export function buildPolicyWhereGroups(policyWhereClauses) {
|
|
39
|
+
const groups = [];
|
|
40
|
+
for (const clauses of policyWhereClauses) {
|
|
41
|
+
if (clauses.length === 0) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const firstClause = clauses[0];
|
|
45
|
+
if (firstClause === undefined) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
groups.push(clauses.length === 1 ? firstClause : `(${clauses.join(" AND ")})`);
|
|
49
|
+
}
|
|
50
|
+
return groups;
|
|
51
|
+
}
|
|
52
|
+
export function formatWhereClause(policyWhereClauses) {
|
|
53
|
+
const groups = buildPolicyWhereGroups(policyWhereClauses);
|
|
54
|
+
if (groups.length === 0) {
|
|
55
|
+
return "";
|
|
56
|
+
}
|
|
57
|
+
if (groups.length === 1) {
|
|
58
|
+
return `\nWHERE\n ${groups[0]}`;
|
|
59
|
+
}
|
|
60
|
+
return `\nWHERE\n ${groups.join(" OR\n ")}`;
|
|
61
|
+
}
|
|
62
|
+
function quoteIdentifier(identifier) {
|
|
63
|
+
const safe = identifier.replace(/"/g, "");
|
|
64
|
+
return `"${safe}"`;
|
|
65
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { UnknownJob } from "src/jobs/types";
|
|
1
2
|
import { BaseApi } from "../base-api";
|
|
2
3
|
import type { ApiRecords } from "../types";
|
|
3
4
|
import type { AdvancedStatistics, AdvancedStatisticsMetadata, BasicStatistics, ColumnStatistics, ColumnSummary, Columns, Configuration, CreateDatasetRefreshScheduleRequest, CreateDatasetRequest, Dataset, DatasetStatus, DatasetTableSummary, DatasetTableSummaryAPIResponse, DatasetWriteMode, FilePerSnapshotResponse, Histogram, IngestDatasetFileRequest, RecalculationInfo, RetentionPolicy, Schema, SchemaArrayItems, SchemaArrayItemsArray, SchemaArrayItemsObject, SchemaArrayItemsPrimitive, SchemaArrayProperty, SchemaFileConfig, SchemaFileConfigType, SchemaObjectProperty, SchemaPrimitiveProperty, SchemaProperties, SchemaPropertiesType, SchemaProperty, SnapshotRange, UpdateDatasetRefreshScheduleRequest, UpdateDatasetRequest, Value } from "./types";
|
|
@@ -178,15 +179,15 @@ export declare class DatasetApi extends BaseApi {
|
|
|
178
179
|
*/
|
|
179
180
|
deleteDatasetSample(datasetId: number): Promise<void>;
|
|
180
181
|
/**
|
|
181
|
-
* Refreshes the
|
|
182
|
+
* Refreshes the materialized view for the given dataset id.
|
|
182
183
|
*
|
|
183
184
|
* @param {number} datasetId - The ID of the dataset for which to refresh the materialized view.
|
|
184
|
-
* @returns {Promise<
|
|
185
|
+
* @returns {Promise<UnknownJob>} A Promise that resolves with a job object to track the refresh operation.
|
|
185
186
|
* @throws {Error} If there is an issue with the request or the response.
|
|
186
187
|
* @memberof DatasetApi
|
|
187
188
|
* @public
|
|
188
189
|
*/
|
|
189
|
-
refreshMaterializedView(datasetId: number): Promise<
|
|
190
|
+
refreshMaterializedView(datasetId: number): Promise<UnknownJob>;
|
|
190
191
|
createDatasetRefreshSchedule(datasetId: number, refreshSchedule: CreateDatasetRefreshScheduleRequest): Promise<void>;
|
|
191
192
|
updateDatasetRefreshSchedule(datasetId: number, refreshSchedule: UpdateDatasetRefreshScheduleRequest): Promise<void>;
|
|
192
193
|
deleteDatasetRefreshSchedule(datasetId: number): Promise<void>;
|
package/build/datasets/index.js
CHANGED
|
@@ -217,10 +217,10 @@ export class DatasetApi extends BaseApi {
|
|
|
217
217
|
await this.delete(`${resourceName}/${datasetId}/sample`);
|
|
218
218
|
}
|
|
219
219
|
/**
|
|
220
|
-
* Refreshes the
|
|
220
|
+
* Refreshes the materialized view for the given dataset id.
|
|
221
221
|
*
|
|
222
222
|
* @param {number} datasetId - The ID of the dataset for which to refresh the materialized view.
|
|
223
|
-
* @returns {Promise<
|
|
223
|
+
* @returns {Promise<UnknownJob>} A Promise that resolves with a job object to track the refresh operation.
|
|
224
224
|
* @throws {Error} If there is an issue with the request or the response.
|
|
225
225
|
* @memberof DatasetApi
|
|
226
226
|
* @public
|
package/build/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export type { App } from "./apps";
|
|
|
5
5
|
export * from "./attributes";
|
|
6
6
|
export * from "./authentication";
|
|
7
7
|
export * from "./base-api";
|
|
8
|
+
export * from "./collaboration-policy";
|
|
8
9
|
export * from "./company-info";
|
|
9
10
|
export * from "./connections";
|
|
10
11
|
export * from "./contracts";
|
package/build/index.js
CHANGED
|
@@ -5,6 +5,7 @@ export { resources } from "./access-tokens/types";
|
|
|
5
5
|
export * from "./attributes";
|
|
6
6
|
export * from "./authentication";
|
|
7
7
|
export * from "./base-api";
|
|
8
|
+
export * from "./collaboration-policy";
|
|
8
9
|
export * from "./company-info";
|
|
9
10
|
export * from "./connections";
|
|
10
11
|
export * from "./contracts";
|
package/build/jobs/index.d.ts
CHANGED
|
@@ -5,6 +5,9 @@ interface GetJobsParameters extends Record<string, string | number | boolean | u
|
|
|
5
5
|
dataset_id?: number;
|
|
6
6
|
per_page?: number;
|
|
7
7
|
offset?: number;
|
|
8
|
+
order_by?: "created_at_asc" | "created_at_desc";
|
|
9
|
+
state?: "cancelled" | "completed" | "failed" | "pending" | "pending_cancellation" | "running";
|
|
10
|
+
type?: string;
|
|
8
11
|
}
|
|
9
12
|
/**
|
|
10
13
|
* @module JobsApi
|
package/build/jobs/types.d.ts
CHANGED
|
@@ -58,6 +58,13 @@ export interface MaterializedViewInput {
|
|
|
58
58
|
budget: NqlBudget;
|
|
59
59
|
dataset_id: number;
|
|
60
60
|
stats_enabled: boolean;
|
|
61
|
+
chunk_metadata?: {
|
|
62
|
+
batch_id: string;
|
|
63
|
+
chunk_sequence: {
|
|
64
|
+
number: number;
|
|
65
|
+
of: number;
|
|
66
|
+
};
|
|
67
|
+
};
|
|
61
68
|
}
|
|
62
69
|
export interface MaterializedViewOutput {
|
|
63
70
|
success: {
|
package/build/nql/AstParser.js
CHANGED
|
@@ -196,8 +196,8 @@ function parseColumnRef(n) {
|
|
|
196
196
|
return attrRef;
|
|
197
197
|
}
|
|
198
198
|
if (n.schema === "company_data" &&
|
|
199
|
-
!Number.isNaN(Number.parseInt(n.table))) {
|
|
200
|
-
const datasetId = Number.parseInt(n.table);
|
|
199
|
+
!Number.isNaN(Number.parseInt(n.table, 10))) {
|
|
200
|
+
const datasetId = Number.parseInt(n.table, 10);
|
|
201
201
|
const datasetColumnRef = {
|
|
202
202
|
type: "dataset_column_ref",
|
|
203
203
|
as: n.as,
|
|
@@ -442,8 +442,9 @@ function parseTable(n) {
|
|
|
442
442
|
};
|
|
443
443
|
return table;
|
|
444
444
|
}
|
|
445
|
-
if (n.schema === "company_data" &&
|
|
446
|
-
|
|
445
|
+
if (n.schema === "company_data" &&
|
|
446
|
+
!Number.isNaN(Number.parseInt(n.table, 10))) {
|
|
447
|
+
const datasetId = Number.parseInt(n.table, 10);
|
|
447
448
|
const table = {
|
|
448
449
|
type: "dataset",
|
|
449
450
|
as: n.as,
|
package/build/nql/NqlBuilder.js
CHANGED
|
@@ -331,7 +331,7 @@ function compileLit(value, valueType, as, aliasParens) {
|
|
|
331
331
|
break;
|
|
332
332
|
}
|
|
333
333
|
case "long":
|
|
334
|
-
valueNql = `${Number.parseInt(value)}`;
|
|
334
|
+
valueNql = `${Number.parseInt(value, 10)}`;
|
|
335
335
|
break;
|
|
336
336
|
case "double":
|
|
337
337
|
valueNql = `${Number.parseFloat(value)}`;
|
package/build/nql/types.d.ts
CHANGED
|
@@ -293,6 +293,18 @@ export declare const NqlObj: z.ZodObject<{
|
|
|
293
293
|
join: z.ZodUndefined;
|
|
294
294
|
}, z.core.$strip>;
|
|
295
295
|
export type Nql = z.infer<typeof NqlObj>;
|
|
296
|
+
export interface RelatedJob {
|
|
297
|
+
id: string;
|
|
298
|
+
number: number;
|
|
299
|
+
idempotency_key: string;
|
|
300
|
+
state: string;
|
|
301
|
+
compiled_select: string;
|
|
302
|
+
}
|
|
303
|
+
export interface BatchInfo {
|
|
304
|
+
batch_id: string;
|
|
305
|
+
batch_size: number;
|
|
306
|
+
related_jobs: RelatedJob[];
|
|
307
|
+
}
|
|
296
308
|
export interface NqlResult {
|
|
297
309
|
id: string;
|
|
298
310
|
company_id: number;
|
|
@@ -318,6 +330,7 @@ export interface NqlResult {
|
|
|
318
330
|
};
|
|
319
331
|
state: string;
|
|
320
332
|
updated_at: string;
|
|
333
|
+
chunking_context?: BatchInfo;
|
|
321
334
|
}
|
|
322
335
|
export type NqlMappingErrors = Record<number, string>;
|
|
323
336
|
export interface NqlCompileResult {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@narrative.io/data-collaboration-sdk-ts",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.65.0",
|
|
4
4
|
"main": "build/index.js",
|
|
5
5
|
"repository": "github:narrative-io/data-collaboration-sdk-ts",
|
|
6
6
|
"source": "src/index.ts",
|
|
@@ -20,21 +20,21 @@
|
|
|
20
20
|
"author": "",
|
|
21
21
|
"license": "ISC",
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"@babel/core": "7.28.
|
|
24
|
-
"@babel/preset-env": "7.28.
|
|
23
|
+
"@babel/core": "7.28.3",
|
|
24
|
+
"@babel/preset-env": "7.28.3",
|
|
25
25
|
"@babel/preset-typescript": "7.27.1",
|
|
26
|
-
"@biomejs/biome": "2.
|
|
27
|
-
"@commitlint/cli": "
|
|
28
|
-
"@commitlint/config-conventional": "
|
|
26
|
+
"@biomejs/biome": "2.2.2",
|
|
27
|
+
"@commitlint/cli": "20.0.0",
|
|
28
|
+
"@commitlint/config-conventional": "20.0.0",
|
|
29
29
|
"@types/jest": "30.0.0",
|
|
30
|
-
"babel-jest": "30.0
|
|
31
|
-
"jest": "30.0
|
|
32
|
-
"lefthook": "1.12.
|
|
33
|
-
"ts-jest": "29.4.
|
|
30
|
+
"babel-jest": "30.1.0",
|
|
31
|
+
"jest": "30.1.0",
|
|
32
|
+
"lefthook": "1.12.3",
|
|
33
|
+
"ts-jest": "29.4.1"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"mande": "2.0.9",
|
|
37
|
-
"zod": "4.
|
|
37
|
+
"zod": "4.1.3",
|
|
38
38
|
"bignumber.js": "9.3.1"
|
|
39
39
|
},
|
|
40
40
|
"overrides": {
|