@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/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;