@openelement/adapter-vite 0.41.0-alpha.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/LICENSE +21 -0
- package/README.md +87 -0
- package/package.json +87 -0
- package/src/alias-utils.js +39 -0
- package/src/build-context.d.ts +111 -0
- package/src/build-context.js +184 -0
- package/src/build-manifest.d.ts +38 -0
- package/src/build-manifest.js +198 -0
- package/src/build.js +97 -0
- package/src/cli/build-client.d.ts +3 -0
- package/src/cli/build-client.js +292 -0
- package/src/cli/build-ssg.d.ts +40 -0
- package/src/cli/build-ssg.js +377 -0
- package/src/cli/build.d.ts +0 -0
- package/src/cli/build.js +27 -0
- package/src/cli/ssg-render.js +32 -0
- package/src/generated-data-resolver.d.ts +12 -0
- package/src/generated-data-resolver.js +52 -0
- package/src/head-injection.d.ts +31 -0
- package/src/head-injection.js +248 -0
- package/src/index.d.ts +58 -0
- package/src/index.js +52 -0
- package/src/island-transform.js +27 -0
- package/src/nitro-mount.d.ts +24 -0
- package/src/nitro-mount.js +27 -0
- package/src/plugin-mdx.d.ts +7 -0
- package/src/plugin-mdx.js +15 -0
- package/src/plugin.d.ts +22 -0
- package/src/plugin.js +264 -0
- package/src/ssg-package-resolver.js +256 -0
- package/src/subpath-resolver.d.ts +26 -0
- package/src/subpath-resolver.js +153 -0
- package/src/workspace-alias.js +113 -0
package/src/plugin.js
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracted from index.ts in v0.22 (SOP-004: adapter-vite decomposition).
|
|
3
|
+
*
|
|
4
|
+
* This is the core build plugin implementation. It is NOT part of the
|
|
5
|
+
* public API. Use `openPipeline()` from the main entry instead.
|
|
6
|
+
*
|
|
7
|
+
* Internal only: called by openPipeline() and the @openelement/app umbrella.
|
|
8
|
+
*/ import { join } from 'node:path';
|
|
9
|
+
import process from 'node:process';
|
|
10
|
+
import { formatError, OpenElementError } from '@openelement/core/errors';
|
|
11
|
+
import { createLogger } from '@openelement/core/logger';
|
|
12
|
+
const log = createLogger('adapter-vite');
|
|
13
|
+
import honoDevServer from '@hono/vite-dev-server';
|
|
14
|
+
import { OpenElementBuildContext } from './build-context.js';
|
|
15
|
+
import { findWorkspaceRoot, generateWorkspaceAliases } from './workspace-alias.js';
|
|
16
|
+
import { buildPlugin } from './build.js';
|
|
17
|
+
import { generateHonoEntryCode } from '@openelement/ssg';
|
|
18
|
+
import { buildHeadExtras } from './head-injection.js';
|
|
19
|
+
import { islandTransformPlugin } from './island-transform.js';
|
|
20
|
+
import { createGeneratedDataResolverPlugin } from './generated-data-resolver.js';
|
|
21
|
+
import { detectAndClassifyCemPackages, fileToTagName, scanIslands, scanPackageManifests, scanRoutes } from '@openelement/ssg';
|
|
22
|
+
import { createCoreResolvePlugin } from './subpath-resolver.js';
|
|
23
|
+
import { mdxPlugin } from './plugin-mdx.js';
|
|
24
|
+
function mergeAliasOptions(primary, fallback) {
|
|
25
|
+
if (!primary) return fallback ?? null;
|
|
26
|
+
if (!fallback) return primary;
|
|
27
|
+
const merged = [];
|
|
28
|
+
const append = (aliases)=>{
|
|
29
|
+
if (!aliases) return;
|
|
30
|
+
if (Array.isArray(aliases)) {
|
|
31
|
+
merged.push(...aliases);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
for (const [find, replacement] of Object.entries(aliases)){
|
|
35
|
+
merged.push({
|
|
36
|
+
find,
|
|
37
|
+
replacement
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
append(primary);
|
|
42
|
+
append(fallback);
|
|
43
|
+
return merged;
|
|
44
|
+
}
|
|
45
|
+
const OPTIONAL_PACKAGE_STUBS = {
|
|
46
|
+
'@openelement/content': 'export async function loadBlogData() { return { posts: [], basePath: "" }; }',
|
|
47
|
+
'@openelement/content/sitemap': 'export function generateSitemap() { return []; }',
|
|
48
|
+
'@openelement/app/i18n': 'export function loadI18nData() { return { locales: [], defaultLocale: "en" }; }'
|
|
49
|
+
};
|
|
50
|
+
export function optionalPackageStubsPlugin() {
|
|
51
|
+
return {
|
|
52
|
+
name: 'open:optional-package-stubs',
|
|
53
|
+
enforce: 'pre',
|
|
54
|
+
async resolveId (id) {
|
|
55
|
+
if (!(id in OPTIONAL_PACKAGE_STUBS)) return;
|
|
56
|
+
const resolved = await this.resolve(id, undefined, {
|
|
57
|
+
skipSelf: true
|
|
58
|
+
});
|
|
59
|
+
if (resolved) return null;
|
|
60
|
+
return `\0open:optional-stub:${id}`;
|
|
61
|
+
},
|
|
62
|
+
load (id) {
|
|
63
|
+
const prefix = '\0open:optional-stub:';
|
|
64
|
+
if (!id.startsWith(prefix)) return;
|
|
65
|
+
return OPTIONAL_PACKAGE_STUBS[id.slice(prefix.length)];
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* This is the core build plugin implementation. It is NOT part of the
|
|
71
|
+
* public API. Use `openPipeline()` from @openelement/adapter-vite instead.
|
|
72
|
+
*
|
|
73
|
+
* Internal only: called by openPipeline() and the @openelement/app umbrella.
|
|
74
|
+
* Jamstack: M=SSG+DSD, A=API Routes, J=Islands.
|
|
75
|
+
*
|
|
76
|
+
* @param options - Framework options
|
|
77
|
+
* @param externalCtx - Optional shared OpenElementBuildContext (used by openElement() umbrella)
|
|
78
|
+
* @internal
|
|
79
|
+
*/ export function createOpenPlugin(options = {}, externalCtx) {
|
|
80
|
+
const metaUrl = import.meta.url;
|
|
81
|
+
// Build head extras (validated HTML fragments, stylesheets, scripts)
|
|
82
|
+
const { headExtras, allowHeadExtrasScripts } = buildHeadExtras(options);
|
|
83
|
+
const resolvedOptions = {
|
|
84
|
+
...options,
|
|
85
|
+
routesDir: options.routesDir || 'app/routes',
|
|
86
|
+
islandsDir: options.islandsDir || 'app/islands',
|
|
87
|
+
componentsDir: options.componentsDir || 'app/components',
|
|
88
|
+
headExtras,
|
|
89
|
+
allowHeadExtrasScripts
|
|
90
|
+
};
|
|
91
|
+
const ctx = externalCtx || new OpenElementBuildContext(resolvedOptions);
|
|
92
|
+
// Pre-generate workspace aliases (sync, once, cached in ctx).
|
|
93
|
+
// Phase 1 config, Phase 2 client build, and Phase 3 SSG build
|
|
94
|
+
// all read ctx.phase1.userResolveAlias - zero redundant generation.
|
|
95
|
+
try {
|
|
96
|
+
const wsRoot = findWorkspaceRoot(process.cwd());
|
|
97
|
+
if (wsRoot) {
|
|
98
|
+
ctx.phase1.userResolveAlias = generateWorkspaceAliases(wsRoot);
|
|
99
|
+
log.info(`Auto-generated ${ctx.phase1.userResolveAlias.length} resolve alias(es) from workspace`);
|
|
100
|
+
}
|
|
101
|
+
} catch {
|
|
102
|
+
log.debug('Workspace not available - aliases stay null');
|
|
103
|
+
}
|
|
104
|
+
const VIRTUAL_ENTRY_ID = 'virtual:open-hono-entry';
|
|
105
|
+
const RESOLVED_ENTRY_ID = '\0' + VIRTUAL_ENTRY_ID;
|
|
106
|
+
const VIRTUAL_BUILD_TRIGGER_ID = 'virtual:open-build-trigger';
|
|
107
|
+
const RESOLVED_BUILD_TRIGGER_ID = '\0' + VIRTUAL_BUILD_TRIGGER_ID;
|
|
108
|
+
function generateEntry(routes, islandTagNames = [], packageManifests = [], islandFiles = []) {
|
|
109
|
+
return generateHonoEntryCode(routes, {
|
|
110
|
+
routesDir: resolvedOptions.routesDir,
|
|
111
|
+
islandsDir: resolvedOptions.islandsDir,
|
|
112
|
+
componentsDir: resolvedOptions.componentsDir,
|
|
113
|
+
middleware: resolvedOptions.middleware,
|
|
114
|
+
islandTagNames,
|
|
115
|
+
islandFiles,
|
|
116
|
+
islandMeta: ctx.phase1.islandMeta,
|
|
117
|
+
packageManifests,
|
|
118
|
+
headExtras: resolvedOptions.headExtras,
|
|
119
|
+
allowHeadExtrasScripts,
|
|
120
|
+
html: resolvedOptions.html,
|
|
121
|
+
upgradeStrategy: resolvedOptions.island?.upgradeStrategy || 'idle',
|
|
122
|
+
clientOnlyTags: [],
|
|
123
|
+
appShell: resolvedOptions.appShell,
|
|
124
|
+
layouts: resolvedOptions.layouts
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
const corePlugin = {
|
|
128
|
+
name: 'open:core',
|
|
129
|
+
config (userConfig) {
|
|
130
|
+
if (userConfig.resolve?.alias) {
|
|
131
|
+
ctx.phase1.userResolveAlias = mergeAliasOptions(userConfig.resolve.alias, ctx.phase1.userResolveAlias);
|
|
132
|
+
}
|
|
133
|
+
const aliases = ctx.phase1.userResolveAlias;
|
|
134
|
+
return {
|
|
135
|
+
resolve: aliases ? {
|
|
136
|
+
alias: aliases
|
|
137
|
+
} : undefined,
|
|
138
|
+
build: {
|
|
139
|
+
// The generated virtual entry intentionally contains the whole route graph.
|
|
140
|
+
// Keep the budget explicit so Vite does not report it as an unexpected warning.
|
|
141
|
+
chunkSizeWarningLimit: 1500,
|
|
142
|
+
rollupOptions: {
|
|
143
|
+
input: [
|
|
144
|
+
VIRTUAL_BUILD_TRIGGER_ID
|
|
145
|
+
]
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
},
|
|
150
|
+
configResolved (cfg) {
|
|
151
|
+
if (cfg.resolve?.alias && !ctx.phase1.userResolveAlias) {
|
|
152
|
+
ctx.phase1.userResolveAlias = cfg.resolve.alias;
|
|
153
|
+
}
|
|
154
|
+
// v0.14.6: Generate placeholder entry code with empty routes in configResolved.
|
|
155
|
+
// This is a Vite requirement - the virtual entry must exist before buildStart().
|
|
156
|
+
// The real entry with actual routes is generated in buildStart() which runs later.
|
|
157
|
+
ctx.phase1.honoEntryCode = generateEntry([], ctx.phase1.islandTagNames, ctx.phase1.packageManifests, ctx.phase1.islandFiles);
|
|
158
|
+
},
|
|
159
|
+
async buildStart () {
|
|
160
|
+
ctx.reset();
|
|
161
|
+
try {
|
|
162
|
+
const routes = await scanRoutes(resolvedOptions.routesDir);
|
|
163
|
+
const islandsRoot = join(process.cwd(), resolvedOptions.islandsDir || 'app/islands');
|
|
164
|
+
const islandFiles = await scanIslands(islandsRoot);
|
|
165
|
+
ctx.phase1.islandTagNames = islandFiles.map((f)=>fileToTagName(f));
|
|
166
|
+
ctx.phase1.islandFiles = islandFiles;
|
|
167
|
+
const { scanIslandMeta } = await import('@openelement/ssg');
|
|
168
|
+
ctx.phase1.islandMeta = await scanIslandMeta(islandsRoot, islandFiles);
|
|
169
|
+
if (resolvedOptions.packageIslands && resolvedOptions.packageIslands.length > 0) {
|
|
170
|
+
ctx.phase1.packageManifests = await scanPackageManifests(resolvedOptions.packageIslands);
|
|
171
|
+
if (ctx.phase1.packageManifests.length > 0) {
|
|
172
|
+
// Extract island declarations from manifests
|
|
173
|
+
ctx.phase1.packageIslandDecls = ctx.phase1.packageManifests.flatMap((pkg)=>pkg.declarations.filter((d)=>d.openElement?.module).map((d)=>({
|
|
174
|
+
tagName: d.tagName,
|
|
175
|
+
modulePath: d.openElement.module,
|
|
176
|
+
isPackage: true,
|
|
177
|
+
hydrate: d.openElement?.hydrate,
|
|
178
|
+
ssr: d.openElement?.hydrate === 'only' ? false : d.openElement?.ssr,
|
|
179
|
+
dsd: d.openElement?.hydrate === 'only' ? false : d.openElement?.dsd
|
|
180
|
+
})));
|
|
181
|
+
log.info(`Package islands: ${ctx.phase1.packageIslandDecls.map((i)=>i.tagName).join(', ')}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Cache routes for lazy load() regeneration (ctx.blogOptions may not
|
|
185
|
+
// be set yet - openContent() buildStart() runs after this one).
|
|
186
|
+
ctx.phase1.cachedRoutes = routes;
|
|
187
|
+
ctx.phase1.honoEntryCode = generateEntry(routes, ctx.phase1.islandTagNames, ctx.phase1.packageManifests, ctx.phase1.islandFiles);
|
|
188
|
+
const { buildEntryDescriptor } = await import('@openelement/ssg');
|
|
189
|
+
// v0.18.0: CEM auto-detection - scan node_modules for custom-elements.json
|
|
190
|
+
// without importing or executing any package code.
|
|
191
|
+
try {
|
|
192
|
+
const nodeModulesDir = join(process.cwd(), 'node_modules');
|
|
193
|
+
ctx.phase1.cemClassifications = await detectAndClassifyCemPackages(nodeModulesDir);
|
|
194
|
+
if (ctx.phase1.cemClassifications.length > 0) {
|
|
195
|
+
log.info(`CEM auto-detection: classified ${ctx.phase1.cemClassifications.length} component(s) from node_modules`);
|
|
196
|
+
}
|
|
197
|
+
} catch (err) {
|
|
198
|
+
// CEM detection is best-effort - never fail the build
|
|
199
|
+
log.debug(`CEM auto-detection failed (non-fatal): ${formatError(err)}`);
|
|
200
|
+
ctx.phase1.cemClassifications = [];
|
|
201
|
+
}
|
|
202
|
+
ctx.phase1.ssrAdmissionPlan = buildEntryDescriptor(routes, {
|
|
203
|
+
routesDir: resolvedOptions.routesDir,
|
|
204
|
+
islandsDir: resolvedOptions.islandsDir,
|
|
205
|
+
islandTagNames: ctx.phase1.islandTagNames,
|
|
206
|
+
islandFiles: ctx.phase1.islandFiles,
|
|
207
|
+
islandMeta: ctx.phase1.islandMeta,
|
|
208
|
+
packageManifests: ctx.phase1.packageManifests,
|
|
209
|
+
cemClassifications: ctx.phase1.cemClassifications,
|
|
210
|
+
clientOnlyTags: [],
|
|
211
|
+
appShell: resolvedOptions.appShell,
|
|
212
|
+
layouts: resolvedOptions.layouts
|
|
213
|
+
}).ssrAdmissionPlan;
|
|
214
|
+
const pageCount = routes.filter((r)=>r.type === 'page' && !r.special).length;
|
|
215
|
+
const apiCount = routes.filter((r)=>r.type === 'api' && !r.special).length;
|
|
216
|
+
const totalIslands = ctx.phase1.islandTagNames.length + ctx.phase1.packageIslandDecls.length;
|
|
217
|
+
log.info(`Routes: ${pageCount} page(s), ${apiCount} API route(s), ` + `${totalIslands} island(s) - openElement Architecture`);
|
|
218
|
+
} catch (err) {
|
|
219
|
+
throw new OpenElementError(`Route scan failed: ${formatError(err)}`, {
|
|
220
|
+
code: 'ROUTE_SCAN_ERROR',
|
|
221
|
+
statusCode: 500,
|
|
222
|
+
recoverable: false
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
const virtualEntryPlugin = {
|
|
228
|
+
name: 'open:virtual-entry',
|
|
229
|
+
resolveId (id) {
|
|
230
|
+
if (id === VIRTUAL_ENTRY_ID) return RESOLVED_ENTRY_ID;
|
|
231
|
+
if (id === VIRTUAL_BUILD_TRIGGER_ID) return RESOLVED_BUILD_TRIGGER_ID;
|
|
232
|
+
},
|
|
233
|
+
load (id) {
|
|
234
|
+
if (id === RESOLVED_BUILD_TRIGGER_ID) {
|
|
235
|
+
return 'export default null;';
|
|
236
|
+
}
|
|
237
|
+
if (id === RESOLVED_ENTRY_ID) {
|
|
238
|
+
// Always regenerate to pick up late-settled ctx fields (e.g., blogOptions
|
|
239
|
+
// from openContent() buildStart() which runs after open:core buildStart()).
|
|
240
|
+
// In dev mode, load() is called lazily by the SSR runner, so all buildStart()
|
|
241
|
+
// hooks have completed by this point.
|
|
242
|
+
return generateEntry(ctx.phase1.cachedRoutes || [], ctx.phase1.islandTagNames, ctx.phase1.packageManifests, ctx.phase1.islandFiles);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
const devServerPlugin = honoDevServer({
|
|
247
|
+
entry: VIRTUAL_ENTRY_ID,
|
|
248
|
+
injectClientScript: true
|
|
249
|
+
});
|
|
250
|
+
return [
|
|
251
|
+
mdxPlugin(),
|
|
252
|
+
corePlugin,
|
|
253
|
+
createGeneratedDataResolverPlugin({
|
|
254
|
+
root: process.cwd()
|
|
255
|
+
}),
|
|
256
|
+
createCoreResolvePlugin(metaUrl),
|
|
257
|
+
optionalPackageStubsPlugin(),
|
|
258
|
+
virtualEntryPlugin,
|
|
259
|
+
devServerPlugin,
|
|
260
|
+
islandTransformPlugin(resolvedOptions.islandsDir),
|
|
261
|
+
buildPlugin(resolvedOptions, ctx)
|
|
262
|
+
];
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9hZGFwdGVyLXZpdGUvc3JjL3BsdWdpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV4dHJhY3RlZCBmcm9tIGluZGV4LnRzIGluIHYwLjIyIChTT1AtMDA0OiBhZGFwdGVyLXZpdGUgZGVjb21wb3NpdGlvbikuXG4gKlxuICogVGhpcyBpcyB0aGUgY29yZSBidWlsZCBwbHVnaW4gaW1wbGVtZW50YXRpb24uIEl0IGlzIE5PVCBwYXJ0IG9mIHRoZVxuICogcHVibGljIEFQSS4gVXNlIGBvcGVuUGlwZWxpbmUoKWAgZnJvbSB0aGUgbWFpbiBlbnRyeSBpbnN0ZWFkLlxuICpcbiAqIEludGVybmFsIG9ubHk6IGNhbGxlZCBieSBvcGVuUGlwZWxpbmUoKSBhbmQgdGhlIEBvcGVuZWxlbWVudC9hcHAgdW1icmVsbGEuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBbGlhcywgUGx1Z2luIH0gZnJvbSAndml0ZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEZyYW1ld29ya09wdGlvbnMsXG4gIEh5ZHJhdGlvblN0cmF0ZWd5LFxuICBSb3V0ZUVudHJ5LFxufSBmcm9tICdAb3BlbmVsZW1lbnQvcHJvdG9jb2wvZnJhbWV3b3JrJztcbmltcG9ydCB0eXBlIHsgT3BlbkVsZW1lbnRQYWNrYWdlTWFuaWZlc3QgfSBmcm9tICdAb3BlbmVsZW1lbnQvcHJvdG9jb2wvbWFuaWZlc3QnO1xuXG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyBmb3JtYXRFcnJvciwgT3BlbkVsZW1lbnRFcnJvciB9IGZyb20gJ0BvcGVuZWxlbWVudC9jb3JlL2Vycm9ycyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICdAb3BlbmVsZW1lbnQvY29yZS9sb2dnZXInO1xuXG5jb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoJ2FkYXB0ZXItdml0ZScpO1xuXG5pbXBvcnQgaG9ub0RldlNlcnZlciBmcm9tICdAaG9uby92aXRlLWRldi1zZXJ2ZXInO1xuaW1wb3J0IHsgT3BlbkVsZW1lbnRCdWlsZENvbnRleHQgfSBmcm9tICcuL2J1aWxkLWNvbnRleHQuanMnO1xuaW1wb3J0IHsgZmluZFdvcmtzcGFjZVJvb3QsIGdlbmVyYXRlV29ya3NwYWNlQWxpYXNlcyB9IGZyb20gJy4vd29ya3NwYWNlLWFsaWFzLmpzJztcbmltcG9ydCB7IGJ1aWxkUGx1Z2luIH0gZnJvbSAnLi9idWlsZC5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUhvbm9FbnRyeUNvZGUgfSBmcm9tICdAb3BlbmVsZW1lbnQvc3NnJztcbmltcG9ydCB7IGJ1aWxkSGVhZEV4dHJhcyB9IGZyb20gJy4vaGVhZC1pbmplY3Rpb24uanMnO1xuaW1wb3J0IHsgaXNsYW5kVHJhbnNmb3JtUGx1Z2luIH0gZnJvbSAnLi9pc2xhbmQtdHJhbnNmb3JtLmpzJztcbmltcG9ydCB7IGNyZWF0ZUdlbmVyYXRlZERhdGFSZXNvbHZlclBsdWdpbiB9IGZyb20gJy4vZ2VuZXJhdGVkLWRhdGEtcmVzb2x2ZXIuanMnO1xuaW1wb3J0IHtcbiAgZGV0ZWN0QW5kQ2xhc3NpZnlDZW1QYWNrYWdlcyxcbiAgZmlsZVRvVGFnTmFtZSxcbiAgc2NhbklzbGFuZHMsXG4gIHNjYW5QYWNrYWdlTWFuaWZlc3RzLFxuICBzY2FuUm91dGVzLFxufSBmcm9tICdAb3BlbmVsZW1lbnQvc3NnJztcbmltcG9ydCB7IGNyZWF0ZUNvcmVSZXNvbHZlUGx1Z2luIH0gZnJvbSAnLi9zdWJwYXRoLXJlc29sdmVyLmpzJztcbmltcG9ydCB7IG1keFBsdWdpbiB9IGZyb20gJy4vcGx1Z2luLW1keC5qcyc7XG5cbnR5cGUgTGVzc0FsaWFzT3B0aW9ucyA9IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBBbGlhc1tdIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gbWVyZ2VBbGlhc09wdGlvbnMoXG4gIHByaW1hcnk6IExlc3NBbGlhc09wdGlvbnMsXG4gIGZhbGxiYWNrOiBMZXNzQWxpYXNPcHRpb25zLFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IEFsaWFzW10gfCBudWxsIHtcbiAgaWYgKCFwcmltYXJ5KSByZXR1cm4gZmFsbGJhY2sgPz8gbnVsbDtcbiAgaWYgKCFmYWxsYmFjaykgcmV0dXJuIHByaW1hcnk7XG5cbiAgY29uc3QgbWVyZ2VkOiBBbGlhc1tdID0gW107XG4gIGNvbnN0IGFwcGVuZCA9IChhbGlhc2VzOiBMZXNzQWxpYXNPcHRpb25zKTogdm9pZCA9PiB7XG4gICAgaWYgKCFhbGlhc2VzKSByZXR1cm47XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYWxpYXNlcykpIHtcbiAgICAgIG1lcmdlZC5wdXNoKC4uLmFsaWFzZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtmaW5kLCByZXBsYWNlbWVudF0gb2YgT2JqZWN0LmVudHJpZXMoYWxpYXNlcykpIHtcbiAgICAgIG1lcmdlZC5wdXNoKHsgZmluZCwgcmVwbGFjZW1lbnQgfSk7XG4gICAgfVxuICB9O1xuXG4gIGFwcGVuZChwcmltYXJ5KTtcbiAgYXBwZW5kKGZhbGxiYWNrKTtcbiAgcmV0dXJuIG1lcmdlZDtcbn1cblxuY29uc3QgT1BUSU9OQUxfUEFDS0FHRV9TVFVCUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ0BvcGVuZWxlbWVudC9jb250ZW50JzpcbiAgICAnZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRCbG9nRGF0YSgpIHsgcmV0dXJuIHsgcG9zdHM6IFtdLCBiYXNlUGF0aDogXCJcIiB9OyB9JyxcbiAgJ0BvcGVuZWxlbWVudC9jb250ZW50L3NpdGVtYXAnOiAnZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2l0ZW1hcCgpIHsgcmV0dXJuIFtdOyB9JyxcbiAgJ0BvcGVuZWxlbWVudC9hcHAvaTE4bic6XG4gICAgJ2V4cG9ydCBmdW5jdGlvbiBsb2FkSTE4bkRhdGEoKSB7IHJldHVybiB7IGxvY2FsZXM6IFtdLCBkZWZhdWx0TG9jYWxlOiBcImVuXCIgfTsgfScsXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxQYWNrYWdlU3R1YnNQbHVnaW4oKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnb3BlbjpvcHRpb25hbC1wYWNrYWdlLXN0dWJzJyxcbiAgICBlbmZvcmNlOiAncHJlJyxcbiAgICBhc3luYyByZXNvbHZlSWQoaWQpIHtcbiAgICAgIGlmICghKGlkIGluIE9QVElPTkFMX1BBQ0tBR0VfU1RVQlMpKSByZXR1cm47XG4gICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHRoaXMucmVzb2x2ZShpZCwgdW5kZWZpbmVkLCB7IHNraXBTZWxmOiB0cnVlIH0pO1xuICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBgXFwwb3BlbjpvcHRpb25hbC1zdHViOiR7aWR9YDtcbiAgICB9LFxuICAgIGxvYWQoaWQpIHtcbiAgICAgIGNvbnN0IHByZWZpeCA9ICdcXDBvcGVuOm9wdGlvbmFsLXN0dWI6JztcbiAgICAgIGlmICghaWQuc3RhcnRzV2l0aChwcmVmaXgpKSByZXR1cm47XG4gICAgICByZXR1cm4gT1BUSU9OQUxfUEFDS0FHRV9TVFVCU1tpZC5zbGljZShwcmVmaXgubGVuZ3RoKV07XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBjb3JlIGJ1aWxkIHBsdWdpbiBpbXBsZW1lbnRhdGlvbi4gSXQgaXMgTk9UIHBhcnQgb2YgdGhlXG4gKiBwdWJsaWMgQVBJLiBVc2UgYG9wZW5QaXBlbGluZSgpYCBmcm9tIEBvcGVuZWxlbWVudC9hZGFwdGVyLXZpdGUgaW5zdGVhZC5cbiAqXG4gKiBJbnRlcm5hbCBvbmx5OiBjYWxsZWQgYnkgb3BlblBpcGVsaW5lKCkgYW5kIHRoZSBAb3BlbmVsZW1lbnQvYXBwIHVtYnJlbGxhLlxuICogSmFtc3RhY2s6IE09U1NHK0RTRCwgQT1BUEkgUm91dGVzLCBKPUlzbGFuZHMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBGcmFtZXdvcmsgb3B0aW9uc1xuICogQHBhcmFtIGV4dGVybmFsQ3R4IC0gT3B0aW9uYWwgc2hhcmVkIE9wZW5FbGVtZW50QnVpbGRDb250ZXh0ICh1c2VkIGJ5IG9wZW5FbGVtZW50KCkgdW1icmVsbGEpXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU9wZW5QbHVnaW4oXG4gIG9wdGlvbnM6IEZyYW1ld29ya09wdGlvbnMgPSB7fSxcbiAgZXh0ZXJuYWxDdHg/OiBPcGVuRWxlbWVudEJ1aWxkQ29udGV4dCxcbik6IFBsdWdpbltdIHtcbiAgY29uc3QgbWV0YVVybCA9IGltcG9ydC5tZXRhLnVybDtcblxuICAvLyBCdWlsZCBoZWFkIGV4dHJhcyAodmFsaWRhdGVkIEhUTUwgZnJhZ21lbnRzLCBzdHlsZXNoZWV0cywgc2NyaXB0cylcbiAgY29uc3QgeyBoZWFkRXh0cmFzLCBhbGxvd0hlYWRFeHRyYXNTY3JpcHRzIH0gPSBidWlsZEhlYWRFeHRyYXMob3B0aW9ucyk7XG5cbiAgY29uc3QgcmVzb2x2ZWRPcHRpb25zOiBGcmFtZXdvcmtPcHRpb25zICYge1xuICAgIGFsbG93SGVhZEV4dHJhc1NjcmlwdHM/OiBib29sZWFuO1xuICB9ID0ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgcm91dGVzRGlyOiBvcHRpb25zLnJvdXRlc0RpciB8fCAnYXBwL3JvdXRlcycsXG4gICAgaXNsYW5kc0Rpcjogb3B0aW9ucy5pc2xhbmRzRGlyIHx8ICdhcHAvaXNsYW5kcycsXG4gICAgY29tcG9uZW50c0Rpcjogb3B0aW9ucy5jb21wb25lbnRzRGlyIHx8ICdhcHAvY29tcG9uZW50cycsXG4gICAgaGVhZEV4dHJhcyxcbiAgICBhbGxvd0hlYWRFeHRyYXNTY3JpcHRzLFxuICB9O1xuXG4gIGNvbnN0IGN0eCA9IGV4dGVybmFsQ3R4IHx8IG5ldyBPcGVuRWxlbWVudEJ1aWxkQ29udGV4dChyZXNvbHZlZE9wdGlvbnMpO1xuXG4gIC8vIFByZS1nZW5lcmF0ZSB3b3Jrc3BhY2UgYWxpYXNlcyAoc3luYywgb25jZSwgY2FjaGVkIGluIGN0eCkuXG4gIC8vIFBoYXNlIDEgY29uZmlnLCBQaGFzZSAyIGNsaWVudCBidWlsZCwgYW5kIFBoYXNlIDMgU1NHIGJ1aWxkXG4gIC8vIGFsbCByZWFkIGN0eC5waGFzZTEudXNlclJlc29sdmVBbGlhcyAtIHplcm8gcmVkdW5kYW50IGdlbmVyYXRpb24uXG4gIHRyeSB7XG4gICAgY29uc3Qgd3NSb290ID0gZmluZFdvcmtzcGFjZVJvb3QocHJvY2Vzcy5jd2QoKSk7XG4gICAgaWYgKHdzUm9vdCkge1xuICAgICAgY3R4LnBoYXNlMS51c2VyUmVzb2x2ZUFsaWFzID0gZ2VuZXJhdGVXb3Jrc3BhY2VBbGlhc2VzKHdzUm9vdCk7XG4gICAgICBsb2cuaW5mbyhcbiAgICAgICAgYEF1dG8tZ2VuZXJhdGVkICR7XG4gICAgICAgICAgKGN0eC5waGFzZTEudXNlclJlc29sdmVBbGlhcyBhcyBBcnJheTx1bmtub3duPikubGVuZ3RoXG4gICAgICAgIH0gcmVzb2x2ZSBhbGlhcyhlcykgZnJvbSB3b3Jrc3BhY2VgLFxuICAgICAgKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIGxvZy5kZWJ1ZygnV29ya3NwYWNlIG5vdCBhdmFpbGFibGUgLSBhbGlhc2VzIHN0YXkgbnVsbCcpO1xuICB9XG5cbiAgY29uc3QgVklSVFVBTF9FTlRSWV9JRCA9ICd2aXJ0dWFsOm9wZW4taG9uby1lbnRyeSc7XG4gIGNvbnN0IFJFU09MVkVEX0VOVFJZX0lEID0gJ1xcMCcgKyBWSVJUVUFMX0VOVFJZX0lEO1xuICBjb25zdCBWSVJUVUFMX0JVSUxEX1RSSUdHRVJfSUQgPSAndmlydHVhbDpvcGVuLWJ1aWxkLXRyaWdnZXInO1xuICBjb25zdCBSRVNPTFZFRF9CVUlMRF9UUklHR0VSX0lEID0gJ1xcMCcgKyBWSVJUVUFMX0JVSUxEX1RSSUdHRVJfSUQ7XG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVFbnRyeShcbiAgICByb3V0ZXM6IFJvdXRlRW50cnlbXSxcbiAgICBpc2xhbmRUYWdOYW1lczogc3RyaW5nW10gPSBbXSxcbiAgICBwYWNrYWdlTWFuaWZlc3RzOiBPcGVuRWxlbWVudFBhY2thZ2VNYW5pZmVzdFtdID0gW10sXG4gICAgaXNsYW5kRmlsZXM6IHN0cmluZ1tdID0gW10sXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdlbmVyYXRlSG9ub0VudHJ5Q29kZShyb3V0ZXMsIHtcbiAgICAgIHJvdXRlc0RpcjogcmVzb2x2ZWRPcHRpb25zLnJvdXRlc0RpcixcbiAgICAgIGlzbGFuZHNEaXI6IHJlc29sdmVkT3B0aW9ucy5pc2xhbmRzRGlyLFxuICAgICAgY29tcG9uZW50c0RpcjogcmVzb2x2ZWRPcHRpb25zLmNvbXBvbmVudHNEaXIsXG4gICAgICBtaWRkbGV3YXJlOiByZXNvbHZlZE9wdGlvbnMubWlkZGxld2FyZSxcbiAgICAgIGlzbGFuZFRhZ05hbWVzLFxuICAgICAgaXNsYW5kRmlsZXMsXG4gICAgICBpc2xhbmRNZXRhOiBjdHgucGhhc2UxLmlzbGFuZE1ldGEsXG4gICAgICBwYWNrYWdlTWFuaWZlc3RzLFxuICAgICAgaGVhZEV4dHJhczogcmVzb2x2ZWRPcHRpb25zLmhlYWRFeHRyYXMsXG4gICAgICBhbGxvd0hlYWRFeHRyYXNTY3JpcHRzLFxuICAgICAgaHRtbDogcmVzb2x2ZWRPcHRpb25zLmh0bWwsXG4gICAgICB1cGdyYWRlU3RyYXRlZ3k6IHJlc29sdmVkT3B0aW9ucy5pc2xhbmQ/LnVwZ3JhZGVTdHJhdGVneSB8fCAnaWRsZScsXG4gICAgICBjbGllbnRPbmx5VGFnczogW10sXG4gICAgICBhcHBTaGVsbDogcmVzb2x2ZWRPcHRpb25zLmFwcFNoZWxsLFxuICAgICAgbGF5b3V0czogcmVzb2x2ZWRPcHRpb25zLmxheW91dHMsXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBjb3JlUGx1Z2luOiBQbHVnaW4gPSB7XG4gICAgbmFtZTogJ29wZW46Y29yZScsXG5cbiAgICBjb25maWcodXNlckNvbmZpZykge1xuICAgICAgaWYgKHVzZXJDb25maWcucmVzb2x2ZT8uYWxpYXMpIHtcbiAgICAgICAgY3R4LnBoYXNlMS51c2VyUmVzb2x2ZUFsaWFzID0gbWVyZ2VBbGlhc09wdGlvbnMoXG4gICAgICAgICAgdXNlckNvbmZpZy5yZXNvbHZlLmFsaWFzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBBbGlhc1tdLFxuICAgICAgICAgIGN0eC5waGFzZTEudXNlclJlc29sdmVBbGlhcyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWxpYXNlcyA9IGN0eC5waGFzZTEudXNlclJlc29sdmVBbGlhcyBhc1xuICAgICAgICB8IEFsaWFzW11cbiAgICAgICAgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgICAgIHwgbnVsbDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzb2x2ZTogYWxpYXNlcyA/IHsgYWxpYXM6IGFsaWFzZXMgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgYnVpbGQ6IHtcbiAgICAgICAgICAvLyBUaGUgZ2VuZXJhdGVkIHZpcnR1YWwgZW50cnkgaW50ZW50aW9uYWxseSBjb250YWlucyB0aGUgd2hvbGUgcm91dGUgZ3JhcGguXG4gICAgICAgICAgLy8gS2VlcCB0aGUgYnVkZ2V0IGV4cGxpY2l0IHNvIFZpdGUgZG9lcyBub3QgcmVwb3J0IGl0IGFzIGFuIHVuZXhwZWN0ZWQgd2FybmluZy5cbiAgICAgICAgICBjaHVua1NpemVXYXJuaW5nTGltaXQ6IDE1MDAsXG4gICAgICAgICAgcm9sbHVwT3B0aW9uczoge1xuICAgICAgICAgICAgaW5wdXQ6IFtWSVJUVUFMX0JVSUxEX1RSSUdHRVJfSURdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBjb25maWdSZXNvbHZlZChjZmcpIHtcbiAgICAgIGlmIChjZmcucmVzb2x2ZT8uYWxpYXMgJiYgIWN0eC5waGFzZTEudXNlclJlc29sdmVBbGlhcykge1xuICAgICAgICBjdHgucGhhc2UxLnVzZXJSZXNvbHZlQWxpYXMgPSBjZmcucmVzb2x2ZS5hbGlhcztcbiAgICAgIH1cbiAgICAgIC8vIHYwLjE0LjY6IEdlbmVyYXRlIHBsYWNlaG9sZGVyIGVudHJ5IGNvZGUgd2l0aCBlbXB0eSByb3V0ZXMgaW4gY29uZmlnUmVzb2x2ZWQuXG4gICAgICAvLyBUaGlzIGlzIGEgVml0ZSByZXF1aXJlbWVudCAtIHRoZSB2aXJ0dWFsIGVudHJ5IG11c3QgZXhpc3QgYmVmb3JlIGJ1aWxkU3RhcnQoKS5cbiAgICAgIC8vIFRoZSByZWFsIGVudHJ5IHdpdGggYWN0dWFsIHJvdXRlcyBpcyBnZW5lcmF0ZWQgaW4gYnVpbGRTdGFydCgpIHdoaWNoIHJ1bnMgbGF0ZXIuXG4gICAgICBjdHgucGhhc2UxLmhvbm9FbnRyeUNvZGUgPSBnZW5lcmF0ZUVudHJ5KFxuICAgICAgICBbXSxcbiAgICAgICAgY3R4LnBoYXNlMS5pc2xhbmRUYWdOYW1lcyxcbiAgICAgICAgY3R4LnBoYXNlMS5wYWNrYWdlTWFuaWZlc3RzLFxuICAgICAgICBjdHgucGhhc2UxLmlzbGFuZEZpbGVzLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgYnVpbGRTdGFydCgpIHtcbiAgICAgIGN0eC5yZXNldCgpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByb3V0ZXMgPSBhd2FpdCBzY2FuUm91dGVzKHJlc29sdmVkT3B0aW9ucy5yb3V0ZXNEaXIhKTtcblxuICAgICAgICBjb25zdCBpc2xhbmRzUm9vdCA9IGpvaW4oXG4gICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICByZXNvbHZlZE9wdGlvbnMuaXNsYW5kc0RpciB8fCAnYXBwL2lzbGFuZHMnLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpc2xhbmRGaWxlcyA9IGF3YWl0IHNjYW5Jc2xhbmRzKGlzbGFuZHNSb290KTtcbiAgICAgICAgY3R4LnBoYXNlMS5pc2xhbmRUYWdOYW1lcyA9IGlzbGFuZEZpbGVzLm1hcCgoZikgPT4gZmlsZVRvVGFnTmFtZShmKSk7XG4gICAgICAgIGN0eC5waGFzZTEuaXNsYW5kRmlsZXMgPSBpc2xhbmRGaWxlcztcbiAgICAgICAgY29uc3QgeyBzY2FuSXNsYW5kTWV0YSB9ID0gYXdhaXQgaW1wb3J0KCdAb3BlbmVsZW1lbnQvc3NnJyk7XG4gICAgICAgIGN0eC5waGFzZTEuaXNsYW5kTWV0YSA9IGF3YWl0IHNjYW5Jc2xhbmRNZXRhKGlzbGFuZHNSb290LCBpc2xhbmRGaWxlcyk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJlc29sdmVkT3B0aW9ucy5wYWNrYWdlSXNsYW5kcyAmJlxuICAgICAgICAgIHJlc29sdmVkT3B0aW9ucy5wYWNrYWdlSXNsYW5kcy5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgIGN0eC5waGFzZTEucGFja2FnZU1hbmlmZXN0cyA9IGF3YWl0IHNjYW5QYWNrYWdlTWFuaWZlc3RzKFxuICAgICAgICAgICAgcmVzb2x2ZWRPcHRpb25zLnBhY2thZ2VJc2xhbmRzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGN0eC5waGFzZTEucGFja2FnZU1hbmlmZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBFeHRyYWN0IGlzbGFuZCBkZWNsYXJhdGlvbnMgZnJvbSBtYW5pZmVzdHNcbiAgICAgICAgICAgIGN0eC5waGFzZTEucGFja2FnZUlzbGFuZERlY2xzID0gY3R4LnBoYXNlMS5wYWNrYWdlTWFuaWZlc3RzLmZsYXRNYXAoKHBrZykgPT5cbiAgICAgICAgICAgICAgcGtnLmRlY2xhcmF0aW9uc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGQpID0+IGQub3BlbkVsZW1lbnQ/Lm1vZHVsZSlcbiAgICAgICAgICAgICAgICAubWFwKChkKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgdGFnTmFtZTogZC50YWdOYW1lLFxuICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogZC5vcGVuRWxlbWVudCEubW9kdWxlISxcbiAgICAgICAgICAgICAgICAgIGlzUGFja2FnZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGh5ZHJhdGU6IGQub3BlbkVsZW1lbnQ/Lmh5ZHJhdGUgYXMgSHlkcmF0aW9uU3RyYXRlZ3kgfCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICBzc3I6IGQub3BlbkVsZW1lbnQ/Lmh5ZHJhdGUgPT09ICdvbmx5JyA/IGZhbHNlIDogZC5vcGVuRWxlbWVudD8uc3NyLFxuICAgICAgICAgICAgICAgICAgZHNkOiBkLm9wZW5FbGVtZW50Py5oeWRyYXRlID09PSAnb25seScgPyBmYWxzZSA6IGQub3BlbkVsZW1lbnQ/LmRzZCxcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICAgICAgYFBhY2thZ2UgaXNsYW5kczogJHtjdHgucGhhc2UxLnBhY2thZ2VJc2xhbmREZWNscy5tYXAoKGkpID0+IGkudGFnTmFtZSkuam9pbignLCAnKX1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSByb3V0ZXMgZm9yIGxhenkgbG9hZCgpIHJlZ2VuZXJhdGlvbiAoY3R4LmJsb2dPcHRpb25zIG1heSBub3RcbiAgICAgICAgLy8gYmUgc2V0IHlldCAtIG9wZW5Db250ZW50KCkgYnVpbGRTdGFydCgpIHJ1bnMgYWZ0ZXIgdGhpcyBvbmUpLlxuICAgICAgICBjdHgucGhhc2UxLmNhY2hlZFJvdXRlcyA9IHJvdXRlcztcblxuICAgICAgICBjdHgucGhhc2UxLmhvbm9FbnRyeUNvZGUgPSBnZW5lcmF0ZUVudHJ5KFxuICAgICAgICAgIHJvdXRlcyxcbiAgICAgICAgICBjdHgucGhhc2UxLmlzbGFuZFRhZ05hbWVzLFxuICAgICAgICAgIGN0eC5waGFzZTEucGFja2FnZU1hbmlmZXN0cyxcbiAgICAgICAgICBjdHgucGhhc2UxLmlzbGFuZEZpbGVzLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCB7IGJ1aWxkRW50cnlEZXNjcmlwdG9yIH0gPSBhd2FpdCBpbXBvcnQoJ0BvcGVuZWxlbWVudC9zc2cnKTtcblxuICAgICAgICAvLyB2MC4xOC4wOiBDRU0gYXV0by1kZXRlY3Rpb24gLSBzY2FuIG5vZGVfbW9kdWxlcyBmb3IgY3VzdG9tLWVsZW1lbnRzLmpzb25cbiAgICAgICAgLy8gd2l0aG91dCBpbXBvcnRpbmcgb3IgZXhlY3V0aW5nIGFueSBwYWNrYWdlIGNvZGUuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgbm9kZU1vZHVsZXNEaXIgPSBqb2luKHByb2Nlc3MuY3dkKCksICdub2RlX21vZHVsZXMnKTtcbiAgICAgICAgICBjdHgucGhhc2UxLmNlbUNsYXNzaWZpY2F0aW9ucyA9IGF3YWl0IGRldGVjdEFuZENsYXNzaWZ5Q2VtUGFja2FnZXMobm9kZU1vZHVsZXNEaXIpO1xuICAgICAgICAgIGlmIChjdHgucGhhc2UxLmNlbUNsYXNzaWZpY2F0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICAgICAgYENFTSBhdXRvLWRldGVjdGlvbjogY2xhc3NpZmllZCAke2N0eC5waGFzZTEuY2VtQ2xhc3NpZmljYXRpb25zLmxlbmd0aH0gY29tcG9uZW50KHMpIGZyb20gbm9kZV9tb2R1bGVzYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAvLyBDRU0gZGV0ZWN0aW9uIGlzIGJlc3QtZWZmb3J0IC0gbmV2ZXIgZmFpbCB0aGUgYnVpbGRcbiAgICAgICAgICBsb2cuZGVidWcoXG4gICAgICAgICAgICBgQ0VNIGF1dG8tZGV0ZWN0aW9uIGZhaWxlZCAobm9uLWZhdGFsKTogJHtmb3JtYXRFcnJvcihlcnIpfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjdHgucGhhc2UxLmNlbUNsYXNzaWZpY2F0aW9ucyA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY3R4LnBoYXNlMS5zc3JBZG1pc3Npb25QbGFuID0gYnVpbGRFbnRyeURlc2NyaXB0b3Iocm91dGVzLCB7XG4gICAgICAgICAgcm91dGVzRGlyOiByZXNvbHZlZE9wdGlvbnMucm91dGVzRGlyLFxuICAgICAgICAgIGlzbGFuZHNEaXI6IHJlc29sdmVkT3B0aW9ucy5pc2xhbmRzRGlyLFxuICAgICAgICAgIGlzbGFuZFRhZ05hbWVzOiBjdHgucGhhc2UxLmlzbGFuZFRhZ05hbWVzLFxuICAgICAgICAgIGlzbGFuZEZpbGVzOiBjdHgucGhhc2UxLmlzbGFuZEZpbGVzLFxuICAgICAgICAgIGlzbGFuZE1ldGE6IGN0eC5waGFzZTEuaXNsYW5kTWV0YSxcbiAgICAgICAgICBwYWNrYWdlTWFuaWZlc3RzOiBjdHgucGhhc2UxLnBhY2thZ2VNYW5pZmVzdHMsXG4gICAgICAgICAgY2VtQ2xhc3NpZmljYXRpb25zOiBjdHgucGhhc2UxLmNlbUNsYXNzaWZpY2F0aW9ucyxcbiAgICAgICAgICBjbGllbnRPbmx5VGFnczogW10sXG4gICAgICAgICAgYXBwU2hlbGw6IHJlc29sdmVkT3B0aW9ucy5hcHBTaGVsbCxcbiAgICAgICAgICBsYXlvdXRzOiByZXNvbHZlZE9wdGlvbnMubGF5b3V0cyxcbiAgICAgICAgfSkuc3NyQWRtaXNzaW9uUGxhbjtcbiAgICAgICAgY29uc3QgcGFnZUNvdW50ID0gcm91dGVzLmZpbHRlcihcbiAgICAgICAgICAocikgPT4gci50eXBlID09PSAncGFnZScgJiYgIXIuc3BlY2lhbCxcbiAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGFwaUNvdW50ID0gcm91dGVzLmZpbHRlcihcbiAgICAgICAgICAocikgPT4gci50eXBlID09PSAnYXBpJyAmJiAhci5zcGVjaWFsLFxuICAgICAgICApLmxlbmd0aDtcbiAgICAgICAgY29uc3QgdG90YWxJc2xhbmRzID0gY3R4LnBoYXNlMS5pc2xhbmRUYWdOYW1lcy5sZW5ndGggK1xuICAgICAgICAgIGN0eC5waGFzZTEucGFja2FnZUlzbGFuZERlY2xzLmxlbmd0aDtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYFJvdXRlczogJHtwYWdlQ291bnR9IHBhZ2UocyksICR7YXBpQ291bnR9IEFQSSByb3V0ZShzKSwgYCArXG4gICAgICAgICAgICBgJHt0b3RhbElzbGFuZHN9IGlzbGFuZChzKSAtIG9wZW5FbGVtZW50IEFyY2hpdGVjdHVyZWAsXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IE9wZW5FbGVtZW50RXJyb3IoYFJvdXRlIHNjYW4gZmFpbGVkOiAke2Zvcm1hdEVycm9yKGVycil9YCwge1xuICAgICAgICAgIGNvZGU6ICdST1VURV9TQ0FOX0VSUk9SJyxcbiAgICAgICAgICBzdGF0dXNDb2RlOiA1MDAsXG4gICAgICAgICAgcmVjb3ZlcmFibGU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IHZpcnR1YWxFbnRyeVBsdWdpbjogUGx1Z2luID0ge1xuICAgIG5hbWU6ICdvcGVuOnZpcnR1YWwtZW50cnknLFxuXG4gICAgcmVzb2x2ZUlkKGlkKSB7XG4gICAgICBpZiAoaWQgPT09IFZJUlRVQUxfRU5UUllfSUQpIHJldHVybiBSRVNPTFZFRF9FTlRSWV9JRDtcbiAgICAgIGlmIChpZCA9PT0gVklSVFVBTF9CVUlMRF9UUklHR0VSX0lEKSByZXR1cm4gUkVTT0xWRURfQlVJTERfVFJJR0dFUl9JRDtcbiAgICB9LFxuXG4gICAgbG9hZChpZCkge1xuICAgICAgaWYgKGlkID09PSBSRVNPTFZFRF9CVUlMRF9UUklHR0VSX0lEKSB7XG4gICAgICAgIHJldHVybiAnZXhwb3J0IGRlZmF1bHQgbnVsbDsnO1xuICAgICAgfVxuICAgICAgaWYgKGlkID09PSBSRVNPTFZFRF9FTlRSWV9JRCkge1xuICAgICAgICAvLyBBbHdheXMgcmVnZW5lcmF0ZSB0byBwaWNrIHVwIGxhdGUtc2V0dGxlZCBjdHggZmllbGRzIChlLmcuLCBibG9nT3B0aW9uc1xuICAgICAgICAvLyBmcm9tIG9wZW5Db250ZW50KCkgYnVpbGRTdGFydCgpIHdoaWNoIHJ1bnMgYWZ0ZXIgb3Blbjpjb3JlIGJ1aWxkU3RhcnQoKSkuXG4gICAgICAgIC8vIEluIGRldiBtb2RlLCBsb2FkKCkgaXMgY2FsbGVkIGxhemlseSBieSB0aGUgU1NSIHJ1bm5lciwgc28gYWxsIGJ1aWxkU3RhcnQoKVxuICAgICAgICAvLyBob29rcyBoYXZlIGNvbXBsZXRlZCBieSB0aGlzIHBvaW50LlxuICAgICAgICByZXR1cm4gZ2VuZXJhdGVFbnRyeShcbiAgICAgICAgICBjdHgucGhhc2UxLmNhY2hlZFJvdXRlcyB8fCBbXSxcbiAgICAgICAgICBjdHgucGhhc2UxLmlzbGFuZFRhZ05hbWVzLFxuICAgICAgICAgIGN0eC5waGFzZTEucGFja2FnZU1hbmlmZXN0cyxcbiAgICAgICAgICBjdHgucGhhc2UxLmlzbGFuZEZpbGVzLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgY29uc3QgZGV2U2VydmVyUGx1Z2luID0gaG9ub0RldlNlcnZlcih7XG4gICAgZW50cnk6IFZJUlRVQUxfRU5UUllfSUQsXG4gICAgaW5qZWN0Q2xpZW50U2NyaXB0OiB0cnVlLFxuICB9KSBhcyBQbHVnaW47XG5cbiAgcmV0dXJuIFtcbiAgICBtZHhQbHVnaW4oKSxcbiAgICBjb3JlUGx1Z2luLFxuICAgIGNyZWF0ZUdlbmVyYXRlZERhdGFSZXNvbHZlclBsdWdpbih7IHJvb3Q6IHByb2Nlc3MuY3dkKCkgfSksXG4gICAgY3JlYXRlQ29yZVJlc29sdmVQbHVnaW4obWV0YVVybCksXG4gICAgb3B0aW9uYWxQYWNrYWdlU3R1YnNQbHVnaW4oKSxcbiAgICB2aXJ0dWFsRW50cnlQbHVnaW4sXG4gICAgZGV2U2VydmVyUGx1Z2luLFxuICAgIGlzbGFuZFRyYW5zZm9ybVBsdWdpbihyZXNvbHZlZE9wdGlvbnMuaXNsYW5kc0RpciEpLFxuICAgIGJ1aWxkUGx1Z2luKHJlc29sdmVkT3B0aW9u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
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { Deno } from "@deno/shim-deno";
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { formatError } from '@openelement/core/errors';
|
|
4
|
+
const VIRTUAL_OPENELEMENT_PACKAGE_PREFIX = '\0openelement:ssg-pkg/';
|
|
5
|
+
// Packages resolved by this plugin for JSR consumer SSG builds.
|
|
6
|
+
// Retained optional packages (content, i18n) are handled by optionalPackageStubsPlugin
|
|
7
|
+
// in build-ssg.ts instead. The resolver must NOT intercept them, because it runs
|
|
8
|
+
// enforce: 'pre' and would prevent the stubs plugin from providing empty stubs
|
|
9
|
+
// when packages are absent.
|
|
10
|
+
const DEFAULT_OPENELEMENT_PACKAGES = new Set([
|
|
11
|
+
'adapter-vite',
|
|
12
|
+
'app',
|
|
13
|
+
'core',
|
|
14
|
+
'create',
|
|
15
|
+
'element',
|
|
16
|
+
'router',
|
|
17
|
+
'signal',
|
|
18
|
+
'ui'
|
|
19
|
+
]);
|
|
20
|
+
const OPENELEMENT_EXPORT_FILES = {
|
|
21
|
+
'adapter-vite': {
|
|
22
|
+
'.': 'src/index.ts',
|
|
23
|
+
'build-context': 'src/build-context.ts',
|
|
24
|
+
'head-injection': 'src/head-injection.ts',
|
|
25
|
+
'nitro-mount': 'src/nitro-mount.ts',
|
|
26
|
+
plugin: 'src/plugin.ts',
|
|
27
|
+
'subpath-resolver': 'src/subpath-resolver.ts',
|
|
28
|
+
'generated-data-resolver': 'src/generated-data-resolver.ts',
|
|
29
|
+
'plugin-mdx': 'src/plugin-mdx.ts',
|
|
30
|
+
'cli/build': 'src/cli/build.ts',
|
|
31
|
+
'cli/build-client': 'src/cli/build-client.ts',
|
|
32
|
+
'cli/build-ssg': 'src/cli/build-ssg.ts'
|
|
33
|
+
},
|
|
34
|
+
app: {
|
|
35
|
+
'.': 'src/index.ts',
|
|
36
|
+
i18n: 'src/i18n.ts',
|
|
37
|
+
'i18n-plugin': 'src/i18n-plugin.ts',
|
|
38
|
+
preact: 'src/preact.ts',
|
|
39
|
+
vite: 'src/vite.ts'
|
|
40
|
+
},
|
|
41
|
+
content: {
|
|
42
|
+
'.': 'src/index.ts',
|
|
43
|
+
'blog-data': 'src/blog/blog-data.ts',
|
|
44
|
+
mdx: 'src/mdx/compile.ts',
|
|
45
|
+
nav: 'src/nav/scanner.ts',
|
|
46
|
+
'nav-data': 'src/nav/writer.ts',
|
|
47
|
+
sitemap: 'src/sitemap/generator.ts'
|
|
48
|
+
},
|
|
49
|
+
core: {
|
|
50
|
+
'.': 'src/index.ts',
|
|
51
|
+
context: 'src/context.ts',
|
|
52
|
+
data: 'src/data.ts',
|
|
53
|
+
'dsd-hydration': 'src/dsd-hydration.ts',
|
|
54
|
+
errors: 'src/errors.ts',
|
|
55
|
+
'html-escape': 'src/html-escape.ts',
|
|
56
|
+
'island-transform': 'src/island-transform.ts',
|
|
57
|
+
isr: 'src/isr.ts',
|
|
58
|
+
'isr-runtime': 'src/isr-runtime.ts',
|
|
59
|
+
'jsx-runtime': 'src/jsx-runtime.ts',
|
|
60
|
+
'jsx-dev-runtime': 'src/jsx-runtime.ts',
|
|
61
|
+
logger: 'src/logger.ts',
|
|
62
|
+
prop: 'src/prop.ts',
|
|
63
|
+
'render-dsd-stream': 'src/render-dsd-stream.ts',
|
|
64
|
+
runtime: 'src/runtime.ts',
|
|
65
|
+
'signal-context': 'src/signal-context.ts',
|
|
66
|
+
'style-sheet': 'src/style-sheet.ts',
|
|
67
|
+
'tag-utils': 'src/tag-utils.ts'
|
|
68
|
+
},
|
|
69
|
+
create: {
|
|
70
|
+
'.': 'cli.ts'
|
|
71
|
+
},
|
|
72
|
+
element: {
|
|
73
|
+
'.': 'src/index.ts'
|
|
74
|
+
},
|
|
75
|
+
router: {
|
|
76
|
+
'.': 'src/data-context.ts',
|
|
77
|
+
'data-context': 'src/data-context.ts',
|
|
78
|
+
i18n: 'src/i18n.ts'
|
|
79
|
+
},
|
|
80
|
+
signal: {
|
|
81
|
+
'.': 'src/index.ts',
|
|
82
|
+
framework: 'src/framework.ts',
|
|
83
|
+
'preact-engine': 'src/preact-engine.ts'
|
|
84
|
+
},
|
|
85
|
+
ssg: {
|
|
86
|
+
'.': 'src/index.ts'
|
|
87
|
+
},
|
|
88
|
+
ui: {
|
|
89
|
+
'.': 'src/index.ts',
|
|
90
|
+
'open-button': 'src/open-button.tsx',
|
|
91
|
+
'open-callout': 'src/open-callout.tsx',
|
|
92
|
+
'open-card': 'src/open-card.tsx',
|
|
93
|
+
'open-code-block': 'src/open-code-block.tsx',
|
|
94
|
+
'open-dialog': 'src/open-dialog.tsx',
|
|
95
|
+
'open-dropdown': 'src/open-dropdown.tsx',
|
|
96
|
+
'open-hero-ping': 'src/open-hero-ping.tsx',
|
|
97
|
+
'open-input': 'src/open-input.tsx',
|
|
98
|
+
'open-layout': 'src/open-layout.tsx',
|
|
99
|
+
'open-modal': 'src/open-modal.tsx',
|
|
100
|
+
'open-props-tokens': 'src/open-props-tokens.ts',
|
|
101
|
+
'open-props-tokens.js': 'src/open-props-tokens.ts',
|
|
102
|
+
'open-step-card': 'src/open-step-card.tsx',
|
|
103
|
+
'open-tabs': 'src/open-tabs.tsx',
|
|
104
|
+
'open-theme-toggle': 'src/open-theme-toggle.tsx',
|
|
105
|
+
'open-badge': 'src/open-badge.tsx',
|
|
106
|
+
'open-brand-mark': 'src/open-brand-mark.tsx',
|
|
107
|
+
'open-lab-panel': 'src/open-lab-panel.tsx',
|
|
108
|
+
'open-lab-stage': 'src/open-lab-stage.tsx',
|
|
109
|
+
'open-standards-visual': 'src/open-standards-visual.tsx',
|
|
110
|
+
'daisy-classes': 'src/daisy-classes.ts',
|
|
111
|
+
'daisy-classes.js': 'src/daisy-classes.ts'
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
export function parseOpenPackageSpecifier(id) {
|
|
115
|
+
const bare = id.match(/^@openelement\/([^/@]+)(?:\/(.+))?$/);
|
|
116
|
+
if (bare) return {
|
|
117
|
+
packageName: bare[1],
|
|
118
|
+
subpath: bare[2] ?? '.'
|
|
119
|
+
};
|
|
120
|
+
const jsr = id.match(/^jsr:@openelement\/([^/@]+)(?:@([^/]+))?(?:\/(.+))?$/);
|
|
121
|
+
if (jsr) {
|
|
122
|
+
return {
|
|
123
|
+
packageName: jsr[1],
|
|
124
|
+
range: jsr[2],
|
|
125
|
+
subpath: jsr[3] ?? '.'
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
export function resolveOpenPackageExport(packageName, subpath) {
|
|
131
|
+
const exports = OPENELEMENT_EXPORT_FILES[packageName];
|
|
132
|
+
if (!exports) {
|
|
133
|
+
throw new Error(`[openElement/SSG] Unknown openElement package: @openelement/${packageName}`);
|
|
134
|
+
}
|
|
135
|
+
const normalized = normalizeSubpath(subpath);
|
|
136
|
+
const file = exports[normalized] ?? (normalized.endsWith('.js') ? exports[normalized.replace(/\.js$/, '')] : undefined);
|
|
137
|
+
if (file) return file;
|
|
138
|
+
throw new Error(`[openElement/SSG] Unknown @openelement/${packageName} export subpath: ${subpath}`);
|
|
139
|
+
}
|
|
140
|
+
export function toVirtualOpenPackageId(packageName, sourcePath) {
|
|
141
|
+
return `${VIRTUAL_OPENELEMENT_PACKAGE_PREFIX}${packageName}/${sourcePath}`;
|
|
142
|
+
}
|
|
143
|
+
export function resolveVirtualOpenPackageRelative(id, importer) {
|
|
144
|
+
if (!importer.startsWith(VIRTUAL_OPENELEMENT_PACKAGE_PREFIX)) return null;
|
|
145
|
+
if (!id.startsWith('./') && !id.startsWith('../')) return null;
|
|
146
|
+
const importerPath = importer.slice(VIRTUAL_OPENELEMENT_PACKAGE_PREFIX.length);
|
|
147
|
+
const [packageName, ...pathParts] = importerPath.split('/');
|
|
148
|
+
const base = pathParts.slice(0, -1);
|
|
149
|
+
const parts = [
|
|
150
|
+
...base,
|
|
151
|
+
...id.split('/')
|
|
152
|
+
];
|
|
153
|
+
const resolved = [];
|
|
154
|
+
for (const part of parts){
|
|
155
|
+
if (!part || part === '.') continue;
|
|
156
|
+
if (part === '..') resolved.pop();
|
|
157
|
+
else resolved.push(part);
|
|
158
|
+
}
|
|
159
|
+
return toVirtualOpenPackageId(packageName, resolveSourcePathExtension(packageName, resolved.join('/')));
|
|
160
|
+
}
|
|
161
|
+
export function createOpenJsrPackageResolverPlugin(options) {
|
|
162
|
+
const fetchSource = options.fetchSource ?? fetch;
|
|
163
|
+
const registry = options.registry ?? (typeof import.meta.url === 'string' && import.meta.url.startsWith('https://') ? 'jsr' : 'npm');
|
|
164
|
+
const isNpmMode = registry === 'npm';
|
|
165
|
+
return {
|
|
166
|
+
name: 'open:ssg-package-resolve',
|
|
167
|
+
enforce: 'pre',
|
|
168
|
+
transform (code) {
|
|
169
|
+
if (!code.includes('npm:')) return null;
|
|
170
|
+
const rewritten = rewriteNpmSpecifiers(code);
|
|
171
|
+
if (rewritten === code) return null;
|
|
172
|
+
return {
|
|
173
|
+
code: rewritten,
|
|
174
|
+
map: null
|
|
175
|
+
};
|
|
176
|
+
},
|
|
177
|
+
resolveId (id, importer) {
|
|
178
|
+
if (options.workspaceRoot) return null;
|
|
179
|
+
if (isNpmMode) return null;
|
|
180
|
+
if (hasExactUserAlias(id, options.userAliases)) return null;
|
|
181
|
+
const spec = parseOpenPackageSpecifier(id);
|
|
182
|
+
if (spec) {
|
|
183
|
+
if (!DEFAULT_OPENELEMENT_PACKAGES.has(spec.packageName)) return null;
|
|
184
|
+
return toVirtualOpenPackageId(spec.packageName, resolveOpenPackageExport(spec.packageName, spec.subpath));
|
|
185
|
+
}
|
|
186
|
+
return resolveVirtualOpenPackageRelative(id, importer ?? '');
|
|
187
|
+
},
|
|
188
|
+
async load (id) {
|
|
189
|
+
if (options.workspaceRoot) return null;
|
|
190
|
+
if (isNpmMode) return null;
|
|
191
|
+
if (!id.startsWith(VIRTUAL_OPENELEMENT_PACKAGE_PREFIX)) return null;
|
|
192
|
+
const [packageName, ...pathParts] = id.slice(VIRTUAL_OPENELEMENT_PACKAGE_PREFIX.length).split('/');
|
|
193
|
+
const filePath = pathParts.join('/');
|
|
194
|
+
if (options.localPackageRoot) {
|
|
195
|
+
const localPath = `${options.localPackageRoot}/packages/${packageName}/${filePath}`;
|
|
196
|
+
try {
|
|
197
|
+
return options.readLocalSource ? options.readLocalSource(localPath) : typeof Deno !== 'undefined' ? await Deno.readTextFile(localPath) : await readFile(localPath, 'utf-8');
|
|
198
|
+
} catch (error) {
|
|
199
|
+
throw new Error(`[openElement/SSG] Failed to read local @openelement/${packageName}/${filePath} ` + `from ${localPath}: ${formatError(error)}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const url = `https://jsr.io/@openelement/${packageName}/${options.version}/${filePath}`;
|
|
203
|
+
const resp = await fetchSource(url);
|
|
204
|
+
if (!resp.ok) {
|
|
205
|
+
throw new Error(`[openElement/SSG] Failed to fetch @openelement/${packageName}/${filePath} ` + `from ${url}: HTTP ${resp.status}`);
|
|
206
|
+
}
|
|
207
|
+
const source = await resp.text();
|
|
208
|
+
// JSR rewrites bare npm specifiers (e.g. 'marked') to 'npm:marked@x.y.z'.
|
|
209
|
+
// Vite/Rolldown does not understand Deno's 'npm:' scheme, so we must
|
|
210
|
+
// convert them back to bare specifiers that the bundler can resolve.
|
|
211
|
+
return rewriteNpmSpecifiers(source);
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
export function hasExactUserAlias(id, aliases) {
|
|
216
|
+
if (!aliases) return false;
|
|
217
|
+
if (Array.isArray(aliases)) {
|
|
218
|
+
return aliases.some((alias)=>typeof alias.find === 'string' && alias.find === id);
|
|
219
|
+
}
|
|
220
|
+
return Object.prototype.hasOwnProperty.call(aliases, id);
|
|
221
|
+
}
|
|
222
|
+
function normalizeSubpath(subpath) {
|
|
223
|
+
if (subpath === '' || subpath === '.') return '.';
|
|
224
|
+
return subpath.replace(/^\.\//, '');
|
|
225
|
+
}
|
|
226
|
+
function resolveSourcePathExtension(packageName, path) {
|
|
227
|
+
const normalized = path.replace(/\.js$/, '');
|
|
228
|
+
const exports = OPENELEMENT_EXPORT_FILES[packageName];
|
|
229
|
+
if (exports) {
|
|
230
|
+
const matched = Object.values(exports).find((file)=>file.replace(/\.(tsx|ts)$/, '') === normalized);
|
|
231
|
+
if (matched) return matched;
|
|
232
|
+
}
|
|
233
|
+
return ensureTsExtension(path);
|
|
234
|
+
}
|
|
235
|
+
function ensureTsExtension(path) {
|
|
236
|
+
const withoutJs = path.replace(/\.js$/, '');
|
|
237
|
+
if (withoutJs.endsWith('.tsx') || withoutJs.endsWith('.ts')) return withoutJs;
|
|
238
|
+
return `${withoutJs}.ts`;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Rewrite Deno/JSR `npm:` import/export specifiers to bare specifiers that
|
|
242
|
+
* Vite/Rolldown can resolve. JSR rewrites bare npm imports like
|
|
243
|
+
* `import from 'marked'` to `import from 'npm:marked@12.0.0'`. Published openElement
|
|
244
|
+
* source can also use explicit `npm:` specifiers so fresh Deno consumers do not
|
|
245
|
+
* need root import-map aliases. Vite doesn't understand `npm:` so we strip the
|
|
246
|
+
* prefix and version, leaving a bare specifier like `marked` or
|
|
247
|
+
* `@preact/signals-core`.
|
|
248
|
+
*
|
|
249
|
+
* Handles:
|
|
250
|
+
*/ const NPM_SPECIFIER_RE = /(\bfrom\s*|\bimport\s*\(\s*|\bimport\s+)(['"])npm:(@?[a-z0-9_-]+(?:\/[a-z0-9_-]+)?)@[^'"/]+(\/[^'"]*)?\2/g;
|
|
251
|
+
function rewriteNpmSpecifiers(source) {
|
|
252
|
+
return source.replace(NPM_SPECIFIER_RE, (_match, prefix, quote, pkg, subpath)=>{
|
|
253
|
+
return `${prefix}${quote}${pkg}${subpath ?? ''}${quote}`;
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9hZGFwdGVyLXZpdGUvc3JjL3NzZy1wYWNrYWdlLXJlc29sdmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlbm8gfSBmcm9tIFwiQGRlbm8vc2hpbS1kZW5vXCI7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHR5cGUgeyBBbGlhcywgUGx1Z2luIH0gZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBmb3JtYXRFcnJvciB9IGZyb20gJ0BvcGVuZWxlbWVudC9jb3JlL2Vycm9ycyc7XG5cbmNvbnN0IFZJUlRVQUxfT1BFTkVMRU1FTlRfUEFDS0FHRV9QUkVGSVggPSAnXFwwb3BlbmVsZW1lbnQ6c3NnLXBrZy8nO1xuLy8gUGFja2FnZXMgcmVzb2x2ZWQgYnkgdGhpcyBwbHVnaW4gZm9yIEpTUiBjb25zdW1lciBTU0cgYnVpbGRzLlxuLy8gUmV0YWluZWQgb3B0aW9uYWwgcGFja2FnZXMgKGNvbnRlbnQsIGkxOG4pIGFyZSBoYW5kbGVkIGJ5IG9wdGlvbmFsUGFja2FnZVN0dWJzUGx1Z2luXG4vLyBpbiBidWlsZC1zc2cudHMgaW5zdGVhZC4gVGhlIHJlc29sdmVyIG11c3QgTk9UIGludGVyY2VwdCB0aGVtLCBiZWNhdXNlIGl0IHJ1bnNcbi8vIGVuZm9yY2U6ICdwcmUnIGFuZCB3b3VsZCBwcmV2ZW50IHRoZSBzdHVicyBwbHVnaW4gZnJvbSBwcm92aWRpbmcgZW1wdHkgc3R1YnNcbi8vIHdoZW4gcGFja2FnZXMgYXJlIGFic2VudC5cbmNvbnN0IERFRkFVTFRfT1BFTkVMRU1FTlRfUEFDS0FHRVMgPSBuZXcgU2V0KFtcbiAgJ2FkYXB0ZXItdml0ZScsXG4gICdhcHAnLFxuICAnY29yZScsXG4gICdjcmVhdGUnLFxuICAnZWxlbWVudCcsXG4gICdyb3V0ZXInLFxuICAnc2lnbmFsJyxcbiAgJ3VpJyxcbl0pO1xuXG5jb25zdCBPUEVORUxFTUVOVF9FWFBPUlRfRklMRVM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0ge1xuICAnYWRhcHRlci12aXRlJzoge1xuICAgICcuJzogJ3NyYy9pbmRleC50cycsXG4gICAgJ2J1aWxkLWNvbnRleHQnOiAnc3JjL2J1aWxkLWNvbnRleHQudHMnLFxuICAgICdoZWFkLWluamVjdGlvbic6ICdzcmMvaGVhZC1pbmplY3Rpb24udHMnLFxuICAgICduaXRyby1tb3VudCc6ICdzcmMvbml0cm8tbW91bnQudHMnLFxuICAgIHBsdWdpbjogJ3NyYy9wbHVnaW4udHMnLFxuICAgICdzdWJwYXRoLXJlc29sdmVyJzogJ3NyYy9zdWJwYXRoLXJlc29sdmVyLnRzJyxcbiAgICAnZ2VuZXJhdGVkLWRhdGEtcmVzb2x2ZXInOiAnc3JjL2dlbmVyYXRlZC1kYXRhLXJlc29sdmVyLnRzJyxcbiAgICAncGx1Z2luLW1keCc6ICdzcmMvcGx1Z2luLW1keC50cycsXG4gICAgJ2NsaS9idWlsZCc6ICdzcmMvY2xpL2J1aWxkLnRzJyxcbiAgICAnY2xpL2J1aWxkLWNsaWVudCc6ICdzcmMvY2xpL2J1aWxkLWNsaWVudC50cycsXG4gICAgJ2NsaS9idWlsZC1zc2cnOiAnc3JjL2NsaS9idWlsZC1zc2cudHMnLFxuICB9LFxuICBhcHA6IHtcbiAgICAnLic6ICdzcmMvaW5kZXgudHMnLFxuICAgIGkxOG46ICdzcmMvaTE4bi50cycsXG4gICAgJ2kxOG4tcGx1Z2luJzogJ3NyYy9pMThuLXBsdWdpbi50cycsXG4gICAgcHJlYWN0OiAnc3JjL3ByZWFjdC50cycsXG4gICAgdml0ZTogJ3NyYy92aXRlLnRzJyxcbiAgfSxcbiAgY29udGVudDoge1xuICAgICcuJzogJ3NyYy9pbmRleC50cycsXG4gICAgJ2Jsb2ctZGF0YSc6ICdzcmMvYmxvZy9ibG9nLWRhdGEudHMnLFxuICAgIG1keDogJ3NyYy9tZHgvY29tcGlsZS50cycsXG4gICAgbmF2OiAnc3JjL25hdi9zY2FubmVyLnRzJyxcbiAgICAnbmF2LWRhdGEnOiAnc3JjL25hdi93cml0ZXIudHMnLFxuICAgIHNpdGVtYXA6ICdzcmMvc2l0ZW1hcC9nZW5lcmF0b3IudHMnLFxuICB9LFxuICBjb3JlOiB7XG4gICAgJy4nOiAnc3JjL2luZGV4LnRzJyxcbiAgICBjb250ZXh0OiAnc3JjL2NvbnRleHQudHMnLFxuICAgIGRhdGE6ICdzcmMvZGF0YS50cycsXG4gICAgJ2RzZC1oeWRyYXRpb24nOiAnc3JjL2RzZC1oeWRyYXRpb24udHMnLFxuICAgIGVycm9yczogJ3NyYy9lcnJvcnMudHMnLFxuICAgICdodG1sLWVzY2FwZSc6ICdzcmMvaHRtbC1lc2NhcGUudHMnLFxuICAgICdpc2xhbmQtdHJhbnNmb3JtJzogJ3NyYy9pc2xhbmQtdHJhbnNmb3JtLnRzJyxcbiAgICBpc3I6ICdzcmMvaXNyLnRzJyxcbiAgICAnaXNyLXJ1bnRpbWUnOiAnc3JjL2lzci1ydW50aW1lLnRzJyxcbiAgICAnanN4LXJ1bnRpbWUnOiAnc3JjL2pzeC1ydW50aW1lLnRzJyxcbiAgICAnanN4LWRldi1ydW50aW1lJzogJ3NyYy9qc3gtcnVudGltZS50cycsXG4gICAgbG9nZ2VyOiAnc3JjL2xvZ2dlci50cycsXG4gICAgcHJvcDogJ3NyYy9wcm9wLnRzJyxcbiAgICAncmVuZGVyLWRzZC1zdHJlYW0nOiAnc3JjL3JlbmRlci1kc2Qtc3RyZWFtLnRzJyxcbiAgICBydW50aW1lOiAnc3JjL3J1bnRpbWUudHMnLFxuICAgICdzaWduYWwtY29udGV4dCc6ICdzcmMvc2lnbmFsLWNvbnRleHQudHMnLFxuICAgICdzdHlsZS1zaGVldCc6ICdzcmMvc3R5bGUtc2hlZXQudHMnLFxuICAgICd0YWctdXRpbHMnOiAnc3JjL3RhZy11dGlscy50cycsXG4gIH0sXG4gIGNyZWF0ZTogeyAnLic6ICdjbGkudHMnIH0sXG4gIGVsZW1lbnQ6IHtcbiAgICAnLic6ICdzcmMvaW5kZXgudHMnLFxuICB9LFxuICByb3V0ZXI6IHtcbiAgICAnLic6ICdzcmMvZGF0YS1jb250ZXh0LnRzJyxcbiAgICAnZGF0YS1jb250ZXh0JzogJ3NyYy9kYXRhLWNvbnRleHQudHMnLFxuICAgIGkxOG46ICdzcmMvaTE4bi50cycsXG4gIH0sXG4gIHNpZ25hbDoge1xuICAgICcuJzogJ3NyYy9pbmRleC50cycsXG4gICAgZnJhbWV3b3JrOiAnc3JjL2ZyYW1ld29yay50cycsXG4gICAgJ3ByZWFjdC1lbmdpbmUnOiAnc3JjL3ByZWFjdC1lbmdpbmUudHMnLFxuICB9LFxuICBzc2c6IHtcbiAgICAnLic6ICdzcmMvaW5kZXgudHMnLFxuICB9LFxuICB1aToge1xuICAgICcuJzogJ3NyYy9pbmRleC50cycsXG4gICAgJ29wZW4tYnV0dG9uJzogJ3NyYy9vcGVuLWJ1dHRvbi50c3gnLFxuICAgICdvcGVuLWNhbGxvdXQnOiAnc3JjL29wZW4tY2FsbG91dC50c3gnLFxuICAgICdvcGVuLWNhcmQnOiAnc3JjL29wZW4tY2FyZC50c3gnLFxuICAgICdvcGVuLWNvZGUtYmxvY2snOiAnc3JjL29wZW4tY29kZS1ibG9jay50c3gnLFxuICAgICdvcGVuLWRpYWxvZyc6ICdzcmMvb3Blbi1kaWFsb2cudHN4JyxcbiAgICAnb3Blbi1kcm9wZG93bic6ICdzcmMvb3Blbi1kcm9wZG93bi50c3gnLFxuICAgICdvcGVuLWhlcm8tcGluZyc6ICdzcmMvb3Blbi1oZXJvLXBpbmcudHN4JyxcbiAgICAnb3Blbi1pbnB1dCc6ICdzcmMvb3Blbi1pbnB1dC50c3gnLFxuICAgICdvcGVuLWxheW91dCc6ICdzcmMvb3Blbi1sYXlvdXQudHN4JyxcbiAgICAnb3Blbi1tb2RhbCc6ICdzcmMvb3Blbi1tb2RhbC50c3gnLFxuICAgICdvcGVuLXByb3BzLXRva2Vucyc6ICdzcmMvb3Blbi1wcm9wcy10b2tlbnMudHMnLFxuICAgICdvcGVuLXByb3BzLXRva2Vucy5qcyc6ICdzcmMvb3Blbi1wcm9wcy10b2tlbnMudHMnLFxuICAgICdvcGVuLXN0ZXAtY2FyZCc6ICdzcmMvb3Blbi1zdGVwLWNhcmQudHN4JyxcbiAgICAnb3Blbi10YWJzJzogJ3NyYy9vcGVuLXRhYnMudHN4JyxcbiAgICAnb3Blbi10aGVtZS10b2dnbGUnOiAnc3JjL29wZW4tdGhlbWUtdG9nZ2xlLnRzeCcsXG4gICAgJ29wZW4tYmFkZ2UnOiAnc3JjL29wZW4tYmFkZ2UudHN4JyxcbiAgICAnb3Blbi1icmFuZC1tYXJrJzogJ3NyYy9vcGVuLWJyYW5kLW1hcmsudHN4JyxcbiAgICAnb3Blbi1sYWItcGFuZWwnOiAnc3JjL29wZW4tbGFiLXBhbmVsLnRzeCcsXG4gICAgJ29wZW4tbGFiLXN0YWdlJzogJ3NyYy9vcGVuLWxhYi1zdGFnZS50c3gnLFxuICAgICdvcGVuLXN0YW5kYXJkcy12aXN1YWwnOiAnc3JjL29wZW4tc3RhbmRhcmRzLXZpc3VhbC50c3gnLFxuICAgICdkYWlzeS1jbGFzc2VzJzogJ3NyYy9kYWlzeS1jbGFzc2VzLnRzJyxcbiAgICAnZGFpc3ktY2xhc3Nlcy5qcyc6ICdzcmMvZGFpc3ktY2xhc3Nlcy50cycsXG4gIH0sXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5Kc3JQYWNrYWdlU3BlY2lmaWVyIHtcbiAgcGFja2FnZU5hbWU6IHN0cmluZztcbiAgc3VicGF0aDogc3RyaW5nO1xuICByYW5nZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuSnNyUGFja2FnZVJlc29sdmVyT3B0aW9ucyB7XG4gIHdvcmtzcGFjZVJvb3Q6IHN0cmluZyB8IG51bGw7XG4gIHZlcnNpb246IHN0cmluZztcbiAgbG9jYWxQYWNrYWdlUm9vdD86IHN0cmluZyB8IG51bGw7XG4gIHVzZXJBbGlhc2VzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IEFsaWFzW10gfCBudWxsO1xuICBmZXRjaFNvdXJjZT86ICh1cmw6IHN0cmluZykgPT4gUHJvbWlzZTxSZXNwb25zZT47XG4gIHJlYWRMb2NhbFNvdXJjZT86IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZztcbiAgLyoqIFJlZ2lzdHJ5IG1vZGUuICducG0nIGxldHMgVml0ZSByZXNvbHZlIEBvcGVuZWxlbWVudC8qIGZyb20gbm9kZV9tb2R1bGVzLlxuICAgKiAnanNyJyBrZWVwcyB0aGUgbGVnYWN5IHZpcnR1YWwtbW9kdWxlIHNvdXJjZSBmZXRjaCBmb3IgSlNSIGNvbnN1bWVycy4gKi9cbiAgcmVnaXN0cnk/OiAnbnBtJyB8ICdqc3InO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VPcGVuUGFja2FnZVNwZWNpZmllcihpZDogc3RyaW5nKTogT3BlbkpzclBhY2thZ2VTcGVjaWZpZXIgfCBudWxsIHtcbiAgY29uc3QgYmFyZSA9IGlkLm1hdGNoKC9eQG9wZW5lbGVtZW50XFwvKFteL0BdKykoPzpcXC8oLispKT8kLyk7XG4gIGlmIChiYXJlKSByZXR1cm4geyBwYWNrYWdlTmFtZTogYmFyZVsxXSwgc3VicGF0aDogYmFyZVsyXSA/PyAnLicgfTtcblxuICBjb25zdCBqc3IgPSBpZC5tYXRjaCgvXmpzcjpAb3BlbmVsZW1lbnRcXC8oW14vQF0rKSg/OkAoW14vXSspKT8oPzpcXC8oLispKT8kLyk7XG4gIGlmIChqc3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFja2FnZU5hbWU6IGpzclsxXSxcbiAgICAgIHJhbmdlOiBqc3JbMl0sXG4gICAgICBzdWJwYXRoOiBqc3JbM10gPz8gJy4nLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVPcGVuUGFja2FnZUV4cG9ydChwYWNrYWdlTmFtZTogc3RyaW5nLCBzdWJwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBleHBvcnRzID0gT1BFTkVMRU1FTlRfRVhQT1JUX0ZJTEVTW3BhY2thZ2VOYW1lXTtcbiAgaWYgKCFleHBvcnRzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBbb3BlbkVsZW1lbnQvU1NHXSBVbmtub3duIG9wZW5FbGVtZW50IHBhY2thZ2U6IEBvcGVuZWxlbWVudC8ke3BhY2thZ2VOYW1lfWApO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVN1YnBhdGgoc3VicGF0aCk7XG4gIGNvbnN0IGZpbGUgPSBleHBvcnRzW25vcm1hbGl6ZWRdID8/XG4gICAgKG5vcm1hbGl6ZWQuZW5kc1dpdGgoJy5qcycpID8gZXhwb3J0c1tub3JtYWxpemVkLnJlcGxhY2UoL1xcLmpzJC8sICcnKV0gOiB1bmRlZmluZWQpO1xuICBpZiAoZmlsZSkgcmV0dXJuIGZpbGU7XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBbb3BlbkVsZW1lbnQvU1NHXSBVbmtub3duIEBvcGVuZWxlbWVudC8ke3BhY2thZ2VOYW1lfSBleHBvcnQgc3VicGF0aDogJHtzdWJwYXRofWAsXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1ZpcnR1YWxPcGVuUGFja2FnZUlkKHBhY2thZ2VOYW1lOiBzdHJpbmcsIHNvdXJjZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtWSVJUVUFMX09QRU5FTEVNRU5UX1BBQ0tBR0VfUFJFRklYfSR7cGFja2FnZU5hbWV9LyR7c291cmNlUGF0aH1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVZpcnR1YWxPcGVuUGFja2FnZVJlbGF0aXZlKGlkOiBzdHJpbmcsIGltcG9ydGVyOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKCFpbXBvcnRlci5zdGFydHNXaXRoKFZJUlRVQUxfT1BFTkVMRU1FTlRfUEFDS0FHRV9QUkVGSVgpKSByZXR1cm4gbnVsbDtcbiAgaWYgKCFpZC5zdGFydHNXaXRoKCcuLycpICYmICFpZC5zdGFydHNXaXRoKCcuLi8nKSkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgaW1wb3J0ZXJQYXRoID0gaW1wb3J0ZXIuc2xpY2UoVklSVFVBTF9PUEVORUxFTUVOVF9QQUNLQUdFX1BSRUZJWC5sZW5ndGgpO1xuICBjb25zdCBbcGFja2FnZU5hbWUsIC4uLnBhdGhQYXJ0c10gPSBpbXBvcnRlclBhdGguc3BsaXQoJy8nKTtcbiAgY29uc3QgYmFzZSA9IHBhdGhQYXJ0cy5zbGljZSgwLCAtMSk7XG4gIGNvbnN0IHBhcnRzID0gWy4uLmJhc2UsIC4uLmlkLnNwbGl0KCcvJyldO1xuICBjb25zdCByZXNvbHZlZDogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBpZiAoIXBhcnQgfHwgcGFydCA9PT0gJy4nKSBjb250aW51ZTtcbiAgICBpZiAocGFydCA9PT0gJy4uJykgcmVzb2x2ZWQucG9wKCk7XG4gICAgZWxzZSByZXNvbHZlZC5wdXNoKHBhcnQpO1xuICB9XG5cbiAgcmV0dXJuIHRvVmlydHVhbE9wZW5QYWNrYWdlSWQoXG4gICAgcGFja2FnZU5hbWUsXG4gICAgcmVzb2x2ZVNvdXJjZVBhdGhFeHRlbnNpb24ocGFja2FnZU5hbWUsIHJlc29sdmVkLmpvaW4oJy8nKSksXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPcGVuSnNyUGFja2FnZVJlc29sdmVyUGx1Z2luKFxuICBvcHRpb25zOiBPcGVuSnNyUGFja2FnZVJlc29sdmVyT3B0aW9ucyxcbik6IFBsdWdpbiB7XG4gIGNvbnN0IGZldGNoU291cmNlID0gb3B0aW9ucy5mZXRjaFNvdXJjZSA/PyBmZXRjaDtcbiAgY29uc3QgcmVnaXN0cnkgPSBvcHRpb25zLnJlZ2lzdHJ5ID8/XG4gICAgKHR5cGVvZiBpbXBvcnQubWV0YS51cmwgPT09ICdzdHJpbmcnICYmIGltcG9ydC5tZXRhLnVybC5zdGFydHNXaXRoKCdodHRwczovLycpID8gJ2pzcicgOiAnbnBtJyk7XG4gIGNvbnN0IGlzTnBtTW9kZSA9IHJlZ2lzdHJ5ID09PSAnbnBtJztcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdvcGVuOnNzZy1wYWNrYWdlLXJlc29sdmUnLFxuICAgIGVuZm9yY2U6ICdwcmUnLFxuICAgIHRyYW5zZm9ybShjb2RlKSB7XG4gICAgICBpZiAoIWNvZGUuaW5jbHVkZXMoJ25wbTonKSkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCByZXdyaXR0ZW4gPSByZXdyaXRlTnBtU3BlY2lmaWVycyhjb2RlKTtcbiAgICAgIGlmIChyZXdyaXR0ZW4gPT09IGNvZGUpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHsgY29kZTogcmV3cml0dGVuLCBtYXA6IG51bGwgfTtcbiAgICB9LFxuICAgIHJlc29sdmVJZChpZCwgaW1wb3J0ZXIpIHtcbiAgICAgIGlmIChvcHRpb25zLndvcmtzcGFjZVJvb3QpIHJldHVybiBudWxsO1xuICAgICAgaWYgKGlzTnBtTW9kZSkgcmV0dXJuIG51bGw7XG4gICAgICBpZiAoaGFzRXhhY3RVc2VyQWxpYXMoaWQsIG9wdGlvbnMudXNlckFsaWFzZXMpKSByZXR1cm4gbnVsbDtcblxuICAgICAgY29uc3Qgc3BlYyA9IHBhcnNlT3BlblBhY2thZ2VTcGVjaWZpZXIoaWQpO1xuICAgICAgaWYgKHNwZWMpIHtcbiAgICAgICAgaWYgKCFERUZBVUxUX09QRU5FTEVNRU5UX1BBQ0tBR0VTLmhhcyhzcGVjLnBhY2thZ2VOYW1lKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB0b1ZpcnR1YWxPcGVuUGFja2FnZUlkKFxuICAgICAgICAgIHNwZWMucGFja2FnZU5hbWUsXG4gICAgICAgICAgcmVzb2x2ZU9wZW5QYWNrYWdlRXhwb3J0KHNwZWMucGFja2FnZU5hbWUsIHNwZWMuc3VicGF0aCksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNvbHZlVmlydHVhbE9wZW5QYWNrYWdlUmVsYXRpdmUoaWQsIGltcG9ydGVyID8/ICcnKTtcbiAgICB9LFxuICAgIGFzeW5jIGxvYWQoaWQpIHtcbiAgICAgIGlmIChvcHRpb25zLndvcmtzcGFjZVJvb3QpIHJldHVybiBudWxsO1xuICAgICAgaWYgKGlzTnBtTW9kZSkgcmV0dXJuIG51bGw7XG4gICAgICBpZiAoIWlkLnN0YXJ0c1dpdGgoVklSVFVBTF9PUEVORUxFTUVOVF9QQUNLQUdFX1BSRUZJWCkpIHJldHVybiBudWxsO1xuXG4gICAgICBjb25zdCBbcGFja2FnZU5hbWUsIC4uLnBhdGhQYXJ0c10gPSBpZC5zbGljZShWSVJUVUFMX09QRU5FTEVNRU5UX1BBQ0tBR0VfUFJFRklYLmxlbmd0aCkuc3BsaXQoXG4gICAgICAgICcvJyxcbiAgICAgICk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGhQYXJ0cy5qb2luKCcvJyk7XG4gICAgICBpZiAob3B0aW9ucy5sb2NhbFBhY2thZ2VSb290KSB7XG4gICAgICAgIGNvbnN0IGxvY2FsUGF0aCA9IGAke29wdGlvbnMubG9jYWxQYWNrYWdlUm9vdH0vcGFja2FnZXMvJHtwYWNrYWdlTmFtZX0vJHtmaWxlUGF0aH1gO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBvcHRpb25zLnJlYWRMb2NhbFNvdXJjZVxuICAgICAgICAgICAgPyBvcHRpb25zLnJlYWRMb2NhbFNvdXJjZShsb2NhbFBhdGgpXG4gICAgICAgICAgICA6IHR5cGVvZiBEZW5vICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgPyBhd2FpdCBEZW5vLnJlYWRUZXh0RmlsZShsb2NhbFBhdGgpXG4gICAgICAgICAgICA6IGF3YWl0IHJlYWRGaWxlKGxvY2FsUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFtvcGVuRWxlbWVudC9TU0ddIEZhaWxlZCB0byByZWFkIGxvY2FsIEBvcGVuZWxlbWVudC8ke3BhY2thZ2VOYW1lfS8ke2ZpbGVQYXRofSBgICtcbiAgICAgICAgICAgICAgYGZyb20gJHtsb2NhbFBhdGh9OiAke2Zvcm1hdEVycm9yKGVycm9yKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vanNyLmlvL0BvcGVuZWxlbWVudC8ke3BhY2thZ2VOYW1lfS8ke29wdGlvbnMudmVyc2lvbn0vJHtmaWxlUGF0aH1gO1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoU291cmNlKHVybCk7XG4gICAgICBpZiAoIXJlc3Aub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBbb3BlbkVsZW1lbnQvU1NHXSBGYWlsZWQgdG8gZmV0Y2ggQG9wZW5lbGVtZW50LyR7cGFja2FnZU5hbWV9LyR7ZmlsZVBhdGh9IGAgK1xuICAgICAgICAgICAgYGZyb20gJHt1cmx9OiBIVFRQICR7cmVzcC5zdGF0dXN9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHJlc3AudGV4dCgpO1xuICAgICAgLy8gSlNSIHJld3JpdGVzIGJhcmUgbnBtIHNwZWNpZmllcnMgKGUuZy4gJ21hcmtlZCcpIHRvICducG06bWFya2VkQHgueS56Jy5cbiAgICAgIC8vIFZpdGUvUm9sbGRvd24gZG9lcyBub3QgdW5kZXJzdGFuZCBEZW5vJ3MgJ25wbTonIHNjaGVtZSwgc28gd2UgbXVzdFxuICAgICAgLy8gY29udmVydCB0aGVtIGJhY2sgdG8gYmFyZSBzcGVjaWZpZXJzIHRoYXQgdGhlIGJ1bmRsZXIgY2FuIHJlc29sdmUuXG4gICAgICByZXR1cm4gcmV3cml0ZU5wbVNwZWNpZmllcnMoc291cmNlKTtcbiAgICB9LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzRXhhY3RVc2VyQWxpYXMoXG4gIGlkOiBzdHJpbmcsXG4gIGFsaWFzZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBBbGlhc1tdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4ge1xuICBpZiAoIWFsaWFzZXMpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYWxpYXNlcykpIHtcbiAgICByZXR1cm4gYWxpYXNlcy5zb21lKChhbGlhcykgPT4gdHlwZW9mIGFsaWFzLmZpbmQgPT09ICdzdHJpbmcnICYmIGFsaWFzLmZpbmQgPT09IGlkKTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFsaWFzZXMsIGlkKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3VicGF0aChzdWJwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoc3VicGF0aCA9PT0gJycgfHwgc3VicGF0aCA9PT0gJy4nKSByZXR1cm4gJy4nO1xuICByZXR1cm4gc3VicGF0aC5yZXBsYWNlKC9eXFwuXFwvLywgJycpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlU291cmNlUGF0aEV4dGVuc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBub3JtYWxpemVkID0gcGF0aC5yZXBsYWNlKC9cXC5qcyQvLCAnJyk7XG4gIGNvbnN0IGV4cG9ydHMgPSBPUEVORUxFTUVOVF9FWFBPUlRfRklMRVNbcGFja2FnZU5hbWVdO1xuICBpZiAoZXhwb3J0cykge1xuICAgIGNvbnN0IG1hdGNoZWQgPSBPYmplY3QudmFsdWVzKGV4cG9ydHMpLmZpbmQoKGZpbGUpID0+XG4gICAgICBmaWxlLnJlcGxhY2UoL1xcLih0c3h8dHMpJC8sICcnKSA9PT0gbm9ybWFsaXplZFxuICAgICk7XG4gICAgaWYgKG1hdGNoZWQpIHJldHVybiBtYXRjaGVkO1xuICB9XG4gIHJldHVybiBlbnN1cmVUc0V4dGVuc2lvbihwYXRoKTtcbn1cblxuZnVuY3Rpb24gZW5zdXJlVHNFeHRlbnNpb24ocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgd2l0aG91dEpzID0gcGF0aC5yZXBsYWNlKC9cXC5qcyQvLCAnJyk7XG4gIGlmICh3aXRob3V0SnMuZW5kc1dpdGgoJy50c3gnKSB8fCB3aXRob3V0SnMuZW5kc1dpdGgoJy50cycpKSByZXR1cm4gd2l0aG91dEpzO1xuICByZXR1cm4gYCR7d2l0aG91dEpzfS50c2A7XG59XG5cbi8qKlxuICogUmV3cml0ZSBEZW5vL0pTUiBgbnBtOmAgaW1wb3J0L2V4cG9ydCBzcGVjaWZpZXJzIHRvIGJhcmUgc3BlY2lmaWVycyB0aGF0XG4gKiBWaXRlL1JvbGxkb3duIGNhbiByZXNvbHZlLiBKU1IgcmV3cml0ZXMgYmFyZSBucG0gaW1wb3J0cyBsaWtlXG4gKiBgaW1wb3J0IGZyb20gJ21hcmtlZCdgIHRvIGBpbXBvcnQgZnJvbSAnbnBtOm1hcmtlZEAxMi4wLjAnYC4gUHVibGlzaGVkIG9wZW5FbGVtZW50XG4gKiBzb3VyY2UgY2FuIGFsc28gdXNlIGV4cGxpY2l0IGBucG06YCBzcGVjaWZpZXJzIHNvIGZyZXNoIERlbm8gY29uc3VtZXJzIGRvIG5vdFxuICogbmVlZCByb290IGltcG9ydC1tYXAgYWxpYXNlcy4gVml0ZSBkb2Vzbid0IHVuZGVyc3RhbmQgYG5wbTpgIHNvIHdlIHN0cmlwIHRoZVxuICogcHJlZml4IGFuZCB2ZXJzaW9uLCBsZWF2aW5nIGEgYmFyZSBzcGVjaWZpZXIgbGlrZSBgbWFya2VkYCBvclxuICogYEBwcmVhY3Qvc2lnbmFscy1jb3JlYC5cbiAqXG4gKiBIYW5kbGVzOlxuICovXG5jb25zdCBOUE1fU1BFQ0lGSUVSX1JFID1cbiAgLyhcXGJmcm9tXFxzKnxcXGJpbXBvcnRcXHMqXFwoXFxzKnxcXGJpbXBvcnRcXHMrKShbJ1wiXSlucG06KEA/W2EtejAtOV8tXSsoPzpcXC9bYS16MC05Xy1dKyk/KUBbXidcIi9dKyhcXC9bXidcIl0qKT9cXDIvZztcblxuZnVuY3Rpb24gcmV3cml0ZU5wbVNwZWNpZmllcnMoc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc291cmNlLnJlcGxhY2UoXG4gICAgTlBNX1NQRUNJRklFUl9SRSxcbiAgICAoX21hdGNoLCBwcmVmaXg6IHN0cmluZywgcXVvdGU6IHN0cmluZywgcGtnOiBzdHJpbmcsIHN1YnBhdGg/OiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtxdW90ZX0ke3BrZ30ke3N1YnBhdGggPz8gJyd9JHtxdW90ZX1gO1xuICAgIH0sXG4gICk7XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsU0FBUyxJQUFJLFFBQVEsa0JBQWtCO0FBQ3ZD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
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracted from index.ts in v0.22 (SOP-004: adapter-vite decomposition).
|
|
3
|
+
*
|
|
4
|
+
* When @openelement/core is loaded from JSR (https:// import.meta.url),
|
|
5
|
+
* Vite's SSR runner cannot load https:// URLs via Node.js ESM loader.
|
|
6
|
+
* This module intercepts @openelement/core/* imports and loads source code
|
|
7
|
+
* through virtual modules, bypassing Node.js ESM loader entirely.
|
|
8
|
+
*
|
|
9
|
+
* ADR 0018 Phase 0: buildCoreSubpathAliases() DELETED.
|
|
10
|
+
* Local mode now relies on @deno/vite-plugin for bare specifier resolution.
|
|
11
|
+
* Remote JSR resolution (createCoreResolvePlugin) is retained because
|
|
12
|
+
* JSR packages are not in node_modules and require virtual module loading.
|
|
13
|
+
*/ import type { Plugin } from 'vite';
|
|
14
|
+
/** Virtual module ID prefix for JSR remote resolution */ export declare const VIRTUAL_CORE_PREFIX: '\0openelement:core/src/';
|
|
15
|
+
/**
|
|
16
|
+
* Mapping of @openelement/core/* subpath specifiers to source files
|
|
17
|
+
* (used by JSR remote resolution only).
|
|
18
|
+
*/ export declare const CORE_SUBPATHS: Record<string, string>;
|
|
19
|
+
/**
|
|
20
|
+
* Create the core subpath resolution plugin for JSR remote execution.
|
|
21
|
+
*
|
|
22
|
+
* When @openelement/core is loaded from JSR (https:// import.meta.url),
|
|
23
|
+
* Vite's SSR runner cannot load https:// URLs via Node.js ESM loader.
|
|
24
|
+
* This plugin intercepts @openelement/core/* imports and loads source code
|
|
25
|
+
* through virtual modules, bypassing Node.js ESM loader entirely.
|
|
26
|
+
*/ export declare function createCoreResolvePlugin(metaUrl: string): Plugin;
|