@inneropen/marvin-astro 1.1.1 → 1.2.1
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 +173 -14
- package/dist/embeds-BTNryQA6.d.ts +79 -0
- package/dist/index.d.ts +43 -6
- package/dist/index.js +116 -14
- package/dist/index.js.map +1 -1
- package/dist/renderers/index.d.ts +119 -0
- package/dist/renderers/index.js +251 -0
- package/dist/renderers/index.js.map +1 -0
- package/dist/types.d.ts +8 -1
- package/package.json +16 -6
- package/src/chrome.ts +242 -0
- package/src/client.ts +119 -0
- package/src/components/Embed.astro +119 -0
- package/src/components/EmbedLoader.astro +24 -0
- package/src/components/EntryRenderer.astro +40 -0
- package/src/components/FormRenderer.astro +188 -0
- package/src/components/LinkCard.astro +42 -0
- package/src/components/embed-frame.ts +168 -0
- package/src/components/embeds.css +137 -0
- package/src/components/index.ts +29 -0
- package/src/components/integration.ts +62 -0
- package/src/components/markdown.ts +4 -0
- package/src/components/registry.ts +34 -0
- package/src/components/renderers/ArticleRenderer.astro +56 -0
- package/src/components/renderers/FaqRenderer.astro +26 -0
- package/src/components/renderers/NavigationRenderer.astro +27 -0
- package/src/components/renderers/PageRenderer.astro +51 -0
- package/src/config.ts +149 -0
- package/src/embeds.ts +137 -0
- package/src/env.d.ts +5 -0
- package/src/fetch.ts +208 -0
- package/src/fields.ts +330 -0
- package/src/format.ts +63 -0
- package/src/index.ts +169 -0
- package/src/markdown.ts +84 -0
- package/src/normalize.ts +284 -0
- package/src/renderers/debug.ts +6 -0
- package/src/renderers/index.ts +48 -0
- package/src/renderers/registry.ts +133 -0
- package/src/renderers/resolve.ts +134 -0
- package/src/renderers/types.ts +71 -0
- package/src/renderers/validation-types.ts +23 -0
- package/src/renderers/validation.ts +55 -0
- package/src/repository.ts +206 -0
- package/src/sections.ts +39 -0
- package/src/site.ts +222 -0
- package/src/types.ts +188 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { MarvinEntry, MarvinAsset } from '@inneropen/marvin-sdk';
|
|
2
|
+
import { M as MarvinEmbeds } from '../embeds-BTNryQA6.js';
|
|
3
|
+
|
|
4
|
+
interface EntryTypeInfo {
|
|
5
|
+
slug: string;
|
|
6
|
+
renderer?: string;
|
|
7
|
+
package?: string;
|
|
8
|
+
version?: string;
|
|
9
|
+
config?: Record<string, unknown>;
|
|
10
|
+
publishable: boolean;
|
|
11
|
+
submittable: boolean;
|
|
12
|
+
routable: boolean;
|
|
13
|
+
}
|
|
14
|
+
interface RendererEntry extends MarvinEntry {
|
|
15
|
+
data: Record<string, unknown>;
|
|
16
|
+
dataJson?: Record<string, unknown>;
|
|
17
|
+
contentMarkdown?: string;
|
|
18
|
+
featuredAsset?: unknown;
|
|
19
|
+
entryTypeInfo?: EntryTypeInfo;
|
|
20
|
+
/** Resolved media embeds, keyed by the URL as written (Marvin with media embeds only). */
|
|
21
|
+
embeds?: MarvinEmbeds;
|
|
22
|
+
}
|
|
23
|
+
type CoreRendererName = 'page' | 'article' | 'faq' | 'navigation';
|
|
24
|
+
interface RendererProps {
|
|
25
|
+
entry: RendererEntry;
|
|
26
|
+
config?: Record<string, unknown>;
|
|
27
|
+
class?: string;
|
|
28
|
+
}
|
|
29
|
+
interface RendererRequirement {
|
|
30
|
+
key: string;
|
|
31
|
+
packageName?: string;
|
|
32
|
+
versionRange?: string;
|
|
33
|
+
config: Record<string, unknown>;
|
|
34
|
+
}
|
|
35
|
+
interface RendererDefinition<T = unknown> {
|
|
36
|
+
key: string;
|
|
37
|
+
component: T;
|
|
38
|
+
defaultConfig?: Record<string, unknown>;
|
|
39
|
+
description?: string;
|
|
40
|
+
}
|
|
41
|
+
interface RendererRegistry<T = unknown> {
|
|
42
|
+
get(name: string, packageName?: string | null): T | undefined;
|
|
43
|
+
has(name: string, packageName?: string | null): boolean;
|
|
44
|
+
names(): string[];
|
|
45
|
+
use?(packageDefinition: RendererPackage<T>): RendererRegistry<T>;
|
|
46
|
+
register?(definition: RendererDefinition<T>): RendererRegistry<T>;
|
|
47
|
+
override?(overrides: Record<string, T>): RendererRegistry<T>;
|
|
48
|
+
}
|
|
49
|
+
interface RendererPackage<T = unknown> {
|
|
50
|
+
packageName: string;
|
|
51
|
+
version: string;
|
|
52
|
+
registry: RendererRegistry<T>;
|
|
53
|
+
}
|
|
54
|
+
interface RendererPackageOptions<T = unknown> {
|
|
55
|
+
packageName: string;
|
|
56
|
+
version: string;
|
|
57
|
+
renderers: Record<string, T>;
|
|
58
|
+
}
|
|
59
|
+
interface RendererPackageRegistry<T = unknown> extends RendererRegistry<T> {
|
|
60
|
+
packages(): RendererPackage<T>[];
|
|
61
|
+
getPackage(packageName: string): RendererPackage<T> | undefined;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
declare function resolveRendererRequirement(entry: RendererEntry): RendererRequirement;
|
|
65
|
+
declare function resolveRendererName(entry: RendererEntry): string;
|
|
66
|
+
declare function resolveRendererConfig(entry: RendererEntry, overrides?: Record<string, unknown>): Record<string, unknown>;
|
|
67
|
+
declare function extractBody(entry: RendererEntry): string | undefined;
|
|
68
|
+
declare function extractField<T = unknown>(entry: RendererEntry, key: string): T | undefined;
|
|
69
|
+
declare function getFeaturedAsset(entry: RendererEntry): MarvinAsset | undefined;
|
|
70
|
+
declare function isRoutable(entry: RendererEntry): boolean;
|
|
71
|
+
declare function shouldRenderEntry(entry: RendererEntry, rendererName?: string): boolean;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* The renderer-package name Marvin's system entry types declare (`renderingJson.package`). The
|
|
75
|
+
* core renderers moved into `@inneropen/marvin-astro`, but existing workspaces still name the old
|
|
76
|
+
* package, so both identify the core set.
|
|
77
|
+
*/
|
|
78
|
+
declare const CORE_RENDERER_PACKAGE = "@inneropen/marvin-renderers-core";
|
|
79
|
+
declare const CORE_RENDERER_PACKAGES: readonly string[];
|
|
80
|
+
declare function isCoreRendererPackage(packageName: string | null | undefined): boolean;
|
|
81
|
+
declare function resolveRenderer<T>(name: string, customRegistry?: RendererRegistry<T> | Record<string, T>, fallbackRegistry?: RendererRegistry<T> | Record<string, T>): T | undefined;
|
|
82
|
+
declare function createRegistry<T>(map: Record<string, T>): RendererRegistry<T>;
|
|
83
|
+
declare function createRendererPackage<T>(options: RendererPackageOptions<T>): RendererPackage<T>;
|
|
84
|
+
declare function createPackageRegistry<T>(packages: RendererPackage<T>[]): RendererPackageRegistry<T>;
|
|
85
|
+
|
|
86
|
+
interface RendererCheckOptions {
|
|
87
|
+
registry: RendererRegistry | Record<string, unknown>;
|
|
88
|
+
apiUrl?: string;
|
|
89
|
+
siteToken?: string;
|
|
90
|
+
strict?: boolean;
|
|
91
|
+
ignore?: string[];
|
|
92
|
+
}
|
|
93
|
+
interface MissingRenderer {
|
|
94
|
+
entryTypeSlug: string;
|
|
95
|
+
entryTypeName: string;
|
|
96
|
+
renderer: string;
|
|
97
|
+
package?: string;
|
|
98
|
+
version?: string;
|
|
99
|
+
}
|
|
100
|
+
interface ValidationResult {
|
|
101
|
+
total: number;
|
|
102
|
+
covered: number;
|
|
103
|
+
missing: MissingRenderer[];
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
interface EntryTypeWithRendering {
|
|
107
|
+
slug: string;
|
|
108
|
+
name: string;
|
|
109
|
+
isRendered?: boolean;
|
|
110
|
+
rendering?: Record<string, unknown> | null;
|
|
111
|
+
}
|
|
112
|
+
declare function validateRenderers(entryTypes: EntryTypeWithRendering[], registry: RendererRegistry | Record<string, unknown>, options?: {
|
|
113
|
+
ignore?: string[];
|
|
114
|
+
}): ValidationResult;
|
|
115
|
+
|
|
116
|
+
/** Trace renderer resolution when `MARVIN_DEBUG=true`. */
|
|
117
|
+
declare function debug(...args: unknown[]): void;
|
|
118
|
+
|
|
119
|
+
export { CORE_RENDERER_PACKAGE, CORE_RENDERER_PACKAGES, type CoreRendererName, type EntryTypeInfo, type MissingRenderer, type RendererCheckOptions, type RendererEntry, type RendererPackage, type RendererPackageOptions, type RendererPackageRegistry, type RendererProps, type RendererRegistry, type ValidationResult, createPackageRegistry, createRegistry, createRendererPackage, debug, extractBody, extractField, getFeaturedAsset, isCoreRendererPackage, isRoutable, resolveRenderer, resolveRendererConfig, resolveRendererName, resolveRendererRequirement, shouldRenderEntry, validateRenderers };
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
// src/renderers/debug.ts
|
|
2
|
+
var isDebug = typeof process !== "undefined" && process.env?.MARVIN_DEBUG === "true";
|
|
3
|
+
function debug(...args) {
|
|
4
|
+
if (isDebug) console.debug("[Marvin renderers]", ...args);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
// src/renderers/resolve.ts
|
|
8
|
+
var DEFAULT_RENDERER = "page";
|
|
9
|
+
function resolveRendererRequirement(entry) {
|
|
10
|
+
const config = entry.entryTypeInfo?.config ?? {};
|
|
11
|
+
const key = entry.entryTypeInfo?.renderer ?? DEFAULT_RENDERER;
|
|
12
|
+
return {
|
|
13
|
+
key,
|
|
14
|
+
packageName: entry.entryTypeInfo?.package ?? void 0,
|
|
15
|
+
versionRange: entry.entryTypeInfo?.version ?? void 0,
|
|
16
|
+
config
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function resolveRendererName(entry) {
|
|
20
|
+
const name = entry.entryTypeInfo?.renderer ?? DEFAULT_RENDERER;
|
|
21
|
+
debug("resolveRendererName", { slug: entry.slug, renderer: name });
|
|
22
|
+
return name;
|
|
23
|
+
}
|
|
24
|
+
function resolveRendererConfig(entry, overrides) {
|
|
25
|
+
const base = entry.entryTypeInfo?.config ?? {};
|
|
26
|
+
const merged = overrides ? { ...base, ...overrides } : base;
|
|
27
|
+
debug("resolveRendererConfig", { slug: entry.slug, config: merged });
|
|
28
|
+
return merged;
|
|
29
|
+
}
|
|
30
|
+
function entryData(entry) {
|
|
31
|
+
return { ...entry.dataJson ?? {}, ...entry.data ?? {} };
|
|
32
|
+
}
|
|
33
|
+
function extractBody(entry) {
|
|
34
|
+
const body = entryData(entry).body;
|
|
35
|
+
if (typeof body === "string") return body;
|
|
36
|
+
return entry.contentMarkdown;
|
|
37
|
+
}
|
|
38
|
+
function extractField(entry, key) {
|
|
39
|
+
return entry.data?.[key] ?? entry.dataJson?.[key];
|
|
40
|
+
}
|
|
41
|
+
function getFeaturedAsset(entry) {
|
|
42
|
+
const featuredAsset = normalizeEntryAsset(entry.featuredAsset);
|
|
43
|
+
if (featuredAsset?.publicUrl) {
|
|
44
|
+
debug("getFeaturedAsset", { slug: entry.slug, source: "featuredAsset", url: featuredAsset.publicUrl });
|
|
45
|
+
return featuredAsset;
|
|
46
|
+
}
|
|
47
|
+
const assets = entry.assets;
|
|
48
|
+
if (!assets?.length) return void 0;
|
|
49
|
+
const featured = assets.find(
|
|
50
|
+
(a) => {
|
|
51
|
+
const value = a;
|
|
52
|
+
const role = value.role ?? value.metadata?.role;
|
|
53
|
+
return role === "featured" || role === "hero";
|
|
54
|
+
}
|
|
55
|
+
);
|
|
56
|
+
const result = normalizeEntryAsset(featured ?? assets[0]);
|
|
57
|
+
debug("getFeaturedAsset", { slug: entry.slug, source: featured ? "role-match" : "first-asset", url: result?.publicUrl });
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
function isRoutable(entry) {
|
|
61
|
+
return entry.entryTypeInfo?.routable !== false;
|
|
62
|
+
}
|
|
63
|
+
function shouldRenderEntry(entry, rendererName) {
|
|
64
|
+
const data = entryData(entry);
|
|
65
|
+
const flags = [
|
|
66
|
+
rendererName && typeof rendererName === "string" ? data[rendererName] : void 0,
|
|
67
|
+
data.enabled,
|
|
68
|
+
data.visible,
|
|
69
|
+
data.show,
|
|
70
|
+
data.display,
|
|
71
|
+
data.include
|
|
72
|
+
].filter((value) => value !== void 0);
|
|
73
|
+
for (const value of flags) {
|
|
74
|
+
if (typeof value === "boolean") {
|
|
75
|
+
return value;
|
|
76
|
+
}
|
|
77
|
+
if (typeof value === "string") {
|
|
78
|
+
const normalized = value.trim().toLowerCase();
|
|
79
|
+
if (["false", "0", "no", "off"].includes(normalized)) return false;
|
|
80
|
+
if (["true", "1", "yes", "on"].includes(normalized)) return true;
|
|
81
|
+
}
|
|
82
|
+
if (typeof value === "number") {
|
|
83
|
+
return value !== 0;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
function normalizeEntryAsset(asset) {
|
|
89
|
+
if (!asset || typeof asset !== "object") return void 0;
|
|
90
|
+
const value = asset;
|
|
91
|
+
const nestedAsset = value.asset;
|
|
92
|
+
if (!nestedAsset) return value;
|
|
93
|
+
return {
|
|
94
|
+
...nestedAsset,
|
|
95
|
+
role: value.role,
|
|
96
|
+
position: value.position,
|
|
97
|
+
metadata: value.metadata ?? value.metadataJson,
|
|
98
|
+
metadataJson: value.metadataJson ?? nestedAsset.metadataJson
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// src/renderers/registry.ts
|
|
103
|
+
var CORE_RENDERER_PACKAGE = "@inneropen/marvin-renderers-core";
|
|
104
|
+
var CORE_RENDERER_PACKAGES = [
|
|
105
|
+
CORE_RENDERER_PACKAGE,
|
|
106
|
+
"@inneropen/marvin-astro"
|
|
107
|
+
];
|
|
108
|
+
function isCoreRendererPackage(packageName) {
|
|
109
|
+
return Boolean(packageName) && CORE_RENDERER_PACKAGES.includes(packageName);
|
|
110
|
+
}
|
|
111
|
+
function isRendererRegistry(value) {
|
|
112
|
+
return Boolean(value) && typeof value === "object" && "get" in value && typeof value.get === "function";
|
|
113
|
+
}
|
|
114
|
+
function resolveRenderer(name, customRegistry, fallbackRegistry) {
|
|
115
|
+
const getValue = (registry) => {
|
|
116
|
+
if (!registry) return void 0;
|
|
117
|
+
if (isRendererRegistry(registry)) {
|
|
118
|
+
return registry.get(name);
|
|
119
|
+
}
|
|
120
|
+
return registry[name];
|
|
121
|
+
};
|
|
122
|
+
return getValue(customRegistry) ?? getValue(fallbackRegistry);
|
|
123
|
+
}
|
|
124
|
+
function createRegistry(map) {
|
|
125
|
+
const registryMap = { ...map };
|
|
126
|
+
const instance = {
|
|
127
|
+
get(name) {
|
|
128
|
+
return registryMap[name];
|
|
129
|
+
},
|
|
130
|
+
has(name) {
|
|
131
|
+
return name in registryMap;
|
|
132
|
+
},
|
|
133
|
+
names() {
|
|
134
|
+
return Object.keys(registryMap);
|
|
135
|
+
},
|
|
136
|
+
use(packageDefinition) {
|
|
137
|
+
for (const [name, value] of Object.entries(packageDefinition.registry.names().reduce((acc, item) => {
|
|
138
|
+
acc[item] = packageDefinition.registry.get(item);
|
|
139
|
+
return acc;
|
|
140
|
+
}, {}))) {
|
|
141
|
+
if (!registryMap[name]) {
|
|
142
|
+
registryMap[name] = value;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return instance;
|
|
146
|
+
},
|
|
147
|
+
register(definition) {
|
|
148
|
+
if (registryMap[definition.key]) {
|
|
149
|
+
throw new Error(`Duplicate renderer registration for "${definition.key}"`);
|
|
150
|
+
}
|
|
151
|
+
registryMap[definition.key] = definition.component;
|
|
152
|
+
return instance;
|
|
153
|
+
},
|
|
154
|
+
override(overrides) {
|
|
155
|
+
for (const [name, value] of Object.entries(overrides)) {
|
|
156
|
+
registryMap[name] = value;
|
|
157
|
+
}
|
|
158
|
+
return instance;
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
return instance;
|
|
162
|
+
}
|
|
163
|
+
function createRendererPackage(options) {
|
|
164
|
+
return {
|
|
165
|
+
packageName: options.packageName,
|
|
166
|
+
version: options.version,
|
|
167
|
+
registry: createRegistry(options.renderers)
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function createPackageRegistry(packages) {
|
|
171
|
+
const byPackage = new Map(packages.map((item) => [item.packageName, item]));
|
|
172
|
+
function getPackage(packageName) {
|
|
173
|
+
return byPackage.get(packageName);
|
|
174
|
+
}
|
|
175
|
+
function findLocalRenderer(name) {
|
|
176
|
+
for (const item of packages) {
|
|
177
|
+
const renderer = item.registry.get(name);
|
|
178
|
+
if (renderer) return renderer;
|
|
179
|
+
}
|
|
180
|
+
return void 0;
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
get(name, packageName) {
|
|
184
|
+
if (packageName) {
|
|
185
|
+
return getPackage(packageName)?.registry.get(name);
|
|
186
|
+
}
|
|
187
|
+
return findLocalRenderer(name);
|
|
188
|
+
},
|
|
189
|
+
has(name, packageName) {
|
|
190
|
+
return Boolean(this.get(name, packageName));
|
|
191
|
+
},
|
|
192
|
+
names() {
|
|
193
|
+
return packages.flatMap((item) => item.registry.names());
|
|
194
|
+
},
|
|
195
|
+
packages() {
|
|
196
|
+
return packages;
|
|
197
|
+
},
|
|
198
|
+
getPackage
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// src/renderers/validation.ts
|
|
203
|
+
function isRendererRegistry2(value) {
|
|
204
|
+
return typeof value === "object" && value !== null && typeof value.has === "function";
|
|
205
|
+
}
|
|
206
|
+
function validateRenderers(entryTypes, registry, options) {
|
|
207
|
+
const ignore = new Set(options?.ignore ?? []);
|
|
208
|
+
const withRenderer = entryTypes.filter(
|
|
209
|
+
(et) => et.isRendered && et.rendering?.renderer && !ignore.has(et.slug)
|
|
210
|
+
);
|
|
211
|
+
const hasRenderer = isRendererRegistry2(registry) ? (name) => registry.has(name) : (name) => name in registry;
|
|
212
|
+
const missing = [];
|
|
213
|
+
for (const et of withRenderer) {
|
|
214
|
+
const rendering = et.rendering;
|
|
215
|
+
const renderer = rendering.renderer;
|
|
216
|
+
if (!hasRenderer(renderer)) {
|
|
217
|
+
missing.push({
|
|
218
|
+
entryTypeSlug: et.slug,
|
|
219
|
+
entryTypeName: et.name,
|
|
220
|
+
renderer,
|
|
221
|
+
package: rendering.package ?? void 0,
|
|
222
|
+
version: rendering.version ?? void 0
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
total: withRenderer.length,
|
|
228
|
+
covered: withRenderer.length - missing.length,
|
|
229
|
+
missing
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
export {
|
|
233
|
+
CORE_RENDERER_PACKAGE,
|
|
234
|
+
CORE_RENDERER_PACKAGES,
|
|
235
|
+
createPackageRegistry,
|
|
236
|
+
createRegistry,
|
|
237
|
+
createRendererPackage,
|
|
238
|
+
debug,
|
|
239
|
+
extractBody,
|
|
240
|
+
extractField,
|
|
241
|
+
getFeaturedAsset,
|
|
242
|
+
isCoreRendererPackage,
|
|
243
|
+
isRoutable,
|
|
244
|
+
resolveRenderer,
|
|
245
|
+
resolveRendererConfig,
|
|
246
|
+
resolveRendererName,
|
|
247
|
+
resolveRendererRequirement,
|
|
248
|
+
shouldRenderEntry,
|
|
249
|
+
validateRenderers
|
|
250
|
+
};
|
|
251
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/renderers/debug.ts","../../src/renderers/resolve.ts","../../src/renderers/registry.ts","../../src/renderers/validation.ts"],"sourcesContent":["const isDebug = typeof process !== 'undefined' && process.env?.MARVIN_DEBUG === 'true';\n\n/** Trace renderer resolution when `MARVIN_DEBUG=true`. */\nexport function debug(...args: unknown[]): void {\n if (isDebug) console.debug('[Marvin renderers]', ...args);\n}\n","import type { MarvinAsset } from '@inneropen/marvin-sdk';\nimport type { RendererEntry, RendererRequirement } from './types.js';\nimport { debug } from './debug.js';\n\nconst DEFAULT_RENDERER = 'page';\n\nexport function resolveRendererRequirement(entry: RendererEntry): RendererRequirement {\n const config = entry.entryTypeInfo?.config ?? {};\n const key = entry.entryTypeInfo?.renderer ?? DEFAULT_RENDERER;\n\n return {\n key,\n packageName: entry.entryTypeInfo?.package ?? undefined,\n versionRange: entry.entryTypeInfo?.version ?? undefined,\n config,\n };\n}\n\nexport function resolveRendererName(entry: RendererEntry): string {\n const name = entry.entryTypeInfo?.renderer ?? DEFAULT_RENDERER;\n debug('resolveRendererName', { slug: entry.slug, renderer: name });\n return name;\n}\n\nexport function resolveRendererConfig(\n entry: RendererEntry,\n overrides?: Record<string, unknown>,\n): Record<string, unknown> {\n const base = entry.entryTypeInfo?.config ?? {};\n const merged = overrides ? { ...base, ...overrides } : base;\n debug('resolveRendererConfig', { slug: entry.slug, config: merged });\n return merged;\n}\n\n/**\n * The entry's field bag, merging `dataJson` under `data` (per-key, `data` wins).\n *\n * `data` is a REQUIRED field on a published entry, so the older\n * `entry.data ?? entry.dataJson` short-circuited on an empty `{}` and never\n * consulted `dataJson` — making that fallback dead. Merging keeps published\n * behaviour identical (published entries carry no `dataJson`) while letting a\n * platform-shaped entry's `dataJson` supply keys `data` doesn't have, matching\n * how `extractField` already resolves values.\n */\nfunction entryData(entry: RendererEntry): Record<string, unknown> {\n return { ...(entry.dataJson ?? {}), ...(entry.data ?? {}) };\n}\n\nexport function extractBody(entry: RendererEntry): string | undefined {\n const body = entryData(entry).body;\n if (typeof body === 'string') return body;\n return entry.contentMarkdown;\n}\n\nexport function extractField<T = unknown>(\n entry: RendererEntry,\n key: string,\n): T | undefined {\n return (entry.data?.[key] ?? entry.dataJson?.[key]) as T | undefined;\n}\n\nexport function getFeaturedAsset(\n entry: RendererEntry,\n): MarvinAsset | undefined {\n const featuredAsset = normalizeEntryAsset(entry.featuredAsset);\n if (featuredAsset?.publicUrl) {\n debug('getFeaturedAsset', { slug: entry.slug, source: 'featuredAsset', url: featuredAsset.publicUrl });\n return featuredAsset as unknown as MarvinAsset;\n }\n\n const assets = entry.assets;\n if (!assets?.length) return undefined;\n\n const featured = assets.find(\n (a) => {\n const value = a as unknown as Record<string, unknown>;\n const role = value.role ?? (value.metadata as Record<string, unknown> | undefined)?.role;\n return role === 'featured' || role === 'hero';\n },\n );\n const result = normalizeEntryAsset(featured ?? assets[0]) as unknown as MarvinAsset | undefined;\n debug('getFeaturedAsset', { slug: entry.slug, source: featured ? 'role-match' : 'first-asset', url: result?.publicUrl });\n return result;\n}\n\nexport function isRoutable(entry: RendererEntry): boolean {\n return entry.entryTypeInfo?.routable !== false;\n}\n\nexport function shouldRenderEntry(entry: RendererEntry, rendererName?: string): boolean {\n const data = entryData(entry);\n const flags = [\n rendererName && typeof rendererName === 'string' ? data[rendererName] : undefined,\n data.enabled,\n data.visible,\n data.show,\n data.display,\n data.include,\n ].filter((value): value is unknown => value !== undefined);\n\n for (const value of flags) {\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase();\n if (['false', '0', 'no', 'off'].includes(normalized)) return false;\n if (['true', '1', 'yes', 'on'].includes(normalized)) return true;\n }\n\n if (typeof value === 'number') {\n return value !== 0;\n }\n }\n\n return true;\n}\n\nfunction normalizeEntryAsset(asset: unknown): Record<string, unknown> | undefined {\n if (!asset || typeof asset !== 'object') return undefined;\n\n const value = asset as Record<string, unknown>;\n const nestedAsset = value.asset as Record<string, unknown> | undefined;\n if (!nestedAsset) return value;\n\n return {\n ...nestedAsset,\n role: value.role,\n position: value.position,\n metadata: value.metadata ?? value.metadataJson,\n metadataJson: value.metadataJson ?? nestedAsset.metadataJson,\n };\n}\n","import type {\n RendererDefinition,\n RendererPackage,\n RendererPackageOptions,\n RendererPackageRegistry,\n RendererRegistry,\n} from './types.js';\n\n/**\n * The renderer-package name Marvin's system entry types declare (`renderingJson.package`). The\n * core renderers moved into `@inneropen/marvin-astro`, but existing workspaces still name the old\n * package, so both identify the core set.\n */\nexport const CORE_RENDERER_PACKAGE = '@inneropen/marvin-renderers-core';\nexport const CORE_RENDERER_PACKAGES: readonly string[] = [\n CORE_RENDERER_PACKAGE,\n '@inneropen/marvin-astro',\n];\n\nexport function isCoreRendererPackage(packageName: string | null | undefined): boolean {\n return Boolean(packageName) && CORE_RENDERER_PACKAGES.includes(packageName as string);\n}\n\nfunction isRendererRegistry<T>(value: RendererRegistry<T> | Record<string, T> | undefined): value is RendererRegistry<T> {\n return Boolean(value) && typeof value === 'object' && 'get' in value && typeof value.get === 'function';\n}\n\nexport function resolveRenderer<T>(\n name: string,\n customRegistry?: RendererRegistry<T> | Record<string, T>,\n fallbackRegistry?: RendererRegistry<T> | Record<string, T>,\n): T | undefined {\n const getValue = (registry: RendererRegistry<T> | Record<string, T> | undefined) => {\n if (!registry) return undefined;\n if (isRendererRegistry(registry)) {\n return registry.get(name);\n }\n return registry[name];\n };\n\n return getValue(customRegistry) ?? getValue(fallbackRegistry);\n}\n\nexport function createRegistry<T>(\n map: Record<string, T>,\n): RendererRegistry<T> {\n const registryMap = { ...map };\n\n const instance: RendererRegistry<T> = {\n get(name: string): T | undefined {\n return registryMap[name];\n },\n has(name: string): boolean {\n return name in registryMap;\n },\n names(): string[] {\n return Object.keys(registryMap);\n },\n use(packageDefinition: RendererPackage<T>): RendererRegistry<T> {\n for (const [name, value] of Object.entries(packageDefinition.registry.names().reduce<Record<string, T>>((acc, item) => {\n acc[item] = packageDefinition.registry.get(item)!;\n return acc;\n }, {}))) {\n if (!registryMap[name]) {\n registryMap[name] = value;\n }\n }\n return instance;\n },\n register(definition: RendererDefinition<T>): RendererRegistry<T> {\n if (registryMap[definition.key]) {\n throw new Error(`Duplicate renderer registration for \"${definition.key}\"`);\n }\n registryMap[definition.key] = definition.component;\n return instance;\n },\n override(overrides: Record<string, T>): RendererRegistry<T> {\n for (const [name, value] of Object.entries(overrides)) {\n registryMap[name] = value;\n }\n return instance;\n },\n };\n\n return instance;\n}\n\nexport function createRendererPackage<T>(\n options: RendererPackageOptions<T>,\n): RendererPackage<T> {\n return {\n packageName: options.packageName,\n version: options.version,\n registry: createRegistry(options.renderers),\n };\n}\n\nexport function createPackageRegistry<T>(\n packages: RendererPackage<T>[],\n): RendererPackageRegistry<T> {\n const byPackage = new Map(packages.map((item) => [item.packageName, item]));\n\n function getPackage(packageName: string): RendererPackage<T> | undefined {\n return byPackage.get(packageName);\n }\n\n function findLocalRenderer(name: string): T | undefined {\n for (const item of packages) {\n const renderer = item.registry.get(name);\n if (renderer) return renderer;\n }\n return undefined;\n }\n\n return {\n get(name: string, packageName?: string | null): T | undefined {\n if (packageName) {\n return getPackage(packageName)?.registry.get(name);\n }\n return findLocalRenderer(name);\n },\n has(name: string, packageName?: string | null): boolean {\n return Boolean(this.get(name, packageName));\n },\n names(): string[] {\n return packages.flatMap((item) => item.registry.names());\n },\n packages(): RendererPackage<T>[] {\n return packages;\n },\n getPackage,\n };\n}\n","import type { RendererRegistry } from './types.js';\nimport type { MissingRenderer, ValidationResult } from './validation-types.js';\n\ninterface EntryTypeWithRendering {\n slug: string;\n name: string;\n isRendered?: boolean;\n rendering?: Record<string, unknown> | null;\n}\n\nfunction isRendererRegistry(value: unknown): value is RendererRegistry {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as RendererRegistry).has === 'function'\n );\n}\n\nexport function validateRenderers(\n entryTypes: EntryTypeWithRendering[],\n registry: RendererRegistry | Record<string, unknown>,\n options?: { ignore?: string[] }\n): ValidationResult {\n const ignore = new Set(options?.ignore ?? []);\n\n const withRenderer = entryTypes.filter(\n (et) => et.isRendered && et.rendering?.renderer && !ignore.has(et.slug)\n );\n\n const hasRenderer = isRendererRegistry(registry)\n ? (name: string) => registry.has(name)\n : (name: string) => name in registry;\n\n const missing: MissingRenderer[] = [];\n\n for (const et of withRenderer) {\n const rendering = et.rendering!;\n const renderer = rendering.renderer as string;\n if (!hasRenderer(renderer)) {\n missing.push({\n entryTypeSlug: et.slug,\n entryTypeName: et.name,\n renderer,\n package: (rendering.package as string) ?? undefined,\n version: (rendering.version as string) ?? undefined,\n });\n }\n }\n\n return {\n total: withRenderer.length,\n covered: withRenderer.length - missing.length,\n missing,\n };\n}\n"],"mappings":"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","names":["isRendererRegistry"]}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { g as MarvinSiteEmbeds } from './embeds-BTNryQA6.js';
|
|
2
|
+
export { a as MarvinEmbed, b as MarvinEmbedIframe, c as MarvinEmbedKind, d as MarvinEmbedLink, e as MarvinEmbedMode, f as MarvinEmbedStatus, M as MarvinEmbeds } from './embeds-BTNryQA6.js';
|
|
1
3
|
import { MarvinEntry, Entry, CollectionEntry, MarvinEntryListItem } from '@inneropen/marvin-sdk';
|
|
2
4
|
|
|
3
5
|
/**
|
|
@@ -95,6 +97,11 @@ type ApiSite = {
|
|
|
95
97
|
imprint?: string;
|
|
96
98
|
social: Record<string, string>;
|
|
97
99
|
seo: ApiSeo;
|
|
100
|
+
/**
|
|
101
|
+
* Embed privacy mode, consent text and the frame sources a `frame-src` CSP must allow.
|
|
102
|
+
* Absent when the server predates media embeds.
|
|
103
|
+
*/
|
|
104
|
+
embeds?: MarvinSiteEmbeds;
|
|
98
105
|
metadata: Record<string, unknown>;
|
|
99
106
|
};
|
|
100
107
|
type ApiNavigationLink = {
|
|
@@ -152,4 +159,4 @@ type SectionLanding = {
|
|
|
152
159
|
hero?: string;
|
|
153
160
|
};
|
|
154
161
|
|
|
155
|
-
export type
|
|
162
|
+
export { type ApiActionVariant, type ApiHero, type ApiHeroAction, type ApiImage, type ApiNavigationLink, type ApiPageAction, type ApiResourceLink, type ApiSeo, type ApiSite, type ApiSiteChrome, type ApiSocialLink, type AssetSelectOptions, type MarvinContentEntry, MarvinSiteEmbeds, type SectionLanding };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inneropen/marvin-astro",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "Site integration for Marvin CMS on Astro — repositories, site chrome, and payload normalization",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -12,12 +12,20 @@
|
|
|
12
12
|
"types": "./dist/types.d.ts",
|
|
13
13
|
"import": "./dist/types.js"
|
|
14
14
|
},
|
|
15
|
+
"./renderers": {
|
|
16
|
+
"types": "./dist/renderers/index.d.ts",
|
|
17
|
+
"import": "./dist/renderers/index.js"
|
|
18
|
+
},
|
|
15
19
|
"./astro": "./src/astro/index.ts",
|
|
16
|
-
"./astro/*": "./src/astro/*"
|
|
20
|
+
"./astro/*": "./src/astro/*",
|
|
21
|
+
"./components": "./src/components/index.ts",
|
|
22
|
+
"./components/registry": "./src/components/registry.ts",
|
|
23
|
+
"./components/integration": "./src/components/integration.ts",
|
|
24
|
+
"./components/*": "./src/components/*"
|
|
17
25
|
},
|
|
18
26
|
"files": [
|
|
19
27
|
"dist",
|
|
20
|
-
"src
|
|
28
|
+
"src"
|
|
21
29
|
],
|
|
22
30
|
"scripts": {
|
|
23
31
|
"build": "tsup",
|
|
@@ -29,7 +37,7 @@
|
|
|
29
37
|
"marked": "^18.0.0"
|
|
30
38
|
},
|
|
31
39
|
"peerDependencies": {
|
|
32
|
-
"@inneropen/marvin-sdk": "^3.0.0",
|
|
40
|
+
"@inneropen/marvin-sdk": "^3.0.0 || ^4.0.0",
|
|
33
41
|
"astro": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
|
|
34
42
|
},
|
|
35
43
|
"peerDependenciesMeta": {
|
|
@@ -41,9 +49,11 @@
|
|
|
41
49
|
"@inneropen/marvin-sdk": "^3.2.0",
|
|
42
50
|
"@semantic-release/changelog": "^6.0.0",
|
|
43
51
|
"@semantic-release/git": "^10.0.0",
|
|
52
|
+
"@types/jsdom": "^30.0.0",
|
|
44
53
|
"@types/node": "^26.1.1",
|
|
45
54
|
"astro": "^5.0.0",
|
|
46
|
-
"
|
|
55
|
+
"jsdom": "^29.1.1",
|
|
56
|
+
"semantic-release": "^25.0.5",
|
|
47
57
|
"tsup": "^8.0.0",
|
|
48
58
|
"typescript": "^5.5.0",
|
|
49
59
|
"vitest": "^3.0.0"
|
|
@@ -54,7 +64,7 @@
|
|
|
54
64
|
"license": "MIT",
|
|
55
65
|
"repository": {
|
|
56
66
|
"type": "git",
|
|
57
|
-
"url": "https://github.com/
|
|
67
|
+
"url": "https://github.com/InnerOpen/marvin-astro.git"
|
|
58
68
|
},
|
|
59
69
|
"keywords": [
|
|
60
70
|
"marvin",
|