@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.
@@ -0,0 +1,153 @@
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 { formatError, OpenElementError } from '@openelement/core/errors';
14
+ /** Virtual module ID prefix for JSR remote resolution */ export 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 const CORE_SUBPATHS = {
19
+ logger: 'logger.ts',
20
+ 'build-context': 'build-context.ts',
21
+ navigation: 'navigation.ts',
22
+ errors: 'errors.ts'
23
+ };
24
+ // M-08 fix: Add max size limit to prevent unbounded memory growth in long dev sessions
25
+ const JSR_CACHE_MAX = 100;
26
+ const jsrSourceCache = new Map();
27
+ function cacheGet(key) {
28
+ return jsrSourceCache.get(key);
29
+ }
30
+ function cacheSet(key, value) {
31
+ if (jsrSourceCache.size >= JSR_CACHE_MAX) {
32
+ // Evict oldest entry
33
+ const firstKey = jsrSourceCache.keys().next().value;
34
+ if (firstKey !== undefined) jsrSourceCache.delete(firstKey);
35
+ }
36
+ jsrSourceCache.set(key, value);
37
+ }
38
+ const OPENELEMENT_PACKAGE_SRC_BASE_RE = /\/@openelement\/([^/]+)\/([^/]+)\/src\/.*$/;
39
+ /**
40
+ * Extract the JSR package source base URL from import.meta.url.
41
+ * Handles both standard JSR paths and edge cases where the version
42
+ * segment differs from expectations.
43
+ */ function getOpenPackageSrcBase(metaUrl, packageName) {
44
+ const match = metaUrl.match(OPENELEMENT_PACKAGE_SRC_BASE_RE);
45
+ if (match) {
46
+ return metaUrl.replace(OPENELEMENT_PACKAGE_SRC_BASE_RE, `/@openelement/${packageName}/${match[2]}/src/`);
47
+ }
48
+ return metaUrl.replace(/\/@openelement\/[^/]+@([^/]+)\/src\/.*$/, `/@openelement/${packageName}/$1/src/`).replace(/\/src\/.*$/, '/src/');
49
+ }
50
+ /**
51
+ * Create the core subpath resolution plugin for JSR remote execution.
52
+ *
53
+ * When @openelement/core is loaded from JSR (https:// import.meta.url),
54
+ * Vite's SSR runner cannot load https:// URLs via Node.js ESM loader.
55
+ * This plugin intercepts @openelement/core/* imports and loads source code
56
+ * through virtual modules, bypassing Node.js ESM loader entirely.
57
+ */ export function createCoreResolvePlugin(metaUrl) {
58
+ const isRemote = metaUrl.startsWith('https://') || metaUrl.startsWith('http://');
59
+ // Compute JSR base URL for source fetching.
60
+ let jsrSrcBase = '';
61
+ if (isRemote) {
62
+ jsrSrcBase = getOpenPackageSrcBase(metaUrl, 'core');
63
+ }
64
+ return {
65
+ name: 'open:core-resolve',
66
+ enforce: 'pre',
67
+ resolveId (source, importer, options) {
68
+ if (!isRemote) return;
69
+ // Case 1: Bare specifier @openelement/core or @openelement/core/*
70
+ if (source === '@openelement/core' || source.startsWith('@openelement/core/')) {
71
+ const subpath = source === '@openelement/core' ? 'index.ts' : CORE_SUBPATHS[source.slice('@openelement/core/'.length)] || `${source.slice('@openelement/core/'.length)}.ts`;
72
+ return `${VIRTUAL_CORE_PREFIX}${subpath}`;
73
+ }
74
+ // Case 2: Relative imports from within our virtual modules
75
+ if (importer?.startsWith(VIRTUAL_CORE_PREFIX) && source.startsWith('./')) {
76
+ const importerDir = importer.replace(/[/\\][^/\\]+$/, '');
77
+ return `${importerDir}/${source.slice(2)}`;
78
+ }
79
+ // Case 3: Third-party bare specifiers from virtual modules
80
+ if (importer?.startsWith(VIRTUAL_CORE_PREFIX) && !source.startsWith('/') && !source.startsWith('.') && !source.startsWith('\0')) {
81
+ return this.resolve(source, undefined, {
82
+ ...options,
83
+ skipSelf: true
84
+ });
85
+ }
86
+ // Case 4: Already-resolved virtual IDs (re-resolve safeguard)
87
+ if (source.startsWith(VIRTUAL_CORE_PREFIX)) {
88
+ return source;
89
+ }
90
+ },
91
+ async load (id) {
92
+ if (!isRemote) return;
93
+ if (!id.startsWith(VIRTUAL_CORE_PREFIX)) return;
94
+ // Check cache
95
+ if (jsrSourceCache.has(id)) return cacheGet(id);
96
+ // Normalize .js -> .ts (Deno convention: imports use .js, files are .ts)
97
+ let filePath = id.slice(VIRTUAL_CORE_PREFIX.length);
98
+ if (filePath.endsWith('.js') && !filePath.endsWith('.ts')) {
99
+ filePath = filePath.slice(0, -3) + '.ts';
100
+ }
101
+ // Fetch TypeScript source from JSR
102
+ const url = `${jsrSrcBase}${filePath}`;
103
+ let tsCode;
104
+ // M-09 fix: Add 30s timeout for JSR fetches to prevent hanging builds
105
+ const controller = new AbortController();
106
+ const timeoutId = setTimeout(()=>controller.abort(), 30_000);
107
+ try {
108
+ const resp = await fetch(url, {
109
+ signal: controller.signal
110
+ });
111
+ if (!resp.ok) {
112
+ throw new Error(`[open:core-resolve] Failed to fetch ${url}: HTTP ${resp.status}`);
113
+ }
114
+ tsCode = await resp.text();
115
+ clearTimeout(timeoutId);
116
+ } catch (err) {
117
+ clearTimeout(timeoutId);
118
+ throw new OpenElementError(`Failed to load @openelement/core module from JSR: ${filePath}. ` + `URL: ${url}. Error: ${formatError(err)}`, {
119
+ code: 'JSR_FETCH_ERROR',
120
+ statusCode: 500,
121
+ recoverable: false
122
+ });
123
+ }
124
+ // Compile TypeScript -> JavaScript via Vite's bundled esbuild transform
125
+ let jsCode;
126
+ try {
127
+ const { transformWithEsbuild } = await import('vite');
128
+ const result = await transformWithEsbuild(tsCode, filePath, {
129
+ loader: 'ts',
130
+ target: 'esnext',
131
+ format: 'esm'
132
+ });
133
+ jsCode = result.code;
134
+ } catch (err) {
135
+ throw new OpenElementError(`Failed to compile @openelement/core module from JSR: ${filePath}. ` + `Error: ${formatError(err)}`, {
136
+ code: 'JSR_COMPILE_ERROR',
137
+ statusCode: 500,
138
+ recoverable: false
139
+ });
140
+ }
141
+ // Post-process: rewrite npm: specifiers to bare specifiers.
142
+ jsCode = jsCode.replace(/(["'])npm:([^"']+)\1/g, (_, quote, specifier)=>{
143
+ const isScoped = specifier.startsWith('@');
144
+ const withoutScope = isScoped ? specifier.slice(1) : specifier;
145
+ const namePart = withoutScope.split('@')[0];
146
+ return `${quote}${isScoped ? '@' : ''}${namePart}${quote}`;
147
+ });
148
+ cacheSet(id, jsCode);
149
+ return jsCode;
150
+ }
151
+ };
152
+ }
153
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9hZGFwdGVyLXZpdGUvc3JjL3N1YnBhdGgtcmVzb2x2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFeHRyYWN0ZWQgZnJvbSBpbmRleC50cyBpbiB2MC4yMiAoU09QLTAwNDogYWRhcHRlci12aXRlIGRlY29tcG9zaXRpb24pLlxuICpcbiAqIFdoZW4gQG9wZW5lbGVtZW50L2NvcmUgaXMgbG9hZGVkIGZyb20gSlNSIChodHRwczovLyBpbXBvcnQubWV0YS51cmwpLFxuICogVml0ZSdzIFNTUiBydW5uZXIgY2Fubm90IGxvYWQgaHR0cHM6Ly8gVVJMcyB2aWEgTm9kZS5qcyBFU00gbG9hZGVyLlxuICogVGhpcyBtb2R1bGUgaW50ZXJjZXB0cyBAb3BlbmVsZW1lbnQvY29yZS8qIGltcG9ydHMgYW5kIGxvYWRzIHNvdXJjZSBjb2RlXG4gKiB0aHJvdWdoIHZpcnR1YWwgbW9kdWxlcywgYnlwYXNzaW5nIE5vZGUuanMgRVNNIGxvYWRlciBlbnRpcmVseS5cbiAqXG4gKiBBRFIgMDAxOCBQaGFzZSAwOiBidWlsZENvcmVTdWJwYXRoQWxpYXNlcygpIERFTEVURUQuXG4gKiBMb2NhbCBtb2RlIG5vdyByZWxpZXMgb24gQGRlbm8vdml0ZS1wbHVnaW4gZm9yIGJhcmUgc3BlY2lmaWVyIHJlc29sdXRpb24uXG4gKiBSZW1vdGUgSlNSIHJlc29sdXRpb24gKGNyZWF0ZUNvcmVSZXNvbHZlUGx1Z2luKSBpcyByZXRhaW5lZCBiZWNhdXNlXG4gKiBKU1IgcGFja2FnZXMgYXJlIG5vdCBpbiBub2RlX21vZHVsZXMgYW5kIHJlcXVpcmUgdmlydHVhbCBtb2R1bGUgbG9hZGluZy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gJ3ZpdGUnO1xuXG5pbXBvcnQgeyBmb3JtYXRFcnJvciwgT3BlbkVsZW1lbnRFcnJvciB9IGZyb20gJ0BvcGVuZWxlbWVudC9jb3JlL2Vycm9ycyc7XG5cbi8qKiBWaXJ0dWFsIG1vZHVsZSBJRCBwcmVmaXggZm9yIEpTUiByZW1vdGUgcmVzb2x1dGlvbiAqL1xuZXhwb3J0IGNvbnN0IFZJUlRVQUxfQ09SRV9QUkVGSVggPSAnXFwwb3BlbmVsZW1lbnQ6Y29yZS9zcmMvJztcblxuLyoqXG4gKiBNYXBwaW5nIG9mIEBvcGVuZWxlbWVudC9jb3JlLyogc3VicGF0aCBzcGVjaWZpZXJzIHRvIHNvdXJjZSBmaWxlc1xuICogKHVzZWQgYnkgSlNSIHJlbW90ZSByZXNvbHV0aW9uIG9ubHkpLlxuICovXG5leHBvcnQgY29uc3QgQ09SRV9TVUJQQVRIUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgbG9nZ2VyOiAnbG9nZ2VyLnRzJyxcbiAgJ2J1aWxkLWNvbnRleHQnOiAnYnVpbGQtY29udGV4dC50cycsXG4gIG5hdmlnYXRpb246ICduYXZpZ2F0aW9uLnRzJyxcbiAgZXJyb3JzOiAnZXJyb3JzLnRzJyxcbn07XG5cbi8vIE0tMDggZml4OiBBZGQgbWF4IHNpemUgbGltaXQgdG8gcHJldmVudCB1bmJvdW5kZWQgbWVtb3J5IGdyb3d0aCBpbiBsb25nIGRldiBzZXNzaW9uc1xuXG5jb25zdCBKU1JfQ0FDSEVfTUFYID0gMTAwO1xuY29uc3QganNyU291cmNlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG5mdW5jdGlvbiBjYWNoZUdldChrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBqc3JTb3VyY2VDYWNoZS5nZXQoa2V5KTtcbn1cblxuZnVuY3Rpb24gY2FjaGVTZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGpzclNvdXJjZUNhY2hlLnNpemUgPj0gSlNSX0NBQ0hFX01BWCkge1xuICAgIC8vIEV2aWN0IG9sZGVzdCBlbnRyeVxuICAgIGNvbnN0IGZpcnN0S2V5ID0ganNyU291cmNlQ2FjaGUua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICBpZiAoZmlyc3RLZXkgIT09IHVuZGVmaW5lZCkganNyU291cmNlQ2FjaGUuZGVsZXRlKGZpcnN0S2V5KTtcbiAgfVxuICBqc3JTb3VyY2VDYWNoZS5zZXQoa2V5LCB2YWx1ZSk7XG59XG5cbmNvbnN0IE9QRU5FTEVNRU5UX1BBQ0tBR0VfU1JDX0JBU0VfUkUgPSAvXFwvQG9wZW5lbGVtZW50XFwvKFteL10rKVxcLyhbXi9dKylcXC9zcmNcXC8uKiQvO1xuXG4vKipcbiAqIEV4dHJhY3QgdGhlIEpTUiBwYWNrYWdlIHNvdXJjZSBiYXNlIFVSTCBmcm9tIGltcG9ydC5tZXRhLnVybC5cbiAqIEhhbmRsZXMgYm90aCBzdGFuZGFyZCBKU1IgcGF0aHMgYW5kIGVkZ2UgY2FzZXMgd2hlcmUgdGhlIHZlcnNpb25cbiAqIHNlZ21lbnQgZGlmZmVycyBmcm9tIGV4cGVjdGF0aW9ucy5cbiAqL1xuZnVuY3Rpb24gZ2V0T3BlblBhY2thZ2VTcmNCYXNlKG1ldGFVcmw6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG1hdGNoID0gbWV0YVVybC5tYXRjaChPUEVORUxFTUVOVF9QQUNLQUdFX1NSQ19CQVNFX1JFKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgcmV0dXJuIG1ldGFVcmwucmVwbGFjZShcbiAgICAgIE9QRU5FTEVNRU5UX1BBQ0tBR0VfU1JDX0JBU0VfUkUsXG4gICAgICBgL0BvcGVuZWxlbWVudC8ke3BhY2thZ2VOYW1lfS8ke21hdGNoWzJdfS9zcmMvYCxcbiAgICApO1xuICB9XG4gIHJldHVybiBtZXRhVXJsXG4gICAgLnJlcGxhY2UoL1xcL0BvcGVuZWxlbWVudFxcL1teL10rQChbXi9dKylcXC9zcmNcXC8uKiQvLCBgL0BvcGVuZWxlbWVudC8ke3BhY2thZ2VOYW1lfS8kMS9zcmMvYClcbiAgICAucmVwbGFjZSgvXFwvc3JjXFwvLiokLywgJy9zcmMvJyk7XG59XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBjb3JlIHN1YnBhdGggcmVzb2x1dGlvbiBwbHVnaW4gZm9yIEpTUiByZW1vdGUgZXhlY3V0aW9uLlxuICpcbiAqIFdoZW4gQG9wZW5lbGVtZW50L2NvcmUgaXMgbG9hZGVkIGZyb20gSlNSIChodHRwczovLyBpbXBvcnQubWV0YS51cmwpLFxuICogVml0ZSdzIFNTUiBydW5uZXIgY2Fubm90IGxvYWQgaHR0cHM6Ly8gVVJMcyB2aWEgTm9kZS5qcyBFU00gbG9hZGVyLlxuICogVGhpcyBwbHVnaW4gaW50ZXJjZXB0cyBAb3BlbmVsZW1lbnQvY29yZS8qIGltcG9ydHMgYW5kIGxvYWRzIHNvdXJjZSBjb2RlXG4gKiB0aHJvdWdoIHZpcnR1YWwgbW9kdWxlcywgYnlwYXNzaW5nIE5vZGUuanMgRVNNIGxvYWRlciBlbnRpcmVseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcmVSZXNvbHZlUGx1Z2luKG1ldGFVcmw6IHN0cmluZyk6IFBsdWdpbiB7XG4gIGNvbnN0IGlzUmVtb3RlID0gbWV0YVVybC5zdGFydHNXaXRoKCdodHRwczovLycpIHx8IG1ldGFVcmwuc3RhcnRzV2l0aCgnaHR0cDovLycpO1xuXG4gIC8vIENvbXB1dGUgSlNSIGJhc2UgVVJMIGZvciBzb3VyY2UgZmV0Y2hpbmcuXG4gIGxldCBqc3JTcmNCYXNlID0gJyc7XG4gIGlmIChpc1JlbW90ZSkge1xuICAgIGpzclNyY0Jhc2UgPSBnZXRPcGVuUGFja2FnZVNyY0Jhc2UobWV0YVVybCwgJ2NvcmUnKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ29wZW46Y29yZS1yZXNvbHZlJyxcbiAgICBlbmZvcmNlOiAncHJlJyxcblxuICAgIHJlc29sdmVJZChzb3VyY2UsIGltcG9ydGVyLCBvcHRpb25zKSB7XG4gICAgICBpZiAoIWlzUmVtb3RlKSByZXR1cm47XG5cbiAgICAgIC8vIENhc2UgMTogQmFyZSBzcGVjaWZpZXIgQG9wZW5lbGVtZW50L2NvcmUgb3IgQG9wZW5lbGVtZW50L2NvcmUvKlxuICAgICAgaWYgKHNvdXJjZSA9PT0gJ0BvcGVuZWxlbWVudC9jb3JlJyB8fCBzb3VyY2Uuc3RhcnRzV2l0aCgnQG9wZW5lbGVtZW50L2NvcmUvJykpIHtcbiAgICAgICAgY29uc3Qgc3VicGF0aCA9IHNvdXJjZSA9PT0gJ0BvcGVuZWxlbWVudC9jb3JlJ1xuICAgICAgICAgID8gJ2luZGV4LnRzJ1xuICAgICAgICAgIDogQ09SRV9TVUJQQVRIU1tzb3VyY2Uuc2xpY2UoJ0BvcGVuZWxlbWVudC9jb3JlLycubGVuZ3RoKV0gfHxcbiAgICAgICAgICAgIGAke3NvdXJjZS5zbGljZSgnQG9wZW5lbGVtZW50L2NvcmUvJy5sZW5ndGgpfS50c2A7XG4gICAgICAgIHJldHVybiBgJHtWSVJUVUFMX0NPUkVfUFJFRklYfSR7c3VicGF0aH1gO1xuICAgICAgfVxuXG4gICAgICAvLyBDYXNlIDI6IFJlbGF0aXZlIGltcG9ydHMgZnJvbSB3aXRoaW4gb3VyIHZpcnR1YWwgbW9kdWxlc1xuICAgICAgaWYgKFxuICAgICAgICBpbXBvcnRlcj8uc3RhcnRzV2l0aChWSVJUVUFMX0NPUkVfUFJFRklYKSAmJlxuICAgICAgICBzb3VyY2Uuc3RhcnRzV2l0aCgnLi8nKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGltcG9ydGVyRGlyID0gaW1wb3J0ZXIucmVwbGFjZSgvWy9cXFxcXVteL1xcXFxdKyQvLCAnJyk7XG4gICAgICAgIHJldHVybiBgJHtpbXBvcnRlckRpcn0vJHtzb3VyY2Uuc2xpY2UoMil9YDtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FzZSAzOiBUaGlyZC1wYXJ0eSBiYXJlIHNwZWNpZmllcnMgZnJvbSB2aXJ0dWFsIG1vZHVsZXNcbiAgICAgIGlmIChcbiAgICAgICAgaW1wb3J0ZXI/LnN0YXJ0c1dpdGgoVklSVFVBTF9DT1JFX1BSRUZJWCkgJiZcbiAgICAgICAgIXNvdXJjZS5zdGFydHNXaXRoKCcvJykgJiZcbiAgICAgICAgIXNvdXJjZS5zdGFydHNXaXRoKCcuJykgJiZcbiAgICAgICAgIXNvdXJjZS5zdGFydHNXaXRoKCdcXDAnKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc29sdmUoc291cmNlLCB1bmRlZmluZWQsIHsgLi4ub3B0aW9ucywgc2tpcFNlbGY6IHRydWUgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENhc2UgNDogQWxyZWFkeS1yZXNvbHZlZCB2aXJ0dWFsIElEcyAocmUtcmVzb2x2ZSBzYWZlZ3VhcmQpXG4gICAgICBpZiAoc291cmNlLnN0YXJ0c1dpdGgoVklSVFVBTF9DT1JFX1BSRUZJWCkpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgbG9hZChpZCkge1xuICAgICAgaWYgKCFpc1JlbW90ZSkgcmV0dXJuO1xuICAgICAgaWYgKCFpZC5zdGFydHNXaXRoKFZJUlRVQUxfQ09SRV9QUkVGSVgpKSByZXR1cm47XG5cbiAgICAgIC8vIENoZWNrIGNhY2hlXG4gICAgICBpZiAoanNyU291cmNlQ2FjaGUuaGFzKGlkKSkgcmV0dXJuIGNhY2hlR2V0KGlkKTtcblxuICAgICAgLy8gTm9ybWFsaXplIC5qcyAtPiAudHMgKERlbm8gY29udmVudGlvbjogaW1wb3J0cyB1c2UgLmpzLCBmaWxlcyBhcmUgLnRzKVxuICAgICAgbGV0IGZpbGVQYXRoID0gaWQuc2xpY2UoVklSVFVBTF9DT1JFX1BSRUZJWC5sZW5ndGgpO1xuICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcuanMnKSAmJiAhZmlsZVBhdGguZW5kc1dpdGgoJy50cycpKSB7XG4gICAgICAgIGZpbGVQYXRoID0gZmlsZVBhdGguc2xpY2UoMCwgLTMpICsgJy50cyc7XG4gICAgICB9XG5cbiAgICAgIC8vIEZldGNoIFR5cGVTY3JpcHQgc291cmNlIGZyb20gSlNSXG4gICAgICBjb25zdCB1cmwgPSBgJHtqc3JTcmNCYXNlfSR7ZmlsZVBhdGh9YDtcbiAgICAgIGxldCB0c0NvZGU6IHN0cmluZztcbiAgICAgIC8vIE0tMDkgZml4OiBBZGQgMzBzIHRpbWVvdXQgZm9yIEpTUiBmZXRjaGVzIHRvIHByZXZlbnQgaGFuZ2luZyBidWlsZHNcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgMzBfMDAwKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KTtcbiAgICAgICAgaWYgKCFyZXNwLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFtvcGVuOmNvcmUtcmVzb2x2ZV0gRmFpbGVkIHRvIGZldGNoICR7dXJsfTogSFRUUCAke3Jlc3Auc3RhdHVzfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0c0NvZGUgPSBhd2FpdCByZXNwLnRleHQoKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIHRocm93IG5ldyBPcGVuRWxlbWVudEVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBAb3BlbmVsZW1lbnQvY29yZSBtb2R1bGUgZnJvbSBKU1I6ICR7ZmlsZVBhdGh9LiBgICtcbiAgICAgICAgICAgIGBVUkw6ICR7dXJsfS4gRXJyb3I6ICR7Zm9ybWF0RXJyb3IoZXJyKX1gLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvZGU6ICdKU1JfRkVUQ0hfRVJST1InLFxuICAgICAgICAgICAgc3RhdHVzQ29kZTogNTAwLFxuICAgICAgICAgICAgcmVjb3ZlcmFibGU6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbXBpbGUgVHlwZVNjcmlwdCAtPiBKYXZhU2NyaXB0IHZpYSBWaXRlJ3MgYnVuZGxlZCBlc2J1aWxkIHRyYW5zZm9ybVxuICAgICAgbGV0IGpzQ29kZTogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyB0cmFuc2Zvcm1XaXRoRXNidWlsZCB9ID0gYXdhaXQgaW1wb3J0KCd2aXRlJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybVdpdGhFc2J1aWxkKHRzQ29kZSwgZmlsZVBhdGgsIHtcbiAgICAgICAgICBsb2FkZXI6ICd0cycsXG4gICAgICAgICAgdGFyZ2V0OiAnZXNuZXh0JyxcbiAgICAgICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgICB9KTtcbiAgICAgICAganNDb2RlID0gcmVzdWx0LmNvZGU7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IE9wZW5FbGVtZW50RXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBjb21waWxlIEBvcGVuZWxlbWVudC9jb3JlIG1vZHVsZSBmcm9tIEpTUjogJHtmaWxlUGF0aH0uIGAgK1xuICAgICAgICAgICAgYEVycm9yOiAke2Zvcm1hdEVycm9yKGVycil9YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2RlOiAnSlNSX0NPTVBJTEVfRVJST1InLFxuICAgICAgICAgICAgc3RhdHVzQ29kZTogNTAwLFxuICAgICAgICAgICAgcmVjb3ZlcmFibGU6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFBvc3QtcHJvY2VzczogcmV3cml0ZSBucG06IHNwZWNpZmllcnMgdG8gYmFyZSBzcGVjaWZpZXJzLlxuICAgICAganNDb2RlID0ganNDb2RlLnJlcGxhY2UoXG4gICAgICAgIC8oW1wiJ10pbnBtOihbXlwiJ10rKVxcMS9nLFxuICAgICAgICAoXzogc3RyaW5nLCBxdW90ZTogc3RyaW5nLCBzcGVjaWZpZXI6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzU2NvcGVkID0gc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ0AnKTtcbiAgICAgICAgICBjb25zdCB3aXRob3V0U2NvcGUgPSBpc1Njb3BlZCA/IHNwZWNpZmllci5zbGljZSgxKSA6IHNwZWNpZmllcjtcbiAgICAgICAgICBjb25zdCBuYW1lUGFydCA9IHdpdGhvdXRTY29wZS5zcGxpdCgnQCcpWzBdO1xuICAgICAgICAgIHJldHVybiBgJHtxdW90ZX0ke2lzU2NvcGVkID8gJ0AnIDogJyd9JHtuYW1lUGFydH0ke3F1b3RlfWA7XG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBjYWNoZVNldChpZCwganNDb2RlKTtcbiAgICAgIHJldHVybiBqc0NvZGU7XG4gICAgfSxcbiAgfTtcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0NBWUMsR0FJRCxTQUFTLFdBQVcsRUFBRSxnQkFBZ0IsUUFBUSwyQkFBMkI7QUFFekUsdURBQXVELEdBQ3ZELE9BQU8sTUFBTSxzQkFBc0IsMEJBQTBCO0FBRTdEOzs7Q0FHQyxHQUNELE9BQU8sTUFBTSxnQkFBd0M7RUFDbkQsUUFBUTtFQUNSLGlCQUFpQjtFQUNqQixZQUFZO0VBQ1osUUFBUTtBQUNWLEVBQUU7QUFFRix1RkFBdUY7QUFFdkYsTUFBTSxnQkFBZ0I7QUFDdEIsTUFBTSxpQkFBaUIsSUFBSTtBQUUzQixTQUFTLFNBQVMsR0FBVztFQUMzQixPQUFPLGVBQWUsR0FBRyxDQUFDO0FBQzVCO0FBRUEsU0FBUyxTQUFTLEdBQVcsRUFBRSxLQUFhO0VBQzFDLElBQUksZUFBZSxJQUFJLElBQUksZUFBZTtJQUN4QyxxQkFBcUI7SUFDckIsTUFBTSxXQUFXLGVBQWUsSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLO0lBQ25ELElBQUksYUFBYSxXQUFXLGVBQWUsTUFBTSxDQUFDO0VBQ3BEO0VBQ0EsZUFBZSxHQUFHLENBQUMsS0FBSztBQUMxQjtBQUVBLE1BQU0sa0NBQWtDO0FBRXhDOzs7O0NBSUMsR0FDRCxTQUFTLHNCQUFzQixPQUFlLEVBQUUsV0FBbUI7RUFDakUsTUFBTSxRQUFRLFFBQVEsS0FBSyxDQUFD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
@@ -0,0 +1,113 @@
1
+ import { Deno } from "@deno/shim-deno";
2
+ /**
3
+ * @openelement/adapter-vite - Workspace alias auto-generation
4
+ *
5
+ * Reads Deno workspace deno.json exports and generates
6
+ * Vite resolve.alias entries. Uses sync Deno APIs so it
7
+ * can run in synchronous plugin hooks (config, configResolved).
8
+ */ import { resolve } from 'node:path';
9
+ function tryReadJson(path) {
10
+ try {
11
+ // H-12 fix: Use platform-appropriate file reading API
12
+ // Deno.readTextFileSync in Deno environments, node:fs in Node.js (Vite)
13
+ const content = typeof Deno !== 'undefined' ? Deno.readTextFileSync(path) : require('node:fs').readFileSync(path, 'utf-8');
14
+ // deno.json files may contain comments - strip them before JSON.parse.
15
+ // Naive regex breaks URLs (https:// -> https:), so we walk character by character,
16
+ // tracking whether we're inside a string literal.
17
+ let result = '';
18
+ let inString = false;
19
+ let escape = false;
20
+ for(let i = 0; i < content.length; i++){
21
+ const ch = content[i];
22
+ if (escape) {
23
+ result += ch;
24
+ escape = false;
25
+ continue;
26
+ }
27
+ if (ch === '\\') {
28
+ result += ch;
29
+ escape = true;
30
+ continue;
31
+ }
32
+ if (ch === '"') {
33
+ inString = !inString;
34
+ result += ch;
35
+ continue;
36
+ }
37
+ if (!inString && ch === '/' && content[i + 1] === '/') {
38
+ // Skip until end of line
39
+ while(i < content.length && content[i] !== '\n')i++;
40
+ result += '\n';
41
+ continue;
42
+ }
43
+ if (!inString && ch === '/' && content[i + 1] === '*') {
44
+ // Skip until */
45
+ i += 2;
46
+ while(i < content.length && !(content[i] === '*' && content[i + 1] === '/'))i++;
47
+ i++; // skip past */
48
+ result += ' ';
49
+ continue;
50
+ }
51
+ result += ch;
52
+ }
53
+ return JSON.parse(result);
54
+ } catch {
55
+ return null;
56
+ }
57
+ }
58
+ /**
59
+ * Walk up from startDir to find a deno.json with a "workspace" field.
60
+ */ export function findWorkspaceRoot(startDir) {
61
+ let dir = resolve(startDir);
62
+ const fsRoot = resolve('/');
63
+ while(dir !== fsRoot && dir !== resolve(dir, '..')){
64
+ const cfg = tryReadJson(resolve(dir, 'deno.json'));
65
+ if (cfg?.workspace && Array.isArray(cfg.workspace)) return dir;
66
+ dir = resolve(dir, '..');
67
+ }
68
+ return null;
69
+ }
70
+ /**
71
+ * Generate Vite resolve.alias from workspace packages' deno.json exports.
72
+ * Subpath aliases come before parent (Vite prefix matching rule).
73
+ */ export function generateWorkspaceAliases(workspaceRoot) {
74
+ const rootCfg = tryReadJson(resolve(workspaceRoot, 'deno.json'));
75
+ if (!rootCfg) return [];
76
+ const members = rootCfg.workspace || [];
77
+ const aliases = [];
78
+ for (const member of members){
79
+ const memberDir = resolve(workspaceRoot, member);
80
+ const memberCfg = tryReadJson(resolve(memberDir, 'deno.json'));
81
+ if (!memberCfg) continue;
82
+ const name = memberCfg.name;
83
+ const exports = memberCfg.exports;
84
+ if (!name || !exports) continue;
85
+ if (typeof exports === 'string') {
86
+ aliases.push({
87
+ find: name,
88
+ replacement: resolve(memberDir, exports)
89
+ });
90
+ continue;
91
+ }
92
+ // Subpath aliases first (Vite prefix matching)
93
+ for (const [exportPath, sourcePath] of Object.entries(exports)){
94
+ if (exportPath === '.') continue;
95
+ const subpath = exportPath.replace(/^\.\//, '/');
96
+ aliases.push({
97
+ find: `${name}${subpath}`,
98
+ replacement: resolve(memberDir, sourcePath)
99
+ });
100
+ }
101
+ // Parent alias last. Subpath aliases above already handle every exported
102
+ // subpath, so a direct import of the package name resolves to the "./"
103
+ // export entry without falling through to directory-index heuristics.
104
+ if (exports['.']) {
105
+ aliases.push({
106
+ find: name,
107
+ replacement: resolve(memberDir, exports['.'])
108
+ });
109
+ }
110
+ }
111
+ return aliases;
112
+ }
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9hZGFwdGVyLXZpdGUvc3JjL3dvcmtzcGFjZS1hbGlhcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZW5vIH0gZnJvbSBcIkBkZW5vL3NoaW0tZGVub1wiO1xuLyoqXG4gKiBAb3BlbmVsZW1lbnQvYWRhcHRlci12aXRlIC0gV29ya3NwYWNlIGFsaWFzIGF1dG8tZ2VuZXJhdGlvblxuICpcbiAqIFJlYWRzIERlbm8gd29ya3NwYWNlIGRlbm8uanNvbiBleHBvcnRzIGFuZCBnZW5lcmF0ZXNcbiAqIFZpdGUgcmVzb2x2ZS5hbGlhcyBlbnRyaWVzLiBVc2VzIHN5bmMgRGVubyBBUElzIHNvIGl0XG4gKiBjYW4gcnVuIGluIHN5bmNocm9ub3VzIHBsdWdpbiBob29rcyAoY29uZmlnLCBjb25maWdSZXNvbHZlZCkuXG4gKi9cblxuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWxpYXNFbnRyeSB7XG4gIGZpbmQ6IHN0cmluZztcbiAgcmVwbGFjZW1lbnQ6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gdHJ5UmVhZEpzb24ocGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHtcbiAgdHJ5IHtcbiAgICAvLyBILTEyIGZpeDogVXNlIHBsYXRmb3JtLWFwcHJvcHJpYXRlIGZpbGUgcmVhZGluZyBBUElcbiAgICAvLyBEZW5vLnJlYWRUZXh0RmlsZVN5bmMgaW4gRGVubyBlbnZpcm9ubWVudHMsIG5vZGU6ZnMgaW4gTm9kZS5qcyAoVml0ZSlcbiAgICBjb25zdCBjb250ZW50ID0gdHlwZW9mIERlbm8gIT09ICd1bmRlZmluZWQnXG4gICAgICA/IERlbm8ucmVhZFRleHRGaWxlU3luYyhwYXRoKVxuICAgICAgOiByZXF1aXJlKCdub2RlOmZzJykucmVhZEZpbGVTeW5jKHBhdGgsICd1dGYtOCcpO1xuICAgIC8vIGRlbm8uanNvbiBmaWxlcyBtYXkgY29udGFpbiBjb21tZW50cyAtIHN0cmlwIHRoZW0gYmVmb3JlIEpTT04ucGFyc2UuXG4gICAgLy8gTmFpdmUgcmVnZXggYnJlYWtzIFVSTHMgKGh0dHBzOi8vIC0+IGh0dHBzOiksIHNvIHdlIHdhbGsgY2hhcmFjdGVyIGJ5IGNoYXJhY3RlcixcbiAgICAvLyB0cmFja2luZyB3aGV0aGVyIHdlJ3JlIGluc2lkZSBhIHN0cmluZyBsaXRlcmFsLlxuICAgIGxldCByZXN1bHQgPSAnJztcbiAgICBsZXQgaW5TdHJpbmcgPSBmYWxzZTtcbiAgICBsZXQgZXNjYXBlID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaCA9IGNvbnRlbnRbaV07XG4gICAgICBpZiAoZXNjYXBlKSB7XG4gICAgICAgIHJlc3VsdCArPSBjaDtcbiAgICAgICAgZXNjYXBlID0gZmFsc2U7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoID09PSAnXFxcXCcpIHtcbiAgICAgICAgcmVzdWx0ICs9IGNoO1xuICAgICAgICBlc2NhcGUgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaCA9PT0gJ1wiJykge1xuICAgICAgICBpblN0cmluZyA9ICFpblN0cmluZztcbiAgICAgICAgcmVzdWx0ICs9IGNoO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghaW5TdHJpbmcgJiYgY2ggPT09ICcvJyAmJiBjb250ZW50W2kgKyAxXSA9PT0gJy8nKSB7XG4gICAgICAgIC8vIFNraXAgdW50aWwgZW5kIG9mIGxpbmVcbiAgICAgICAgd2hpbGUgKGkgPCBjb250ZW50Lmxlbmd0aCAmJiBjb250ZW50W2ldICE9PSAnXFxuJykgaSsrO1xuICAgICAgICByZXN1bHQgKz0gJ1xcbic7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFpblN0cmluZyAmJiBjaCA9PT0gJy8nICYmIGNvbnRlbnRbaSArIDFdID09PSAnKicpIHtcbiAgICAgICAgLy8gU2tpcCB1bnRpbCAqL1xuICAgICAgICBpICs9IDI7XG4gICAgICAgIHdoaWxlIChpIDwgY29udGVudC5sZW5ndGggJiYgIShjb250ZW50W2ldID09PSAnKicgJiYgY29udGVudFtpICsgMV0gPT09ICcvJykpIGkrKztcbiAgICAgICAgaSsrOyAvLyBza2lwIHBhc3QgKi9cbiAgICAgICAgcmVzdWx0ICs9ICcgJztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gY2g7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogV2FsayB1cCBmcm9tIHN0YXJ0RGlyIHRvIGZpbmQgYSBkZW5vLmpzb24gd2l0aCBhIFwid29ya3NwYWNlXCIgZmllbGQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kV29ya3NwYWNlUm9vdChzdGFydERpcjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGxldCBkaXIgPSByZXNvbHZlKHN0YXJ0RGlyKTtcbiAgY29uc3QgZnNSb290ID0gcmVzb2x2ZSgnLycpO1xuICB3aGlsZSAoZGlyICE9PSBmc1Jvb3QgJiYgZGlyICE9PSByZXNvbHZlKGRpciwgJy4uJykpIHtcbiAgICBjb25zdCBjZmcgPSB0cnlSZWFkSnNvbihyZXNvbHZlKGRpciwgJ2Rlbm8uanNvbicpKTtcbiAgICBpZiAoY2ZnPy53b3Jrc3BhY2UgJiYgQXJyYXkuaXNBcnJheShjZmcud29ya3NwYWNlKSkgcmV0dXJuIGRpcjtcbiAgICBkaXIgPSByZXNvbHZlKGRpciwgJy4uJyk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgVml0ZSByZXNvbHZlLmFsaWFzIGZyb20gd29ya3NwYWNlIHBhY2thZ2VzJyBkZW5vLmpzb24gZXhwb3J0cy5cbiAqIFN1YnBhdGggYWxpYXNlcyBjb21lIGJlZm9yZSBwYXJlbnQgKFZpdGUgcHJlZml4IG1hdGNoaW5nIHJ1bGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVXb3Jrc3BhY2VBbGlhc2VzKHdvcmtzcGFjZVJvb3Q6IHN0cmluZyk6IEFsaWFzRW50cnlbXSB7XG4gIGNvbnN0IHJvb3RDZmcgPSB0cnlSZWFkSnNvbihyZXNvbHZlKHdvcmtzcGFjZVJvb3QsICdkZW5vLmpzb24nKSk7XG4gIGlmICghcm9vdENmZykgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IG1lbWJlcnM6IHN0cmluZ1tdID0gKHJvb3RDZmcud29ya3NwYWNlIGFzIHN0cmluZ1tdKSB8fCBbXTtcbiAgY29uc3QgYWxpYXNlczogQWxpYXNFbnRyeVtdID0gW107XG5cbiAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycykge1xuICAgIGNvbnN0IG1lbWJlckRpciA9IHJlc29sdmUod29ya3NwYWNlUm9vdCwgbWVtYmVyKTtcbiAgICBjb25zdCBtZW1iZXJDZmcgPSB0cnlSZWFkSnNvbihyZXNvbHZlKG1lbWJlckRpciwgJ2Rlbm8uanNvbicpKTtcbiAgICBpZiAoIW1lbWJlckNmZykgY29udGludWU7XG5cbiAgICBjb25zdCBuYW1lID0gbWVtYmVyQ2ZnLm5hbWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGV4cG9ydHMgPSBtZW1iZXJDZmcuZXhwb3J0cyBhc1xuICAgICAgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgICB8IHN0cmluZ1xuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFuYW1lIHx8ICFleHBvcnRzKSBjb250aW51ZTtcblxuICAgIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGFsaWFzZXMucHVzaCh7IGZpbmQ6IG5hbWUsIHJlcGxhY2VtZW50OiByZXNvbHZlKG1lbWJlckRpciwgZXhwb3J0cykgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBTdWJwYXRoIGFsaWFzZXMgZmlyc3QgKFZpdGUgcHJlZml4IG1hdGNoaW5nKVxuICAgIGZvciAoY29uc3QgW2V4cG9ydFBhdGgsIHNvdXJjZVBhdGhdIG9mIE9iamVjdC5lbnRyaWVzKGV4cG9ydHMpKSB7XG4gICAgICBpZiAoZXhwb3J0UGF0aCA9PT0gJy4nKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHN1YnBhdGggPSBleHBvcnRQYXRoLnJlcGxhY2UoL15cXC5cXC8vLCAnLycpO1xuICAgICAgYWxpYXNlcy5wdXNoKHtcbiAgICAgICAgZmluZDogYCR7bmFtZX0ke3N1YnBhdGh9YCxcbiAgICAgICAgcmVwbGFjZW1lbnQ6IHJlc29sdmUobWVtYmVyRGlyLCBzb3VyY2VQYXRoIGFzIHN0cmluZyksXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gUGFyZW50IGFsaWFzIGxhc3QuIFN1YnBhdGggYWxpYXNlcyBhYm92ZSBhbHJlYWR5IGhhbmRsZSBldmVyeSBleHBvcnRlZFxuICAgIC8vIHN1YnBhdGgsIHNvIGEgZGlyZWN0IGltcG9ydCBvZiB0aGUgcGFja2FnZSBuYW1lIHJlc29sdmVzIHRvIHRoZSBcIi4vXCJcbiAgICAvLyBleHBvcnQgZW50cnkgd2l0aG91dCBmYWxsaW5nIHRocm91Z2ggdG8gZGlyZWN0b3J5LWluZGV4IGhldXJpc3RpY3MuXG4gICAgaWYgKGV4cG9ydHNbJy4nXSkge1xuICAgICAgYWxpYXNlcy5wdXNoKHtcbiAgICAgICAgZmluZDogbmFtZSxcbiAgICAgICAgcmVwbGFjZW1lbnQ6IHJlc29sdmUobWVtYmVyRGlyLCBleHBvcnRzWycuJ10gYXMgc3RyaW5nKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYWxpYXNlcztcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxTQUFTLElBQUksUUFBUSxrQkFBa0I7QUFDdkM7Ozs7OztDQU1DLEdBRUQsU0FB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