@ultipa-graph/ultipa-driver 5.1.5-s5.2 → 6.0.4
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/LICENSE +21 -0
- package/README.md +65 -0
- package/dist/client.d.ts +196 -0
- package/dist/client.js +394 -0
- package/dist/config.d.ts +65 -0
- package/dist/config.js +135 -0
- package/dist/connection.d.ts +30 -0
- package/dist/connection.js +190 -0
- package/dist/errors.d.ts +99 -0
- package/dist/errors.js +237 -0
- package/dist/index.d.ts +14 -5
- package/dist/index.js +88 -39
- package/dist/printers.d.ts +33 -0
- package/dist/printers.js +312 -0
- package/dist/proto/gqldb.proto +689 -0
- package/dist/response.d.ts +256 -0
- package/dist/response.js +723 -0
- package/dist/services/admin-service.d.ts +44 -0
- package/dist/services/admin-service.js +168 -0
- package/dist/services/bulk-import-service.d.ts +35 -0
- package/dist/services/bulk-import-service.js +105 -0
- package/dist/services/converters.d.ts +57 -0
- package/dist/services/converters.js +254 -0
- package/dist/services/data-service.d.ts +44 -0
- package/dist/services/data-service.js +206 -0
- package/dist/services/graph-service.d.ts +32 -0
- package/dist/services/graph-service.js +127 -0
- package/dist/services/health-service.d.ts +50 -0
- package/dist/services/health-service.js +78 -0
- package/dist/services/index.d.ts +13 -0
- package/dist/services/index.js +30 -0
- package/dist/services/query-service.d.ts +39 -0
- package/dist/services/query-service.js +112 -0
- package/dist/services/service-context.d.ts +39 -0
- package/dist/services/service-context.js +73 -0
- package/dist/services/session-service.d.ts +24 -0
- package/dist/services/session-service.js +66 -0
- package/dist/services/transaction-service.d.ts +33 -0
- package/dist/services/transaction-service.js +100 -0
- package/dist/services.d.ts +28 -0
- package/dist/services.js +122 -0
- package/dist/session.d.ts +45 -0
- package/dist/session.js +75 -0
- package/dist/transaction.d.ts +42 -0
- package/dist/transaction.js +89 -0
- package/dist/types/bulk_import.d.ts +53 -0
- package/dist/types/bulk_import.js +6 -0
- package/dist/types/data_types.d.ts +116 -0
- package/dist/types/data_types.js +122 -0
- package/dist/types/enums.d.ts +59 -0
- package/dist/types/enums.js +67 -0
- package/dist/types/graph_models.d.ts +54 -0
- package/dist/types/graph_models.js +6 -0
- package/dist/types/index.d.ts +11 -5
- package/dist/types/index.js +36 -37
- package/dist/types/metadata.d.ts +107 -0
- package/dist/types/metadata.js +6 -0
- package/dist/types/schema.d.ts +31 -0
- package/dist/types/schema.js +6 -0
- package/dist/types/typed_value.d.ts +25 -0
- package/dist/types/typed_value.js +1176 -0
- package/dist/types/wrappers.d.ts +23 -0
- package/dist/types/wrappers.js +39 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.js +24 -0
- package/package.json +50 -63
- package/dist/connection/connection.final.d.ts +0 -14
- package/dist/connection/connection.final.js +0 -94
- package/dist/connection/connection.final.js.map +0 -1
- package/dist/connection/connection.pool.d.ts +0 -21
- package/dist/connection/connection.pool.js +0 -103
- package/dist/connection/connection.pool.js.map +0 -1
- package/dist/connection/extra/algos/algo.extra.d.ts +0 -34
- package/dist/connection/extra/algos/algo.extra.js +0 -69
- package/dist/connection/extra/algos/algo.extra.js.map +0 -1
- package/dist/connection/extra/algos/algo.utils.d.ts +0 -3
- package/dist/connection/extra/algos/algo.utils.js +0 -54
- package/dist/connection/extra/algos/algo.utils.js.map +0 -1
- package/dist/connection/extra/algos/community.d.ts +0 -27
- package/dist/connection/extra/algos/community.js +0 -76
- package/dist/connection/extra/algos/community.js.map +0 -1
- package/dist/connection/extra/algos/degrees.d.ts +0 -10
- package/dist/connection/extra/algos/degrees.js +0 -24
- package/dist/connection/extra/algos/degrees.js.map +0 -1
- package/dist/connection/extra/algos/embedding.d.ts +0 -13
- package/dist/connection/extra/algos/embedding.js +0 -33
- package/dist/connection/extra/algos/embedding.js.map +0 -1
- package/dist/connection/extra/algos/index.d.ts +0 -5
- package/dist/connection/extra/algos/index.js +0 -14
- package/dist/connection/extra/algos/index.js.map +0 -1
- package/dist/connection/extra/base.extra.d.ts +0 -18
- package/dist/connection/extra/base.extra.js +0 -111
- package/dist/connection/extra/base.extra.js.map +0 -1
- package/dist/connection/extra/batch.insert.extra.d.ts +0 -58
- package/dist/connection/extra/batch.insert.extra.js +0 -354
- package/dist/connection/extra/batch.insert.extra.js.map +0 -1
- package/dist/connection/extra/connection.base.d.ts +0 -112
- package/dist/connection/extra/connection.base.js +0 -530
- package/dist/connection/extra/connection.base.js.map +0 -1
- package/dist/connection/extra/connection.d.ts +0 -17
- package/dist/connection/extra/connection.js +0 -44
- package/dist/connection/extra/connection.js.map +0 -1
- package/dist/connection/extra/graph.extra.d.ts +0 -54
- package/dist/connection/extra/graph.extra.js +0 -151
- package/dist/connection/extra/graph.extra.js.map +0 -1
- package/dist/connection/extra/hdc.extra.d.ts +0 -89
- package/dist/connection/extra/hdc.extra.js +0 -322
- package/dist/connection/extra/hdc.extra.js.map +0 -1
- package/dist/connection/extra/index.extra.d.ts +0 -102
- package/dist/connection/extra/index.extra.js +0 -210
- package/dist/connection/extra/index.extra.js.map +0 -1
- package/dist/connection/extra/job.extra.d.ts +0 -32
- package/dist/connection/extra/job.extra.js +0 -122
- package/dist/connection/extra/job.extra.js.map +0 -1
- package/dist/connection/extra/meta.extra.d.ts +0 -36
- package/dist/connection/extra/meta.extra.js +0 -123
- package/dist/connection/extra/meta.extra.js.map +0 -1
- package/dist/connection/extra/policy.extra.d.ts +0 -32
- package/dist/connection/extra/policy.extra.js +0 -114
- package/dist/connection/extra/policy.extra.js.map +0 -1
- package/dist/connection/extra/privilege.extra.d.ts +0 -8
- package/dist/connection/extra/privilege.extra.js +0 -20
- package/dist/connection/extra/privilege.extra.js.map +0 -1
- package/dist/connection/extra/property.extra.d.ts +0 -66
- package/dist/connection/extra/property.extra.js +0 -190
- package/dist/connection/extra/property.extra.js.map +0 -1
- package/dist/connection/extra/schema.extra.d.ts +0 -108
- package/dist/connection/extra/schema.extra.js +0 -253
- package/dist/connection/extra/schema.extra.js.map +0 -1
- package/dist/connection/extra/search.extra.d.ts +0 -12
- package/dist/connection/extra/search.extra.js +0 -117
- package/dist/connection/extra/search.extra.js.map +0 -1
- package/dist/connection/extra/task.extra.d.ts +0 -24
- package/dist/connection/extra/task.extra.js +0 -107
- package/dist/connection/extra/task.extra.js.map +0 -1
- package/dist/connection/extra/user.extra.d.ts +0 -28
- package/dist/connection/extra/user.extra.js +0 -91
- package/dist/connection/extra/user.extra.js.map +0 -1
- package/dist/connection/extra/user.privilege.extra.d.ts +0 -64
- package/dist/connection/extra/user.privilege.extra.js +0 -273
- package/dist/connection/extra/user.privilege.extra.js.map +0 -1
- package/dist/connection/index.d.ts +0 -5
- package/dist/connection/index.js +0 -13
- package/dist/connection/index.js.map +0 -1
- package/dist/connection/network.manager.d.ts +0 -28
- package/dist/connection/network.manager.js +0 -179
- package/dist/connection/network.manager.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/printers/alias.d.ts +0 -2
- package/dist/printers/alias.js +0 -39
- package/dist/printers/alias.js.map +0 -1
- package/dist/printers/any.d.ts +0 -2
- package/dist/printers/any.js +0 -63
- package/dist/printers/any.js.map +0 -1
- package/dist/printers/array.aio.d.ts +0 -3
- package/dist/printers/array.aio.js +0 -259
- package/dist/printers/array.aio.js.map +0 -1
- package/dist/printers/common.d.ts +0 -0
- package/dist/printers/common.js +0 -1
- package/dist/printers/common.js.map +0 -1
- package/dist/printers/edge.d.ts +0 -5
- package/dist/printers/edge.js +0 -78
- package/dist/printers/edge.js.map +0 -1
- package/dist/printers/explain.plan.d.ts +0 -2
- package/dist/printers/explain.plan.js +0 -46
- package/dist/printers/explain.plan.js.map +0 -1
- package/dist/printers/index.d.ts +0 -24
- package/dist/printers/index.js +0 -43
- package/dist/printers/index.js.map +0 -1
- package/dist/printers/node.d.ts +0 -5
- package/dist/printers/node.js +0 -77
- package/dist/printers/node.js.map +0 -1
- package/dist/printers/path.d.ts +0 -3
- package/dist/printers/path.js +0 -62
- package/dist/printers/path.js.map +0 -1
- package/dist/printers/status.d.ts +0 -3
- package/dist/printers/status.js +0 -68
- package/dist/printers/status.js.map +0 -1
- package/dist/printers/table.d.ts +0 -2
- package/dist/printers/table.js +0 -56
- package/dist/printers/table.js.map +0 -1
- package/dist/proto/tmp.js +0 -366
- package/dist/proto/ultipa_grpc_pb.d.ts +0 -258
- package/dist/proto/ultipa_grpc_pb.js +0 -366
- package/dist/proto/ultipa_grpc_pb.js.map +0 -1
- package/dist/proto/ultipa_pb.d.ts +0 -1
- package/dist/proto/ultipa_pb.js +0 -12119
- package/dist/proto/ultipa_pb.js.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/types/types.algos.params.d.ts +0 -545
- package/dist/types/types.algos.params.js +0 -16
- package/dist/types/types.algos.params.js.map +0 -1
- package/dist/types/types.d.ts +0 -1214
- package/dist/types/types.extra.d.ts +0 -146
- package/dist/types/types.extra.js +0 -27
- package/dist/types/types.extra.js.map +0 -1
- package/dist/types/types.js +0 -1606
- package/dist/types/types.js.map +0 -1
- package/dist/types/util.d.ts +0 -15
- package/dist/types/util.js +0 -136
- package/dist/types/util.js.map +0 -1
- package/dist/utils/common.d.ts +0 -3
- package/dist/utils/common.js +0 -22
- package/dist/utils/common.js.map +0 -1
- package/dist/utils/config.d.ts +0 -3
- package/dist/utils/config.js +0 -7
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/format.d.ts +0 -45
- package/dist/utils/format.js +0 -879
- package/dist/utils/format.js.map +0 -1
- package/dist/utils/index.d.ts +0 -10
- package/dist/utils/index.js +0 -30
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/params.validate.d.ts +0 -4
- package/dist/utils/params.validate.js +0 -14
- package/dist/utils/params.validate.js.map +0 -1
- package/dist/utils/property.d.ts +0 -24
- package/dist/utils/property.js +0 -203
- package/dist/utils/property.js.map +0 -1
- package/dist/utils/raft.retry.d.ts +0 -0
- package/dist/utils/raft.retry.js +0 -1
- package/dist/utils/raft.retry.js.map +0 -1
- package/dist/utils/serialize/commont.d.ts +0 -12
- package/dist/utils/serialize/commont.js +0 -46
- package/dist/utils/serialize/commont.js.map +0 -1
- package/dist/utils/serialize/deserialize.d.ts +0 -10
- package/dist/utils/serialize/deserialize.js +0 -288
- package/dist/utils/serialize/deserialize.js.map +0 -1
- package/dist/utils/serialize/null.d.ts +0 -32
- package/dist/utils/serialize/null.js +0 -178
- package/dist/utils/serialize/null.js.map +0 -1
- package/dist/utils/serialize/serialize.d.ts +0 -10
- package/dist/utils/serialize/serialize.js +0 -146
- package/dist/utils/serialize/serialize.js.map +0 -1
- package/dist/utils/stream.helper.d.ts +0 -10
- package/dist/utils/stream.helper.js +0 -71
- package/dist/utils/stream.helper.js.map +0 -1
- package/dist/utils/time.record.d.ts +0 -15
- package/dist/utils/time.record.js +0 -52
- package/dist/utils/time.record.js.map +0 -1
- package/dist/utils/timezone.d.ts +0 -7
- package/dist/utils/timezone.js +0 -21
- package/dist/utils/timezone.js.map +0 -1
- package/dist/utils/ultipa.datetime.d.ts +0 -14
- package/dist/utils/ultipa.datetime.js +0 -160
- package/dist/utils/ultipa.datetime.js.map +0 -1
- package/dist/utils/uql-maker.d.ts +0 -165
- package/dist/utils/uql-maker.js +0 -402
- package/dist/utils/uql-maker.js.map +0 -1
- package/dist/utils/uql.parse.d.ts +0 -27
- package/dist/utils/uql.parse.js +0 -205
- package/dist/utils/uql.parse.js.map +0 -1
- package/readme.md +0 -65
- package/src/proto/build.sh +0 -41
- package/src/proto/build_windows.sh +0 -40
- package/src/proto/ultipa.proto +0 -531
- package/src/proto/ultipa_grpc_pb.d.ts +0 -92
- package/src/proto/ultipa_grpc_pb.js +0 -414
- package/src/proto/ultipa_pb.d.ts +0 -1983
- package/src/proto/ultipa_pb.js +0 -14852
package/dist/printers.js
ADDED
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Pretty printers for GQLDB data types.
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.printNodes = printNodes;
|
|
10
|
+
exports.printNodesWithoutSchema = printNodesWithoutSchema;
|
|
11
|
+
exports.printEdges = printEdges;
|
|
12
|
+
exports.printEdgesWithoutSchema = printEdgesWithoutSchema;
|
|
13
|
+
exports.printPaths = printPaths;
|
|
14
|
+
exports.printTable = printTable;
|
|
15
|
+
exports.printAny = printAny;
|
|
16
|
+
const cli_table3_1 = __importDefault(require("cli-table3"));
|
|
17
|
+
const types_1 = require("./types");
|
|
18
|
+
/**
|
|
19
|
+
* Print nodes in tabular format grouped by schema.
|
|
20
|
+
*/
|
|
21
|
+
function printNodes(nodes, schemas) {
|
|
22
|
+
if (!nodes || nodes.length === 0) {
|
|
23
|
+
return 'No nodes found.';
|
|
24
|
+
}
|
|
25
|
+
const result = [];
|
|
26
|
+
let lastSchema = undefined;
|
|
27
|
+
let currentTable = null;
|
|
28
|
+
for (const node of nodes) {
|
|
29
|
+
if (!node)
|
|
30
|
+
continue;
|
|
31
|
+
const schemaName = node.labels.length > 0 ? node.labels[0] : '';
|
|
32
|
+
if (lastSchema === undefined || schemaName !== lastSchema) {
|
|
33
|
+
if (currentTable) {
|
|
34
|
+
result.push(currentTable.toString());
|
|
35
|
+
result.push('');
|
|
36
|
+
}
|
|
37
|
+
const headers = ['ID', 'Labels'];
|
|
38
|
+
if (schemas && schemas.has(schemaName)) {
|
|
39
|
+
for (const prop of schemas.get(schemaName).properties) {
|
|
40
|
+
headers.push(prop.name);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
headers.push(...Object.keys(node.properties));
|
|
45
|
+
}
|
|
46
|
+
currentTable = new cli_table3_1.default({ head: headers });
|
|
47
|
+
lastSchema = schemaName;
|
|
48
|
+
}
|
|
49
|
+
const row = [node.id, formatLabels(node.labels)];
|
|
50
|
+
if (schemas && schemas.has(schemaName)) {
|
|
51
|
+
for (const prop of schemas.get(schemaName).properties) {
|
|
52
|
+
row.push(formatValue(node.properties[prop.name]));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
for (const key of Object.keys(node.properties)) {
|
|
57
|
+
row.push(formatValue(node.properties[key]));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
currentTable.push(row);
|
|
61
|
+
}
|
|
62
|
+
if (currentTable) {
|
|
63
|
+
result.push(currentTable.toString());
|
|
64
|
+
}
|
|
65
|
+
result.push(`\n${nodes.length} node(s)`);
|
|
66
|
+
return result.join('\n');
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Print nodes deriving schema from data.
|
|
70
|
+
*/
|
|
71
|
+
function printNodesWithoutSchema(nodes) {
|
|
72
|
+
if (!nodes || nodes.length === 0) {
|
|
73
|
+
return 'No nodes found.';
|
|
74
|
+
}
|
|
75
|
+
const schemas = new Map();
|
|
76
|
+
for (const node of nodes) {
|
|
77
|
+
if (!node)
|
|
78
|
+
continue;
|
|
79
|
+
for (const label of node.labels) {
|
|
80
|
+
if (!schemas.has(label)) {
|
|
81
|
+
schemas.set(label, buildSchemaFromNode(label, node));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return printNodes(nodes, schemas);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Print edges in tabular format grouped by schema.
|
|
89
|
+
*/
|
|
90
|
+
function printEdges(edges, schemas) {
|
|
91
|
+
if (!edges || edges.length === 0) {
|
|
92
|
+
return 'No edges found.';
|
|
93
|
+
}
|
|
94
|
+
const result = [];
|
|
95
|
+
let lastSchema = undefined;
|
|
96
|
+
let currentTable = null;
|
|
97
|
+
for (const edge of edges) {
|
|
98
|
+
if (!edge)
|
|
99
|
+
continue;
|
|
100
|
+
const schemaName = edge.label;
|
|
101
|
+
if (lastSchema === undefined || schemaName !== lastSchema) {
|
|
102
|
+
if (currentTable) {
|
|
103
|
+
result.push(currentTable.toString());
|
|
104
|
+
result.push('');
|
|
105
|
+
}
|
|
106
|
+
const headers = ['ID', 'FROM', 'TO', 'Label'];
|
|
107
|
+
if (schemas && schemas.has(schemaName)) {
|
|
108
|
+
for (const prop of schemas.get(schemaName).properties) {
|
|
109
|
+
headers.push(prop.name);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
headers.push(...Object.keys(edge.properties));
|
|
114
|
+
}
|
|
115
|
+
currentTable = new cli_table3_1.default({ head: headers });
|
|
116
|
+
lastSchema = schemaName;
|
|
117
|
+
}
|
|
118
|
+
const row = [edge.id, edge.fromNodeId, edge.toNodeId, edge.label];
|
|
119
|
+
if (schemas && schemas.has(schemaName)) {
|
|
120
|
+
for (const prop of schemas.get(schemaName).properties) {
|
|
121
|
+
row.push(formatValue(edge.properties[prop.name]));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
for (const key of Object.keys(edge.properties)) {
|
|
126
|
+
row.push(formatValue(edge.properties[key]));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
currentTable.push(row);
|
|
130
|
+
}
|
|
131
|
+
if (currentTable) {
|
|
132
|
+
result.push(currentTable.toString());
|
|
133
|
+
}
|
|
134
|
+
result.push(`\n${edges.length} edge(s)`);
|
|
135
|
+
return result.join('\n');
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Print edges deriving schema from data.
|
|
139
|
+
*/
|
|
140
|
+
function printEdgesWithoutSchema(edges) {
|
|
141
|
+
if (!edges || edges.length === 0) {
|
|
142
|
+
return 'No edges found.';
|
|
143
|
+
}
|
|
144
|
+
const schemas = new Map();
|
|
145
|
+
for (const edge of edges) {
|
|
146
|
+
if (!edge)
|
|
147
|
+
continue;
|
|
148
|
+
if (edge.label && !schemas.has(edge.label)) {
|
|
149
|
+
schemas.set(edge.label, buildSchemaFromEdge(edge.label, edge));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return printEdges(edges, schemas);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Print paths with node-edge sequence notation.
|
|
156
|
+
*/
|
|
157
|
+
function printPaths(paths) {
|
|
158
|
+
if (!paths || paths.length === 0) {
|
|
159
|
+
return 'No paths found.';
|
|
160
|
+
}
|
|
161
|
+
const table = new cli_table3_1.default({ head: ['#', 'Path'] });
|
|
162
|
+
paths.forEach((path, i) => {
|
|
163
|
+
if (!path)
|
|
164
|
+
return;
|
|
165
|
+
table.push([String(i), formatPath(path)]);
|
|
166
|
+
});
|
|
167
|
+
return table.toString() + `\n${paths.length} path(s)`;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Print generic table data.
|
|
171
|
+
*/
|
|
172
|
+
function printTable(dataTable) {
|
|
173
|
+
if (!dataTable || !dataTable.headers || dataTable.headers.length === 0) {
|
|
174
|
+
return 'No table data.';
|
|
175
|
+
}
|
|
176
|
+
const headers = dataTable.headers.map((h) => h.name);
|
|
177
|
+
const cliTable = new cli_table3_1.default({ head: headers });
|
|
178
|
+
for (const row of dataTable.rows) {
|
|
179
|
+
cliTable.push(row.map((v) => formatValue(v)));
|
|
180
|
+
}
|
|
181
|
+
const result = [];
|
|
182
|
+
if (dataTable.name) {
|
|
183
|
+
result.push(`Table: ${dataTable.name}`);
|
|
184
|
+
}
|
|
185
|
+
result.push(cliTable.toString());
|
|
186
|
+
result.push(`\n${dataTable.rows.length} row(s)`);
|
|
187
|
+
return result.join('\n');
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Auto-detect type from Response and print accordingly.
|
|
191
|
+
*/
|
|
192
|
+
function printAny(resp) {
|
|
193
|
+
if (!resp || resp.isEmpty()) {
|
|
194
|
+
return 'No data.';
|
|
195
|
+
}
|
|
196
|
+
// Try to auto-detect the type from the first column
|
|
197
|
+
if (resp.columns.length > 0) {
|
|
198
|
+
try {
|
|
199
|
+
const ar = resp.get(0);
|
|
200
|
+
// Try edges first
|
|
201
|
+
try {
|
|
202
|
+
const { edges, schemas } = ar.asEdges();
|
|
203
|
+
if (edges.length > 0) {
|
|
204
|
+
return printEdges(edges, schemas);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch (e) {
|
|
208
|
+
// Not edges, continue
|
|
209
|
+
}
|
|
210
|
+
// Try nodes
|
|
211
|
+
try {
|
|
212
|
+
const { nodes, schemas } = ar.asNodes();
|
|
213
|
+
if (nodes.length > 0) {
|
|
214
|
+
return printNodes(nodes, schemas);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch (e) {
|
|
218
|
+
// Not nodes, continue
|
|
219
|
+
}
|
|
220
|
+
// Try paths
|
|
221
|
+
try {
|
|
222
|
+
const paths = ar.asPaths();
|
|
223
|
+
if (paths.length > 0) {
|
|
224
|
+
return printPaths(paths);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch (e) {
|
|
228
|
+
// Not paths, continue
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch (e) {
|
|
232
|
+
// Fall through to table
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// Fallback to table format (use deprecated method for multi-column display)
|
|
236
|
+
return printTable(resp.asTable());
|
|
237
|
+
}
|
|
238
|
+
// Helper functions
|
|
239
|
+
function formatLabels(labels) {
|
|
240
|
+
if (!labels || labels.length === 0)
|
|
241
|
+
return '';
|
|
242
|
+
return '[' + labels.join(', ') + ']';
|
|
243
|
+
}
|
|
244
|
+
function formatValue(v) {
|
|
245
|
+
if (v === null || v === undefined)
|
|
246
|
+
return '<nil>';
|
|
247
|
+
if (Array.isArray(v)) {
|
|
248
|
+
return '[' + v.map(formatValue).join(', ') + ']';
|
|
249
|
+
}
|
|
250
|
+
if (typeof v === 'object') {
|
|
251
|
+
const parts = Object.entries(v).map(([k, val]) => `${k}: ${formatValue(val)}`);
|
|
252
|
+
return '{' + parts.join(', ') + '}';
|
|
253
|
+
}
|
|
254
|
+
return String(v);
|
|
255
|
+
}
|
|
256
|
+
function formatPath(path) {
|
|
257
|
+
if (!path)
|
|
258
|
+
return '<nil>';
|
|
259
|
+
const parts = [];
|
|
260
|
+
let nodeIdx = 0;
|
|
261
|
+
let edgeIdx = 0;
|
|
262
|
+
while (nodeIdx < path.nodes.length || edgeIdx < path.edges.length) {
|
|
263
|
+
if (nodeIdx < path.nodes.length) {
|
|
264
|
+
const node = path.nodes[nodeIdx];
|
|
265
|
+
const label = node.labels.length > 0 ? ':' + node.labels[0] : '';
|
|
266
|
+
parts.push(`(${node.id}${label})`);
|
|
267
|
+
nodeIdx++;
|
|
268
|
+
}
|
|
269
|
+
if (edgeIdx < path.edges.length) {
|
|
270
|
+
const edge = path.edges[edgeIdx];
|
|
271
|
+
parts.push(`-[${edge.id}:${edge.label}]->`);
|
|
272
|
+
edgeIdx++;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return parts.join(' ');
|
|
276
|
+
}
|
|
277
|
+
function containsAny(arr, ...items) {
|
|
278
|
+
return arr.some(s => items.includes(s));
|
|
279
|
+
}
|
|
280
|
+
function buildSchemaFromNode(label, node) {
|
|
281
|
+
const properties = Object.entries(node.properties).map(([name, value]) => ({
|
|
282
|
+
name,
|
|
283
|
+
type: inferPropertyType(value),
|
|
284
|
+
}));
|
|
285
|
+
return { name: label, properties };
|
|
286
|
+
}
|
|
287
|
+
function buildSchemaFromEdge(label, edge) {
|
|
288
|
+
const properties = Object.entries(edge.properties).map(([name, value]) => ({
|
|
289
|
+
name,
|
|
290
|
+
type: inferPropertyType(value),
|
|
291
|
+
}));
|
|
292
|
+
return { name: label, properties };
|
|
293
|
+
}
|
|
294
|
+
function inferPropertyType(value) {
|
|
295
|
+
if (value === null || value === undefined)
|
|
296
|
+
return types_1.PropertyType.NULL;
|
|
297
|
+
if (typeof value === 'boolean')
|
|
298
|
+
return types_1.PropertyType.BOOL;
|
|
299
|
+
if (typeof value === 'number') {
|
|
300
|
+
return Number.isInteger(value) ? types_1.PropertyType.INT64 : types_1.PropertyType.DOUBLE;
|
|
301
|
+
}
|
|
302
|
+
if (typeof value === 'string')
|
|
303
|
+
return types_1.PropertyType.STRING;
|
|
304
|
+
if (Buffer.isBuffer(value))
|
|
305
|
+
return types_1.PropertyType.BLOB;
|
|
306
|
+
if (Array.isArray(value))
|
|
307
|
+
return types_1.PropertyType.LIST;
|
|
308
|
+
if (typeof value === 'object')
|
|
309
|
+
return types_1.PropertyType.MAP;
|
|
310
|
+
return types_1.PropertyType.UNSET;
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJpbnRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7OztBQVNILGdDQXFEQztBQUtELDBEQWdCQztBQUtELGdDQXFEQztBQUtELDBEQWNDO0FBS0QsZ0NBYUM7QUFLRCxnQ0FvQkM7QUFLRCw0QkE4Q0M7QUE1UEQsNERBQWtDO0FBQ2xDLG1DQUFtRTtBQUduRTs7R0FFRztBQUNILFNBQWdCLFVBQVUsQ0FBQyxLQUFhLEVBQUUsT0FBNkI7SUFDckUsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pDLE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixJQUFJLFVBQVUsR0FBdUIsU0FBUyxDQUFDO0lBQy9DLElBQUksWUFBWSxHQUEwQixJQUFJLENBQUM7SUFFL0MsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSTtZQUFFLFNBQVM7UUFFcEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFaEUsSUFBSSxVQUFVLEtBQUssU0FBUyxJQUFJLFVBQVUsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUMxRCxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xCLENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRLENB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U0FBUztRQUFFLE9BQU8sb0JBQVksQ0FBQyxJQUFJLENBQUM7SUFDcEUsSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTO1FBQUUsT0FBTyxvQkFBWSxDQUFDLElBQUksQ0FBQztJQUN6RCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLG9CQUFZLENBQUMsTUFBTSxDQUFDO0lBQzVFLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLG9CQUFZLENBQUMsTUFBTSxDQUFDO0lBQzFELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLG9CQUFZLENBQUMsSUFBSSxDQUFDO0lBQ3JELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLG9CQUFZLENBQUMsSUFBSSxDQUFDO0lBQ25ELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sb0JBQVksQ0FBQyxHQUFHLENBQUM7SUFDdkQsT0FBTyxvQkFBWSxDQUFDLEtBQUssQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQcmV0dHkgcHJpbnRlcnMgZm9yIEdRTERCIGRhdGEgdHlwZXMuXG4gKi9cblxuaW1wb3J0IENsaVRhYmxlIGZyb20gJ2NsaS10YWJsZTMnO1xuaW1wb3J0IHsgU2NoZW1hLCBQcm9wZXJ0eVR5cGUsIFRhYmxlIGFzIERhdGFUYWJsZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgUmVzcG9uc2UsIE5vZGUsIEVkZ2UsIFBhdGggfSBmcm9tICcuL3Jlc3BvbnNlJztcblxuLyoqXG4gKiBQcmludCBub2RlcyBpbiB0YWJ1bGFyIGZvcm1hdCBncm91cGVkIGJ5IHNjaGVtYS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50Tm9kZXMobm9kZXM6IE5vZGVbXSwgc2NoZW1hcz86IE1hcDxzdHJpbmcsIFNjaGVtYT4pOiBzdHJpbmcge1xuICBpZiAoIW5vZGVzIHx8IG5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnTm8gbm9kZXMgZm91bmQuJztcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGxhc3RTY2hlbWE6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgbGV0IGN1cnJlbnRUYWJsZTogQ2xpVGFibGUuVGFibGUgfCBudWxsID0gbnVsbDtcblxuICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICBpZiAoIW5vZGUpIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qgc2NoZW1hTmFtZSA9IG5vZGUubGFiZWxzLmxlbmd0aCA+IDAgPyBub2RlLmxhYmVsc1swXSA6ICcnO1xuXG4gICAgaWYgKGxhc3RTY2hlbWEgPT09IHVuZGVmaW5lZCB8fCBzY2hlbWFOYW1lICE9PSBsYXN0U2NoZW1hKSB7XG4gICAgICBpZiAoY3VycmVudFRhYmxlKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGN1cnJlbnRUYWJsZS50b1N0cmluZygpKTtcbiAgICAgICAgcmVzdWx0LnB1c2goJycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBoZWFkZXJzID0gWydJRCcsICdMYWJlbHMnXTtcbiAgICAgIGlmIChzY2hlbWFzICYmIHNjaGVtYXMuaGFzKHNjaGVtYU5hbWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBzY2hlbWFzLmdldChzY2hlbWFOYW1lKSEucHJvcGVydGllcykge1xuICAgICAgICAgIGhlYWRlcnMucHVzaChwcm9wLm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWFkZXJzLnB1c2goLi4uT2JqZWN0LmtleXMobm9kZS5wcm9wZXJ0aWVzKSk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRUYWJsZSA9IG5ldyBDbGlUYWJsZSh7IGhlYWQ6IGhlYWRlcnMgfSkgYXMgQ2xpVGFibGUuVGFibGU7XG4gICAgICBsYXN0U2NoZW1hID0gc2NoZW1hTmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCByb3c6IHN0cmluZ1tdID0gW25vZGUuaWQsIGZvcm1hdExhYmVscyhub2RlLmxhYmVscyldO1xuICAgIGlmIChzY2hlbWFzICYmIHNjaGVtYXMuaGFzKHNjaGVtYU5hbWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2Ygc2NoZW1hcy5nZXQoc2NoZW1hTmFtZSkhLnByb3BlcnRpZXMpIHtcbiAgICAgICAgcm93LnB1c2goZm9ybWF0VmFsdWUobm9kZS5wcm9wZXJ0aWVzW3Byb3AubmFtZV0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobm9kZS5wcm9wZXJ0aWVzKSkge1xuICAgICAgICByb3cucHVzaChmb3JtYXRWYWx1ZShub2RlLnByb3BlcnRpZXNba2V5XSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGN1cnJlbnRUYWJsZSEucHVzaChyb3cpO1xuICB9XG5cbiAgaWYgKGN1cnJlbnRUYWJsZSkge1xuICAgIHJlc3VsdC5wdXNoKGN1cnJlbnRUYWJsZS50b1N0cmluZygpKTtcbiAgfVxuXG4gIHJlc3VsdC5wdXNoKGBcXG4ke25vZGVzLmxlbmd0aH0gbm9kZShzKWApO1xuICByZXR1cm4gcmVzdWx0LmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIFByaW50IG5vZGVzIGRlcml2aW5nIHNjaGVtYSBmcm9tIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmludE5vZGVzV2l0aG91dFNjaGVtYShub2RlczogTm9kZVtdKTogc3RyaW5nIHtcbiAgaWYgKCFub2RlcyB8fCBub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJ05vIG5vZGVzIGZvdW5kLic7XG4gIH1cblxuICBjb25zdCBzY2hlbWFzID0gbmV3IE1hcDxzdHJpbmcsIFNjaGVtYT4oKTtcbiAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgaWYgKCFub2RlKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IGxhYmVsIG9mIG5vZGUubGFiZWxzKSB7XG4gICAgICBpZiAoIXNjaGVtYXMuaGFzKGxhYmVsKSkge1xuICAgICAgICBzY2hlbWFzLnNldChsYWJlbCwgYnVpbGRTY2hlbWFGcm9tTm9kZShsYWJlbCwgbm9kZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcmludE5vZGVzKG5vZGVzLCBzY2hlbWFzKTtcbn1cblxuLyoqXG4gKiBQcmludCBlZGdlcyBpbiB0YWJ1bGFyIGZvcm1hdCBncm91cGVkIGJ5IHNjaGVtYS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50RWRnZXMoZWRnZXM6IEVkZ2VbXSwgc2NoZW1hcz86IE1hcDxzdHJpbmcsIFNjaGVtYT4pOiBzdHJpbmcge1xuICBpZiAoIWVkZ2VzIHx8IGVkZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnTm8gZWRnZXMgZm91bmQuJztcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGxhc3RTY2hlbWE6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgbGV0IGN1cnJlbnRUYWJsZTogQ2xpVGFibGUuVGFibGUgfCBudWxsID0gbnVsbDtcblxuICBmb3IgKGNvbnN0IGVkZ2Ugb2YgZWRnZXMpIHtcbiAgICBpZiAoIWVkZ2UpIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qgc2NoZW1hTmFtZSA9IGVkZ2UubGFiZWw7XG5cbiAgICBpZiAobGFzdFNjaGVtYSA9PT0gdW5kZWZpbmVkIHx8IHNjaGVtYU5hbWUgIT09IGxhc3RTY2hlbWEpIHtcbiAgICAgIGlmIChjdXJyZW50VGFibGUpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goY3VycmVudFRhYmxlLnRvU3RyaW5nKCkpO1xuICAgICAgICByZXN1bHQucHVzaCgnJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBbJ0lEJywgJ0ZST00nLCAnVE8nLCAnTGFiZWwnXTtcbiAgICAgIGlmIChzY2hlbWFzICYmIHNjaGVtYXMuaGFzKHNjaGVtYU5hbWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBzY2hlbWFzLmdldChzY2hlbWFOYW1lKSEucHJvcGVydGllcykge1xuICAgICAgICAgIGhlYWRlcnMucHVzaChwcm9wLm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWFkZXJzLnB1c2goLi4uT2JqZWN0LmtleXMoZWRnZS5wcm9wZXJ0aWVzKSk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRUYWJsZSA9IG5ldyBDbGlUYWJsZSh7IGhlYWQ6IGhlYWRlcnMgfSkgYXMgQ2xpVGFibGUuVGFibGU7XG4gICAgICBsYXN0U2NoZW1hID0gc2NoZW1hTmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCByb3c6IHN0cmluZ1tdID0gW2VkZ2UuaWQsIGVkZ2UuZnJvbU5vZGVJZCwgZWRnZS50b05vZGVJZCwgZWRnZS5sYWJlbF07XG4gICAgaWYgKHNjaGVtYXMgJiYgc2NoZW1hcy5oYXMoc2NoZW1hTmFtZSkpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBzY2hlbWFzLmdldChzY2hlbWFOYW1lKSEucHJvcGVydGllcykge1xuICAgICAgICByb3cucHVzaChmb3JtYXRWYWx1ZShlZGdlLnByb3BlcnRpZXNbcHJvcC5uYW1lXSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlZGdlLnByb3BlcnRpZXMpKSB7XG4gICAgICAgIHJvdy5wdXNoKGZvcm1hdFZhbHVlKGVkZ2UucHJvcGVydGllc1trZXldKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY3VycmVudFRhYmxlIS5wdXNoKHJvdyk7XG4gIH1cblxuICBpZiAoY3VycmVudFRhYmxlKSB7XG4gICAgcmVzdWx0LnB1c2goY3VycmVudFRhYmxlLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgcmVzdWx0LnB1c2goYFxcbiR7ZWRnZXMubGVuZ3RofSBlZGdlKHMpYCk7XG4gIHJldHVybiByZXN1bHQuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogUHJpbnQgZWRnZXMgZGVyaXZpbmcgc2NoZW1hIGZyb20gZGF0YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50RWRnZXNXaXRob3V0U2NoZW1hKGVkZ2VzOiBFZGdlW10pOiBzdHJpbmcge1xuICBpZiAoIWVkZ2VzIHx8IGVkZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnTm8gZWRnZXMgZm91bmQuJztcbiAgfVxuXG4gIGNvbnN0IHNjaGVtYXMgPSBuZXcgTWFwPHN0cmluZywgU2NoZW1hPigpO1xuICBmb3IgKGNvbnN0IGVkZ2Ugb2YgZWRnZXMpIHtcbiAgICBpZiAoIWVkZ2UpIGNvbnRpbnVlO1xuICAgIGlmIChlZGdlLmxhYmVsICYmICFzY2hlbWFzLmhhcyhlZGdlLmxhYmVsKSkge1xuICAgICAgc2NoZW1hcy5zZXQoZWRnZS5sYWJlbCwgYnVpbGRTY2hlbWFGcm9tRWRnZShlZGdlLmxhYmVsLCBlZGdlKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHByaW50RWRnZXMoZWRnZXMsIHNjaGVtYXMpO1xufVxuXG4vKipcbiAqIFByaW50IHBhdGhzIHdpdGggbm9kZS1lZGdlIHNlcXVlbmNlIG5vdGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRQYXRocyhwYXRoczogUGF0aFtdKTogc3RyaW5nIHtcbiAgaWYgKCFwYXRocyB8fCBwYXRocy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJ05vIHBhdGhzIGZvdW5kLic7XG4gIH1cblxuICBjb25zdCB0YWJsZSA9IG5ldyBDbGlUYWJsZSh7IGhlYWQ6IFsnIycsICdQYXRoJ10gfSkgYXMgQ2xpVGFibGUuVGFibGU7XG5cbiAgcGF0aHMuZm9yRWFjaCgocGF0aCwgaSkgPT4ge1xuICAgIGlmICghcGF0aCkgcmV0dXJuO1xuICAgIHRhYmxlLnB1c2goW1N0cmluZyhpKSwgZm9ybWF0UGF0aChwYXRoKV0pO1xuICB9KTtcblxuICByZXR1cm4gdGFibGUudG9TdHJpbmcoKSArIGBcXG4ke3BhdGhzLmxlbmd0aH0gcGF0aChzKWA7XG59XG5cbi8qKlxuICogUHJpbnQgZ2VuZXJpYyB0YWJsZSBkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRUYWJsZShkYXRhVGFibGU6IERhdGFUYWJsZSk6IHN0cmluZyB7XG4gIGlmICghZGF0YVRhYmxlIHx8ICFkYXRhVGFibGUuaGVhZGVycyB8fCBkYXRhVGFibGUuaGVhZGVycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJ05vIHRhYmxlIGRhdGEuJztcbiAgfVxuXG4gIGNvbnN0IGhlYWRlcnMgPSBkYXRhVGFibGUuaGVhZGVycy5tYXAoKGg6IHsgbmFtZTogc3RyaW5nIH0pID0+IGgubmFtZSk7XG4gIGNvbnN0IGNsaVRhYmxlID0gbmV3IENsaVRhYmxlKHsgaGVhZDogaGVhZGVycyB9KSBhcyBDbGlUYWJsZS5UYWJsZTtcblxuICBmb3IgKGNvbnN0IHJvdyBvZiBkYXRhVGFibGUucm93cykge1xuICAgIGNsaVRhYmxlLnB1c2gocm93Lm1hcCgodjogdW5rbm93bikgPT4gZm9ybWF0VmFsdWUodikpKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGRhdGFUYWJsZS5uYW1lKSB7XG4gICAgcmVzdWx0LnB1c2goYFRhYmxlOiAke2RhdGFUYWJsZS5uYW1lfWApO1xuICB9XG4gIHJlc3VsdC5wdXNoKGNsaVRhYmxlLnRvU3RyaW5nKCkpO1xuICByZXN1bHQucHVzaChgXFxuJHtkYXRhVGFibGUucm93cy5sZW5ndGh9IHJvdyhzKWApO1xuXG4gIHJldHVybiByZXN1bHQuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogQXV0by1kZXRlY3QgdHlwZSBmcm9tIFJlc3BvbnNlIGFuZCBwcmludCBhY2NvcmRpbmdseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50QW55KHJlc3A6IFJlc3BvbnNlKTogc3RyaW5nIHtcbiAgaWYgKCFyZXNwIHx8IHJlc3AuaXNFbXB0eSgpKSB7XG4gICAgcmV0dXJuICdObyBkYXRhLic7XG4gIH1cblxuICAvLyBUcnkgdG8gYXV0by1kZXRlY3QgdGhlIHR5cGUgZnJvbSB0aGUgZmlyc3QgY29sdW1uXG4gIGlmIChyZXNwLmNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhciA9IHJlc3AuZ2V0KDApO1xuXG4gICAgICAvLyBUcnkgZWRnZXMgZmlyc3RcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgZWRnZXMsIHNjaGVtYXMgfSA9IGFyLmFzRWRnZXMoKTtcbiAgICAgICAgaWYgKGVkZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4gcHJpbnRFZGdlcyhlZGdlcywgc2NoZW1hcyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gTm90IGVkZ2VzLCBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBUcnkgbm9kZXNcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgbm9kZXMsIHNjaGVtYXMgfSA9IGFyLmFzTm9kZXMoKTtcbiAgICAgICAgaWYgKG5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4gcHJpbnROb2Rlcyhub2Rlcywgc2NoZW1hcyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gTm90IG5vZGVzLCBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBUcnkgcGF0aHNcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhdGhzID0gYXIuYXNQYXRocygpO1xuICAgICAgICBpZiAocGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiBwcmludFBhdGhzKHBhdGhzKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBOb3QgcGF0aHMsIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHRhYmxlXG4gICAgfVxuICB9XG5cbiAgLy8gRmFsbGJhY2sgdG8gdGFibGUgZm9ybWF0ICh1c2UgZGVwcmVjYXRlZCBtZXRob2QgZm9yIG11bHRpLWNvbHVtbiBkaXNwbGF5KVxuICByZXR1cm4gcHJpbnRUYWJsZShyZXNwLmFzVGFibGUoKSk7XG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbnNcblxuZnVuY3Rpb24gZm9ybWF0TGFiZWxzKGxhYmVsczogc3RyaW5nW10pOiBzdHJpbmcge1xuICBpZiAoIWxhYmVscyB8fCBsYWJlbHMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gIHJldHVybiAnWycgKyBsYWJlbHMuam9pbignLCAnKSArICddJztcbn1cblxuZnVuY3Rpb24gZm9ybWF0VmFsdWUodjogYW55KTogc3RyaW5nIHtcbiAgaWYgKHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJzxuaWw+JztcbiAgaWYgKEFycmF5LmlzQXJyYXkodikpIHtcbiAgICByZXR1cm4gJ1snICsgdi5tYXAoZm9ybWF0VmFsdWUpLmpvaW4oJywgJykgKyAnXSc7XG4gIH1cbiAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IHBhcnRzID0gT2JqZWN0LmVudHJpZXModikubWFwKChbaywgdmFsXSkgPT4gYCR7a306ICR7Zm9ybWF0VmFsdWUodmFsKX1gKTtcbiAgICByZXR1cm4gJ3snICsgcGFydHMuam9pbignLCAnKSArICd9JztcbiAgfVxuICByZXR1cm4gU3RyaW5nKHYpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQYXRoKHBhdGg6IFBhdGgpOiBzdHJpbmcge1xuICBpZiAoIXBhdGgpIHJldHVybiAnPG5pbD4nO1xuXG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgbm9kZUlkeCA9IDA7XG4gIGxldCBlZGdlSWR4ID0gMDtcblxuICB3aGlsZSAobm9kZUlkeCA8IHBhdGgubm9kZXMubGVuZ3RoIHx8IGVkZ2VJZHggPCBwYXRoLmVkZ2VzLmxlbmd0aCkge1xuICAgIGlmIChub2RlSWR4IDwgcGF0aC5ub2Rlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwYXRoLm5vZGVzW25vZGVJZHhdO1xuICAgICAgY29uc3QgbGFiZWwgPSBub2RlLmxhYmVscy5sZW5ndGggPiAwID8gJzonICsgbm9kZS5sYWJlbHNbMF0gOiAnJztcbiAgICAgIHBhcnRzLnB1c2goYCgke25vZGUuaWR9JHtsYWJlbH0pYCk7XG4gICAgICBub2RlSWR4Kys7XG4gICAgfVxuICAgIGlmIChlZGdlSWR4IDwgcGF0aC5lZGdlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGVkZ2UgPSBwYXRoLmVkZ2VzW2VkZ2VJZHhdO1xuICAgICAgcGFydHMucHVzaChgLVske2VkZ2UuaWR9OiR7ZWRnZS5sYWJlbH1dLT5gKTtcbiAgICAgIGVkZ2VJZHgrKztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShhcnI6IHN0cmluZ1tdLCAuLi5pdGVtczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGFyci5zb21lKHMgPT4gaXRlbXMuaW5jbHVkZXMocykpO1xufVxuXG5mdW5jdGlvbiBidWlsZFNjaGVtYUZyb21Ob2RlKGxhYmVsOiBzdHJpbmcsIG5vZGU6IE5vZGUpOiBTY2hlbWEge1xuICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmVudHJpZXMobm9kZS5wcm9wZXJ0aWVzKS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+ICh7XG4gICAgbmFtZSxcbiAgICB0eXBlOiBpbmZlclByb3BlcnR5VHlwZSh2YWx1ZSksXG4gIH0pKTtcbiAgcmV0dXJuIHsgbmFtZTogbGFiZWwsIHByb3BlcnRpZXMgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTY2hlbWFGcm9tRWRnZShsYWJlbDogc3RyaW5nLCBlZGdlOiBFZGdlKTogU2NoZW1hIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5lbnRyaWVzKGVkZ2UucHJvcGVydGllcykubWFwKChbbmFtZSwgdmFsdWVdKSA9PiAoe1xuICAgIG5hbWUsXG4gICAgdHlwZTogaW5mZXJQcm9wZXJ0eVR5cGUodmFsdWUpLFxuICB9KSk7XG4gIHJldHVybiB7IG5hbWU6IGxhYmVsLCBwcm9wZXJ0aWVzIH07XG59XG5cbmZ1bmN0aW9uIGluZmVyUHJvcGVydHlUeXBlKHZhbHVlOiBhbnkpOiBQcm9wZXJ0eVR5cGUge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFByb3BlcnR5VHlwZS5OVUxMO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiBQcm9wZXJ0eVR5cGUuQk9PTDtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgPyBQcm9wZXJ0eVR5cGUuSU5UNjQgOiBQcm9wZXJ0eVR5cGUuRE9VQkxFO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gUHJvcGVydHlUeXBlLlNUUklORztcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHJldHVybiBQcm9wZXJ0eVR5cGUuQkxPQjtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gUHJvcGVydHlUeXBlLkxJU1Q7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSByZXR1cm4gUHJvcGVydHlUeXBlLk1BUDtcbiAgcmV0dXJuIFByb3BlcnR5VHlwZS5VTlNFVDtcbn1cbiJdfQ==
|