great 1.2.2 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +122 -50
- package/dist/clone/index.d.ts +2 -2
- package/dist/clone/index.js.map +1 -1
- package/dist/deploy/index.d.ts +2 -2
- package/dist/deploy/index.js.map +1 -1
- package/dist/explode/index.d.ts +2 -2
- package/dist/explode/index.js.map +1 -1
- package/dist/generated/operations.d.ts +30 -8
- package/dist/generated/schema.d.ts +138 -2
- package/dist/generated/schema.js +15 -0
- package/dist/generated/schema.js.map +1 -1
- package/dist/implode/index.d.ts +2 -2
- package/dist/implode/index.js +1 -0
- package/dist/implode/index.js.map +1 -1
- package/dist/implode/transform.d.ts +1 -0
- package/dist/implode/transform.js +16 -2
- package/dist/implode/transform.js.map +1 -1
- package/dist/import/index.d.ts +4 -2
- package/dist/import/index.js +27 -6
- package/dist/import/index.js.map +1 -1
- package/dist/include/index.d.ts +4 -2
- package/dist/include/index.js +129 -11
- package/dist/include/index.js.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/init/index.d.ts +2 -2
- package/dist/init/index.js +3 -3
- package/dist/init/index.js.map +1 -1
- package/dist/integrations/create.js +1 -1
- package/dist/integrations/create.js.map +1 -1
- package/dist/integrations/index.js +6 -1
- package/dist/integrations/index.js.map +1 -1
- package/dist/integrations/list.d.ts +2 -0
- package/dist/integrations/list.js +30 -16
- package/dist/integrations/list.js.map +1 -1
- package/dist/migrate/index.d.ts +5 -2
- package/dist/migrate/index.js +102 -4
- package/dist/migrate/index.js.map +1 -1
- package/dist/pull/index.d.ts +2 -2
- package/dist/pull/index.js.map +1 -1
- package/dist/push/index.d.ts +3 -2
- package/dist/push/index.js +168 -73
- package/dist/push/index.js.map +1 -1
- package/dist/remove/index.d.ts +5 -0
- package/dist/remove/index.js +71 -0
- package/dist/remove/index.js.map +1 -0
- package/dist/rename/index.d.ts +2 -2
- package/dist/rename/index.js +54 -23
- package/dist/rename/index.js.map +1 -1
- package/dist/run/index.d.ts +29 -2
- package/dist/run/index.js.map +1 -1
- package/dist/status/index.d.ts +2 -2
- package/dist/status/index.js +1 -1
- package/dist/status/index.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/utils/createIntegrationFromFile.d.ts +2 -2
- package/dist/utils/createIntegrationFromFile.js.map +1 -1
- package/dist/utils/detectPullConflicts.d.ts +2 -2
- package/dist/utils/detectPullConflicts.js +9 -14
- package/dist/utils/detectPullConflicts.js.map +1 -1
- package/dist/utils/elementFiles.d.ts +24 -5
- package/dist/utils/elementFiles.js +147 -8
- package/dist/utils/elementFiles.js.map +1 -1
- package/dist/utils/fetchLocal.d.ts +4 -4
- package/dist/utils/fetchLocal.js.map +1 -1
- package/dist/utils/graphqlError.js +16 -2
- package/dist/utils/graphqlError.js.map +1 -1
- package/dist/utils/greatFile.d.ts +3 -3
- package/dist/utils/greatFile.js.map +1 -1
- package/dist/utils/mergeEndpointLists.d.ts +7 -0
- package/dist/utils/mergeEndpointLists.js +32 -0
- package/dist/utils/mergeEndpointLists.js.map +1 -0
- package/dist/utils/promptForDetach.d.ts +6 -0
- package/dist/utils/promptForDetach.js +15 -0
- package/dist/utils/promptForDetach.js.map +1 -0
- package/dist/utils/promptForEndpoints.d.ts +5 -0
- package/dist/utils/promptForEndpoints.js +37 -0
- package/dist/utils/promptForEndpoints.js.map +1 -0
- package/dist/utils/promptForReplaceLocal.d.ts +5 -0
- package/dist/utils/promptForReplaceLocal.js +18 -0
- package/dist/utils/promptForReplaceLocal.js.map +1 -0
- package/dist/utils/promptForValue.d.ts +1 -0
- package/dist/utils/promptForValue.js +5 -3
- package/dist/utils/promptForValue.js.map +1 -1
- package/dist/utils/resolveAccount.d.ts +2 -2
- package/dist/utils/resolveAccount.js.map +1 -1
- package/dist/utils/resolveElement.d.ts +2 -0
- package/dist/utils/resolveElement.js +8 -0
- package/dist/utils/resolveElement.js.map +1 -1
- package/dist/utils/resolveElementIncludes.d.ts +6 -0
- package/dist/utils/resolveElementIncludes.js +113 -0
- package/dist/utils/resolveElementIncludes.js.map +1 -0
- package/dist/utils/saveIntegration.d.ts +2 -2
- package/dist/utils/saveIntegration.js +54 -30
- package/dist/utils/saveIntegration.js.map +1 -1
- package/dist/utils/serviceFile.d.ts +34 -0
- package/dist/utils/serviceFile.js +95 -0
- package/dist/utils/serviceFile.js.map +1 -0
- package/dist/utils/shadowMarker.d.ts +5 -0
- package/dist/utils/shadowMarker.js +16 -0
- package/dist/utils/shadowMarker.js.map +1 -0
- package/dist/utils/writeShadowElement.d.ts +12 -10
- package/dist/utils/writeShadowElement.js +98 -58
- package/dist/utils/writeShadowElement.js.map +1 -1
- package/dist/values/get.d.ts +2 -2
- package/dist/values/get.js.map +1 -1
- package/dist/values/list.d.ts +2 -2
- package/dist/values/list.js.map +1 -1
- package/dist/values/set.d.ts +2 -2
- package/dist/values/set.js.map +1 -1
- package/dist/values/unset.d.ts +2 -2
- package/dist/values/unset.js.map +1 -1
- package/package.json +16 -17
- package/quality.toml +4 -0
- package/dist/utils/resolveElementInclude.d.ts +0 -3
- package/dist/utils/resolveElementInclude.js +0 -27
- package/dist/utils/resolveElementInclude.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveElement.js","sourceRoot":"","sources":["../../src/utils/resolveElement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAQ5D,MAAM,wBAAwB,GAAG,GAAG,CAAA;;;;;;;;;;;;;;CAcnC,CAAA;AAED,MAAM,yBAAyB,GAAG,GAAG,CAAA;;;;;;;;;;;;;;CAcpC,CAAA;AAoBD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA8B;IAUjE,MAAM,EACJ,UAAU,EACV,IAAI,EACJ,qBAAqB,EACrB,SAAS,EACT,QAAQ,EACR,MAAM,EACN,GAAG,GACJ,GAAG,OAAO,CAAA;IAGX,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CACnC,wBAAwB,EACxB,EAAE,EAAE,EAAE,UAAU,EAAE,CACnB,CAAA;IAED,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,kBAAkB,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACvC,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;QAE3B,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAA;IAC9B,CAAC;IAGD,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,GAAG,CACD,KAAK,CAAC,GAAG,CACP,YAAY,UAAU,2GAA2G,CAClI,CACF,CAAA;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAGD,MAAM,iBAAiB,GAAG,MAAM,kBAAkB,CAChD,qBAAqB,EACrB,SAAS,EACT,QAAQ,EACR,MAAM,CACP,CAAA;IACD,IAAI,iBAAiB,CAAC,KAAK,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC;QACrD,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,IAAI,uBAAuB,CAAC,CAAC,CAAA;QAClE,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,aAAa,GAAG,iBAAiB,CAAC,EAAE,CAAA;IAG1C,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,OAAO,CACpC,yBAAyB,EACzB,EAAE,aAAa,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CACzC,CAAA;IAED,IAAI,SAAS,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,kBAAkB,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACxC,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;QAClC,MAAM,eAAe,GAAG,iBAAiB,CAAC,IAAI,IAAI,iBAAiB,CAAC,EAAE,CAAA;QACtE,GAAG,CACD,KAAK,CAAC,GAAG,CACP,qBAAqB,UAAU,+BAA+B,eAAe,GAAG,CACjF,CACF,CAAA;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAGD,OAAO,SAAS,CAAC,IAAI,CAAC,YAAY,CAAA;AACpC,CAAC"}
|
|
1
|
+
{"version":3,"file":"resolveElement.js","sourceRoot":"","sources":["../../src/utils/resolveElement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { GraphQLRequestClient } from './graphqlClient.js';
|
|
2
|
+
import type { ResolveElementIncludeQuery } from '../generated/operations.js';
|
|
3
|
+
export type ResolvedInclude = ResolveElementIncludeQuery['resolveElementInclude'];
|
|
4
|
+
export default function resolveElementIncludes(graphqlClient: GraphQLRequestClient, elementId: string, sourceTimestamp: string | undefined, log: (message: string) => void): Promise<ResolvedInclude[] | undefined>;
|
|
5
|
+
export declare function endpointListKeys(list: ResolvedInclude): string[] | undefined;
|
|
6
|
+
export declare function resolveEndpointIncludes(graphqlClient: GraphQLRequestClient, list: ResolvedInclude, sourceTimestamp: string | undefined, log: (message: string) => void): Promise<ResolvedInclude[] | undefined>;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { gql } from 'graphql-tag';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { handleGraphQLError, isNotFoundError } from './graphqlError.js';
|
|
4
|
+
import { companionElementType, isEndpointKeys } from './serviceFile.js';
|
|
5
|
+
import { ElementType } from '../generated/schema.js';
|
|
6
|
+
const ResolveElementIncludeQueryDocument = gql `
|
|
7
|
+
query ResolveElementInclude($elementId: ID!, $sourceTimestamp: DateTime) {
|
|
8
|
+
resolveElementInclude(
|
|
9
|
+
elementId: $elementId
|
|
10
|
+
sourceTimestamp: $sourceTimestamp
|
|
11
|
+
) {
|
|
12
|
+
key
|
|
13
|
+
name
|
|
14
|
+
description
|
|
15
|
+
type
|
|
16
|
+
integration {
|
|
17
|
+
id
|
|
18
|
+
}
|
|
19
|
+
content {
|
|
20
|
+
sourceId
|
|
21
|
+
sourceTimestamp
|
|
22
|
+
provenance
|
|
23
|
+
data
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
`;
|
|
28
|
+
const ElementIdByKeyQueryDocument = gql `
|
|
29
|
+
query ElementIdByKey($integrationId: ID!, $key: ID!, $type: ElementType!) {
|
|
30
|
+
elementByKey(integrationId: $integrationId, key: $key, type: $type) {
|
|
31
|
+
id
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
`;
|
|
35
|
+
async function resolveOne(graphqlClient, elementId, sourceTimestamp, log) {
|
|
36
|
+
const result = await graphqlClient.request(ResolveElementIncludeQueryDocument, { elementId, sourceTimestamp });
|
|
37
|
+
if (result.error) {
|
|
38
|
+
handleGraphQLError(result.error, log);
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
return result.data?.resolveElementInclude;
|
|
42
|
+
}
|
|
43
|
+
async function findElementId(graphqlClient, integrationId, key, type, log) {
|
|
44
|
+
const result = await graphqlClient.request(ElementIdByKeyQueryDocument, { integrationId, key, type });
|
|
45
|
+
if (result.error) {
|
|
46
|
+
if (isNotFoundError(result.error)) {
|
|
47
|
+
return { status: 'none' };
|
|
48
|
+
}
|
|
49
|
+
handleGraphQLError(result.error, log);
|
|
50
|
+
return { status: 'error' };
|
|
51
|
+
}
|
|
52
|
+
const id = result.data?.elementByKey?.id;
|
|
53
|
+
return id ? { status: 'found', id } : { status: 'none' };
|
|
54
|
+
}
|
|
55
|
+
async function findCompanionId(graphqlClient, resolved, log) {
|
|
56
|
+
const type = companionElementType(resolved.type);
|
|
57
|
+
if (!type || !resolved.integration) {
|
|
58
|
+
return { status: 'none' };
|
|
59
|
+
}
|
|
60
|
+
return findElementId(graphqlClient, resolved.integration.id, resolved.key, type, log);
|
|
61
|
+
}
|
|
62
|
+
export default async function resolveElementIncludes(graphqlClient, elementId, sourceTimestamp, log) {
|
|
63
|
+
const resolved = await resolveOne(graphqlClient, elementId, sourceTimestamp, log);
|
|
64
|
+
if (!resolved) {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
const lookup = await findCompanionId(graphqlClient, resolved, log);
|
|
68
|
+
if (lookup.status === 'error') {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
if (lookup.status === 'none') {
|
|
72
|
+
return [resolved];
|
|
73
|
+
}
|
|
74
|
+
const companion = await resolveOne(graphqlClient, lookup.id, sourceTimestamp, log);
|
|
75
|
+
if (!companion) {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
return companion.content?.sourceId ? [resolved, companion] : [resolved];
|
|
79
|
+
}
|
|
80
|
+
export function endpointListKeys(list) {
|
|
81
|
+
const endpoints = list.content?.data?.endpoints;
|
|
82
|
+
return isEndpointKeys(endpoints) ? endpoints : undefined;
|
|
83
|
+
}
|
|
84
|
+
async function resolveEndpoint(graphqlClient, integrationId, key, sourceTimestamp, log) {
|
|
85
|
+
const lookup = await findElementId(graphqlClient, integrationId, key, ElementType.Endpoint, log);
|
|
86
|
+
if (lookup.status === 'none') {
|
|
87
|
+
log(chalk.yellow(`Endpoint ${key} was not found in the source integration`));
|
|
88
|
+
return 'none';
|
|
89
|
+
}
|
|
90
|
+
if (lookup.status === 'error') {
|
|
91
|
+
return 'error';
|
|
92
|
+
}
|
|
93
|
+
const resolved = await resolveOne(graphqlClient, lookup.id, sourceTimestamp, log);
|
|
94
|
+
return resolved ?? 'error';
|
|
95
|
+
}
|
|
96
|
+
export async function resolveEndpointIncludes(graphqlClient, list, sourceTimestamp, log) {
|
|
97
|
+
const keys = endpointListKeys(list) ?? [];
|
|
98
|
+
if (!list.integration || keys.length === 0) {
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
const endpoints = [];
|
|
102
|
+
for (const key of keys) {
|
|
103
|
+
const resolved = await resolveEndpoint(graphqlClient, list.integration.id, key, sourceTimestamp, log);
|
|
104
|
+
if (resolved === 'error') {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
else if (resolved !== 'none') {
|
|
108
|
+
endpoints.push(resolved);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return endpoints;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=resolveElementIncludes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveElementIncludes.js","sourceRoot":"","sources":["../../src/utils/resolveElementIncludes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
1
|
import type { IntegrationDefinitionQuery } from '../generated/operations.js';
|
|
2
|
+
import type { GreatFs } from '../types.js';
|
|
3
3
|
type Integration = NonNullable<IntegrationDefinitionQuery['integration']>;
|
|
4
4
|
export type IntegrationDefinitions = Omit<NonNullable<Integration['latest']>, 'elements' | 'timestamp'> & {
|
|
5
5
|
elements: (Omit<NonNullable<Integration['latest']>['elements'][0], 'content' | 'id' | 'name' | 'description'> & {
|
|
@@ -16,5 +16,5 @@ export type IntegrationMeta = Pick<Integration, 'key' | 'name' | 'description' |
|
|
|
16
16
|
templateImports?: Integration['templateImports'];
|
|
17
17
|
};
|
|
18
18
|
export declare const typeToFolder: Record<string, string>;
|
|
19
|
-
export default function saveIntegration(integration: IntegrationMeta, definitions: IntegrationDefinitions, root?: string, fsImpl?:
|
|
19
|
+
export default function saveIntegration(integration: IntegrationMeta, definitions: IntegrationDefinitions, root?: string, fsImpl?: GreatFs): void;
|
|
20
20
|
export {};
|
|
@@ -2,8 +2,9 @@ import fs from 'node:fs';
|
|
|
2
2
|
import hashContent from './hashContent.js';
|
|
3
3
|
import resolveIntegrationType from './integrationType.js';
|
|
4
4
|
import { emptyGreatFile, readGreatFile, writeGreatFile, setElementRecord, getElementRecord, addProvenance, } from './greatFile.js';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { elementFilePath, elementKeyFromFileName, isVirtualFolder, } from './elementFiles.js';
|
|
6
|
+
import { SERVICES_FOLDER, mergeServiceFile, serviceFileFolders, } from './serviceFile.js';
|
|
7
|
+
import { SHADOW_MARKER, shadowMarkerFor } from './shadowMarker.js';
|
|
7
8
|
const normalizeFolderName = (folder) => folder.replace(':', '_');
|
|
8
9
|
function createFolderIfMissing(root, fsImpl) {
|
|
9
10
|
const rootPath = root ? `${root}/` : '';
|
|
@@ -14,22 +15,12 @@ function createFolderIfMissing(root, fsImpl) {
|
|
|
14
15
|
}
|
|
15
16
|
};
|
|
16
17
|
}
|
|
17
|
-
function elementFilePath(rootPath, folder, name, fsImpl) {
|
|
18
|
-
if (!folder) {
|
|
19
|
-
return `${rootPath}${name}.json`;
|
|
20
|
-
}
|
|
21
|
-
for (const ext of JSON_EXTENSIONS) {
|
|
22
|
-
const path = `${rootPath}${folder}/${name}${ext}`;
|
|
23
|
-
if (fsImpl.existsSync(path)) {
|
|
24
|
-
return path;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return `${rootPath}${folder}/${name}.json`;
|
|
28
|
-
}
|
|
29
18
|
function writeJsonFile(root, fsImpl) {
|
|
30
19
|
const rootPath = root ? `${root}/` : '';
|
|
31
20
|
return (folder, name, content) => {
|
|
32
|
-
const path =
|
|
21
|
+
const path = folder
|
|
22
|
+
? elementFilePath(root, folder, name, fsImpl)
|
|
23
|
+
: `${rootPath}${name}.json`;
|
|
33
24
|
try {
|
|
34
25
|
fsImpl.writeFileSync(path, JSON.stringify(content, undefined, 2));
|
|
35
26
|
}
|
|
@@ -38,14 +29,25 @@ function writeJsonFile(root, fsImpl) {
|
|
|
38
29
|
}
|
|
39
30
|
};
|
|
40
31
|
}
|
|
41
|
-
const
|
|
42
|
-
...(element.content?.sourceId ? { [SHADOW_MARKER]: true } : {}),
|
|
32
|
+
const buildElementContent = (element) => ({
|
|
43
33
|
...(element.name ? { name: element.name } : {}),
|
|
44
34
|
...(element.description != null
|
|
45
35
|
? { description: element.description }
|
|
46
36
|
: {}),
|
|
47
37
|
...element.content?.data,
|
|
48
38
|
});
|
|
39
|
+
const isShadow = (element) => Boolean(element?.content?.sourceId);
|
|
40
|
+
const buildElementFile = (element) => ({
|
|
41
|
+
...(isShadow(element) ? { [SHADOW_MARKER]: true } : {}),
|
|
42
|
+
...buildElementContent(element),
|
|
43
|
+
});
|
|
44
|
+
const buildListContent = (list) => list?.content?.data
|
|
45
|
+
? { endpoints: list.content.data.endpoints ?? [] }
|
|
46
|
+
: undefined;
|
|
47
|
+
const buildServiceFile = (service, list) => mergeServiceFile({
|
|
48
|
+
service: service ? buildElementContent(service) : undefined,
|
|
49
|
+
list: buildListContent(list),
|
|
50
|
+
}, shadowMarkerFor(isShadow(service), isShadow(list)));
|
|
49
51
|
const buildElementRecord = (element) => {
|
|
50
52
|
const record = {
|
|
51
53
|
...(element.id ? { id: element.id } : {}),
|
|
@@ -77,6 +79,8 @@ const buildImportRecords = (templateImports) => (templateImports ?? []).flatMap(
|
|
|
77
79
|
export const typeToFolder = {
|
|
78
80
|
Schema: 'schemas',
|
|
79
81
|
Service: 'services',
|
|
82
|
+
Endpoint: 'endpoints',
|
|
83
|
+
EndpointList: 'endpointLists',
|
|
80
84
|
Auth: 'auths',
|
|
81
85
|
SchemaMutation: 'mutations',
|
|
82
86
|
Dictionary: 'dictionaries',
|
|
@@ -85,30 +89,58 @@ export const typeToFolder = {
|
|
|
85
89
|
Flow: 'flows',
|
|
86
90
|
RetryRule: 'retryRules',
|
|
87
91
|
};
|
|
92
|
+
const fileFolders = () => [...new Set(Object.values(typeToFolder))].filter((folder) => !isVirtualFolder(folder));
|
|
88
93
|
function deleteRemovedFiles(rootFolder, elements, priorGreat, fsImpl) {
|
|
89
94
|
const rootPath = rootFolder ? `${rootFolder}/` : '';
|
|
90
|
-
|
|
95
|
+
fileFolders().forEach((folder) => {
|
|
91
96
|
const folderPath = `${rootPath}${folder}`;
|
|
92
97
|
if (!fsImpl.existsSync(folderPath)) {
|
|
93
98
|
return;
|
|
94
99
|
}
|
|
95
100
|
const files = fsImpl.readdirSync(folderPath);
|
|
101
|
+
const folders = serviceFileFolders(folder);
|
|
96
102
|
files.forEach((file) => {
|
|
97
103
|
const fileKey = elementKeyFromFileName(file);
|
|
98
104
|
if (!fileKey) {
|
|
99
105
|
return;
|
|
100
106
|
}
|
|
101
|
-
const existsInApi = elements?.some((element) => typeToFolder[element.__typename]
|
|
107
|
+
const existsInApi = elements?.some((element) => folders.includes(typeToFolder[element.__typename]) &&
|
|
102
108
|
element.key === fileKey);
|
|
103
109
|
if (existsInApi) {
|
|
104
110
|
return;
|
|
105
111
|
}
|
|
106
|
-
if (getElementRecord(priorGreat,
|
|
112
|
+
if (folders.some((f) => getElementRecord(priorGreat, f, fileKey))) {
|
|
107
113
|
fsImpl.unlinkSync(`${folderPath}/${file}`);
|
|
108
114
|
}
|
|
109
115
|
});
|
|
110
116
|
});
|
|
111
117
|
}
|
|
118
|
+
function writeElements(elements, writeFile, great) {
|
|
119
|
+
const lists = new Map(elements
|
|
120
|
+
.filter((element) => element.__typename === 'EndpointList')
|
|
121
|
+
.map((element) => [element.key, element]));
|
|
122
|
+
const serviceKeys = new Set(elements
|
|
123
|
+
.filter((element) => element.__typename === 'Service')
|
|
124
|
+
.map((element) => element.key));
|
|
125
|
+
for (const element of elements) {
|
|
126
|
+
const folder = typeToFolder[element.__typename];
|
|
127
|
+
if (!folder) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (element.__typename === 'Service') {
|
|
131
|
+
writeFile(folder, element.key, buildServiceFile(element, lists.get(element.key)));
|
|
132
|
+
}
|
|
133
|
+
else if (element.__typename === 'EndpointList') {
|
|
134
|
+
if (!serviceKeys.has(element.key)) {
|
|
135
|
+
writeFile(SERVICES_FOLDER, element.key, buildServiceFile(undefined, element));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
writeFile(folder, element.key, buildElementFile(element));
|
|
140
|
+
}
|
|
141
|
+
setElementRecord(great, folder, element.key, buildElementRecord(element));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
112
144
|
export default function saveIntegration(integration, definitions, root, fsImpl = fs) {
|
|
113
145
|
const { id, name, description, status, type, account, templateImports } = integration;
|
|
114
146
|
const { timestamp, elements } = definitions;
|
|
@@ -135,18 +167,10 @@ export default function saveIntegration(integration, definitions, root, fsImpl =
|
|
|
135
167
|
queueService: undefined,
|
|
136
168
|
};
|
|
137
169
|
writeFile(null, 'integration', index);
|
|
138
|
-
|
|
139
|
-
createFolder(folder);
|
|
140
|
-
});
|
|
170
|
+
fileFolders().forEach(createFolder);
|
|
141
171
|
deleteRemovedFiles(rootFolder, elements, priorGreat, fsImpl);
|
|
142
172
|
if (elements) {
|
|
143
|
-
elements
|
|
144
|
-
const folder = typeToFolder[element.__typename];
|
|
145
|
-
if (folder) {
|
|
146
|
-
writeFile(folder, element.key, buildElementFile(element));
|
|
147
|
-
setElementRecord(great, folder, element.key, buildElementRecord(element));
|
|
148
|
-
}
|
|
149
|
-
});
|
|
173
|
+
writeElements(elements, writeFile, great);
|
|
150
174
|
}
|
|
151
175
|
const imports = buildImportRecords(templateImports);
|
|
152
176
|
if (imports.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"saveIntegration.js","sourceRoot":"","sources":["../../src/utils/saveIntegration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,WAAW,MAAM,kBAAkB,CAAA;AAC1C,OAAO,sBAAsB,MAAM,sBAAsB,CAAA;AACzD,OAAO,EACL,cAAc,EACd,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,GACd,MAAM,gBAAgB,CAAA;AACvB,OAAO,
|
|
1
|
+
{"version":3,"file":"saveIntegration.js","sourceRoot":"","sources":["../../src/utils/saveIntegration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ElementType } from '../generated/schema.js';
|
|
2
|
+
import type { ShadowMarker } from './shadowMarker.js';
|
|
3
|
+
import type { GreatFile } from './greatFile.js';
|
|
4
|
+
import type { GreatFs } from '../types.js';
|
|
5
|
+
export declare const SERVICES_FOLDER = "services";
|
|
6
|
+
export declare const ENDPOINTS_FOLDER = "endpoints";
|
|
7
|
+
export declare const ENDPOINT_LISTS_FOLDER = "endpointLists";
|
|
8
|
+
export interface EndpointListContent {
|
|
9
|
+
endpoints: string[];
|
|
10
|
+
}
|
|
11
|
+
export type EndpointsKind = 'none' | 'keys' | 'inline' | 'mixed';
|
|
12
|
+
export interface ServiceFileParts {
|
|
13
|
+
service?: Record<string, unknown>;
|
|
14
|
+
list?: EndpointListContent;
|
|
15
|
+
}
|
|
16
|
+
export declare const isServiceFileFolder: (folder: string) => boolean;
|
|
17
|
+
export declare const serviceFileFolders: (folder: string) => string[];
|
|
18
|
+
export declare const companionElementType: (type: ElementType) => ElementType | undefined;
|
|
19
|
+
export interface EndpointReferenceElement {
|
|
20
|
+
folder: string;
|
|
21
|
+
key: string;
|
|
22
|
+
data: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
export declare function classifyEndpoints(endpoints: unknown): EndpointsKind;
|
|
25
|
+
export declare const hasServiceContent: (data: Record<string, unknown>) => boolean;
|
|
26
|
+
export declare const mixedEndpointsMessage: (filePath: string) => string;
|
|
27
|
+
export declare function splitServiceFile(data: Record<string, unknown>, filePath: string): ServiceFileParts;
|
|
28
|
+
export declare function mergeServiceFile(parts: {
|
|
29
|
+
service?: Record<string, unknown>;
|
|
30
|
+
list?: EndpointListContent;
|
|
31
|
+
}, marker?: ShadowMarker): Record<string, unknown>;
|
|
32
|
+
export declare function readServiceFileParts(filePath: string, fsImpl: GreatFs): ServiceFileParts;
|
|
33
|
+
export declare const isEndpointKeys: (value: unknown) => value is string[];
|
|
34
|
+
export declare function validateEndpointReferences(elements: readonly EndpointReferenceElement[], great: GreatFile): string[];
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import parseJson from './parseJson.js';
|
|
2
|
+
import { SHADOW_MARKER } from './shadowMarker.js';
|
|
3
|
+
import { ElementType } from '../generated/schema.js';
|
|
4
|
+
export const SERVICES_FOLDER = 'services';
|
|
5
|
+
export const ENDPOINTS_FOLDER = 'endpoints';
|
|
6
|
+
export const ENDPOINT_LISTS_FOLDER = 'endpointLists';
|
|
7
|
+
export const isServiceFileFolder = (folder) => folder === SERVICES_FOLDER || folder === ENDPOINT_LISTS_FOLDER;
|
|
8
|
+
export const serviceFileFolders = (folder) => folder === SERVICES_FOLDER
|
|
9
|
+
? [ENDPOINT_LISTS_FOLDER, SERVICES_FOLDER]
|
|
10
|
+
: [folder];
|
|
11
|
+
export const companionElementType = (type) => type === ElementType.Service
|
|
12
|
+
? ElementType.EndpointList
|
|
13
|
+
: type === ElementType.EndpointList
|
|
14
|
+
? ElementType.Service
|
|
15
|
+
: undefined;
|
|
16
|
+
export function classifyEndpoints(endpoints) {
|
|
17
|
+
if (!Array.isArray(endpoints)) {
|
|
18
|
+
return 'none';
|
|
19
|
+
}
|
|
20
|
+
const keyCount = endpoints.filter((entry) => typeof entry === 'string').length;
|
|
21
|
+
if (keyCount === endpoints.length) {
|
|
22
|
+
return 'keys';
|
|
23
|
+
}
|
|
24
|
+
return keyCount === 0 ? 'inline' : 'mixed';
|
|
25
|
+
}
|
|
26
|
+
const META_PROPS = new Set([SHADOW_MARKER, 'name', 'description', 'endpoints']);
|
|
27
|
+
export const hasServiceContent = (data) => Object.keys(data).some((prop) => !META_PROPS.has(prop));
|
|
28
|
+
export const mixedEndpointsMessage = (filePath) => `${filePath} mixes endpoint keys and inline endpoint definitions, which is not allowed. Run \`great migrate\` to extract the inline endpoints to files first`;
|
|
29
|
+
export function splitServiceFile(data, filePath) {
|
|
30
|
+
const kind = classifyEndpoints(data.endpoints);
|
|
31
|
+
if (kind === 'mixed') {
|
|
32
|
+
throw new Error(mixedEndpointsMessage(filePath));
|
|
33
|
+
}
|
|
34
|
+
const { [SHADOW_MARKER]: _marker, ...content } = data;
|
|
35
|
+
if (kind !== 'keys') {
|
|
36
|
+
return { service: content };
|
|
37
|
+
}
|
|
38
|
+
const { endpoints, ...serviceContent } = content;
|
|
39
|
+
return {
|
|
40
|
+
...(hasServiceContent(content) ? { service: serviceContent } : {}),
|
|
41
|
+
list: { endpoints: endpoints },
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function mergeEndpoints(service, list) {
|
|
45
|
+
const inline = service?.endpoints;
|
|
46
|
+
const inlineEndpoints = Array.isArray(inline) ? inline : [];
|
|
47
|
+
if (!list) {
|
|
48
|
+
return Array.isArray(inline) ? inline : undefined;
|
|
49
|
+
}
|
|
50
|
+
return [...inlineEndpoints, ...list.endpoints];
|
|
51
|
+
}
|
|
52
|
+
export function mergeServiceFile(parts, marker) {
|
|
53
|
+
const { endpoints: _inline, ...serviceContent } = parts.service ?? {};
|
|
54
|
+
const endpoints = mergeEndpoints(parts.service, parts.list);
|
|
55
|
+
return {
|
|
56
|
+
...(marker !== undefined ? { [SHADOW_MARKER]: marker } : {}),
|
|
57
|
+
...serviceContent,
|
|
58
|
+
...(endpoints ? { endpoints } : {}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export function readServiceFileParts(filePath, fsImpl) {
|
|
62
|
+
if (!fsImpl.existsSync(filePath)) {
|
|
63
|
+
return {};
|
|
64
|
+
}
|
|
65
|
+
const data = parseJson(fsImpl.readFileSync(filePath, 'utf8'));
|
|
66
|
+
return splitServiceFile(data, filePath);
|
|
67
|
+
}
|
|
68
|
+
export const isEndpointKeys = (value) => classifyEndpoints(value) === 'keys';
|
|
69
|
+
const endpointFileKeys = (elements) => elements
|
|
70
|
+
.filter((element) => element.folder === ENDPOINTS_FOLDER)
|
|
71
|
+
.map((element) => element.key);
|
|
72
|
+
const recordedEndpointKeys = (great) => Object.keys(great.elements)
|
|
73
|
+
.filter((recordKey) => recordKey.startsWith(`${ENDPOINTS_FOLDER}/`))
|
|
74
|
+
.map((recordKey) => recordKey.slice(ENDPOINTS_FOLDER.length + 1));
|
|
75
|
+
const listedEndpoints = (elements) => elements.flatMap((element) => {
|
|
76
|
+
const endpoints = element.data.endpoints;
|
|
77
|
+
return element.folder === ENDPOINT_LISTS_FOLDER && isEndpointKeys(endpoints)
|
|
78
|
+
? endpoints.map((key) => ({ service: element.key, key }))
|
|
79
|
+
: [];
|
|
80
|
+
});
|
|
81
|
+
export function validateEndpointReferences(elements, great) {
|
|
82
|
+
const fileKeys = endpointFileKeys(elements);
|
|
83
|
+
const knownKeys = new Set([...fileKeys, ...recordedEndpointKeys(great)]);
|
|
84
|
+
const listed = listedEndpoints(elements);
|
|
85
|
+
const listedKeys = new Set(listed.map(({ key }) => key));
|
|
86
|
+
return [
|
|
87
|
+
...listed
|
|
88
|
+
.filter(({ key }) => !knownKeys.has(key))
|
|
89
|
+
.map(({ service, key }) => `Service ${service} lists endpoint "${key}", but there is no endpoints/${key} file`),
|
|
90
|
+
...fileKeys
|
|
91
|
+
.filter((key) => !listedKeys.has(key))
|
|
92
|
+
.map((key) => `Endpoint ${key} is not listed in any service's endpoints`),
|
|
93
|
+
];
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=serviceFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceFile.js","sourceRoot":"","sources":["../../src/utils/serviceFile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const SHADOW_MARKER = "$shadow";
|
|
2
|
+
export type ShadowMarker = true | 'service' | 'endpoints';
|
|
3
|
+
export declare const isShadowMarker: (value: unknown) => value is ShadowMarker;
|
|
4
|
+
export declare const stripShadowMarker: ({ [SHADOW_MARKER]: _shadow, ...data }: Record<string, unknown>) => Record<string, unknown>;
|
|
5
|
+
export declare function shadowMarkerFor(serviceIsShadow: boolean, listIsShadow: boolean): ShadowMarker | undefined;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const SHADOW_MARKER = '$shadow';
|
|
2
|
+
export const isShadowMarker = (value) => value === true || value === 'service' || value === 'endpoints';
|
|
3
|
+
export const stripShadowMarker = ({ [SHADOW_MARKER]: _shadow, ...data }) => data;
|
|
4
|
+
export function shadowMarkerFor(serviceIsShadow, listIsShadow) {
|
|
5
|
+
if (serviceIsShadow && listIsShadow) {
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
else if (serviceIsShadow) {
|
|
9
|
+
return 'service';
|
|
10
|
+
}
|
|
11
|
+
else if (listIsShadow) {
|
|
12
|
+
return 'endpoints';
|
|
13
|
+
}
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=shadowMarker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadowMarker.js","sourceRoot":"","sources":["../../src/utils/shadowMarker.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAA;AAItC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAc,EAAyB,EAAE,CACtE,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,WAAW,CAAA;AAGhE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAChC,CAAC,aAAa,CAAC,EAAE,OAAO,EACxB,GAAG,IAAI,EACiB,EAA2B,EAAE,CAAC,IAAI,CAAA;AAI5D,MAAM,UAAU,eAAe,CAC7B,eAAwB,EACxB,YAAqB;IAErB,IAAI,eAAe,IAAI,YAAY,EAAE,CAAC;QACpC,OAAO,IAAI,CAAA;IACb,CAAC;SAAM,IAAI,eAAe,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAA;IAClB,CAAC;SAAM,IAAI,YAAY,EAAE,CAAC;QACxB,OAAO,WAAW,CAAA;IACpB,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC"}
|
|
@@ -1,25 +1,27 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type { ElementTarget } from './elementFiles.js';
|
|
2
2
|
import type { GreatFile } from './greatFile.js';
|
|
3
|
-
import type {
|
|
4
|
-
|
|
5
|
-
export
|
|
3
|
+
import type { ResolveTemplateImportQuery } from '../generated/operations.js';
|
|
4
|
+
import type { GreatFs } from '../types.js';
|
|
5
|
+
export type ResolvedShadow = ResolveTemplateImportQuery['resolveTemplateImport']['elements'][number];
|
|
6
6
|
export interface ShadowConflict {
|
|
7
7
|
key: string;
|
|
8
8
|
folder: string;
|
|
9
9
|
reason: string;
|
|
10
10
|
}
|
|
11
11
|
export interface WriteShadowsResult {
|
|
12
|
-
written:
|
|
13
|
-
|
|
14
|
-
key: string;
|
|
15
|
-
}[];
|
|
12
|
+
written: ElementTarget[];
|
|
13
|
+
merged: ElementTarget[];
|
|
16
14
|
skipped: ResolvedShadow[];
|
|
17
15
|
conflicts: ShadowConflict[];
|
|
18
16
|
}
|
|
17
|
+
export type ShadowMode = 'include' | 'import';
|
|
19
18
|
interface WriteShadowsOptions {
|
|
19
|
+
mode: ShadowMode;
|
|
20
20
|
root?: string;
|
|
21
|
-
fsImpl?:
|
|
21
|
+
fsImpl?: GreatFs;
|
|
22
22
|
}
|
|
23
|
-
export declare function
|
|
23
|
+
export declare function isLocalOccupant(great: GreatFile, folder: string, key: string, root: string | undefined, fsImpl: GreatFs): boolean;
|
|
24
|
+
export declare const findLocalOccupants: (great: GreatFile, elements: readonly ResolvedShadow[], root: string | undefined, fsImpl: GreatFs) => ElementTarget[];
|
|
25
|
+
export declare function writeShadowElements(great: GreatFile, resolved: readonly ResolvedShadow[], options: WriteShadowsOptions): WriteShadowsResult;
|
|
24
26
|
export declare function logShadowConflicts(verb: string, conflicts: readonly ShadowConflict[], log: (message: string) => void): void;
|
|
25
27
|
export {};
|