@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,436 @@
1
+ // src/extensions.ts
2
+ import { existsSync } from "fs";
3
+ import { join } from "path";
4
+ import process from "process";
5
+ import {
6
+ createDescriptorCatalog,
7
+ parseDescriptorIds,
8
+ resolveDescriptorSelectionSeed
9
+ } from "@lorion-org/composition-graph";
10
+ import { discoverDescriptors } from "@lorion-org/descriptor-discovery";
11
+ import {
12
+ collectProviderDefaults,
13
+ collectProviderPreferences,
14
+ collectSelectedProviderPreferences,
15
+ resolveItemProviderSelection,
16
+ resolveSelectedProviderRelationPreferences
17
+ } from "@lorion-org/provider-selection";
18
+
19
+ // src/extension-descriptor.schema.json
20
+ var extension_descriptor_schema_default = {
21
+ $schema: "http://json-schema.org/draft-07/schema#",
22
+ $id: "https://lorion.dev/schemas/nuxt-extension-descriptor.schema.json",
23
+ $ref: "#/$defs/extension",
24
+ $defs: {
25
+ semver: {
26
+ type: "string",
27
+ pattern: "^(\\^|~)?\\d+\\.\\d+\\.\\d+$"
28
+ },
29
+ dependencyMap: {
30
+ type: "object",
31
+ additionalProperties: { $ref: "#/$defs/semver" }
32
+ },
33
+ extension: {
34
+ type: "object",
35
+ properties: {
36
+ id: {
37
+ type: "string",
38
+ minLength: 1
39
+ },
40
+ version: { $ref: "#/$defs/semver" },
41
+ providesFor: {
42
+ oneOf: [
43
+ {
44
+ type: "string",
45
+ minLength: 1
46
+ },
47
+ {
48
+ type: "array",
49
+ items: {
50
+ type: "string",
51
+ minLength: 1
52
+ }
53
+ }
54
+ ]
55
+ },
56
+ capabilities: {
57
+ type: "array",
58
+ items: {
59
+ type: "string",
60
+ minLength: 1
61
+ }
62
+ },
63
+ dependencies: { $ref: "#/$defs/dependencyMap" },
64
+ disabled: { type: "boolean" },
65
+ location: { type: "string" },
66
+ defaultFor: {
67
+ oneOf: [
68
+ {
69
+ type: "string",
70
+ minLength: 1
71
+ },
72
+ {
73
+ type: "array",
74
+ items: {
75
+ type: "string",
76
+ minLength: 1
77
+ }
78
+ }
79
+ ]
80
+ },
81
+ providerPreferences: {
82
+ type: "object",
83
+ additionalProperties: {
84
+ type: "string",
85
+ minLength: 1
86
+ }
87
+ },
88
+ publicRuntimeConfig: {
89
+ type: "object",
90
+ additionalProperties: true
91
+ },
92
+ runtimeConfig: {
93
+ type: "object",
94
+ properties: {
95
+ validation: {
96
+ type: "string",
97
+ enum: ["none", "optional", "startup", "onUse"]
98
+ }
99
+ },
100
+ additionalProperties: false
101
+ },
102
+ bundles: {
103
+ type: "array",
104
+ items: { $ref: "#/$defs/extension" }
105
+ }
106
+ },
107
+ required: ["id", "version"],
108
+ additionalProperties: true
109
+ }
110
+ }
111
+ };
112
+
113
+ // src/descriptor-schema.ts
114
+ var nuxtExtensionDescriptorSchema = extension_descriptor_schema_default;
115
+
116
+ // src/extensions.ts
117
+ var defaultExtensionOptions = {
118
+ defaultSelection: "default",
119
+ publicRuntimeConfigKey: "extensionSelection",
120
+ descriptorPaths: ["extensions/*/extension.json"]
121
+ };
122
+ var defaultExtensionSelectionSeedKey = "capability";
123
+ var defaultExtensionResolutionRelations = [
124
+ "dependencies",
125
+ "defaultProviders",
126
+ "providerPreferences"
127
+ ];
128
+ var defaultNuxtRelationDescriptors = [
129
+ {
130
+ direction: "incoming",
131
+ field: "defaultFor",
132
+ id: "defaultProviders"
133
+ },
134
+ {
135
+ id: "providerPreferences",
136
+ field: "providerPreferences",
137
+ targetMode: "values"
138
+ }
139
+ ];
140
+ function isRecord(value) {
141
+ return typeof value === "object" && value !== null && !Array.isArray(value);
142
+ }
143
+ function normalizeSelection(value) {
144
+ return parseDescriptorIds(value);
145
+ }
146
+ function resolveNuxtExtensionSelectionSeed(seedOptions) {
147
+ if (seedOptions === false) return [];
148
+ return resolveDescriptorSelectionSeed({
149
+ argv: seedOptions?.argv ?? process.argv,
150
+ env: seedOptions?.env ?? process.env,
151
+ key: seedOptions?.key ?? defaultExtensionSelectionSeedKey,
152
+ ...seedOptions?.cliKeys ? { cliKeys: seedOptions.cliKeys } : {},
153
+ ...seedOptions?.envKeys ? { envKeys: seedOptions.envKeys } : {}
154
+ });
155
+ }
156
+ function resolveExtensionOptions(options) {
157
+ return {
158
+ descriptorSchema: options.descriptorSchema ?? nuxtExtensionDescriptorSchema,
159
+ descriptorPaths: options.descriptorPaths ?? [...defaultExtensionOptions.descriptorPaths]
160
+ };
161
+ }
162
+ function resolveExtensionSelection(input = {}) {
163
+ const candidates = [
164
+ normalizeSelection(input.selected),
165
+ normalizeSelection(input.defaultSelection ?? defaultExtensionOptions.defaultSelection)
166
+ ];
167
+ return candidates.find((candidate) => candidate.length > 0) ?? [];
168
+ }
169
+ function resolveBaseExtensionSelection(input) {
170
+ const baseExtensions = input.options.baseExtensions;
171
+ return typeof baseExtensions === "function" ? normalizeSelection(baseExtensions(input)) : normalizeSelection(baseExtensions);
172
+ }
173
+ function optionalDir(path) {
174
+ return existsSync(path) ? path : void 0;
175
+ }
176
+ function optionalFile(path) {
177
+ return existsSync(path) ? path : void 0;
178
+ }
179
+ function findNuxtConfigFile(cwd) {
180
+ return ["nuxt.config.ts", "nuxt.config.mts", "nuxt.config.js", "nuxt.config.mjs"].map((fileName) => optionalFile(join(cwd, fileName))).find(Boolean);
181
+ }
182
+ function createExtensionEntry(input) {
183
+ const descriptor = {
184
+ ...input.descriptor,
185
+ location: input.descriptor.location ?? input.cwd
186
+ };
187
+ const appDir = optionalDir(join(input.cwd, "app"));
188
+ const modulesDir = optionalDir(join(input.cwd, "modules"));
189
+ const publicDir = optionalDir(join(input.cwd, "public"));
190
+ const serverDir = optionalDir(join(input.cwd, "server"));
191
+ const sharedDir = optionalDir(join(input.cwd, "shared"));
192
+ const configFile = findNuxtConfigFile(input.cwd);
193
+ const entry = {
194
+ cwd: input.cwd,
195
+ descriptor
196
+ };
197
+ if (appDir) entry.appDir = appDir;
198
+ if (configFile) entry.configFile = configFile;
199
+ if (modulesDir) entry.modulesDir = modulesDir;
200
+ if (publicDir) entry.publicDir = publicDir;
201
+ if (serverDir) entry.serverDir = serverDir;
202
+ if (sharedDir) entry.sharedDir = sharedDir;
203
+ return entry;
204
+ }
205
+ function canRegisterExtensionLayer(entry) {
206
+ return Boolean(
207
+ entry.appDir || entry.configFile || entry.modulesDir || entry.publicDir || entry.serverDir || entry.sharedDir
208
+ );
209
+ }
210
+ function canExtendExtensionLayer(entry) {
211
+ return Boolean(entry.configFile);
212
+ }
213
+ function discoverNuxtExtensionEntries(input) {
214
+ const resolvedOptions = resolveExtensionOptions(input.options);
215
+ return discoverDescriptors({
216
+ cwd: input.projectRootDir,
217
+ descriptorPaths: resolvedOptions.descriptorPaths,
218
+ nestedField: "bundles",
219
+ ...resolvedOptions.descriptorSchema === false ? {} : {
220
+ validation: {
221
+ schema: resolvedOptions.descriptorSchema
222
+ }
223
+ }
224
+ }).map(
225
+ (entry) => createExtensionEntry({
226
+ cwd: entry.cwd,
227
+ descriptor: entry.descriptor
228
+ })
229
+ );
230
+ }
231
+ function createNuxtExtensionCatalog(input) {
232
+ return createDescriptorCatalog({
233
+ descriptors: input.entries.map((entry) => entry.descriptor),
234
+ relationDescriptors: [...defaultNuxtRelationDescriptors, ...input.relationDescriptors ?? []]
235
+ });
236
+ }
237
+ function createNuxtExtensionEntryMap(entries) {
238
+ return new Map(entries.map((entry) => [entry.descriptor.id, entry]));
239
+ }
240
+ function pickEntriesById(ids, entryById) {
241
+ return ids.map((id) => entryById.get(id)).filter((entry) => Boolean(entry));
242
+ }
243
+ function createNuxtSelectedProviderPreferences(input) {
244
+ return collectSelectedProviderPreferences({
245
+ items: input.entries,
246
+ getCapabilityId: (entry) => entry.descriptor.providesFor,
247
+ getProviderId: (entry) => entry.descriptor.id,
248
+ selectedProviderIds: input.selectedExtensions
249
+ });
250
+ }
251
+ function createProviderSelectionAwareEntries(entries, selectedProviders) {
252
+ if (!Object.keys(selectedProviders).length) return entries;
253
+ return entries.map((entry) => {
254
+ const descriptor = { ...entry.descriptor };
255
+ const preferences = resolveSelectedProviderRelationPreferences({
256
+ providerId: entry.descriptor.id,
257
+ defaultFor: entry.descriptor.defaultFor,
258
+ providerPreferences: entry.descriptor.providerPreferences,
259
+ selectedProviders
260
+ });
261
+ delete descriptor.defaultFor;
262
+ delete descriptor.providerPreferences;
263
+ return {
264
+ ...entry,
265
+ descriptor: {
266
+ ...descriptor,
267
+ ...preferences
268
+ }
269
+ };
270
+ });
271
+ }
272
+ function mergeRuntimeConfigSection(target = {}, source = {}) {
273
+ const merged = { ...target };
274
+ for (const [key, value] of Object.entries(source)) {
275
+ const current = merged[key];
276
+ merged[key] = isRecord(current) && isRecord(value) ? mergeRuntimeConfigSection(current, value) : value;
277
+ }
278
+ return merged;
279
+ }
280
+ function createExtensionSelectionRuntimeConfig(input) {
281
+ const runtimeConfig = input.activeExtensions.reduce(
282
+ (current, extension) => ({
283
+ ...current,
284
+ public: mergeRuntimeConfigSection(
285
+ current.public,
286
+ extension.descriptor.publicRuntimeConfig ?? {}
287
+ )
288
+ }),
289
+ { public: {} }
290
+ );
291
+ if (input.publicRuntimeConfigKey === false) return runtimeConfig;
292
+ return {
293
+ ...runtimeConfig,
294
+ public: {
295
+ ...runtimeConfig.public,
296
+ [defaultExtensionOptions.publicRuntimeConfigKey]: {
297
+ discoveredExtensionIds: input.discoveredExtensions.map((extension) => extension.descriptor.id).sort((left, right) => left.localeCompare(right)),
298
+ resolvedExtensionIds: input.resolvedExtensionIds,
299
+ selectedExtensionIds: input.selectedExtensions
300
+ }
301
+ }
302
+ };
303
+ }
304
+ function createNuxtExtensionBootstrap(input) {
305
+ const options = input.options ?? {};
306
+ const selectedExtensions = resolveExtensionSelection({
307
+ ...options.defaultSelection ? { defaultSelection: options.defaultSelection } : {},
308
+ selected: options.selected ?? resolveNuxtExtensionSelectionSeed(options.selectionSeed)
309
+ });
310
+ const createCatalog = (entries2) => createNuxtExtensionCatalog({
311
+ entries: entries2,
312
+ ...options.relationDescriptors ? { relationDescriptors: options.relationDescriptors } : {}
313
+ });
314
+ if (options.enabled === false) {
315
+ return {
316
+ activeExtensions: [],
317
+ baseExtensionIds: [],
318
+ catalog: createCatalog([]),
319
+ discoveredExtensions: [],
320
+ publicRuntimeConfig: { public: {} },
321
+ resolvedExtensionIds: [],
322
+ resolvedExtensions: [],
323
+ selectedExtensions
324
+ };
325
+ }
326
+ const entries = discoverNuxtExtensionEntries({
327
+ projectRootDir: input.rootDir,
328
+ options
329
+ });
330
+ const baseExtensionIds = resolveBaseExtensionSelection({
331
+ descriptors: entries.map((entry) => entry.descriptor),
332
+ options,
333
+ selectedExtensions
334
+ });
335
+ if (!entries.length) {
336
+ return {
337
+ activeExtensions: [],
338
+ baseExtensionIds,
339
+ catalog: createCatalog(entries),
340
+ discoveredExtensions: entries,
341
+ publicRuntimeConfig: { public: {} },
342
+ resolvedExtensionIds: [],
343
+ resolvedExtensions: [],
344
+ selectedExtensions
345
+ };
346
+ }
347
+ const selectedProviders = createNuxtSelectedProviderPreferences({
348
+ entries,
349
+ selectedExtensions
350
+ });
351
+ const resolutionEntries = createProviderSelectionAwareEntries(entries, selectedProviders);
352
+ const catalog = createCatalog(resolutionEntries);
353
+ const selection = catalog.resolveSelection({
354
+ baseDescriptors: baseExtensionIds,
355
+ policy: {
356
+ inspectionRelationIds: defaultExtensionResolutionRelations,
357
+ provenanceRelationIds: defaultExtensionResolutionRelations,
358
+ resolutionRelationIds: defaultExtensionResolutionRelations
359
+ },
360
+ selected: selectedExtensions
361
+ });
362
+ const resolvedExtensionIds = selection.getResolved();
363
+ const resolvedExtensions = pickEntriesById(
364
+ resolvedExtensionIds,
365
+ createNuxtExtensionEntryMap(resolutionEntries)
366
+ );
367
+ const activeExtensions = resolvedExtensions.filter(canRegisterExtensionLayer);
368
+ return {
369
+ activeExtensions,
370
+ baseExtensionIds: selection.getBaseDescriptors(),
371
+ catalog,
372
+ discoveredExtensions: entries,
373
+ publicRuntimeConfig: createExtensionSelectionRuntimeConfig({
374
+ activeExtensions,
375
+ baseExtensionIds: selection.getBaseDescriptors(),
376
+ discoveredExtensions: entries,
377
+ publicRuntimeConfigKey: defaultExtensionOptions.publicRuntimeConfigKey,
378
+ resolvedExtensionIds,
379
+ selectedExtensions
380
+ }),
381
+ resolvedExtensionIds,
382
+ resolvedExtensions,
383
+ selectedExtensions: selection.getSelected()
384
+ };
385
+ }
386
+ function createNuxtExtensionLayerPaths(bootstrap) {
387
+ return bootstrap.activeExtensions.filter(canExtendExtensionLayer).map((extension) => extension.cwd);
388
+ }
389
+ function createNuxtProviderSelectionRuntimeConfig(extensions, options = {}) {
390
+ const publicRuntimeConfigKey = "providerSelection";
391
+ const descriptorPreferences = collectProviderPreferences({
392
+ items: extensions,
393
+ getProviderPreferences: (extension) => extension.descriptor.providerPreferences
394
+ });
395
+ const providerDefaults = collectProviderDefaults({
396
+ items: extensions,
397
+ getDefaultFor: (extension) => extension.descriptor.defaultFor,
398
+ getProviderId: (extension) => extension.descriptor.id
399
+ });
400
+ const configuredProviders = options.configuredProviders ?? {};
401
+ const selectedProviders = options.selectedProviders ?? {};
402
+ const fallbackProviders = {
403
+ ...providerDefaults,
404
+ ...descriptorPreferences,
405
+ ...options.fallbackProviders ?? {}
406
+ };
407
+ const resolution = resolveItemProviderSelection({
408
+ items: extensions,
409
+ getCapabilityId: (extension) => extension.descriptor.providesFor,
410
+ getProviderId: (extension) => extension.descriptor.id,
411
+ configuredProviders,
412
+ fallbackProviders,
413
+ selectedProviders
414
+ });
415
+ return {
416
+ public: {
417
+ [publicRuntimeConfigKey]: {
418
+ configuredProviders,
419
+ excludedProviderIds: resolution.excludedProviderIds,
420
+ fallbackProviders,
421
+ mismatches: resolution.mismatches,
422
+ selections: Object.fromEntries(resolution.selections)
423
+ }
424
+ }
425
+ };
426
+ }
427
+ export {
428
+ createNuxtExtensionBootstrap,
429
+ createNuxtExtensionCatalog,
430
+ createNuxtExtensionEntryMap,
431
+ createNuxtExtensionLayerPaths,
432
+ createNuxtProviderSelectionRuntimeConfig,
433
+ createNuxtSelectedProviderPreferences,
434
+ discoverNuxtExtensionEntries,
435
+ resolveExtensionSelection
436
+ };
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { NuxtModule } from '@nuxt/schema';
2
- import { N as NuxtExtensionBootstrap, a as NuxtRuntimeConfig, b as NuxtExtensionBootstrapLogEvent, L as LorionNuxtModuleOptions } from './extensions-vNob6d2x.js';
3
- export { c as NuxtBaseExtensionSelection, d as NuxtBaseExtensionSelectionInput, e as NuxtExtensionBootstrapReporter, f as NuxtExtensionDescriptor, g as NuxtExtensionEntry, h as NuxtExtensionModuleOptions, i as NuxtProviderSelectionModuleOptions, j as NuxtProviderSelectionRuntimeConfig, R as RuntimeConfigNuxtModuleOptions, k as createNuxtExtensionBootstrap, l as createNuxtExtensionLayerPaths, m as createNuxtProviderSelectionRuntimeConfig, r as resolveExtensionSelection } from './extensions-vNob6d2x.js';
2
+ import { N as NuxtExtensionBootstrap, a as NuxtRuntimeConfig, b as NuxtExtensionBootstrapLogEvent, L as LorionNuxtModuleOptions } from './extensions-DlFRz22Q.js';
3
+ export { c as NuxtBaseExtensionSelection, d as NuxtBaseExtensionSelectionInput, e as NuxtExtensionBootstrapReporter, f as NuxtExtensionDescriptor, g as NuxtExtensionEntry, h as NuxtExtensionModuleOptions, i as NuxtExtensionSelectionSeedOptions, j as NuxtProviderSelectionModuleOptions, k as NuxtProviderSelectionRuntimeConfig, R as RuntimeConfigNuxtModuleOptions, l as createNuxtExtensionBootstrap, m as createNuxtExtensionCatalog, n as createNuxtExtensionEntryMap, o as createNuxtExtensionLayerPaths, p as createNuxtProviderSelectionRuntimeConfig, q as discoverNuxtExtensionEntries, r as resolveExtensionSelection } from './extensions-DlFRz22Q.js';
4
+ export { JsonSchemaObject, nuxtExtensionDescriptorSchema } from './descriptor-schema.js';
4
5
  import '@lorion-org/composition-graph';
5
6
  import '@lorion-org/provider-selection';
6
- import '@lorion-org/descriptor-discovery';
7
7
  import '@lorion-org/runtime-config';
8
8
  import '@lorion-org/runtime-config-node';
9
9