@lorion-org/nuxt 1.0.0-beta.1 → 1.0.0-beta.2

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.
@@ -0,0 +1,66 @@
1
+ import {
2
+ loadRuntimeConfigSourceTree,
3
+ resolveRuntimeConfigSourcePublicRootPath,
4
+ validateRuntimeConfigSourceScopes,
5
+ type RuntimeConfigSchemaTargetInput,
6
+ type RuntimeConfigValidateResult,
7
+ type ValidateRuntimeConfigPatternSourceScopesOptions,
8
+ } from '@lorion-org/runtime-config-node';
9
+ import { toRuntimeConfigFragment, type RuntimeConfigFragmentMap } from '@lorion-org/runtime-config';
10
+ import { createNuxtRuntimeConfig } from './runtime-config';
11
+ import type {
12
+ CreateNuxtRuntimeConfigOptions,
13
+ NuxtRuntimeConfig,
14
+ RuntimeConfigNuxtSourceOptions,
15
+ } from './types';
16
+ export type { RuntimeConfigNuxtSourceOptions } from './types';
17
+
18
+ export type CreateNuxtRuntimeConfigFromSourceOptions = Omit<
19
+ CreateNuxtRuntimeConfigOptions,
20
+ 'fragments' | 'runtimeConfig'
21
+ >;
22
+
23
+ export type ValidateNuxtRuntimeConfigSourceScopesOptions = Omit<
24
+ ValidateRuntimeConfigPatternSourceScopesOptions,
25
+ 'fileName' | 'runtimeConfigDirName'
26
+ >;
27
+
28
+ export function resolveNuxtRuntimeConfigPublicRootPath(
29
+ source: RuntimeConfigNuxtSourceOptions,
30
+ ): string | undefined {
31
+ return resolveRuntimeConfigSourcePublicRootPath(source);
32
+ }
33
+
34
+ export function loadNuxtRuntimeConfigFragments(
35
+ source: RuntimeConfigNuxtSourceOptions,
36
+ options: Pick<CreateNuxtRuntimeConfigOptions, 'contextInputKey'> = {},
37
+ ): RuntimeConfigFragmentMap {
38
+ const fragments = loadRuntimeConfigSourceTree(source);
39
+ const normalizedFragments: RuntimeConfigFragmentMap = new Map();
40
+
41
+ for (const [scopeId, config] of fragments.entries()) {
42
+ normalizedFragments.set(scopeId, toRuntimeConfigFragment(config, options));
43
+ }
44
+
45
+ return normalizedFragments;
46
+ }
47
+
48
+ export function createNuxtRuntimeConfigFromSource(
49
+ source: RuntimeConfigNuxtSourceOptions,
50
+ options: CreateNuxtRuntimeConfigFromSourceOptions = {},
51
+ ): NuxtRuntimeConfig {
52
+ return createNuxtRuntimeConfig({
53
+ ...options,
54
+ fragments: loadNuxtRuntimeConfigFragments(source, {
55
+ ...(options.contextInputKey ? { contextInputKey: options.contextInputKey } : {}),
56
+ }),
57
+ });
58
+ }
59
+
60
+ export function validateNuxtRuntimeConfigSourceScopes(
61
+ source: RuntimeConfigNuxtSourceOptions,
62
+ targets: RuntimeConfigSchemaTargetInput[],
63
+ options: ValidateNuxtRuntimeConfigSourceScopesOptions = {},
64
+ ): RuntimeConfigValidateResult {
65
+ return validateRuntimeConfigSourceScopes(source, targets, options);
66
+ }
@@ -0,0 +1,292 @@
1
+ import {
2
+ getPrivateRuntimeConfigScope,
3
+ getPublicRuntimeConfigScope,
4
+ getRuntimeConfigFragment,
5
+ getRuntimeConfigScope,
6
+ projectSectionedRuntimeConfig,
7
+ resolveRuntimeConfigValueFromRuntimeConfig,
8
+ toRuntimeConfigFragment,
9
+ type GetRuntimeConfigFragmentOptions,
10
+ type GetRuntimeConfigScopeOptions,
11
+ type ResolveRuntimeConfigValueFromRuntimeConfigOptions,
12
+ type NamedRuntimeConfigFragment,
13
+ type RuntimeConfigContext,
14
+ type RuntimeConfigFragmentMap,
15
+ type RuntimeConfigSection,
16
+ type SectionedRuntimeConfig,
17
+ } from '@lorion-org/runtime-config';
18
+ import type {
19
+ CreateNuxtRuntimeConfigOptions,
20
+ NuxtExtensionSelection,
21
+ NuxtPrivateRuntimeConfigMode,
22
+ NuxtProviderSelectionRuntimeConfig,
23
+ NuxtRuntimeConfig,
24
+ NuxtRuntimeConfigInput,
25
+ ReadNuxtRuntimeConfigOptions,
26
+ RuntimeConfigNuxtFragments,
27
+ } from './types';
28
+ export type {
29
+ CreateNuxtRuntimeConfigOptions,
30
+ NuxtExtensionSelection,
31
+ NuxtExtensionSelectionRuntimeConfig,
32
+ NuxtPrivateRuntimeConfigMode,
33
+ NuxtRuntimeConfig,
34
+ NuxtRuntimeConfigInput,
35
+ ReadNuxtRuntimeConfigOptions,
36
+ RuntimeConfigNuxtFragments,
37
+ } from './types';
38
+
39
+ const isObject = (value: unknown): value is Record<string, unknown> => {
40
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
41
+ };
42
+
43
+ const toStringArray = (value: unknown): string[] =>
44
+ Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === 'string') : [];
45
+
46
+ function createContextInputOptions(
47
+ contextInputKey?: string,
48
+ ): Pick<CreateNuxtRuntimeConfigOptions, 'contextInputKey'> {
49
+ return contextInputKey === undefined ? {} : { contextInputKey };
50
+ }
51
+
52
+ function createPrivateOutputOptions(
53
+ privateOutput?: NuxtPrivateRuntimeConfigMode,
54
+ ): Pick<CreateNuxtRuntimeConfigOptions, 'privateOutput'> {
55
+ return privateOutput === undefined ? {} : { privateOutput };
56
+ }
57
+
58
+ function createPrivateInputOptions(
59
+ privateInput?: NuxtPrivateRuntimeConfigMode,
60
+ ): ReadNuxtRuntimeConfigOptions {
61
+ return privateInput === undefined ? {} : { privateInput };
62
+ }
63
+
64
+ function withoutPublicRuntimeConfig(config: NuxtRuntimeConfigInput): RuntimeConfigSection {
65
+ const privateConfig = { ...config };
66
+ delete privateConfig.public;
67
+
68
+ return privateConfig;
69
+ }
70
+
71
+ export function normalizeNuxtRuntimeConfigFragments(
72
+ fragments: RuntimeConfigNuxtFragments = {},
73
+ options: Pick<CreateNuxtRuntimeConfigOptions, 'contextInputKey'> = {},
74
+ ): NamedRuntimeConfigFragment[] | RuntimeConfigFragmentMap {
75
+ if (fragments instanceof Map) {
76
+ const normalizedFragments: RuntimeConfigFragmentMap = new Map();
77
+
78
+ for (const [scopeId, config] of fragments.entries()) {
79
+ normalizedFragments.set(scopeId, toRuntimeConfigFragment(config, options));
80
+ }
81
+
82
+ return normalizedFragments;
83
+ }
84
+
85
+ if (Array.isArray(fragments)) {
86
+ return fragments.map((fragment) => ({
87
+ scopeId: fragment.scopeId,
88
+ config: toRuntimeConfigFragment(fragment.config, options),
89
+ }));
90
+ }
91
+
92
+ return Object.entries(fragments).map(([scopeId, config]) => ({
93
+ scopeId,
94
+ config: toRuntimeConfigFragment(config, options),
95
+ }));
96
+ }
97
+
98
+ export function toNuxtRuntimeConfig(
99
+ runtimeConfig: SectionedRuntimeConfig,
100
+ options: Pick<CreateNuxtRuntimeConfigOptions, 'privateOutput'> = {},
101
+ ): NuxtRuntimeConfig {
102
+ if (options.privateOutput === 'section') {
103
+ return {
104
+ private: {
105
+ ...runtimeConfig.private,
106
+ },
107
+ public: {
108
+ ...runtimeConfig.public,
109
+ },
110
+ };
111
+ }
112
+
113
+ return {
114
+ ...runtimeConfig.private,
115
+ public: {
116
+ ...runtimeConfig.public,
117
+ },
118
+ };
119
+ }
120
+
121
+ export function fromNuxtRuntimeConfig(
122
+ runtimeConfig: NuxtRuntimeConfigInput,
123
+ options: ReadNuxtRuntimeConfigOptions = {},
124
+ ): SectionedRuntimeConfig {
125
+ if (options.privateInput === 'section') {
126
+ return {
127
+ public: isObject(runtimeConfig.public) ? runtimeConfig.public : {},
128
+ private: isObject(runtimeConfig.private) ? runtimeConfig.private : {},
129
+ };
130
+ }
131
+
132
+ const { public: publicConfig = {}, ...privateConfig } = runtimeConfig;
133
+
134
+ return {
135
+ public: publicConfig,
136
+ private: privateConfig,
137
+ };
138
+ }
139
+
140
+ export function createNuxtRuntimeConfig(
141
+ options: CreateNuxtRuntimeConfigOptions = {},
142
+ ): NuxtRuntimeConfig {
143
+ const { contextInputKey, fragments, runtimeConfig, ...projectOptions } = options;
144
+ const runtimeConfigFragments = fragments ?? {};
145
+ const sectionedRuntimeConfig =
146
+ runtimeConfig ??
147
+ projectSectionedRuntimeConfig(
148
+ normalizeNuxtRuntimeConfigFragments(
149
+ runtimeConfigFragments,
150
+ createContextInputOptions(contextInputKey),
151
+ ),
152
+ projectOptions,
153
+ );
154
+
155
+ return toNuxtRuntimeConfig(
156
+ sectionedRuntimeConfig,
157
+ createPrivateOutputOptions(options.privateOutput),
158
+ );
159
+ }
160
+
161
+ export function mergeNuxtRuntimeConfig(
162
+ target: NuxtRuntimeConfigInput = {},
163
+ source: NuxtRuntimeConfigInput = {},
164
+ ): NuxtRuntimeConfig {
165
+ const targetPublic = isObject(target.public) ? target.public : {};
166
+ const sourcePublic = isObject(source.public) ? source.public : {};
167
+
168
+ return {
169
+ ...withoutPublicRuntimeConfig(target),
170
+ ...withoutPublicRuntimeConfig(source),
171
+ public: {
172
+ ...targetPublic,
173
+ ...sourcePublic,
174
+ },
175
+ };
176
+ }
177
+
178
+ export function getNuxtExtensionSelection(
179
+ runtimeConfig: NuxtRuntimeConfigInput,
180
+ ): NuxtExtensionSelection {
181
+ const selection = isObject(runtimeConfig.public?.extensionSelection)
182
+ ? runtimeConfig.public.extensionSelection
183
+ : undefined;
184
+
185
+ if (!selection) {
186
+ return {
187
+ discoveredExtensionIds: [],
188
+ notInjectedExtensionIds: [],
189
+ resolvedExtensionIds: [],
190
+ selectedExtensionIds: [],
191
+ };
192
+ }
193
+
194
+ const discoveredExtensionIds = toStringArray(selection.discoveredExtensionIds);
195
+ const resolvedExtensionIds = toStringArray(selection.resolvedExtensionIds);
196
+ const resolvedExtensionIdSet = new Set(resolvedExtensionIds);
197
+
198
+ return {
199
+ discoveredExtensionIds,
200
+ notInjectedExtensionIds: discoveredExtensionIds
201
+ .filter((id) => !resolvedExtensionIdSet.has(id))
202
+ .sort((left, right) => left.localeCompare(right)),
203
+ resolvedExtensionIds,
204
+ selectedExtensionIds: toStringArray(selection.selectedExtensionIds),
205
+ };
206
+ }
207
+
208
+ export function getNuxtProviderSelection(
209
+ runtimeConfig: NuxtRuntimeConfigInput,
210
+ ): NuxtProviderSelectionRuntimeConfig | undefined {
211
+ const providerSelection = runtimeConfig.public?.providerSelection;
212
+
213
+ return isObject(providerSelection) && isObject(providerSelection.selections)
214
+ ? (providerSelection as NuxtProviderSelectionRuntimeConfig)
215
+ : undefined;
216
+ }
217
+
218
+ export function getPublicNuxtRuntimeConfigScope<
219
+ T extends RuntimeConfigSection = RuntimeConfigSection,
220
+ >(
221
+ runtimeConfig: NuxtRuntimeConfigInput,
222
+ scopeId: string,
223
+ options: Omit<GetRuntimeConfigScopeOptions, 'visibility'> & ReadNuxtRuntimeConfigOptions = {},
224
+ ): T {
225
+ const { privateInput, ...scopeOptions } = options;
226
+
227
+ return getPublicRuntimeConfigScope<T>(
228
+ fromNuxtRuntimeConfig(runtimeConfig, createPrivateInputOptions(privateInput)),
229
+ scopeId,
230
+ scopeOptions,
231
+ );
232
+ }
233
+
234
+ export function getNuxtRuntimeConfigScope<T extends RuntimeConfigSection = RuntimeConfigSection>(
235
+ runtimeConfig: NuxtRuntimeConfigInput,
236
+ scopeId: string,
237
+ options: GetRuntimeConfigScopeOptions & ReadNuxtRuntimeConfigOptions = {},
238
+ ): T {
239
+ const { privateInput, ...scopeOptions } = options;
240
+
241
+ return getRuntimeConfigScope<T>(
242
+ fromNuxtRuntimeConfig(runtimeConfig, createPrivateInputOptions(privateInput)),
243
+ scopeId,
244
+ scopeOptions,
245
+ );
246
+ }
247
+
248
+ export function getPrivateNuxtRuntimeConfigScope<
249
+ T extends RuntimeConfigSection = RuntimeConfigSection,
250
+ >(
251
+ runtimeConfig: NuxtRuntimeConfigInput,
252
+ scopeId: string,
253
+ options: Omit<GetRuntimeConfigScopeOptions, 'visibility'> & ReadNuxtRuntimeConfigOptions = {},
254
+ ): T {
255
+ const { privateInput, ...scopeOptions } = options;
256
+
257
+ return getPrivateRuntimeConfigScope<T>(
258
+ fromNuxtRuntimeConfig(runtimeConfig, createPrivateInputOptions(privateInput)),
259
+ scopeId,
260
+ scopeOptions,
261
+ );
262
+ }
263
+
264
+ export function resolveNuxtRuntimeConfigValue<T = unknown>(
265
+ runtimeConfig: NuxtRuntimeConfigInput,
266
+ scopeId: string,
267
+ key: string,
268
+ options: ResolveRuntimeConfigValueFromRuntimeConfigOptions<T> & ReadNuxtRuntimeConfigOptions = {},
269
+ ): T | undefined {
270
+ const { privateInput, ...resolveOptions } = options;
271
+
272
+ return resolveRuntimeConfigValueFromRuntimeConfig<T>(
273
+ fromNuxtRuntimeConfig(runtimeConfig, createPrivateInputOptions(privateInput)),
274
+ scopeId,
275
+ key,
276
+ resolveOptions,
277
+ );
278
+ }
279
+
280
+ export function getNuxtRuntimeConfigFragment(
281
+ runtimeConfig: NuxtRuntimeConfigInput,
282
+ scopeId: string,
283
+ options: GetRuntimeConfigFragmentOptions & ReadNuxtRuntimeConfigOptions = {},
284
+ ): RuntimeConfigContext {
285
+ const { privateInput, ...fragmentOptions } = options;
286
+
287
+ return getRuntimeConfigFragment(
288
+ fromNuxtRuntimeConfig(runtimeConfig, createPrivateInputOptions(privateInput)),
289
+ scopeId,
290
+ fragmentOptions,
291
+ );
292
+ }
package/src/types.ts ADDED
@@ -0,0 +1,143 @@
1
+ import type {
2
+ NamedRuntimeConfigFragment,
3
+ ProjectSectionedRuntimeConfigOptions,
4
+ RuntimeConfigFragment,
5
+ RuntimeConfigFragmentMap,
6
+ RuntimeConfigSection,
7
+ SectionedRuntimeConfig,
8
+ } from '@lorion-org/runtime-config';
9
+ import type { ProviderPreferenceMap, ProviderSelection } from '@lorion-org/provider-selection';
10
+ import type {
11
+ Descriptor,
12
+ DescriptorSelectionSeedInput,
13
+ RelationDescriptor,
14
+ } from '@lorion-org/composition-graph';
15
+ import type {
16
+ RuntimeConfigPathPatternSource,
17
+ ValidateRuntimeConfigPatternSourceScopesOptions,
18
+ } from '@lorion-org/runtime-config-node';
19
+ import type { JsonSchemaObject } from './descriptor-schema';
20
+ import type { NuxtExtensionBootstrap } from './extensions';
21
+
22
+ export type RuntimeConfigNuxtFragmentInput = RuntimeConfigFragment & Record<string, unknown>;
23
+
24
+ export type RuntimeConfigNuxtFragments =
25
+ | RuntimeConfigFragmentMap
26
+ | NamedRuntimeConfigFragment[]
27
+ | Record<string, RuntimeConfigNuxtFragmentInput>;
28
+
29
+ export type RuntimeConfigNuxtSourceOptions = RuntimeConfigPathPatternSource;
30
+
31
+ export type NuxtPrivateRuntimeConfigMode = 'root' | 'section';
32
+
33
+ export type NuxtRuntimeConfig = RuntimeConfigSection & {
34
+ public: RuntimeConfigSection;
35
+ };
36
+
37
+ export type NuxtRuntimeConfigInput = RuntimeConfigSection & {
38
+ public?: RuntimeConfigSection;
39
+ };
40
+
41
+ export type CreateNuxtRuntimeConfigOptions = ProjectSectionedRuntimeConfigOptions & {
42
+ contextInputKey?: string;
43
+ fragments?: RuntimeConfigNuxtFragments;
44
+ privateOutput?: NuxtPrivateRuntimeConfigMode;
45
+ runtimeConfig?: SectionedRuntimeConfig;
46
+ };
47
+
48
+ export type ReadNuxtRuntimeConfigOptions = {
49
+ privateInput?: NuxtPrivateRuntimeConfigMode;
50
+ };
51
+
52
+ export type RuntimeConfigNuxtModuleOptions = Omit<CreateNuxtRuntimeConfigOptions, 'scopeIds'> & {
53
+ enabled?: boolean;
54
+ imports?: boolean;
55
+ publicAssets?:
56
+ | boolean
57
+ | {
58
+ maxAge?: number;
59
+ };
60
+ source?: RuntimeConfigNuxtSourceOptions;
61
+ validation?: false | NuxtRuntimeConfigValidationOptions;
62
+ };
63
+
64
+ export type NuxtRuntimeConfigValidationOptions = Pick<
65
+ ValidateRuntimeConfigPatternSourceScopesOptions,
66
+ 'formatError' | 'schemaFileName'
67
+ >;
68
+
69
+ export type NuxtProviderSelectionModuleOptions = {
70
+ configuredProviders?: ProviderPreferenceMap;
71
+ enabled?: boolean;
72
+ fallbackProviders?: ProviderPreferenceMap;
73
+ selectedProviders?: ProviderPreferenceMap;
74
+ };
75
+
76
+ export type NuxtProviderSelectionRuntimeConfig = {
77
+ configuredProviders: ProviderPreferenceMap;
78
+ excludedProviderIds: string[];
79
+ fallbackProviders: ProviderPreferenceMap;
80
+ mismatches: Array<{
81
+ capabilityId: string;
82
+ configuredProviderId: string;
83
+ }>;
84
+ selections: Record<string, ProviderSelection>;
85
+ };
86
+
87
+ export type NuxtExtensionSelectionRuntimeConfig = {
88
+ discoveredExtensionIds: string[];
89
+ resolvedExtensionIds: string[];
90
+ selectedExtensionIds: string[];
91
+ };
92
+
93
+ export type NuxtExtensionSelection = NuxtExtensionSelectionRuntimeConfig & {
94
+ notInjectedExtensionIds: string[];
95
+ };
96
+
97
+ export type NuxtExtensionBootstrapLogEvent = {
98
+ bootstrap: NuxtExtensionBootstrap;
99
+ providerSelection?: NuxtProviderSelectionRuntimeConfig;
100
+ };
101
+
102
+ export type NuxtExtensionBootstrapReporter = (event: NuxtExtensionBootstrapLogEvent) => void;
103
+
104
+ export type NuxtBaseExtensionSelectionInput = {
105
+ descriptors: Descriptor[];
106
+ selectedExtensions: string[];
107
+ };
108
+
109
+ export type NuxtBaseExtensionSelection =
110
+ | string
111
+ | string[]
112
+ | ((input: NuxtBaseExtensionSelectionInput) => string[]);
113
+
114
+ export type NuxtExtensionSelectionSeedOptions = Omit<DescriptorSelectionSeedInput, 'defaultValue'>;
115
+
116
+ export type NuxtExtensionModuleOptions = {
117
+ baseExtensions?: NuxtBaseExtensionSelection;
118
+ defaultSelection?: string | string[];
119
+ descriptorSchema?: false | JsonSchemaObject;
120
+ descriptorPaths?: string[];
121
+ enabled?: boolean;
122
+ relationDescriptors?: RelationDescriptor[];
123
+ selected?: string | string[];
124
+ selectionSeed?: false | NuxtExtensionSelectionSeedOptions;
125
+ };
126
+
127
+ export type LorionNuxtModuleOptions = {
128
+ extensionBootstrap?: NuxtExtensionBootstrap;
129
+ extensions?: NuxtExtensionModuleOptions;
130
+ logging?:
131
+ | boolean
132
+ | {
133
+ reporter?: NuxtExtensionBootstrapReporter;
134
+ };
135
+ providers?: NuxtProviderSelectionModuleOptions;
136
+ runtimeConfig?: RuntimeConfigNuxtModuleOptions;
137
+ };
138
+
139
+ declare module 'nuxt/schema' {
140
+ interface NuxtConfig {
141
+ lorion?: LorionNuxtModuleOptions;
142
+ }
143
+ }