@finos/legend-application-studio 28.18.147 → 28.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/application/LegendIngestionConfiguration.d.ts +1 -5
- package/lib/application/LegendIngestionConfiguration.d.ts.map +1 -1
- package/lib/application/LegendIngestionConfiguration.js +1 -8
- package/lib/application/LegendIngestionConfiguration.js.map +1 -1
- package/lib/components/ElementIconUtils.d.ts.map +1 -1
- package/lib/components/ElementIconUtils.js +3 -1
- package/lib/components/ElementIconUtils.js.map +1 -1
- package/lib/components/editor/editor-group/EditorGroup.d.ts +2 -0
- package/lib/components/editor/editor-group/EditorGroup.d.ts.map +1 -1
- package/lib/components/editor/editor-group/EditorGroup.js +16 -2
- package/lib/components/editor/editor-group/EditorGroup.js.map +1 -1
- package/lib/components/editor/editor-group/RuntimeEditor.d.ts.map +1 -1
- package/lib/components/editor/editor-group/RuntimeEditor.js +3 -1
- package/lib/components/editor/editor-group/RuntimeEditor.js.map +1 -1
- package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.d.ts.map +1 -1
- package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.js +3 -3
- package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.js.map +1 -1
- package/lib/components/editor/editor-group/dataProduct/DataPoductEditor.d.ts.map +1 -1
- package/lib/components/editor/editor-group/dataProduct/DataPoductEditor.js +140 -26
- package/lib/components/editor/editor-group/dataProduct/DataPoductEditor.js.map +1 -1
- package/lib/components/editor/editor-group/function-activator/FunctionEditor.d.ts +1 -0
- package/lib/components/editor/editor-group/function-activator/FunctionEditor.d.ts.map +1 -1
- package/lib/components/editor/editor-group/function-activator/FunctionEditor.js +21 -3
- package/lib/components/editor/editor-group/function-activator/FunctionEditor.js.map +1 -1
- package/lib/{stores/ingestion/AdhocDataProductDeployResponse.js → components/editor/editor-group/function-activator/MemSQLFunctionActivatorEditor.d.ts} +3 -8
- package/lib/components/editor/editor-group/function-activator/MemSQLFunctionActivatorEditor.d.ts.map +1 -0
- package/lib/components/editor/editor-group/function-activator/MemSQLFunctionActivatorEditor.js +89 -0
- package/lib/components/editor/editor-group/function-activator/MemSQLFunctionActivatorEditor.js.map +1 -0
- package/lib/components/editor/editor-group/ingest-editor/IngestDefinitionEditor.js +1 -1
- package/lib/components/editor/editor-group/ingest-editor/IngestDefinitionEditor.js.map +1 -1
- package/lib/components/editor/editor-group/service-editor/ServiceExecutionQueryEditor.d.ts.map +1 -1
- package/lib/components/editor/editor-group/service-editor/ServiceExecutionQueryEditor.js +1 -2
- package/lib/components/editor/editor-group/service-editor/ServiceExecutionQueryEditor.js.map +1 -1
- package/lib/components/editor/side-bar/CreateNewElementModal.d.ts.map +1 -1
- package/lib/components/editor/side-bar/CreateNewElementModal.js +7 -7
- package/lib/components/editor/side-bar/CreateNewElementModal.js.map +1 -1
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/package.json +2 -1
- package/lib/stores/editor/EditorGraphState.d.ts.map +1 -1
- package/lib/stores/editor/EditorGraphState.js +4 -1
- package/lib/stores/editor/EditorGraphState.js.map +1 -1
- package/lib/stores/editor/EditorStore.d.ts +2 -2
- package/lib/stores/editor/EditorStore.d.ts.map +1 -1
- package/lib/stores/editor/EditorStore.js +2 -2
- package/lib/stores/editor/EditorStore.js.map +1 -1
- package/lib/stores/editor/EditorTabManagerState.d.ts.map +1 -1
- package/lib/stores/editor/EditorTabManagerState.js +5 -1
- package/lib/stores/editor/EditorTabManagerState.js.map +1 -1
- package/lib/stores/editor/NewElementState.d.ts +2 -0
- package/lib/stores/editor/NewElementState.d.ts.map +1 -1
- package/lib/stores/editor/NewElementState.js +10 -2
- package/lib/stores/editor/NewElementState.js.map +1 -1
- package/lib/stores/editor/data-cube/LegendStudioDataCubeHelper.d.ts +2 -2
- package/lib/stores/editor/data-cube/LegendStudioDataCubeHelper.d.ts.map +1 -1
- package/lib/stores/editor/data-cube/LegendStudioDataCubeHelper.js +4 -3
- package/lib/stores/editor/data-cube/LegendStudioDataCubeHelper.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/FunctionActivatorState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/FunctionActivatorState.js +14 -1
- package/lib/stores/editor/editor-state/element-editor-state/FunctionActivatorState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/FunctionEditorState.d.ts +3 -0
- package/lib/stores/editor/editor-state/element-editor-state/FunctionEditorState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/FunctionEditorState.js +24 -1
- package/lib/stores/editor/editor-state/element-editor-state/FunctionEditorState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/connection/ConnectionEditorState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/connection/ConnectionEditorState.js +3 -2
- package/lib/stores/editor/editor-state/element-editor-state/connection/ConnectionEditorState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.js +4 -1
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.d.ts +9 -4
- package/lib/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.js +23 -4
- package/lib/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/function-activator/HostedServiceFunctionActivatorEditorState.js +3 -3
- package/lib/stores/editor/editor-state/element-editor-state/function-activator/HostedServiceFunctionActivatorEditorState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/function-activator/MemSQLFunctionActivatorEditorState.d.ts +33 -0
- package/lib/stores/editor/editor-state/element-editor-state/function-activator/MemSQLFunctionActivatorEditorState.d.ts.map +1 -0
- package/lib/stores/editor/editor-state/element-editor-state/function-activator/MemSQLFunctionActivatorEditorState.js +86 -0
- package/lib/stores/editor/editor-state/element-editor-state/function-activator/MemSQLFunctionActivatorEditorState.js.map +1 -0
- package/lib/stores/editor/editor-state/element-editor-state/function-activator/SnowflakeAppFunctionActivatorEditorState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/function-activator/SnowflakeAppFunctionActivatorEditorState.js +28 -2
- package/lib/stores/editor/editor-state/element-editor-state/function-activator/SnowflakeAppFunctionActivatorEditorState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/ingest/IngestDefinitionEditorState.d.ts +2 -3
- package/lib/stores/editor/editor-state/element-editor-state/ingest/IngestDefinitionEditorState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/ingest/IngestDefinitionEditorState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/service/ServiceExecutionState.d.ts +4 -1
- package/lib/stores/editor/editor-state/element-editor-state/service/ServiceExecutionState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/service/ServiceExecutionState.js +24 -1
- package/lib/stores/editor/editor-state/element-editor-state/service/ServiceExecutionState.js.map +1 -1
- package/lib/stores/editor/panel-group/SQLPlaygroundPanelState.js +1 -1
- package/lib/stores/editor/panel-group/SQLPlaygroundPanelState.js.map +1 -1
- package/lib/stores/editor/utils/ModelClassifierUtils.d.ts +1 -0
- package/lib/stores/editor/utils/ModelClassifierUtils.d.ts.map +1 -1
- package/lib/stores/editor/utils/ModelClassifierUtils.js +1 -0
- package/lib/stores/editor/utils/ModelClassifierUtils.js.map +1 -1
- package/lib/stores/graph-modifier/DSL_DataProduct_GraphModifierHelper.d.ts +3 -2
- package/lib/stores/graph-modifier/DSL_DataProduct_GraphModifierHelper.d.ts.map +1 -1
- package/lib/stores/graph-modifier/DSL_DataProduct_GraphModifierHelper.js +7 -4
- package/lib/stores/graph-modifier/DSL_DataProduct_GraphModifierHelper.js.map +1 -1
- package/package.json +9 -8
- package/src/application/LegendIngestionConfiguration.ts +1 -12
- package/src/components/ElementIconUtils.tsx +3 -0
- package/src/components/editor/editor-group/EditorGroup.tsx +29 -8
- package/src/components/editor/editor-group/RuntimeEditor.tsx +3 -1
- package/src/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.tsx +3 -2
- package/src/components/editor/editor-group/dataProduct/DataPoductEditor.tsx +375 -65
- package/src/components/editor/editor-group/function-activator/FunctionEditor.tsx +40 -2
- package/src/components/editor/editor-group/function-activator/MemSQLFunctionActivatorEditor.tsx +269 -0
- package/src/components/editor/editor-group/ingest-editor/IngestDefinitionEditor.tsx +1 -1
- package/src/components/editor/editor-group/service-editor/ServiceExecutionQueryEditor.tsx +1 -2
- package/src/components/editor/side-bar/CreateNewElementModal.tsx +38 -6
- package/src/index.ts +2 -0
- package/src/stores/editor/EditorGraphState.ts +3 -0
- package/src/stores/editor/EditorStore.ts +7 -5
- package/src/stores/editor/EditorTabManagerState.ts +4 -0
- package/src/stores/editor/NewElementState.ts +13 -2
- package/src/stores/editor/data-cube/LegendStudioDataCubeHelper.ts +14 -2
- package/src/stores/editor/editor-state/element-editor-state/FunctionActivatorState.ts +15 -0
- package/src/stores/editor/editor-state/element-editor-state/FunctionEditorState.ts +50 -0
- package/src/stores/editor/editor-state/element-editor-state/connection/ConnectionEditorState.ts +3 -2
- package/src/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.ts +4 -1
- package/src/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.ts +31 -5
- package/src/stores/editor/editor-state/element-editor-state/function-activator/HostedServiceFunctionActivatorEditorState.ts +3 -3
- package/src/stores/editor/editor-state/element-editor-state/function-activator/MemSQLFunctionActivatorEditorState.ts +130 -0
- package/src/stores/editor/editor-state/element-editor-state/function-activator/SnowflakeAppFunctionActivatorEditorState.ts +38 -7
- package/src/stores/editor/editor-state/element-editor-state/ingest/IngestDefinitionEditorState.ts +3 -3
- package/src/stores/editor/editor-state/element-editor-state/service/ServiceExecutionState.ts +51 -0
- package/src/stores/editor/panel-group/SQLPlaygroundPanelState.ts +1 -1
- package/src/stores/editor/utils/ModelClassifierUtils.ts +1 -0
- package/src/stores/graph-modifier/DSL_DataProduct_GraphModifierHelper.ts +10 -4
- package/tsconfig.json +2 -5
- package/lib/stores/ingestion/AdhocDataProductDeployResponse.d.ts +0 -21
- package/lib/stores/ingestion/AdhocDataProductDeployResponse.d.ts.map +0 -1
- package/lib/stores/ingestion/AdhocDataProductDeployResponse.js.map +0 -1
- package/lib/stores/ingestion/IngestDeploymentServerClient.d.ts +0 -35
- package/lib/stores/ingestion/IngestDeploymentServerClient.d.ts.map +0 -1
- package/lib/stores/ingestion/IngestDeploymentServerClient.js +0 -58
- package/lib/stores/ingestion/IngestDeploymentServerClient.js.map +0 -1
- package/lib/stores/ingestion/IngestDiscoveryServerClient.d.ts +0 -26
- package/lib/stores/ingestion/IngestDiscoveryServerClient.d.ts.map +0 -1
- package/lib/stores/ingestion/IngestDiscoveryServerClient.js +0 -35
- package/lib/stores/ingestion/IngestDiscoveryServerClient.js.map +0 -1
- package/lib/stores/ingestion/IngestionDeploymentResponse.d.ts +0 -41
- package/lib/stores/ingestion/IngestionDeploymentResponse.d.ts.map +0 -1
- package/lib/stores/ingestion/IngestionDeploymentResponse.js +0 -56
- package/lib/stores/ingestion/IngestionDeploymentResponse.js.map +0 -1
- package/lib/stores/ingestion/IngestionManager.d.ts +0 -38
- package/lib/stores/ingestion/IngestionManager.d.ts.map +0 -1
- package/lib/stores/ingestion/IngestionManager.js +0 -111
- package/lib/stores/ingestion/IngestionManager.js.map +0 -1
- package/src/stores/ingestion/AdhocDataProductDeployResponse.ts +0 -29
- package/src/stores/ingestion/IngestDeploymentServerClient.ts +0 -112
- package/src/stores/ingestion/IngestDiscoveryServerClient.ts +0 -52
- package/src/stores/ingestion/IngestionDeploymentResponse.ts +0 -74
- package/src/stores/ingestion/IngestionManager.ts +0 -219
@@ -68,9 +68,11 @@ import {
|
|
68
68
|
QueryBuilderTelemetryHelper,
|
69
69
|
buildExecutionParameterValues,
|
70
70
|
getExecutionQueryFromRawLambda,
|
71
|
+
getRawLambdaForLetFuncs,
|
71
72
|
} from '@finos/legend-query-builder';
|
72
73
|
import { FunctionActivatorState } from './FunctionActivatorState.js';
|
73
74
|
import { FunctionTestableState } from './function-activator/testable/FunctionTestableState.js';
|
75
|
+
import { openDataCube } from '../../data-cube/LegendStudioDataCubeHelper.js';
|
74
76
|
|
75
77
|
export enum FUNCTION_EDITOR_TAB {
|
76
78
|
DEFINITION = 'DEFINITION',
|
@@ -249,6 +251,24 @@ export class FunctionParametersState extends LambdaParametersState {
|
|
249
251
|
);
|
250
252
|
}
|
251
253
|
|
254
|
+
openDataCubeModal(
|
255
|
+
query: RawLambda,
|
256
|
+
element: PackageableElement,
|
257
|
+
editorStore: EditorStore,
|
258
|
+
): void {
|
259
|
+
this.parameterStates = this.build(query);
|
260
|
+
this.parameterValuesEditorState.open(
|
261
|
+
(): Promise<void> =>
|
262
|
+
this.functionEditorState
|
263
|
+
.openingDataCube(element, editorStore)
|
264
|
+
.catch(
|
265
|
+
this.functionEditorState.editorStore.applicationStore
|
266
|
+
.alertUnhandledError,
|
267
|
+
),
|
268
|
+
PARAMETER_SUBMIT_ACTION.RUN,
|
269
|
+
);
|
270
|
+
}
|
271
|
+
|
252
272
|
build(lambda: RawLambda): LambdaParameterState[] {
|
253
273
|
const parameters = buildLambdaVariableExpressions(
|
254
274
|
lambda,
|
@@ -531,6 +551,36 @@ export class FunctionEditorState extends ElementEditorState {
|
|
531
551
|
}
|
532
552
|
}
|
533
553
|
|
554
|
+
async handleOpeningDataCube(
|
555
|
+
element: PackageableElement,
|
556
|
+
editorStore: EditorStore,
|
557
|
+
): Promise<void> {
|
558
|
+
const query = this.bodyExpressionSequence;
|
559
|
+
const parameters = (query.parameters ?? []) as object[];
|
560
|
+
if (parameters.length) {
|
561
|
+
this.parametersState.openDataCubeModal(query, element, editorStore);
|
562
|
+
} else {
|
563
|
+
await openDataCube(element, editorStore);
|
564
|
+
}
|
565
|
+
}
|
566
|
+
|
567
|
+
async openingDataCube(
|
568
|
+
element: PackageableElement,
|
569
|
+
editorStore: EditorStore,
|
570
|
+
): Promise<void> {
|
571
|
+
const params = buildExecutionParameterValues(
|
572
|
+
this.parametersState.parameterStates,
|
573
|
+
this.editorStore.graphManagerState,
|
574
|
+
);
|
575
|
+
|
576
|
+
const letFuncsRawLambda = getRawLambdaForLetFuncs(
|
577
|
+
this.parametersState.parameterStates,
|
578
|
+
this.editorStore.graphManagerState,
|
579
|
+
);
|
580
|
+
|
581
|
+
await openDataCube(element, editorStore, params, letFuncsRawLambda);
|
582
|
+
}
|
583
|
+
|
534
584
|
*handleRunFunc(): GeneratorFn<void> {
|
535
585
|
if (this.isRunningFunc) {
|
536
586
|
return;
|
package/src/stores/editor/editor-state/element-editor-state/connection/ConnectionEditorState.ts
CHANGED
@@ -171,8 +171,9 @@ export class RelationalDatabaseConnectionValueState extends ConnectionValueState
|
|
171
171
|
};
|
172
172
|
|
173
173
|
get storeValidationResult(): ValidationIssue | undefined {
|
174
|
-
return
|
175
|
-
|
174
|
+
return !this.connection.store ||
|
175
|
+
isStubbed_PackageableElement(this.connection.store.value)
|
176
|
+
? createValidationError(['Connection database is empty'])
|
176
177
|
: undefined;
|
177
178
|
}
|
178
179
|
|
package/src/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.ts
CHANGED
@@ -373,12 +373,15 @@ export class DatabaseSchemaExplorerState {
|
|
373
373
|
});
|
374
374
|
|
375
375
|
this.connection = connection;
|
376
|
-
this.database = guaranteeType(connection.store
|
376
|
+
this.database = guaranteeType(connection.store?.value, Database);
|
377
377
|
this.editorStore = editorStore;
|
378
378
|
this.targetDatabasePath = DEFAULT_DATABASE_PATH;
|
379
379
|
}
|
380
380
|
|
381
381
|
get isCreatingNewDatabase(): boolean {
|
382
|
+
if (!this.connection.store) {
|
383
|
+
return false;
|
384
|
+
}
|
382
385
|
return isStubbed_PackageableElement(this.connection.store.value);
|
383
386
|
}
|
384
387
|
|
package/src/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.ts
CHANGED
@@ -44,20 +44,24 @@ import {
|
|
44
44
|
ActionState,
|
45
45
|
guaranteeNonNullable,
|
46
46
|
assertTrue,
|
47
|
+
uuid,
|
47
48
|
} from '@finos/legend-shared';
|
48
49
|
import {
|
49
50
|
dataProduct_addAccessPoint,
|
50
51
|
dataProduct_addAccessPointGroup,
|
51
52
|
dataProduct_deleteAccessPoint,
|
53
|
+
dataProduct_deleteAccessPointGroup,
|
52
54
|
} from '../../../../graph-modifier/DSL_DataProduct_GraphModifierHelper.js';
|
53
55
|
import { LambdaEditorState } from '@finos/legend-query-builder';
|
54
|
-
import type { IngestionManager } from '../../../../ingestion/IngestionManager.js';
|
55
56
|
import {
|
56
57
|
DataProductElementEditorInitialConfiguration,
|
57
58
|
EditorInitialConfiguration,
|
58
59
|
} from '../ElementEditorInitialConfiguration.js';
|
59
60
|
import { EXTERNAL_APPLICATION_NAVIGATION__generateUrlWithEditorConfig } from '../../../../../__lib__/LegendStudioNavigation.js';
|
60
|
-
import type {
|
61
|
+
import type {
|
62
|
+
AdhocDataProductDeployResponse,
|
63
|
+
LakehouseIngestionManager,
|
64
|
+
} from '@finos/legend-server-lakehouse';
|
61
65
|
|
62
66
|
export class AccessPointState {
|
63
67
|
readonly state: AccessPointGroupState;
|
@@ -187,6 +191,7 @@ export class LakehouseAccessPointState extends AccessPointState {
|
|
187
191
|
|
188
192
|
export class AccessPointGroupState {
|
189
193
|
readonly state: DataProductEditorState;
|
194
|
+
readonly uuid = uuid();
|
190
195
|
value: AccessPointGroup;
|
191
196
|
accessPointStates: AccessPointState[] = [];
|
192
197
|
|
@@ -248,11 +253,13 @@ export const generateUrlToDeployOnOpen = (
|
|
248
253
|
|
249
254
|
export class DataProductEditorState extends ElementEditorState {
|
250
255
|
accessPointModal = false;
|
256
|
+
accessPointGroupModal = false;
|
251
257
|
deploymentState = ActionState.create();
|
252
258
|
accessPointGroupStates: AccessPointGroupState[] = [];
|
253
259
|
isConvertingTransformLambdaObjects = false;
|
254
260
|
deployOnOpen = false;
|
255
261
|
deployResponse: AdhocDataProductDeployResponse | undefined;
|
262
|
+
editingGroupState: AccessPointGroupState | undefined;
|
256
263
|
|
257
264
|
constructor(
|
258
265
|
editorStore: EditorStore,
|
@@ -264,6 +271,7 @@ export class DataProductEditorState extends ElementEditorState {
|
|
264
271
|
makeObservable(this, {
|
265
272
|
product: computed,
|
266
273
|
accessPointModal: observable,
|
274
|
+
accessPointGroupModal: observable,
|
267
275
|
accessPointGroupStates: observable,
|
268
276
|
isConvertingTransformLambdaObjects: observable,
|
269
277
|
deploy: flow,
|
@@ -272,8 +280,11 @@ export class DataProductEditorState extends ElementEditorState {
|
|
272
280
|
setDeployOnOpen: action,
|
273
281
|
setDeployResponse: action,
|
274
282
|
setAccessPointModal: action,
|
283
|
+
setAccessPointGroupModal: action,
|
275
284
|
addAccessPoint: action,
|
276
285
|
convertAccessPointsFuncObjects: flow,
|
286
|
+
editingGroupState: observable,
|
287
|
+
setEditingGroupState: action,
|
277
288
|
});
|
278
289
|
this.accessPointGroupStates = this.product.accessPointGroups.map(
|
279
290
|
(e) => new AccessPointGroupState(e, this),
|
@@ -336,6 +347,14 @@ export class DataProductEditorState extends ElementEditorState {
|
|
336
347
|
this.accessPointModal = val;
|
337
348
|
}
|
338
349
|
|
350
|
+
setEditingGroupState(val: AccessPointGroupState | undefined): void {
|
351
|
+
this.editingGroupState = val;
|
352
|
+
}
|
353
|
+
|
354
|
+
setAccessPointGroupModal(val: boolean): void {
|
355
|
+
this.accessPointGroupModal = val;
|
356
|
+
}
|
357
|
+
|
339
358
|
addAccessPoint(
|
340
359
|
id: string,
|
341
360
|
description: string | undefined,
|
@@ -350,12 +369,12 @@ export class DataProductEditorState extends ElementEditorState {
|
|
350
369
|
const groupState =
|
351
370
|
accessPointGroup instanceof AccessPointGroupState
|
352
371
|
? accessPointGroup
|
353
|
-
: this.
|
372
|
+
: this.createGroupAndAdd(accessPointGroup);
|
354
373
|
groupState.addAccessPoint(accesspoint);
|
355
374
|
addUniqueEntry(this.accessPointGroupStates, groupState);
|
356
375
|
}
|
357
376
|
|
358
|
-
|
377
|
+
createGroupAndAdd(id: string, description?: string): AccessPointGroupState {
|
359
378
|
const existingGroupState = this.accessPointGroupStates.find(
|
360
379
|
(groupState) => groupState.value.id === id,
|
361
380
|
);
|
@@ -365,10 +384,17 @@ export class DataProductEditorState extends ElementEditorState {
|
|
365
384
|
}
|
366
385
|
const group = new AccessPointGroup();
|
367
386
|
group.id = id;
|
387
|
+
group.description = description;
|
368
388
|
dataProduct_addAccessPointGroup(this.product, group);
|
369
389
|
return new AccessPointGroupState(group, this);
|
370
390
|
}
|
371
391
|
|
392
|
+
deleteAccessPointGroup(val: AccessPointGroupState): void {
|
393
|
+
const state = this.accessPointGroupStates.find((a) => a === val);
|
394
|
+
deleteEntry(this.accessPointGroupStates, state);
|
395
|
+
dataProduct_deleteAccessPointGroup(this.product, val.value);
|
396
|
+
}
|
397
|
+
|
372
398
|
*deploy(token: string | undefined): GeneratorFn<void> {
|
373
399
|
try {
|
374
400
|
assertTrue(
|
@@ -426,7 +452,7 @@ export class DataProductEditorState extends ElementEditorState {
|
|
426
452
|
return this.product.accessPointGroups.map((e) => e.accessPoints).flat();
|
427
453
|
}
|
428
454
|
|
429
|
-
get ingestionManager():
|
455
|
+
get ingestionManager(): LakehouseIngestionManager | undefined {
|
430
456
|
return this.editorStore.ingestionManager;
|
431
457
|
}
|
432
458
|
|
@@ -201,19 +201,19 @@ export class HostedServiceFunctionActivatorEditorState extends ElementEditorStat
|
|
201
201
|
.then((response) =>
|
202
202
|
this.editorStore.applicationStore.alertService.setActionAlertInfo({
|
203
203
|
message: `Hosted Service Function Activator has been deployed successfully`,
|
204
|
-
prompt: response.
|
204
|
+
prompt: response.deployed
|
205
205
|
? 'You can now launch and monitor the operation of your function activator'
|
206
206
|
: undefined,
|
207
207
|
type: ActionAlertType.STANDARD,
|
208
208
|
actions: [
|
209
|
-
...(response.
|
209
|
+
...(response.deployed !== undefined
|
210
210
|
? [
|
211
211
|
{
|
212
212
|
label: 'Launch Service',
|
213
213
|
type: ActionAlertActionType.PROCEED,
|
214
214
|
handler: (): void => {
|
215
215
|
this.editorStore.applicationStore.navigationService.navigator.visitAddress(
|
216
|
-
response.
|
216
|
+
response.deployed ?? '',
|
217
217
|
);
|
218
218
|
},
|
219
219
|
default: true,
|
@@ -0,0 +1,130 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright (c) 2020-present, Goldman Sachs
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
* you may not use this file except in compliance with the License.
|
6
|
+
* You may obtain a copy of the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
* See the License for the specific language governing permissions and
|
14
|
+
* limitations under the License.
|
15
|
+
*/
|
16
|
+
|
17
|
+
import {
|
18
|
+
type PackageableConnection,
|
19
|
+
MemSQLFunction,
|
20
|
+
ConnectionPointer,
|
21
|
+
InMemoryGraphData,
|
22
|
+
PackageableElementExplicitReference,
|
23
|
+
observe_MemSQLFunctionDeploymentConfiguration,
|
24
|
+
observe_MemSQLFunction,
|
25
|
+
DeploymentOwner,
|
26
|
+
observe_DeploymentOwnership,
|
27
|
+
} from '@finos/legend-graph';
|
28
|
+
import {
|
29
|
+
type GeneratorFn,
|
30
|
+
ActionState,
|
31
|
+
assertErrorThrown,
|
32
|
+
guaranteeType,
|
33
|
+
} from '@finos/legend-shared';
|
34
|
+
import { makeObservable, action, flow, computed } from 'mobx';
|
35
|
+
import type { EditorStore } from '../../../EditorStore.js';
|
36
|
+
import { ElementEditorState } from '../ElementEditorState.js';
|
37
|
+
|
38
|
+
export class MemSQLFunctionActivatorEditorState extends ElementEditorState {
|
39
|
+
readonly validateState = ActionState.create();
|
40
|
+
readonly deployState = ActionState.create();
|
41
|
+
|
42
|
+
constructor(editorStore: EditorStore, element: MemSQLFunction) {
|
43
|
+
super(editorStore, element);
|
44
|
+
|
45
|
+
makeObservable(this, {
|
46
|
+
activator: computed,
|
47
|
+
reprocess: action,
|
48
|
+
updateOwnership: action,
|
49
|
+
updateAppDescription: action,
|
50
|
+
updateApplicationName: action,
|
51
|
+
updateConnection: action,
|
52
|
+
validate: flow,
|
53
|
+
deployToSandbox: flow,
|
54
|
+
});
|
55
|
+
}
|
56
|
+
|
57
|
+
get activator(): MemSQLFunction {
|
58
|
+
return observe_MemSQLFunction(
|
59
|
+
guaranteeType(
|
60
|
+
this.element,
|
61
|
+
MemSQLFunction,
|
62
|
+
'Element inside Mem SQL function editor state must be a MemSQLFunction',
|
63
|
+
),
|
64
|
+
);
|
65
|
+
}
|
66
|
+
|
67
|
+
updateConnection(val: PackageableConnection): void {
|
68
|
+
this.activator.activationConfiguration.activationConnection =
|
69
|
+
new ConnectionPointer(PackageableElementExplicitReference.create(val));
|
70
|
+
observe_MemSQLFunctionDeploymentConfiguration(
|
71
|
+
this.activator.activationConfiguration,
|
72
|
+
);
|
73
|
+
}
|
74
|
+
|
75
|
+
updateOwnership(val: string): void {
|
76
|
+
this.activator.ownership = new DeploymentOwner(val, this.activator);
|
77
|
+
observe_DeploymentOwnership(this.activator.ownership);
|
78
|
+
}
|
79
|
+
|
80
|
+
updateApplicationName(val: string): void {
|
81
|
+
this.activator.functionName = val;
|
82
|
+
}
|
83
|
+
|
84
|
+
updateAppDescription(val: string): void {
|
85
|
+
this.activator.description = val;
|
86
|
+
}
|
87
|
+
|
88
|
+
*validate(): GeneratorFn<void> {
|
89
|
+
this.validateState.inProgress();
|
90
|
+
try {
|
91
|
+
yield this.editorStore.graphManagerState.graphManager.validateFunctionActivator(
|
92
|
+
this.activator,
|
93
|
+
new InMemoryGraphData(this.editorStore.graphManagerState.graph),
|
94
|
+
);
|
95
|
+
this.editorStore.applicationStore.notificationService.notifySuccess(
|
96
|
+
`Function activator is valid`,
|
97
|
+
);
|
98
|
+
} catch (error) {
|
99
|
+
assertErrorThrown(error);
|
100
|
+
this.editorStore.applicationStore.notificationService.notifyError(error);
|
101
|
+
} finally {
|
102
|
+
this.validateState.complete();
|
103
|
+
}
|
104
|
+
}
|
105
|
+
|
106
|
+
*deployToSandbox(): GeneratorFn<void> {
|
107
|
+
this.deployState.inProgress();
|
108
|
+
try {
|
109
|
+
yield this.editorStore.graphManagerState.graphManager.publishFunctionActivatorToSandbox(
|
110
|
+
this.activator,
|
111
|
+
new InMemoryGraphData(this.editorStore.graphManagerState.graph),
|
112
|
+
);
|
113
|
+
this.editorStore.applicationStore.notificationService.notifySuccess(
|
114
|
+
'MemSQL Function Activator has been deployed successfully',
|
115
|
+
);
|
116
|
+
} catch (error) {
|
117
|
+
assertErrorThrown(error);
|
118
|
+
this.editorStore.applicationStore.notificationService.notifyError(error);
|
119
|
+
} finally {
|
120
|
+
this.deployState.complete();
|
121
|
+
}
|
122
|
+
}
|
123
|
+
|
124
|
+
reprocess(
|
125
|
+
newElement: MemSQLFunction,
|
126
|
+
editorStore: EditorStore,
|
127
|
+
): MemSQLFunctionActivatorEditorState {
|
128
|
+
return new MemSQLFunctionActivatorEditorState(editorStore, newElement);
|
129
|
+
}
|
130
|
+
}
|
@@ -35,6 +35,10 @@ import {
|
|
35
35
|
import { makeObservable, action, flow, computed } from 'mobx';
|
36
36
|
import type { EditorStore } from '../../../EditorStore.js';
|
37
37
|
import { ElementEditorState } from '../ElementEditorState.js';
|
38
|
+
import {
|
39
|
+
ActionAlertActionType,
|
40
|
+
ActionAlertType,
|
41
|
+
} from '@finos/legend-application';
|
38
42
|
|
39
43
|
export class SnowflakeAppFunctionActivatorEdtiorState extends ElementEditorState {
|
40
44
|
readonly validateState = ActionState.create();
|
@@ -122,13 +126,40 @@ export class SnowflakeAppFunctionActivatorEdtiorState extends ElementEditorState
|
|
122
126
|
*deployToSandbox(): GeneratorFn<void> {
|
123
127
|
this.deployState.inProgress();
|
124
128
|
try {
|
125
|
-
yield this.editorStore.graphManagerState.graphManager
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
129
|
+
yield this.editorStore.graphManagerState.graphManager
|
130
|
+
.publishFunctionActivatorToSandbox(
|
131
|
+
this.activator,
|
132
|
+
new InMemoryGraphData(this.editorStore.graphManagerState.graph),
|
133
|
+
)
|
134
|
+
.then((response) =>
|
135
|
+
this.editorStore.applicationStore.alertService.setActionAlertInfo({
|
136
|
+
message: `Snowflake UDTF has been deployed successfully`,
|
137
|
+
prompt: response.deploymentLocation
|
138
|
+
? 'You can now call your UDTF on Snowflake'
|
139
|
+
: undefined,
|
140
|
+
type: ActionAlertType.STANDARD,
|
141
|
+
actions: [
|
142
|
+
...(response.deploymentLocation !== undefined
|
143
|
+
? [
|
144
|
+
{
|
145
|
+
label: 'Launch Snowflake UDTF',
|
146
|
+
type: ActionAlertActionType.PROCEED,
|
147
|
+
handler: (): void => {
|
148
|
+
this.editorStore.applicationStore.navigationService.navigator.visitAddress(
|
149
|
+
response.deploymentLocation ?? '',
|
150
|
+
);
|
151
|
+
},
|
152
|
+
default: true,
|
153
|
+
},
|
154
|
+
]
|
155
|
+
: []),
|
156
|
+
{
|
157
|
+
label: 'Close',
|
158
|
+
type: ActionAlertActionType.PROCEED_WITH_CAUTION,
|
159
|
+
},
|
160
|
+
],
|
161
|
+
}),
|
162
|
+
);
|
132
163
|
} catch (error) {
|
133
164
|
assertErrorThrown(error);
|
134
165
|
this.editorStore.applicationStore.notificationService.notifyError(error);
|
package/src/stores/editor/editor-state/element-editor-state/ingest/IngestDefinitionEditorState.ts
CHANGED
@@ -27,7 +27,6 @@ import {
|
|
27
27
|
removePrefix,
|
28
28
|
type GeneratorFn,
|
29
29
|
} from '@finos/legend-shared';
|
30
|
-
import type { IngestionManager } from '../../../../ingestion/IngestionManager.js';
|
31
30
|
import {
|
32
31
|
action,
|
33
32
|
computed,
|
@@ -39,8 +38,9 @@ import {
|
|
39
38
|
import type {
|
40
39
|
IngestDefinitionDeploymentResponse,
|
41
40
|
IngestDefinitionValidationResponse,
|
41
|
+
LakehouseIngestionManager,
|
42
42
|
ValidateAndDeploymentResponse,
|
43
|
-
} from '
|
43
|
+
} from '@finos/legend-server-lakehouse';
|
44
44
|
import {
|
45
45
|
EditorInitialConfiguration,
|
46
46
|
IngestElementEditorInitialConfiguration,
|
@@ -113,7 +113,7 @@ export class IngestDefinitionEditorState extends ElementEditorState {
|
|
113
113
|
);
|
114
114
|
}
|
115
115
|
|
116
|
-
get ingestionManager():
|
116
|
+
get ingestionManager(): LakehouseIngestionManager | undefined {
|
117
117
|
return this.editorStore.ingestionManager;
|
118
118
|
}
|
119
119
|
|
package/src/stores/editor/editor-state/element-editor-state/service/ServiceExecutionState.ts
CHANGED
@@ -41,6 +41,7 @@ import {
|
|
41
41
|
type QueryInfo,
|
42
42
|
type LightQuery,
|
43
43
|
type ExecutionResultWithMetadata,
|
44
|
+
type Service,
|
44
45
|
PureSingleExecution,
|
45
46
|
PureMultiExecution,
|
46
47
|
KeyedExecutionParameter,
|
@@ -84,8 +85,10 @@ import {
|
|
84
85
|
QUERY_BUILDER_EVENT,
|
85
86
|
ExecutionPlanState,
|
86
87
|
QUERY_LOADER_TYPEAHEAD_SEARCH_LIMIT,
|
88
|
+
getRawLambdaForLetFuncs,
|
87
89
|
} from '@finos/legend-query-builder';
|
88
90
|
import { DEFAULT_TAB_SIZE } from '@finos/legend-application';
|
91
|
+
import { openDataCube } from '../../../data-cube/LegendStudioDataCubeHelper.js';
|
89
92
|
|
90
93
|
export class ServiceExecutionParametersState extends LambdaParametersState {
|
91
94
|
executionState: ServicePureExecutionState;
|
@@ -115,6 +118,24 @@ export class ServiceExecutionParametersState extends LambdaParametersState {
|
|
115
118
|
);
|
116
119
|
}
|
117
120
|
|
121
|
+
openDataCubeModal(
|
122
|
+
query: RawLambda,
|
123
|
+
element: Service,
|
124
|
+
editorStore: EditorStore,
|
125
|
+
): void {
|
126
|
+
this.parameterStates = this.build(query);
|
127
|
+
this.parameterValuesEditorState.open(
|
128
|
+
(): Promise<void> =>
|
129
|
+
this.executionState
|
130
|
+
.openingDataCube(element, editorStore)
|
131
|
+
.catch(
|
132
|
+
this.executionState.editorStore.applicationStore
|
133
|
+
.alertUnhandledError,
|
134
|
+
),
|
135
|
+
PARAMETER_SUBMIT_ACTION.RUN,
|
136
|
+
);
|
137
|
+
}
|
138
|
+
|
118
139
|
build(query: RawLambda): LambdaParameterState[] {
|
119
140
|
const parameters = buildLambdaVariableExpressions(
|
120
141
|
query,
|
@@ -495,6 +516,36 @@ export abstract class ServicePureExecutionState extends ServiceExecutionState {
|
|
495
516
|
this.queryRunPromise = promise;
|
496
517
|
};
|
497
518
|
|
519
|
+
async handleOpeningDataCube(
|
520
|
+
element: Service,
|
521
|
+
editorStore: EditorStore,
|
522
|
+
): Promise<void> {
|
523
|
+
const query = this.queryState.query;
|
524
|
+
const parameters = (query.parameters ?? []) as object[];
|
525
|
+
if (parameters.length) {
|
526
|
+
this.parametersState.openDataCubeModal(query, element, editorStore);
|
527
|
+
} else {
|
528
|
+
await openDataCube(element, editorStore);
|
529
|
+
}
|
530
|
+
}
|
531
|
+
|
532
|
+
async openingDataCube(
|
533
|
+
element: Service,
|
534
|
+
editorStore: EditorStore,
|
535
|
+
): Promise<void> {
|
536
|
+
const params = buildExecutionParameterValues(
|
537
|
+
this.parametersState.parameterStates,
|
538
|
+
this.editorStore.graphManagerState,
|
539
|
+
);
|
540
|
+
|
541
|
+
const letFuncsRawLambda = getRawLambdaForLetFuncs(
|
542
|
+
this.parametersState.parameterStates,
|
543
|
+
this.editorStore.graphManagerState,
|
544
|
+
);
|
545
|
+
|
546
|
+
await openDataCube(element, editorStore, params, letFuncsRawLambda);
|
547
|
+
}
|
548
|
+
|
498
549
|
*generatePlan(debug: boolean): GeneratorFn<void> {
|
499
550
|
if (this.isGeneratingPlan) {
|
500
551
|
return;
|
@@ -95,7 +95,7 @@ export class SQLPlaygroundPanelState implements CommandRegistrar {
|
|
95
95
|
this.connection = val;
|
96
96
|
if (val) {
|
97
97
|
const connection = guaranteeRelationalDatabaseConnection(val);
|
98
|
-
this.database = connection.store
|
98
|
+
this.database = connection.store?.value;
|
99
99
|
this.schemaExplorerState = new DatabaseSchemaExplorerState(
|
100
100
|
this.editorStore,
|
101
101
|
connection,
|
@@ -32,14 +32,20 @@ export const dataProduct_deleteAccessPoint = action(
|
|
32
32
|
);
|
33
33
|
|
34
34
|
export const dataProduct_addAccessPoint = action(
|
35
|
-
(
|
36
|
-
addUniqueEntry(
|
35
|
+
(group: AccessPointGroup, accessPoint: AccessPoint) => {
|
36
|
+
addUniqueEntry(group.accessPoints, observe_AccessPoint(accessPoint));
|
37
37
|
},
|
38
38
|
);
|
39
39
|
|
40
40
|
export const accessPointGroup_setDescription = action(
|
41
|
-
(
|
42
|
-
|
41
|
+
(group: AccessPointGroup, description: string) => {
|
42
|
+
group.description = description;
|
43
|
+
},
|
44
|
+
);
|
45
|
+
|
46
|
+
export const accessPointGroup_setName = action(
|
47
|
+
(group: AccessPointGroup, name: string) => {
|
48
|
+
group.id = name;
|
43
49
|
},
|
44
50
|
);
|
45
51
|
|
package/tsconfig.json
CHANGED
@@ -133,6 +133,7 @@
|
|
133
133
|
"./src/stores/editor/editor-state/element-editor-state/external-format/DSL_ExternalFormat_SchemaSetEditorState.ts",
|
134
134
|
"./src/stores/editor/editor-state/element-editor-state/function-activator/HostedServiceFunctionActivatorEditorState.ts",
|
135
135
|
"./src/stores/editor/editor-state/element-editor-state/function-activator/INTERNAL__UnknownFunctionActivatorEditorState.ts",
|
136
|
+
"./src/stores/editor/editor-state/element-editor-state/function-activator/MemSQLFunctionActivatorEditorState.ts",
|
136
137
|
"./src/stores/editor/editor-state/element-editor-state/function-activator/PostDeploymentActionEditorState.ts",
|
137
138
|
"./src/stores/editor/editor-state/element-editor-state/function-activator/SnowflakeAppFunctionActivatorEditorState.ts",
|
138
139
|
"./src/stores/editor/editor-state/element-editor-state/function-activator/testable/FunctionTestableState.ts",
|
@@ -205,11 +206,6 @@
|
|
205
206
|
"./src/stores/graph-modifier/STO_FlatData_GraphModifierHelper.ts",
|
206
207
|
"./src/stores/graph-modifier/STO_Relational_GraphModifierHelper.ts",
|
207
208
|
"./src/stores/graph-modifier/Testable_GraphModifierHelper.ts",
|
208
|
-
"./src/stores/ingestion/AdhocDataProductDeployResponse.ts",
|
209
|
-
"./src/stores/ingestion/IngestDeploymentServerClient.ts",
|
210
|
-
"./src/stores/ingestion/IngestDiscoveryServerClient.ts",
|
211
|
-
"./src/stores/ingestion/IngestionDeploymentResponse.ts",
|
212
|
-
"./src/stores/ingestion/IngestionManager.ts",
|
213
209
|
"./src/stores/lazy-text-editor/LazyTextEditorStore.ts",
|
214
210
|
"./src/stores/project-reviewer/ProjectReviewerStore.ts",
|
215
211
|
"./src/stores/project-view/ProjectViewerEditorMode.ts",
|
@@ -273,6 +269,7 @@
|
|
273
269
|
"./src/components/editor/editor-group/function-activator/FunctionEditor.tsx",
|
274
270
|
"./src/components/editor/editor-group/function-activator/HostedServiceFunctionActivatorEditor.tsx",
|
275
271
|
"./src/components/editor/editor-group/function-activator/INTERNAL__UnknownFunctionActivatorEdtior.tsx",
|
272
|
+
"./src/components/editor/editor-group/function-activator/MemSQLFunctionActivatorEditor.tsx",
|
276
273
|
"./src/components/editor/editor-group/function-activator/SnowflakeAppFunctionActivatorEditor.tsx",
|
277
274
|
"./src/components/editor/editor-group/function-activator/testable/FunctionTestableEditor.tsx",
|
278
275
|
"./src/components/editor/editor-group/ingest-editor/IngestDefinitionEditor.tsx",
|
@@ -1,21 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Copyright (c) 2020-present, Goldman Sachs
|
3
|
-
*
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
* you may not use this file except in compliance with the License.
|
6
|
-
* You may obtain a copy of the License at
|
7
|
-
*
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
*
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
-
* See the License for the specific language governing permissions and
|
14
|
-
* limitations under the License.
|
15
|
-
*/
|
16
|
-
import type { PlainObject } from '@finos/legend-shared';
|
17
|
-
export declare class AdhocDataProductDeployResponse {
|
18
|
-
content: PlainObject;
|
19
|
-
}
|
20
|
-
export declare const createAdhocDataProductDeployResponse: (json: PlainObject<AdhocDataProductDeployResponse>) => AdhocDataProductDeployResponse;
|
21
|
-
//# sourceMappingURL=AdhocDataProductDeployResponse.d.ts.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"AdhocDataProductDeployResponse.d.ts","sourceRoot":"","sources":["../../../src/stores/ingestion/AdhocDataProductDeployResponse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,qBAAa,8BAA8B;IACzC,OAAO,EAAG,WAAW,CAAC;CACvB;AAED,eAAO,MAAM,oCAAoC,GAC/C,MAAM,WAAW,CAAC,8BAA8B,CAAC,KAChD,8BAIF,CAAC"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"AdhocDataProductDeployResponse.js","sourceRoot":"","sources":["../../../src/stores/ingestion/AdhocDataProductDeployResponse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,MAAM,OAAO,8BAA8B;IACzC,OAAO,CAAe;CACvB;AAED,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAClD,IAAiD,EACjB,EAAE;IAClC,MAAM,QAAQ,GAAG,IAAI,8BAA8B,EAAE,CAAC;IACtD,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;IACxB,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC"}
|