@docupace/ihub-config 1.0.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 +82 -0
- package/dist/config/config-injector.d.ts +24 -0
- package/dist/config/config-injector.d.ts.map +1 -0
- package/dist/config/config-injector.js +28 -0
- package/dist/config/config-injector.js.map +1 -0
- package/dist/config/template-processor.d.ts +25 -0
- package/dist/config/template-processor.d.ts.map +1 -0
- package/dist/config/template-processor.js +154 -0
- package/dist/config/template-processor.js.map +1 -0
- package/dist/config-extension.d.ts +11 -0
- package/dist/config-extension.d.ts.map +1 -0
- package/dist/config-extension.js +42 -0
- package/dist/config-extension.js.map +1 -0
- package/dist/config-providers/base-config.d.ts +8 -0
- package/dist/config-providers/base-config.d.ts.map +1 -0
- package/dist/config-providers/base-config.js +2 -0
- package/dist/config-providers/base-config.js.map +1 -0
- package/dist/config-providers/index.d.ts +5 -0
- package/dist/config-providers/index.d.ts.map +1 -0
- package/dist/config-providers/index.js +8 -0
- package/dist/config-providers/index.js.map +1 -0
- package/dist/config-resolvers/index.d.ts +15 -0
- package/dist/config-resolvers/index.d.ts.map +1 -0
- package/dist/config-resolvers/index.js +24 -0
- package/dist/config-resolvers/index.js.map +1 -0
- package/dist/config-service.d.ts +63 -0
- package/dist/config-service.d.ts.map +1 -0
- package/dist/config-service.js +515 -0
- package/dist/config-service.js.map +1 -0
- package/dist/env.d.ts +2 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +3 -0
- package/dist/env.js.map +1 -0
- package/dist/globals.d.ts +30 -0
- package/dist/globals.d.ts.map +1 -0
- package/dist/globals.js +95 -0
- package/dist/globals.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/instance-config.d.ts +21 -0
- package/dist/instance-config.d.ts.map +1 -0
- package/dist/instance-config.js +74 -0
- package/dist/instance-config.js.map +1 -0
- package/dist/lib/file-system.d.ts +2 -0
- package/dist/lib/file-system.d.ts.map +1 -0
- package/dist/lib/file-system.js +11 -0
- package/dist/lib/file-system.js.map +1 -0
- package/dist/lib/filters.d.ts +7 -0
- package/dist/lib/filters.d.ts.map +1 -0
- package/dist/lib/filters.js +123 -0
- package/dist/lib/filters.js.map +1 -0
- package/dist/lib/param-helpers.d.ts +11 -0
- package/dist/lib/param-helpers.d.ts.map +1 -0
- package/dist/lib/param-helpers.js +54 -0
- package/dist/lib/param-helpers.js.map +1 -0
- package/dist/lib/replace-dots-outside-expressions.d.ts +2 -0
- package/dist/lib/replace-dots-outside-expressions.d.ts.map +1 -0
- package/dist/lib/replace-dots-outside-expressions.js +10 -0
- package/dist/lib/replace-dots-outside-expressions.js.map +1 -0
- package/dist/lib/sort.d.ts +2 -0
- package/dist/lib/sort.d.ts.map +1 -0
- package/dist/lib/sort.js +25 -0
- package/dist/lib/sort.js.map +1 -0
- package/dist/mappers/config-mapper.d.ts +8 -0
- package/dist/mappers/config-mapper.d.ts.map +1 -0
- package/dist/mappers/config-mapper.js +17 -0
- package/dist/mappers/config-mapper.js.map +1 -0
- package/dist/model/graphs/config/common.graphql +8 -0
- package/dist/model/graphs/config/fields.graphql +338 -0
- package/dist/model/graphs/config/menu.graphql +40 -0
- package/dist/model/graphs/config/mutation.graphql +30 -0
- package/dist/model/graphs/config/page.graphql +227 -0
- package/dist/model/graphs/config/panel.graphql +30 -0
- package/dist/model/graphs/config/query.graphql +55 -0
- package/dist/model/graphs/config/selectOptions.graphql +47 -0
- package/dist/model/graphs/config/table.graphql +97 -0
- package/dist/model/graphs/config/tests.graphql +16 -0
- package/dist/model/graphs/config/theme.graphql +41 -0
- package/dist/model/graphs/config/ui-components.graphql +11 -0
- package/dist/model/graphs/domains/scalars.graphql +3 -0
- package/dist/model/graphs/filter.graphql +5 -0
- package/dist/model/graphs/schema.graphql +7 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +34 -0
- package/dist/server.js.map +1 -0
- package/dist/types/filter-types.d.ts +62 -0
- package/dist/types/filter-types.d.ts.map +1 -0
- package/dist/types/filter-types.js +28 -0
- package/dist/types/filter-types.js.map +1 -0
- package/dist/types/graphql.d.ts +74630 -0
- package/dist/types/graphql.d.ts.map +1 -0
- package/dist/types/graphql.js +94 -0
- package/dist/types/graphql.js.map +1 -0
- package/dist/types/types.d.ts +13 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/types.js +2 -0
- package/dist/types/types.js.map +1 -0
- package/model/graphs/config/common.graphql +8 -0
- package/model/graphs/config/fields.graphql +338 -0
- package/model/graphs/config/menu.graphql +40 -0
- package/model/graphs/config/mutation.graphql +30 -0
- package/model/graphs/config/page.graphql +227 -0
- package/model/graphs/config/panel.graphql +30 -0
- package/model/graphs/config/query.graphql +55 -0
- package/model/graphs/config/selectOptions.graphql +47 -0
- package/model/graphs/config/table.graphql +97 -0
- package/model/graphs/config/tests.graphql +16 -0
- package/model/graphs/config/theme.graphql +41 -0
- package/model/graphs/config/ui-components.graphql +11 -0
- package/model/graphs/domains/scalars.graphql +3 -0
- package/model/graphs/filter.graphql +5 -0
- package/model/graphs/schema.graphql +7 -0
- package/package.json +63 -0
package/README.md
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# @docupace/ihub-config
|
|
2
|
+
|
|
3
|
+
Reusable config-service GraphQL package extracted from docupace server.
|
|
4
|
+
|
|
5
|
+
## Run standalone server
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm install
|
|
9
|
+
pnpm start:dev
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Use as extension in another server
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
import { getConfigExtension } from '@docupace/ihub-config';
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Then add to server extensions array.
|
|
19
|
+
|
|
20
|
+
To resolve template expressions (for example `$${applicationPreference:...}`),
|
|
21
|
+
provide `configInjectorResolvers` from the host app:
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { getConfigExtension } from '@docupace/ihub-config';
|
|
25
|
+
import {
|
|
26
|
+
DashboardPageConfigProvider,
|
|
27
|
+
TablePageConfigProvider,
|
|
28
|
+
AnyPageConfigProvider,
|
|
29
|
+
DetailsPageConfigProvider,
|
|
30
|
+
} from './your-host-config-providers.js';
|
|
31
|
+
import { configResolvers } from './your-host-config-resolvers.js';
|
|
32
|
+
|
|
33
|
+
const APPLICATION_PREFERENCE_PREFIX = 'applicationPreference';
|
|
34
|
+
|
|
35
|
+
const applicationPreferenceResolver = async (keys, context) => {
|
|
36
|
+
const data = await loadApplicationPreferences(keys, context);
|
|
37
|
+
|
|
38
|
+
const result: Record<string, string | undefined> = {};
|
|
39
|
+
keys.forEach((key) => (result[key] = undefined));
|
|
40
|
+
data.records.forEach((record: { name: string; value: string }) => {
|
|
41
|
+
result[record.name] = record.value;
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const configExtension = await getConfigExtension({
|
|
48
|
+
configInjectorResolvers: {
|
|
49
|
+
[APPLICATION_PREFERENCE_PREFIX]: applicationPreferenceResolver,
|
|
50
|
+
},
|
|
51
|
+
providers: {
|
|
52
|
+
DashboardPage: DashboardPageConfigProvider,
|
|
53
|
+
TablePage: TablePageConfigProvider,
|
|
54
|
+
AnyPage: AnyPageConfigProvider,
|
|
55
|
+
DetailsPage: DetailsPageConfigProvider,
|
|
56
|
+
},
|
|
57
|
+
resolvers: configResolvers,
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Required environment variables
|
|
62
|
+
|
|
63
|
+
- `AUTH0_DOMAIN`
|
|
64
|
+
- `AUTH0_AUDIENCE`
|
|
65
|
+
- `AUTH0_CLIENT_ID`
|
|
66
|
+
- `AUTH0_CLIENT_SECRET`
|
|
67
|
+
|
|
68
|
+
Optional:
|
|
69
|
+
|
|
70
|
+
- `CORE_URL`
|
|
71
|
+
- `AUTH0_CC_CLIENT_ID`
|
|
72
|
+
- `AUTH0_CC_CLIENT_SECRET`
|
|
73
|
+
- `INTEGRATION_HUB_URL`
|
|
74
|
+
|
|
75
|
+
Config stores (repeat by prefix such as `STANDARD`, `SITE`):
|
|
76
|
+
|
|
77
|
+
- `<PREFIX>_CONFIG_LOCAL_PATH`
|
|
78
|
+
- `<PREFIX>_CONFIG_REMOTE_PATH`
|
|
79
|
+
- `<PREFIX>_CONFIG_REMOTE_BRANCH`
|
|
80
|
+
- `<PREFIX>_CONFIG_PRIORITY`
|
|
81
|
+
- `<PREFIX>_CONFIG_NAME`
|
|
82
|
+
- `CONFIG_LOCAL_PATH_ROOT` (optional fallback)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ApolloContext } from '../types/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Type for resolver functions that can resolve template expressions
|
|
4
|
+
*/
|
|
5
|
+
export type ResolverFunction = (keys: string[], context: ApolloContext) => Promise<Record<string, any>>;
|
|
6
|
+
export type ConfigInjectorResolvers = Record<string, ResolverFunction>;
|
|
7
|
+
export declare const setConfigInjectorResolvers: (resolvers?: ConfigInjectorResolvers) => void;
|
|
8
|
+
export declare const addConfigInjectorResolver: (prefix: string, resolver: ResolverFunction) => void;
|
|
9
|
+
export declare const getConfigInjectorResolvers: () => ConfigInjectorResolvers;
|
|
10
|
+
/**
|
|
11
|
+
* Processes configuration values and injects resolved properties for template expressions
|
|
12
|
+
*
|
|
13
|
+
* This function scans the input for template expressions in the format $${prefix:property.path}
|
|
14
|
+
* and replaces them with actual values from the appropriate property resolvers.
|
|
15
|
+
*
|
|
16
|
+
* @param configValue The configuration value to process (typically a string, but supports any type)
|
|
17
|
+
* @param context Request context provided by the host
|
|
18
|
+
* @returns Promise resolving to the processed configuration value with templates resolved
|
|
19
|
+
* @throws {Error} When a template expression uses an unsupported prefix
|
|
20
|
+
*
|
|
21
|
+
* Resolver implementations are configured by the host application.
|
|
22
|
+
*/
|
|
23
|
+
export declare function injectConfigValue<T>(configValue: T, context: ApolloContext): Promise<T>;
|
|
24
|
+
//# sourceMappingURL=config-injector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-injector.d.ts","sourceRoot":"","sources":["../../src/config/config-injector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,aAAa,KACnB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;AAElC,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAIvE,eAAO,MAAM,0BAA0B,GACrC,YAAW,uBAA4B,KACtC,IAEF,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,QAAQ,MAAM,EACd,UAAU,gBAAgB,KACzB,IAEF,CAAC;AAEF,eAAO,MAAM,0BAA0B,QAAO,uBAE7C,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,WAAW,EAAE,CAAC,EACd,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,CAAC,CAAC,CAMZ"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { resolveTemplateExpressions } from './template-processor.js';
|
|
2
|
+
let configResolvers = {};
|
|
3
|
+
export const setConfigInjectorResolvers = (resolvers = {}) => {
|
|
4
|
+
configResolvers = { ...resolvers };
|
|
5
|
+
};
|
|
6
|
+
export const addConfigInjectorResolver = (prefix, resolver) => {
|
|
7
|
+
configResolvers[prefix] = resolver;
|
|
8
|
+
};
|
|
9
|
+
export const getConfigInjectorResolvers = () => {
|
|
10
|
+
return { ...configResolvers };
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Processes configuration values and injects resolved properties for template expressions
|
|
14
|
+
*
|
|
15
|
+
* This function scans the input for template expressions in the format $${prefix:property.path}
|
|
16
|
+
* and replaces them with actual values from the appropriate property resolvers.
|
|
17
|
+
*
|
|
18
|
+
* @param configValue The configuration value to process (typically a string, but supports any type)
|
|
19
|
+
* @param context Request context provided by the host
|
|
20
|
+
* @returns Promise resolving to the processed configuration value with templates resolved
|
|
21
|
+
* @throws {Error} When a template expression uses an unsupported prefix
|
|
22
|
+
*
|
|
23
|
+
* Resolver implementations are configured by the host application.
|
|
24
|
+
*/
|
|
25
|
+
export async function injectConfigValue(configValue, context) {
|
|
26
|
+
return await resolveTemplateExpressions(configValue, configResolvers, context);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=config-injector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-injector.js","sourceRoot":"","sources":["../../src/config/config-injector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAarE,IAAI,eAAe,GAA4B,EAAE,CAAC;AAElD,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,YAAqC,EAAE,EACjC,EAAE;IACR,eAAe,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,MAAc,EACd,QAA0B,EACpB,EAAE;IACR,eAAe,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAA4B,EAAE;IACtE,OAAO,EAAE,GAAG,eAAe,EAAE,CAAC;AAChC,CAAC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,WAAc,EACd,OAAsB;IAEtB,OAAO,MAAM,0BAA0B,CACrC,WAAW,EACX,eAAe,EACf,OAAO,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ResolverFunction } from './config-injector.js';
|
|
2
|
+
import { ApolloContext } from '../types/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Processes template expressions in strings and replaces them with resolved values
|
|
5
|
+
*
|
|
6
|
+
* @param input The string that may contain template expressions like $${applicationPreference:something}
|
|
7
|
+
* @param resolvers Object mapping of prefix to resolver functions
|
|
8
|
+
* @param context Request context for resolvers
|
|
9
|
+
* @returns Promise resolving to the input with template expressions replaced
|
|
10
|
+
* @throws {Error} When a template expression uses an unsupported prefix
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const input = "Feature enabled: $${applicationPreference:feature.enabled}";
|
|
15
|
+
* const result = await resolveTemplateExpressions(input, resolvers, context);
|
|
16
|
+
* // result: "Feature enabled: true"
|
|
17
|
+
*
|
|
18
|
+
* // Throws error for unknown prefix:
|
|
19
|
+
* const invalid = "Value: $${unknown:setting}";
|
|
20
|
+
* await resolveTemplateExpressions(invalid, resolvers, context);
|
|
21
|
+
* // Error: Unknown template prefix 'unknown'. Supported prefixes: applicationPreference, env. Found in expressions: $${unknown:setting}
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function resolveTemplateExpressions<T>(input: T, resolvers: Record<string, ResolverFunction>, context: ApolloContext): Promise<T>;
|
|
25
|
+
//# sourceMappingURL=template-processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-processor.d.ts","sourceRoot":"","sources":["../../src/config/template-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAoClD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,0BAA0B,CAAC,CAAC,EAChD,KAAK,EAAE,CAAC,EACR,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAC3C,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,CAAC,CAAC,CAyDZ"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template expression pattern for matching placeholders like $${anything}
|
|
3
|
+
*
|
|
4
|
+
* Pattern breakdown:
|
|
5
|
+
* - \$\$ - Literal double dollar signs (escaped)
|
|
6
|
+
* - \{ - Literal opening brace (escaped)
|
|
7
|
+
* - ([^}]+) - Capture group 1: Everything inside braces (one or more non-brace characters)
|
|
8
|
+
* - \} - Literal closing brace (escaped)
|
|
9
|
+
* - g flag - Global matching to find all occurrences
|
|
10
|
+
*
|
|
11
|
+
* Examples:
|
|
12
|
+
* - $${applicationPreference:setting} → content: "applicationPreference:setting"
|
|
13
|
+
* - $${env:NODE_ENV} → content: "env:NODE_ENV"
|
|
14
|
+
* - $${applicationPreference:sys.core.retention.readOnlyAccess.enabled} → content: "applicationPreference:sys.core.retention.readOnlyAccess.enabled"
|
|
15
|
+
* - $${config:database.host} → content: "config:database.host"
|
|
16
|
+
* - $${invalid} → content: "invalid" (will be validated and throw error)
|
|
17
|
+
*
|
|
18
|
+
* This pattern captures everything inside $${} and then validates the format
|
|
19
|
+
* to ensure it follows the prefix:path convention.
|
|
20
|
+
*/
|
|
21
|
+
const TEMPLATE_EXPRESSION_PATTERN = /\$\$\{([^}]+)\}/g;
|
|
22
|
+
/**
|
|
23
|
+
* Processes template expressions in strings and replaces them with resolved values
|
|
24
|
+
*
|
|
25
|
+
* @param input The string that may contain template expressions like $${applicationPreference:something}
|
|
26
|
+
* @param resolvers Object mapping of prefix to resolver functions
|
|
27
|
+
* @param context Request context for resolvers
|
|
28
|
+
* @returns Promise resolving to the input with template expressions replaced
|
|
29
|
+
* @throws {Error} When a template expression uses an unsupported prefix
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* const input = "Feature enabled: $${applicationPreference:feature.enabled}";
|
|
34
|
+
* const result = await resolveTemplateExpressions(input, resolvers, context);
|
|
35
|
+
* // result: "Feature enabled: true"
|
|
36
|
+
*
|
|
37
|
+
* // Throws error for unknown prefix:
|
|
38
|
+
* const invalid = "Value: $${unknown:setting}";
|
|
39
|
+
* await resolveTemplateExpressions(invalid, resolvers, context);
|
|
40
|
+
* // Error: Unknown template prefix 'unknown'. Supported prefixes: applicationPreference, env. Found in expressions: $${unknown:setting}
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export async function resolveTemplateExpressions(input, resolvers, context) {
|
|
44
|
+
// Only process strings - return other types unchanged
|
|
45
|
+
if (typeof input !== 'string') {
|
|
46
|
+
return input;
|
|
47
|
+
}
|
|
48
|
+
const stringInput = input;
|
|
49
|
+
const expressions = extractTemplateExpressions(stringInput);
|
|
50
|
+
// If no template expressions found, return original string
|
|
51
|
+
if (expressions.length === 0) {
|
|
52
|
+
return input;
|
|
53
|
+
}
|
|
54
|
+
let processedString = stringInput;
|
|
55
|
+
const expressionsByPrefix = groupExpressionsByPrefix(expressions);
|
|
56
|
+
// Process each prefix group
|
|
57
|
+
for (const [prefix, prefixExpressions] of Object.entries(expressionsByPrefix)) {
|
|
58
|
+
const resolver = resolvers?.[prefix];
|
|
59
|
+
if (!resolver) {
|
|
60
|
+
throw new Error(`Unknown template prefix '${prefix}'. ` +
|
|
61
|
+
`Supported prefixes: ${Object.keys(resolvers).join(', ')}. ` +
|
|
62
|
+
`Found in expressions: ${prefixExpressions.map((e) => e.fullExpression).join(', ')}`);
|
|
63
|
+
}
|
|
64
|
+
const propertyPaths = [
|
|
65
|
+
...new Set(prefixExpressions.map((expr) => expr.path)),
|
|
66
|
+
];
|
|
67
|
+
const resolvedProperties = await resolver(propertyPaths, context);
|
|
68
|
+
for (const expression of prefixExpressions) {
|
|
69
|
+
const resolvedValue = resolvedProperties[expression.path];
|
|
70
|
+
if (resolvedValue === undefined) {
|
|
71
|
+
throw new Error(`Failed to resolve template expression '${expression.fullExpression}'. ` +
|
|
72
|
+
`Property '${expression.path}' not found in the '${prefix}' resolver response.`);
|
|
73
|
+
}
|
|
74
|
+
processedString = replaceTemplateExpression(processedString, expression.fullExpression, resolvedValue);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return processedString;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Validates the format of a template expression and returns the prefix and path.
|
|
81
|
+
* Throws an error if the format is invalid.
|
|
82
|
+
*/
|
|
83
|
+
function getPrefixAndPathOrThrow(fullExpression, content) {
|
|
84
|
+
if (!content.includes(':')) {
|
|
85
|
+
throw new Error(`Invalid template expression format: '${fullExpression}'. Template expressions must contain a colon separator between prefix and path.`);
|
|
86
|
+
}
|
|
87
|
+
const [prefix, path] = content.split(':');
|
|
88
|
+
if (!prefix) {
|
|
89
|
+
throw new Error(`Invalid template expression format '${fullExpression}'. Prefix cannot be empty.`);
|
|
90
|
+
}
|
|
91
|
+
if (!path) {
|
|
92
|
+
throw new Error(`Invalid template expression format '${fullExpression}'. Property path cannot be empty.`);
|
|
93
|
+
}
|
|
94
|
+
return { prefix, path };
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Extracts all template expressions from a string
|
|
98
|
+
*/
|
|
99
|
+
function extractTemplateExpressions(input) {
|
|
100
|
+
const matches = input.matchAll(TEMPLATE_EXPRESSION_PATTERN);
|
|
101
|
+
const expressions = Array.from(matches).map((match) => {
|
|
102
|
+
const fullExpression = match[0];
|
|
103
|
+
const content = match[1];
|
|
104
|
+
const { prefix, path } = getPrefixAndPathOrThrow(fullExpression, content);
|
|
105
|
+
return {
|
|
106
|
+
fullExpression,
|
|
107
|
+
prefix,
|
|
108
|
+
path,
|
|
109
|
+
};
|
|
110
|
+
});
|
|
111
|
+
return expressions;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Groups template expressions by their resolver prefix
|
|
115
|
+
*/
|
|
116
|
+
function groupExpressionsByPrefix(expressions) {
|
|
117
|
+
return expressions.reduce((groups, expression) => {
|
|
118
|
+
const { prefix } = expression;
|
|
119
|
+
if (!groups[prefix]) {
|
|
120
|
+
groups[prefix] = [];
|
|
121
|
+
}
|
|
122
|
+
groups[prefix].push(expression);
|
|
123
|
+
return groups;
|
|
124
|
+
}, {});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Safely replaces a template expression with its resolved value
|
|
128
|
+
*
|
|
129
|
+
* This function performs a literal string replacement by escaping regex special characters
|
|
130
|
+
* in the template expression to ensure exact matching, then replaces all occurrences
|
|
131
|
+
* with the resolved value converted to a string.
|
|
132
|
+
*
|
|
133
|
+
* @param input The string containing the template expression to replace
|
|
134
|
+
* @param templateExpression The exact template expression to find (e.g., "$${applicationPreference:setting}")
|
|
135
|
+
* @param resolvedValue The value to substitute for the template expression
|
|
136
|
+
* @returns The input string with all occurrences of the template expression replaced
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```typescript
|
|
140
|
+
* const result = replaceTemplateExpression(
|
|
141
|
+
* "Feature: $${applicationPreference:enabled} and $${applicationPreference:enabled}",
|
|
142
|
+
* "$${applicationPreference:enabled}",
|
|
143
|
+
* "true"
|
|
144
|
+
* );
|
|
145
|
+
* // result: "Feature: true and true"
|
|
146
|
+
* ```
|
|
147
|
+
*/
|
|
148
|
+
function replaceTemplateExpression(input, templateExpression, resolvedValue) {
|
|
149
|
+
// Escape special regex characters in the template expression
|
|
150
|
+
const escapedExpression = templateExpression.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
151
|
+
const regex = new RegExp(escapedExpression, 'g');
|
|
152
|
+
return input.replace(regex, String(resolvedValue));
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=template-processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-processor.js","sourceRoot":"","sources":["../../src/config/template-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ExtensionConfig } from '@docupace/ihub-core/types';
|
|
2
|
+
import { ConfigInjectorResolvers } from './config/config-injector.js';
|
|
3
|
+
import { ConfigProviders } from './config-providers/index.js';
|
|
4
|
+
import { ConfigResolversConfig } from './config-resolvers/index.js';
|
|
5
|
+
export interface ConfigExtensionOptions {
|
|
6
|
+
configInjectorResolvers?: ConfigInjectorResolvers;
|
|
7
|
+
providers?: ConfigProviders;
|
|
8
|
+
resolvers?: ConfigResolversConfig;
|
|
9
|
+
}
|
|
10
|
+
export declare const getConfigExtension: (options?: ConfigExtensionOptions) => Promise<ExtensionConfig>;
|
|
11
|
+
//# sourceMappingURL=config-extension.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-extension.d.ts","sourceRoot":"","sources":["../src/config-extension.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAI5D,OAAO,EACL,uBAAuB,EAExB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,eAAe,EAAsB,MAAM,6BAA6B,CAAC;AAClF,OAAO,EACL,qBAAqB,EAEtB,MAAM,6BAA6B,CAAC;AAOrC,MAAM,WAAW,sBAAsB;IACrC,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;IAClD,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,SAAS,CAAC,EAAE,qBAAqB,CAAC;CACnC;AAgBD,eAAO,MAAM,kBAAkB,GAC7B,UAAS,sBAA2B,KACnC,OAAO,CAAC,eAAe,CAwBzB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import { getInstanceConfig } from './instance-config.js';
|
|
4
|
+
import { defaultConfigService } from './config-service.js';
|
|
5
|
+
import ConfigMapper from './mappers/config-mapper.js';
|
|
6
|
+
import { setConfigInjectorResolvers, } from './config/config-injector.js';
|
|
7
|
+
import { setConfigProviders } from './config-providers/index.js';
|
|
8
|
+
import { setConfigResolvers, } from './config-resolvers/index.js';
|
|
9
|
+
const moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
10
|
+
const modelPath = path.resolve(moduleDir, '../model');
|
|
11
|
+
let configStoreInitPromise;
|
|
12
|
+
const ensureConfigStoresInitialized = async () => {
|
|
13
|
+
if (!configStoreInitPromise) {
|
|
14
|
+
const instanceConfig = await getInstanceConfig();
|
|
15
|
+
const configService = defaultConfigService({
|
|
16
|
+
model: undefined,
|
|
17
|
+
configStores: instanceConfig.configStores,
|
|
18
|
+
});
|
|
19
|
+
configStoreInitPromise = configService.init();
|
|
20
|
+
}
|
|
21
|
+
await configStoreInitPromise;
|
|
22
|
+
};
|
|
23
|
+
export const getConfigExtension = async (options = {}) => {
|
|
24
|
+
setConfigInjectorResolvers(options.configInjectorResolvers ?? {});
|
|
25
|
+
setConfigProviders(options.providers ?? {});
|
|
26
|
+
setConfigResolvers(options.resolvers ?? {});
|
|
27
|
+
const instanceConfig = await getInstanceConfig();
|
|
28
|
+
await ensureConfigStoresInitialized();
|
|
29
|
+
const configModelPaths = instanceConfig.configStores.map((configStore) => path.resolve(configStore.localPath, 'model'));
|
|
30
|
+
return {
|
|
31
|
+
name: 'config',
|
|
32
|
+
modelPaths: [modelPath, ...configModelPaths],
|
|
33
|
+
mappers: [
|
|
34
|
+
{
|
|
35
|
+
mapperClass: ConfigMapper,
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
tools: [],
|
|
39
|
+
resolvers: {},
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=config-extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-extension.js","sourceRoot":"","sources":["../src/config-extension.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,YAAY,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAEL,0BAA0B,GAC3B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAmB,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,EAEL,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AAErC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAEtD,IAAI,sBAAgD,CAAC;AAQrD,MAAM,6BAA6B,GAAG,KAAK,IAAI,EAAE;IAC/C,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,MAAM,iBAAiB,EAAE,CAAC;QACjD,MAAM,aAAa,GAAG,oBAAoB,CAAC;YACzC,KAAK,EAAE,SAAS;YAChB,YAAY,EAAE,cAAc,CAAC,YAAY;SAC1C,CAAC,CAAC;QAEH,sBAAsB,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,sBAAsB,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACrC,UAAkC,EAAE,EACV,EAAE;IAC5B,0BAA0B,CAAC,OAAO,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;IAClE,kBAAkB,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC5C,kBAAkB,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAE5C,MAAM,cAAc,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAEjD,MAAM,6BAA6B,EAAE,CAAC;IAEtC,MAAM,gBAAgB,GAAG,cAAc,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CACvE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAC7C,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,CAAC,SAAS,EAAE,GAAG,gBAAgB,CAAC;QAC5C,OAAO,EAAE;YACP;gBACE,WAAW,EAAE,YAAY;aAC1B;SACF;QACD,KAAK,EAAE,EAAE;QACT,SAAS,EAAE,EAAE;KACd,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import ConfigService from '../config-service.js';
|
|
2
|
+
import { ApolloContext } from '../types/types.js';
|
|
3
|
+
export interface ConfigProvider {
|
|
4
|
+
processConfig(config: any, configService: ConfigService, context: ApolloContext): any;
|
|
5
|
+
}
|
|
6
|
+
export type ConfigProviderClass = new () => ConfigProvider;
|
|
7
|
+
export type ConfigProviders = Record<string, ConfigProviderClass>;
|
|
8
|
+
//# sourceMappingURL=base-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-config.d.ts","sourceRoot":"","sources":["../../src/config-providers/base-config.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,aAAa,CACX,MAAM,EAAE,GAAG,EACX,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,aAAa,GACrB,GAAG,CAAC;CACR;AAED,MAAM,MAAM,mBAAmB,GAAG,UAAU,cAAc,CAAC;AAE3D,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-config.js","sourceRoot":"","sources":["../../src/config-providers/base-config.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ConfigProviders } from './base-config.js';
|
|
2
|
+
export declare const setConfigProviders: (providers?: ConfigProviders) => void;
|
|
3
|
+
export declare const getConfigProviders: () => ConfigProviders;
|
|
4
|
+
export type { ConfigProviders } from './base-config.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config-providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAInD,eAAO,MAAM,kBAAkB,GAAI,YAAW,eAAoB,KAAG,IAEpE,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAO,eAErC,CAAC;AAEF,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config-providers/index.ts"],"names":[],"mappings":"AAEA,IAAI,mBAAmB,GAAoB,EAAE,CAAC;AAE9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,YAA6B,EAAE,EAAQ,EAAE;IAC1E,mBAAmB,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAoB,EAAE;IACtD,OAAO,EAAE,GAAG,mBAAmB,EAAE,CAAC;AACpC,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import ConfigService from '../config-service.js';
|
|
2
|
+
export interface ConfigResolverFactoryDeps {
|
|
3
|
+
configService: ConfigService;
|
|
4
|
+
}
|
|
5
|
+
export type ConfigResolverRegistry<T = Record<string, any>> = T;
|
|
6
|
+
export type ConfigQueryResolverFactory = (deps: ConfigResolverFactoryDeps) => ConfigResolverRegistry;
|
|
7
|
+
export type ConfigMutationResolverFactory = (deps: ConfigResolverFactoryDeps) => ConfigResolverRegistry;
|
|
8
|
+
export interface ConfigResolversConfig {
|
|
9
|
+
query?: ConfigQueryResolverFactory;
|
|
10
|
+
mutation?: ConfigMutationResolverFactory;
|
|
11
|
+
}
|
|
12
|
+
export declare const setConfigResolvers: (resolvers?: ConfigResolversConfig) => void;
|
|
13
|
+
export declare const getConfigResolvers: () => ConfigResolversConfig;
|
|
14
|
+
export declare const deepMergeResolvers: (builtInResolvers: Record<string, any>, hostResolvers: Record<string, any>) => Record<string, any>;
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config-resolvers/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,sBAAsB,CAAC;AAEjD,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;AAEhE,MAAM,MAAM,0BAA0B,GAAG,CACvC,IAAI,EAAE,yBAAyB,KAC5B,sBAAsB,CAAC;AAE5B,MAAM,MAAM,6BAA6B,GAAG,CAC1C,IAAI,EAAE,yBAAyB,KAC5B,sBAAsB,CAAC;AAE5B,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,0BAA0B,CAAC;IACnC,QAAQ,CAAC,EAAE,6BAA6B,CAAC;CAC1C;AAID,eAAO,MAAM,kBAAkB,GAC7B,YAAW,qBAA0B,KACpC,IAEF,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAO,qBAErC,CAAC;AAQF,eAAO,MAAM,kBAAkB,GAC7B,kBAAkB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACrC,eAAe,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KACjC,MAAM,CAAC,MAAM,EAAE,GAAG,CAapB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
let configResolvers = {};
|
|
2
|
+
export const setConfigResolvers = (resolvers = {}) => {
|
|
3
|
+
configResolvers = { ...resolvers };
|
|
4
|
+
};
|
|
5
|
+
export const getConfigResolvers = () => {
|
|
6
|
+
return { ...configResolvers };
|
|
7
|
+
};
|
|
8
|
+
const isPlainObject = (value) => {
|
|
9
|
+
return (typeof value === 'object' && value !== null && !Array.isArray(value));
|
|
10
|
+
};
|
|
11
|
+
export const deepMergeResolvers = (builtInResolvers, hostResolvers) => {
|
|
12
|
+
const merged = { ...builtInResolvers };
|
|
13
|
+
for (const [key, hostValue] of Object.entries(hostResolvers ?? {})) {
|
|
14
|
+
const builtInValue = merged[key];
|
|
15
|
+
if (isPlainObject(builtInValue) && isPlainObject(hostValue)) {
|
|
16
|
+
merged[key] = deepMergeResolvers(builtInValue, hostValue);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
merged[key] = hostValue;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return merged;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config-resolvers/index.ts"],"names":[],"mappings":"AAqBA,IAAI,eAAe,GAA0B,EAAE,CAAC;AAEhD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,YAAmC,EAAE,EAC/B,EAAE;IACR,eAAe,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAA0B,EAAE;IAC5D,OAAO,EAAE,GAAG,eAAe,EAAE,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAc,EAAgC,EAAE;IACrE,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CACrE,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,gBAAqC,EACrC,aAAkC,EACb,EAAE;IACvB,MAAM,MAAM,GAAG,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAEvC,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,CAAC;QACnE,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,aAAa,CAAC,YAAY,CAAC,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5D,MAAM,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Model } from '@docupace/ihub-core';
|
|
2
|
+
import { ApolloContext } from './types/types.js';
|
|
3
|
+
export interface ConfigStore {
|
|
4
|
+
supportsRefresh(): boolean;
|
|
5
|
+
getConfig(path: string): any;
|
|
6
|
+
listConfigs(path: string): any;
|
|
7
|
+
updateConfig(path: string, config: any): any;
|
|
8
|
+
init(): void;
|
|
9
|
+
refresh(): void;
|
|
10
|
+
}
|
|
11
|
+
export interface ConfigStoreParams {
|
|
12
|
+
key: string;
|
|
13
|
+
name: string;
|
|
14
|
+
localPath: string;
|
|
15
|
+
priority: number;
|
|
16
|
+
remotePath?: string;
|
|
17
|
+
remoteBranch?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface DefaultConfigServiceParams {
|
|
20
|
+
model?: Model;
|
|
21
|
+
configStores: ConfigStoreParams[];
|
|
22
|
+
}
|
|
23
|
+
export declare class ConfigFileStore implements ConfigStore {
|
|
24
|
+
private localPath;
|
|
25
|
+
private remotePath?;
|
|
26
|
+
private remoteBranch?;
|
|
27
|
+
constructor(params: ConfigStoreParams);
|
|
28
|
+
getLocalPath(): string;
|
|
29
|
+
supportsRefresh(): boolean;
|
|
30
|
+
private getFilesWithRemovedExtensions;
|
|
31
|
+
private isDirectory;
|
|
32
|
+
getFinalPath(fullPath: string): Promise<string>;
|
|
33
|
+
getAbsConfig(fullPath: string): Promise<any>;
|
|
34
|
+
getConfig(configPath: string): Promise<any>;
|
|
35
|
+
listConfigs(configPath: string): Promise<string[]>;
|
|
36
|
+
updateConfig(configPath: string, config: any): Promise<void>;
|
|
37
|
+
init(): Promise<void>;
|
|
38
|
+
refresh(): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
declare class ConfigService {
|
|
41
|
+
private configStores;
|
|
42
|
+
private model?;
|
|
43
|
+
constructor(configStores: ConfigStore[], model?: Model);
|
|
44
|
+
generateResolvers(): void;
|
|
45
|
+
processConfig(config: any, context: ApolloContext, processProviders?: boolean): Promise<any>;
|
|
46
|
+
getRefConfig(configPath: string, refConfigPath: string, context: ApolloContext, values?: any): Promise<any>;
|
|
47
|
+
updatePathValues(obj: any, inputPath: string): any;
|
|
48
|
+
flattenArray(arr: any[]): any[];
|
|
49
|
+
processObjectExpressions(object: any, inputValues: any, context: ApolloContext): Promise<any>;
|
|
50
|
+
private processImageReference;
|
|
51
|
+
processObject(configPath: string, obj: any, context: ApolloContext, values?: any): Promise<any>;
|
|
52
|
+
private getFileMimeType;
|
|
53
|
+
getConfigFromStore(path: string): Promise<any>;
|
|
54
|
+
getConfig(configPath: string, context: ApolloContext, values?: any, processProviders?: boolean): Promise<any>;
|
|
55
|
+
getDirectConfig(configPath: string, context: ApolloContext, values?: any, processProviders?: boolean): Promise<any>;
|
|
56
|
+
listDirectConfigs(configPath: string): Promise<any[]>;
|
|
57
|
+
updateConfig(configPath: string, config: any, context: ApolloContext): Promise<any>;
|
|
58
|
+
getPageConfig(pagePath: string, context: ApolloContext, processConfig?: boolean): Promise<any>;
|
|
59
|
+
init(): Promise<void[]>;
|
|
60
|
+
}
|
|
61
|
+
export declare const defaultConfigService: ({ model, configStores, }: DefaultConfigServiceParams) => ConfigService;
|
|
62
|
+
export default ConfigService;
|
|
63
|
+
//# sourceMappingURL=config-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-service.d.ts","sourceRoot":"","sources":["../src/config-service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAM5C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQjD,MAAM,WAAW,WAAW;IAC1B,eAAe,IAAI,OAAO,CAAC;IAC3B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC;IAC7B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC;IAC/B,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;IAC7C,IAAI,IAAI,IAAI,CAAC;IACb,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,YAAY,EAAE,iBAAiB,EAAE,CAAC;CACnC;AAED,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAC,CAAS;gBAElB,MAAM,EAAE,iBAAiB;IAM9B,YAAY,IAAI,MAAM;IAItB,eAAe,IAAI,OAAO;YAInB,6BAA6B;YAkB7B,WAAW;IAcnB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoB/C,YAAY,CAAC,QAAQ,EAAE,MAAM;IAO7B,SAAS,CAAC,UAAU,EAAE,MAAM;IAK5B,WAAW,CAAC,UAAU,EAAE,MAAM;IAS9B,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG;IAO5C,IAAI;IAwBJ,OAAO;CAWd;AAED,cAAM,aAAa;IACjB,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,KAAK,CAAC,CAAQ;gBAEV,YAAY,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE,KAAK;IAQtD,iBAAiB;IA+KX,aAAa,CACjB,MAAM,EAAE,GAAG,EACX,OAAO,EAAE,aAAa,EACtB,gBAAgB,CAAC,EAAE,OAAO,GACzB,OAAO,CAAC,GAAG,CAAC;IAqDT,YAAY,CAChB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,GAAG;IAYd,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,GAAG;IAuBlD,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE;IAYzB,wBAAwB,CAC5B,MAAM,EAAE,GAAG,EACX,WAAW,EAAE,GAAG,EAChB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,GAAG,CAAC;YAgDD,qBAAqB;IA4C7B,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,aAAa,EACtB,MAAM,GAAE,GAAQ,GACf,OAAO,CAAC,GAAG,CAAC;IAoEf,OAAO,CAAC,eAAe;IAcjB,kBAAkB,CAAC,IAAI,EAAE,MAAM;IAiB/B,SAAS,CACb,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,GAAG,EACZ,gBAAgB,CAAC,EAAE,OAAO;IAMtB,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,GAAG,EACZ,gBAAgB,CAAC,EAAE,OAAO;IAatB,iBAAiB,CAAC,UAAU,EAAE,MAAM;IASpC,YAAY,CAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,GAAG,EACX,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,GAAG,CAAC;IAMT,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,aAAa,CAAC,EAAE,OAAO;IAWnB,IAAI;CAKX;AAED,eAAO,MAAM,oBAAoB,GAAI,0BAGlC,0BAA0B,KAAG,aAK/B,CAAC;AAEF,eAAe,aAAa,CAAC"}
|