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

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