@mostfeatured/dbi 0.2.8 → 0.2.10

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.
@@ -1 +1 @@
1
- {"version":3,"file":"svelteRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/types/Components/HTMLComponentsV2/svelteRenderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAErE,OAAO,EAA8C,mBAAmB,EAAwB,MAAM,gBAAgB,CAAC;AAGvH,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,GAAG,EAAE,CAAC;IAClB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,QAAQ,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;IAC7D,aAAa,EAAE,mBAAmB,CAAC;CACpC;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,GAAG,CAAC,cAAc,CAAC,EACxB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAyG7B;AA4LD;;GAEG;AACH,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,GAAG,CAAC,cAAc,CAAC,EACxB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAI7B"}
1
+ {"version":3,"file":"svelteRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/types/Components/HTMLComponentsV2/svelteRenderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAErE,OAAO,EAA8C,mBAAmB,EAAwB,MAAM,gBAAgB,CAAC;AAIvH,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,GAAG,EAAE,CAAC;IAClB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,QAAQ,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;IAC7D,aAAa,EAAE,mBAAmB,CAAC;CACpC;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,GAAG,CAAC,cAAc,CAAC,EACxB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CA8F7B;AA4KD;;GAEG;AACH,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,GAAG,CAAC,cAAc,CAAC,EACxB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAI7B"}
@@ -7,6 +7,7 @@ const compiler_1 = require("svelte/compiler");
7
7
  const parser_1 = require("./parser");
8
8
  const svelteParser_1 = require("./svelteParser");
9
9
  const stuffs = tslib_1.__importStar(require("stuffs"));
10
+ const vm = tslib_1.__importStar(require("vm"));
10
11
  /**
11
12
  * Compile and render a Svelte component to Discord components
12
13
  */
@@ -17,7 +18,7 @@ async function renderSvelteComponent(dbi, source, dbiName, options = {}) {
17
18
  const componentInfo = await (0, svelteParser_1.parseSvelteComponent)(source, data);
18
19
  // Use the processed source (with auto-generated names injected)
19
20
  const processedSource = componentInfo.processedSource;
20
- // Compile the Svelte component for SSR
21
+ // Compile the Svelte component for SSR (Svelte 5)
21
22
  const compiled = (0, compiler_1.compile)(processedSource, {
22
23
  generate: "server",
23
24
  css: "injected",
@@ -27,20 +28,15 @@ async function renderSvelteComponent(dbi, source, dbiName, options = {}) {
27
28
  let html = "";
28
29
  try {
29
30
  const moduleContext = createModuleContext(dbi, data, ttl);
30
- const componentModule = evaluateCompiledComponent(compiled.js.code, moduleContext);
31
- // Render the component with props (include data in props)
32
- const renderResult = componentModule.render({ ...data, data });
33
- html = renderResult.html || renderResult.body || "";
34
- // Debug: Log rendered HTML
35
- if (process.env.DEBUG_SVELTE) {
36
- console.log("Rendered HTML:", html);
37
- }
31
+ const Component = evaluateCompiledComponent(compiled.js.code, moduleContext);
32
+ // Svelte 5 SSR: Use render from svelte/server
33
+ const { render } = require("svelte/server");
34
+ const renderResult = render(Component, { props: { ...data, data } });
35
+ html = renderResult.body || "";
38
36
  }
39
37
  catch (error) {
40
- console.error("Error rendering Svelte component:", error);
41
38
  throw error;
42
39
  }
43
- console.log("Rendered HTML:", html);
44
40
  // For Svelte mode, inject state into interactive elements as a ref
45
41
  // Reuse existing ref if data already has one, otherwise create new
46
42
  if (data && Object.keys(data).length > 0) {
@@ -79,10 +75,8 @@ async function renderSvelteComponent(dbi, source, dbiName, options = {}) {
79
75
  return `<${tag}${attrs} data-1:ref="${stateRefId}">`;
80
76
  });
81
77
  }
82
- console.log("HTML with state:", html);
83
78
  // Parse the rendered HTML to Discord components
84
79
  const components = (0, parser_1.parseHTMLComponentsV2)(dbi, html, dbiName, { data, ttl });
85
- console.log("Parsed Components:", JSON.stringify(components, null, 2));
86
80
  // Create handler context (also captures $effect callbacks)
87
81
  const handlerContext = (0, svelteParser_1.createHandlerContext)(componentInfo.scriptContent, data);
88
82
  const handlers = new Map();
@@ -128,158 +122,121 @@ function createModuleContext(dbi, data, ttl) {
128
122
  */
129
123
  function evaluateCompiledComponent(code, context) {
130
124
  try {
131
- // Aggressively strip ALL import statements
132
- // Svelte 5 generates imports with special chars like $ that need careful handling
125
+ // Load Svelte 5 internal runtime
126
+ const svelteInternal = require("svelte/internal/server");
127
+ // Process the code to work in our context
133
128
  let processedCode = code;
134
- // Remove all lines that start with 'import' (most reliable approach)
129
+ // Collect external modules to inject into sandbox
130
+ const externalModules = {};
131
+ // Replace svelte internal imports
132
+ processedCode = processedCode.replace(/import\s*\*\s*as\s*(\w+)\s*from\s*["']svelte\/internal\/server["'];?/g, 'const $1 = __svelteInternal;');
133
+ processedCode = processedCode.replace(/import\s*\{([^}]+)\}\s*from\s*["']svelte\/internal\/server["'];?/g, (match, imports) => {
134
+ const importList = imports.split(',').map((i) => i.trim());
135
+ return `const { ${importList.join(', ')} } = __svelteInternal;`;
136
+ });
137
+ // Handle external module imports (default imports)
138
+ processedCode = processedCode.replace(/import\s+(\w+)\s+from\s*["']([^"']+)["'];?/g, (match, varName, modulePath) => {
139
+ // Skip svelte imports
140
+ if (modulePath.startsWith('svelte'))
141
+ return '';
142
+ try {
143
+ const mod = require(modulePath);
144
+ externalModules[varName] = mod.default || mod;
145
+ return `const ${varName} = __externalModules.${varName};`;
146
+ }
147
+ catch (e) {
148
+ return '';
149
+ }
150
+ });
151
+ // Handle named imports from external modules
152
+ processedCode = processedCode.replace(/import\s*\{([^}]+)\}\s*from\s*["']([^"']+)["'];?/g, (match, imports, modulePath) => {
153
+ // Skip svelte imports
154
+ if (modulePath.startsWith('svelte'))
155
+ return '';
156
+ try {
157
+ const mod = require(modulePath);
158
+ const importList = imports.split(',').map((i) => i.trim());
159
+ importList.forEach((importName) => {
160
+ const [name, alias] = importName.split(' as ').map(s => s.trim());
161
+ externalModules[alias || name] = mod[name] || mod.default?.[name];
162
+ });
163
+ return importList.map((importName) => {
164
+ const [name, alias] = importName.split(' as ').map(s => s.trim());
165
+ return `const ${alias || name} = __externalModules.${alias || name};`;
166
+ }).join('\n');
167
+ }
168
+ catch (e) {
169
+ return '';
170
+ }
171
+ });
172
+ // Handle namespace imports from external modules
173
+ processedCode = processedCode.replace(/import\s*\*\s*as\s*(\w+)\s*from\s*["']([^"']+)["'];?/g, (match, varName, modulePath) => {
174
+ // Skip svelte imports
175
+ if (modulePath.startsWith('svelte'))
176
+ return '';
177
+ try {
178
+ const mod = require(modulePath);
179
+ externalModules[varName] = mod;
180
+ return `const ${varName} = __externalModules.${varName};`;
181
+ }
182
+ catch (e) {
183
+ return '';
184
+ }
185
+ });
186
+ // Remove any remaining import statements
135
187
  processedCode = processedCode
136
188
  .split('\n')
137
189
  .filter(line => !line.trim().startsWith('import '))
138
190
  .join('\n');
139
- // Also remove 'export default' and replace with assignment
140
- processedCode = processedCode.replace(/export\s+default\s+/g, 'module.exports = ');
141
- // Create exports object
142
- const exports = {};
143
- const module = { exports };
144
- // Provide Svelte 5 server runtime functions
145
- // The compiled code references these via the $ namespace
146
- const $ = {
147
- // Escape functions
148
- escape: (str) => String(str)
149
- .replace(/&/g, "&amp;")
150
- .replace(/</g, "&lt;")
151
- .replace(/>/g, "&gt;")
152
- .replace(/"/g, "&quot;")
153
- .replace(/'/g, "&#39;"),
154
- escape_text: (str) => String(str)
155
- .replace(/&/g, "&amp;")
156
- .replace(/</g, "&lt;")
157
- .replace(/>/g, "&gt;"),
158
- escape_attribute_value: (str) => String(str)
159
- .replace(/"/g, "&quot;")
160
- .replace(/'/g, "&#39;"),
161
- // Array helpers for {#each}
162
- ensure_array_like: (value) => {
163
- if (Array.isArray(value))
164
- return value;
165
- if (value == null)
166
- return [];
167
- if (typeof value === 'object' && Symbol.iterator in value) {
168
- return Array.from(value);
169
- }
170
- return [value];
171
- },
172
- // Renderer methods
173
- component: (fn) => fn,
174
- push: (content) => content,
175
- pop: () => { },
176
- attr: (name, value, is_boolean) => {
177
- if (is_boolean && !value)
178
- return '';
179
- if (value == null)
180
- return '';
181
- return ` ${name}="${String(value)}"`;
182
- },
183
- spread_attributes: (attrs) => {
184
- return Object.entries(attrs)
185
- .map(([key, value]) => ` ${key}="${String(value)}"`)
186
- .join('');
187
- },
188
- spread_props: (props) => props,
189
- bind_props: (props, names) => {
190
- const result = {};
191
- names.forEach(name => {
192
- if (name in props)
193
- result[name] = props[name];
194
- });
195
- return result;
196
- },
197
- stringify: (value) => JSON.stringify(value),
198
- store_get: (store) => store,
199
- unsubscribe_stores: () => { },
200
- // Control flow
201
- each: (items, fn) => {
202
- return items.map((item, index) => fn(item, index)).join('');
203
- },
204
- // Lifecycle
191
+ // Replace 'export default' with assignment
192
+ processedCode = processedCode.replace(/export\s+default\s+/g, '__exports.default = ');
193
+ // Replace 'export function' with assignment
194
+ processedCode = processedCode.replace(/export\s+function\s+(\w+)/g, '__exports.$1 = function $1');
195
+ // Replace 'export const' with assignment
196
+ processedCode = processedCode.replace(/export\s+const\s+(\w+)/g, '__exports.$1 = ');
197
+ // Replace 'export let' with assignment
198
+ processedCode = processedCode.replace(/export\s+let\s+(\w+)/g, '__exports.$1 = ');
199
+ // Create the sandbox context
200
+ const __exports = {};
201
+ // Svelte lifecycle functions - no-ops for SSR
202
+ const svelteLifecycle = {
203
+ onMount: () => () => { }, // Returns cleanup function
204
+ onDestroy: () => { },
205
+ beforeUpdate: () => { },
206
+ afterUpdate: () => { },
205
207
  tick: () => Promise.resolve(),
206
- flush: () => { },
207
- // Validation
208
- validate_component: (component) => component,
209
- validate_store: (store) => store,
210
- // Misc
211
- noop: () => { },
212
- run: (fn) => fn(),
213
- run_all: (fns) => fns.forEach(f => f()),
214
- is_promise: (value) => value && typeof value.then === 'function',
215
- missing_component: { $$render: () => '' },
208
+ untrack: (fn) => fn(),
209
+ createEventDispatcher: () => () => { },
216
210
  };
217
- // Create renderer object that accumulates HTML
218
- let html = '';
219
- const $$renderer = {
220
- out: '',
221
- head: '',
222
- component: (fn) => {
223
- return fn($$renderer);
224
- },
225
- push: (content) => {
226
- html += content;
227
- return $$renderer;
228
- },
229
- pop: () => $$renderer,
230
- element: (tag, fn) => {
231
- html += `<${tag}`;
232
- fn();
233
- html += `>`;
234
- return $$renderer;
235
- },
236
- close: (tag) => {
237
- html += `</${tag}>`;
238
- return $$renderer;
239
- },
240
- };
241
- // Create a function wrapper with all context and Svelte runtime
242
- // Include lifecycle stubs - these are no-ops in SSR but need to be defined
243
- const allContext = {
211
+ // Note: Svelte 5 runes ($state, $derived, etc.) are compile-time features
212
+ // The compiler transforms them, so we don't need runtime implementations.
213
+ // The `$` variable is used by compiled code as the svelte/internal/server namespace.
214
+ const sandbox = {
215
+ __svelteInternal: svelteInternal,
216
+ __externalModules: externalModules,
217
+ $: svelteInternal, // Direct alias for compiled Svelte code that uses `$`
218
+ __exports,
219
+ console,
220
+ ...svelteLifecycle,
244
221
  ...context,
245
- $,
246
- $$renderer,
247
- module,
248
- exports,
249
- // Lifecycle stubs for SSR (actual lifecycle runs in handler context)
250
- onMount: (fn) => { },
251
- onDestroy: (fn) => { },
252
222
  };
253
- const contextKeys = Object.keys(allContext);
254
- const contextValues = Object.values(allContext);
255
- // Wrap in IIFE
223
+ // Wrap code in IIFE
256
224
  const wrappedCode = `
257
- (function(${contextKeys.join(", ")}) {
225
+ (function() {
258
226
  ${processedCode}
259
- return module.exports;
260
- })
227
+ })();
261
228
  `;
262
- // Evaluate the code
263
- const func = eval(wrappedCode);
264
- const component = func(...contextValues);
265
- // Return a render function
266
- return {
267
- render: (props) => {
268
- html = '';
269
- try {
270
- component($$renderer, props);
271
- return { html, head: '', css: { code: '', map: null } };
272
- }
273
- catch (e) {
274
- console.error('Component render error:', e);
275
- throw e;
276
- }
277
- }
278
- };
229
+ // Run in VM context for better isolation
230
+ vm.createContext(sandbox);
231
+ vm.runInContext(wrappedCode, sandbox);
232
+ // Return the component
233
+ const Component = sandbox.__exports.default;
234
+ if (!Component) {
235
+ throw new Error("Svelte component did not export a default component");
236
+ }
237
+ return Component;
279
238
  }
280
239
  catch (error) {
281
- console.error("Error evaluating compiled component:", error);
282
- console.error("Code preview (first 500 chars):", code.substring(0, 500));
283
240
  throw error;
284
241
  }
285
242
  }
@@ -1 +1 @@
1
- {"version":3,"file":"svelteRenderer.js","sourceRoot":"","sources":["../../../../../src/types/Components/HTMLComponentsV2/svelteRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { compile } from \"svelte/compiler\";\r\nimport { DBI } from \"../../../DBI\";\r\nimport { NamespaceEnums } from \"../../../../generated/namespaceData\";\r\nimport { parseHTMLComponentsV2 } from \"./parser\";\r\nimport { parseSvelteComponent, createHandlerContext, SvelteComponentInfo, HandlerContextResult } from \"./svelteParser\";\r\nimport * as stuffs from \"stuffs\";\r\n\r\nexport interface SvelteRenderOptions {\r\n data?: Record<string, any>;\r\n ttl?: number;\r\n}\r\n\r\nexport interface SvelteRenderResult {\r\n components: any[];\r\n handlers: Map<string, { handlerFn: Function, context: any }>;\r\n componentInfo: SvelteComponentInfo;\r\n}\r\n\r\n/**\r\n * Compile and render a Svelte component to Discord components\r\n */\r\nexport async function renderSvelteComponent(\r\n dbi: DBI<NamespaceEnums>,\r\n source: string,\r\n dbiName: string,\r\n options: SvelteRenderOptions = {}\r\n): Promise<SvelteRenderResult> {\r\n const { data = {}, ttl = 0 } = options;\r\n\r\n // Parse the Svelte component to extract handlers\r\n // This also injects auto-generated names into elements without name attribute\r\n const componentInfo = await parseSvelteComponent(source, data);\r\n\r\n // Use the processed source (with auto-generated names injected)\r\n const processedSource = componentInfo.processedSource;\r\n\r\n // Compile the Svelte component for SSR\r\n const compiled = compile(processedSource, {\r\n generate: \"server\",\r\n css: \"injected\",\r\n dev: false,\r\n } as any);\r\n\r\n // Create a module context for the compiled code\r\n let html = \"\";\r\n try {\r\n const moduleContext = createModuleContext(dbi, data, ttl);\r\n const componentModule = evaluateCompiledComponent(compiled.js.code, moduleContext);\r\n\r\n // Render the component with props (include data in props)\r\n const renderResult = componentModule.render({ ...data, data });\r\n html = renderResult.html || renderResult.body || \"\";\r\n\r\n // Debug: Log rendered HTML\r\n if (process.env.DEBUG_SVELTE) {\r\n console.log(\"Rendered HTML:\", html);\r\n }\r\n } catch (error) {\r\n console.error(\"Error rendering Svelte component:\", error);\r\n throw error;\r\n }\r\n\r\n console.log(\"Rendered HTML:\", html);\r\n\r\n // For Svelte mode, inject state into interactive elements as a ref\r\n // Reuse existing ref if data already has one, otherwise create new\r\n if (data && Object.keys(data).length > 0) {\r\n let stateRefId: string;\r\n\r\n // Check if data already has a $ref (from previous render)\r\n if (data.$ref && typeof data.$ref === 'string') {\r\n stateRefId = data.$ref;\r\n // Update the existing ref's value with new data\r\n const existingRef = dbi.data.refs.get(stateRefId);\r\n if (existingRef) {\r\n existingRef.value = data;\r\n existingRef.at = Date.now(); // Refresh timestamp\r\n } else {\r\n // Ref expired or was deleted, create new one with same ID\r\n dbi.data.refs.set(stateRefId, { at: Date.now(), value: data, ttl });\r\n }\r\n } else {\r\n // Create a new ref for the state\r\n stateRefId = stuffs.randomString(8);\r\n data.$ref = stateRefId; // Store ref ID in data for future updates\r\n dbi.data.refs.set(stateRefId, { at: Date.now(), value: data, ttl });\r\n }\r\n\r\n // Add state ref to all elements with name attribute (buttons, selects)\r\n html = html.replace(/<button([^>]*name=\"[^\"]*\"[^>]*)>/g, (match, attrs) => {\r\n // Check if it already has data attributes\r\n if (attrs.includes('data-1:')) return match;\r\n return `<button${attrs} data-1:ref=\"${stateRefId}\">`;\r\n });\r\n // Also handle select elements\r\n html = html.replace(/<(string-select|user-select|role-select|channel-select|mentionable-select)([^>]*name=\"[^\"]*\"[^>]*)>/g, (match, tag, attrs) => {\r\n if (attrs.includes('data-1:')) return match;\r\n return `<${tag}${attrs} data-1:ref=\"${stateRefId}\">`;\r\n });\r\n }\r\n\r\n console.log(\"HTML with state:\", html);\r\n\r\n // Parse the rendered HTML to Discord components\r\n const components = parseHTMLComponentsV2(dbi, html, dbiName, { data, ttl });\r\n\r\n console.log(\"Parsed Components:\", JSON.stringify(components, null, 2));\r\n\r\n // Create handler context (also captures $effect callbacks)\r\n const handlerContext = createHandlerContext(componentInfo.scriptContent, data);\r\n const handlers = new Map<string, { handlerFn: Function, context: any }>();\r\n\r\n // Run effects on initial render\r\n handlerContext.runEffects();\r\n\r\n // Map handlers to component names\r\n componentInfo.handlers.forEach((handlerInfo, componentName) => {\r\n const handlerFn = handlerContext.handlers[handlerInfo.handlerName];\r\n if (handlerFn && typeof handlerFn === \"function\") {\r\n handlers.set(componentName, {\r\n handlerFn,\r\n context: data\r\n });\r\n }\r\n });\r\n\r\n return {\r\n components,\r\n handlers,\r\n componentInfo\r\n };\r\n}\r\n\r\n/**\r\n * Create a module context for evaluating the compiled Svelte component\r\n */\r\nfunction createModuleContext(dbi: DBI<NamespaceEnums>, data: Record<string, any>, ttl: number) {\r\n return {\r\n // Store objects in refs for later retrieval in handlers\r\n // This is used internally by the parser when converting to Discord components\r\n __storeRef: (obj: any) => {\r\n let id = stuffs.randomString(8);\r\n dbi.data.refs.set(id, { at: Date.now(), value: obj, ttl });\r\n return id;\r\n },\r\n\r\n // DBI instance for advanced usage\r\n __dbi: dbi,\r\n\r\n // All data context available\r\n ...data,\r\n data, // Also expose as 'data' prop\r\n };\r\n}\r\n\r\n/**\r\n * Evaluate the compiled Svelte component code\r\n */\r\nfunction evaluateCompiledComponent(code: string, context: Record<string, any>): any {\r\n try {\r\n // Aggressively strip ALL import statements\r\n // Svelte 5 generates imports with special chars like $ that need careful handling\r\n let processedCode = code;\r\n\r\n // Remove all lines that start with 'import' (most reliable approach)\r\n processedCode = processedCode\r\n .split('\\n')\r\n .filter(line => !line.trim().startsWith('import '))\r\n .join('\\n');\r\n\r\n // Also remove 'export default' and replace with assignment\r\n processedCode = processedCode.replace(/export\\s+default\\s+/g, 'module.exports = ');\r\n\r\n // Create exports object\r\n const exports: any = {};\r\n const module = { exports };\r\n\r\n // Provide Svelte 5 server runtime functions\r\n // The compiled code references these via the $ namespace\r\n const $: any = {\r\n // Escape functions\r\n escape: (str: any) => String(str)\r\n .replace(/&/g, \"&amp;\")\r\n .replace(/</g, \"&lt;\")\r\n .replace(/>/g, \"&gt;\")\r\n .replace(/\"/g, \"&quot;\")\r\n .replace(/'/g, \"&#39;\"),\r\n escape_text: (str: any) => String(str)\r\n .replace(/&/g, \"&amp;\")\r\n .replace(/</g, \"&lt;\")\r\n .replace(/>/g, \"&gt;\"),\r\n escape_attribute_value: (str: any) => String(str)\r\n .replace(/\"/g, \"&quot;\")\r\n .replace(/'/g, \"&#39;\"),\r\n // Array helpers for {#each}\r\n ensure_array_like: (value: any) => {\r\n if (Array.isArray(value)) return value;\r\n if (value == null) return [];\r\n if (typeof value === 'object' && Symbol.iterator in value) {\r\n return Array.from(value);\r\n }\r\n return [value];\r\n },\r\n // Renderer methods\r\n component: (fn: Function) => fn,\r\n push: (content: string) => content,\r\n pop: () => { },\r\n attr: (name: string, value: any, is_boolean?: boolean) => {\r\n if (is_boolean && !value) return '';\r\n if (value == null) return '';\r\n return ` ${name}=\"${String(value)}\"`;\r\n },\r\n spread_attributes: (attrs: Record<string, any>) => {\r\n return Object.entries(attrs)\r\n .map(([key, value]) => ` ${key}=\"${String(value)}\"`)\r\n .join('');\r\n },\r\n spread_props: (props: Record<string, any>) => props,\r\n bind_props: (props: Record<string, any>, names: string[]) => {\r\n const result: any = {};\r\n names.forEach(name => {\r\n if (name in props) result[name] = props[name];\r\n });\r\n return result;\r\n },\r\n stringify: (value: any) => JSON.stringify(value),\r\n store_get: (store: any) => store,\r\n unsubscribe_stores: () => { },\r\n // Control flow\r\n each: (items: any[], fn: Function) => {\r\n return items.map((item, index) => fn(item, index)).join('');\r\n },\r\n // Lifecycle\r\n tick: () => Promise.resolve(),\r\n flush: () => { },\r\n // Validation\r\n validate_component: (component: any) => component,\r\n validate_store: (store: any) => store,\r\n // Misc\r\n noop: () => { },\r\n run: (fn: Function) => fn(),\r\n run_all: (fns: Function[]) => fns.forEach(f => f()),\r\n is_promise: (value: any) => value && typeof value.then === 'function',\r\n missing_component: { $$render: () => '' },\r\n };\r\n\r\n // Create renderer object that accumulates HTML\r\n let html = '';\r\n const $$renderer: any = {\r\n out: '',\r\n head: '',\r\n component: (fn: Function) => {\r\n return fn($$renderer);\r\n },\r\n push: (content: string) => {\r\n html += content;\r\n return $$renderer;\r\n },\r\n pop: () => $$renderer,\r\n element: (tag: string, fn: Function) => {\r\n html += `<${tag}`;\r\n fn();\r\n html += `>`;\r\n return $$renderer;\r\n },\r\n close: (tag: string) => {\r\n html += `</${tag}>`;\r\n return $$renderer;\r\n },\r\n };\r\n\r\n // Create a function wrapper with all context and Svelte runtime\r\n // Include lifecycle stubs - these are no-ops in SSR but need to be defined\r\n const allContext = {\r\n ...context,\r\n $,\r\n $$renderer,\r\n module,\r\n exports,\r\n // Lifecycle stubs for SSR (actual lifecycle runs in handler context)\r\n onMount: (fn: Function) => { /* SSR no-op, real onMount runs in handler context */ },\r\n onDestroy: (fn: Function) => { /* SSR no-op, real onDestroy runs in handler context */ },\r\n };\r\n\r\n const contextKeys = Object.keys(allContext);\r\n const contextValues = Object.values(allContext);\r\n\r\n // Wrap in IIFE\r\n const wrappedCode = `\r\n (function(${contextKeys.join(\", \")}) {\r\n ${processedCode}\r\n return module.exports;\r\n })\r\n `;\r\n\r\n // Evaluate the code\r\n const func = eval(wrappedCode);\r\n const component = func(...contextValues);\r\n\r\n // Return a render function\r\n return {\r\n render: (props: any) => {\r\n html = '';\r\n try {\r\n component($$renderer, props);\r\n return { html, head: '', css: { code: '', map: null } };\r\n } catch (e) {\r\n console.error('Component render error:', e);\r\n throw e;\r\n }\r\n }\r\n };\r\n } catch (error) {\r\n console.error(\"Error evaluating compiled component:\", error);\r\n console.error(\"Code preview (first 500 chars):\", code.substring(0, 500));\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Render a Svelte component from a file\r\n */\r\nexport async function renderSvelteComponentFromFile(\r\n dbi: DBI<NamespaceEnums>,\r\n filePath: string,\r\n dbiName: string,\r\n options: SvelteRenderOptions = {}\r\n): Promise<SvelteRenderResult> {\r\n const fs = require(\"fs\");\r\n const source = fs.readFileSync(filePath, \"utf-8\");\r\n return await renderSvelteComponent(dbi, source, dbiName, options);\r\n}\r\n"]}
1
+ {"version":3,"file":"svelteRenderer.js","sourceRoot":"","sources":["../../../../../src/types/Components/HTMLComponentsV2/svelteRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { compile } from \"svelte/compiler\";\r\nimport { DBI } from \"../../../DBI\";\r\nimport { NamespaceEnums } from \"../../../../generated/namespaceData\";\r\nimport { parseHTMLComponentsV2 } from \"./parser\";\r\nimport { parseSvelteComponent, createHandlerContext, SvelteComponentInfo, HandlerContextResult } from \"./svelteParser\";\r\nimport * as stuffs from \"stuffs\";\r\nimport * as vm from \"vm\";\r\n\r\nexport interface SvelteRenderOptions {\r\n data?: Record<string, any>;\r\n ttl?: number;\r\n}\r\n\r\nexport interface SvelteRenderResult {\r\n components: any[];\r\n handlers: Map<string, { handlerFn: Function, context: any }>;\r\n componentInfo: SvelteComponentInfo;\r\n}\r\n\r\n/**\r\n * Compile and render a Svelte component to Discord components\r\n */\r\nexport async function renderSvelteComponent(\r\n dbi: DBI<NamespaceEnums>,\r\n source: string,\r\n dbiName: string,\r\n options: SvelteRenderOptions = {}\r\n): Promise<SvelteRenderResult> {\r\n const { data = {}, ttl = 0 } = options;\r\n\r\n // Parse the Svelte component to extract handlers\r\n // This also injects auto-generated names into elements without name attribute\r\n const componentInfo = await parseSvelteComponent(source, data);\r\n\r\n // Use the processed source (with auto-generated names injected)\r\n const processedSource = componentInfo.processedSource;\r\n\r\n // Compile the Svelte component for SSR (Svelte 5)\r\n const compiled = compile(processedSource, {\r\n generate: \"server\",\r\n css: \"injected\",\r\n dev: false,\r\n } as any);\r\n\r\n // Create a module context for the compiled code\r\n let html = \"\";\r\n try {\r\n const moduleContext = createModuleContext(dbi, data, ttl);\r\n const Component = evaluateCompiledComponent(compiled.js.code, moduleContext);\r\n\r\n // Svelte 5 SSR: Use render from svelte/server\r\n const { render } = require(\"svelte/server\");\r\n const renderResult = render(Component, { props: { ...data, data } });\r\n html = renderResult.body || \"\";\r\n } catch (error) {\r\n throw error;\r\n }\r\n\r\n // For Svelte mode, inject state into interactive elements as a ref\r\n // Reuse existing ref if data already has one, otherwise create new\r\n if (data && Object.keys(data).length > 0) {\r\n let stateRefId: string;\r\n\r\n // Check if data already has a $ref (from previous render)\r\n if (data.$ref && typeof data.$ref === 'string') {\r\n stateRefId = data.$ref;\r\n // Update the existing ref's value with new data\r\n const existingRef = dbi.data.refs.get(stateRefId);\r\n if (existingRef) {\r\n existingRef.value = data;\r\n existingRef.at = Date.now(); // Refresh timestamp\r\n } else {\r\n // Ref expired or was deleted, create new one with same ID\r\n dbi.data.refs.set(stateRefId, { at: Date.now(), value: data, ttl });\r\n }\r\n } else {\r\n // Create a new ref for the state\r\n stateRefId = stuffs.randomString(8);\r\n data.$ref = stateRefId; // Store ref ID in data for future updates\r\n dbi.data.refs.set(stateRefId, { at: Date.now(), value: data, ttl });\r\n }\r\n\r\n // Add state ref to all elements with name attribute (buttons, selects)\r\n html = html.replace(/<button([^>]*name=\"[^\"]*\"[^>]*)>/g, (match, attrs) => {\r\n // Check if it already has data attributes\r\n if (attrs.includes('data-1:')) return match;\r\n return `<button${attrs} data-1:ref=\"${stateRefId}\">`;\r\n });\r\n // Also handle select elements\r\n html = html.replace(/<(string-select|user-select|role-select|channel-select|mentionable-select)([^>]*name=\"[^\"]*\"[^>]*)>/g, (match, tag, attrs) => {\r\n if (attrs.includes('data-1:')) return match;\r\n return `<${tag}${attrs} data-1:ref=\"${stateRefId}\">`;\r\n });\r\n }\r\n\r\n // Parse the rendered HTML to Discord components\r\n const components = parseHTMLComponentsV2(dbi, html, dbiName, { data, ttl });\r\n\r\n // Create handler context (also captures $effect callbacks)\r\n const handlerContext = createHandlerContext(componentInfo.scriptContent, data);\r\n const handlers = new Map<string, { handlerFn: Function, context: any }>();\r\n\r\n // Run effects on initial render\r\n handlerContext.runEffects();\r\n\r\n // Map handlers to component names\r\n componentInfo.handlers.forEach((handlerInfo, componentName) => {\r\n const handlerFn = handlerContext.handlers[handlerInfo.handlerName];\r\n if (handlerFn && typeof handlerFn === \"function\") {\r\n handlers.set(componentName, {\r\n handlerFn,\r\n context: data\r\n });\r\n }\r\n });\r\n\r\n return {\r\n components,\r\n handlers,\r\n componentInfo\r\n };\r\n}\r\n\r\n/**\r\n * Create a module context for evaluating the compiled Svelte component\r\n */\r\nfunction createModuleContext(dbi: DBI<NamespaceEnums>, data: Record<string, any>, ttl: number) {\r\n return {\r\n // Store objects in refs for later retrieval in handlers\r\n // This is used internally by the parser when converting to Discord components\r\n __storeRef: (obj: any) => {\r\n let id = stuffs.randomString(8);\r\n dbi.data.refs.set(id, { at: Date.now(), value: obj, ttl });\r\n return id;\r\n },\r\n\r\n // DBI instance for advanced usage\r\n __dbi: dbi,\r\n\r\n // All data context available\r\n ...data,\r\n data, // Also expose as 'data' prop\r\n };\r\n}\r\n\r\n/**\r\n * Evaluate the compiled Svelte component code\r\n */\r\nfunction evaluateCompiledComponent(code: string, context: Record<string, any>): any {\r\n try {\r\n // Load Svelte 5 internal runtime\r\n const svelteInternal = require(\"svelte/internal/server\");\r\n\r\n // Process the code to work in our context\r\n let processedCode = code;\r\n\r\n // Collect external modules to inject into sandbox\r\n const externalModules: Record<string, any> = {};\r\n\r\n // Replace svelte internal imports\r\n processedCode = processedCode.replace(\r\n /import\\s*\\*\\s*as\\s*(\\w+)\\s*from\\s*[\"']svelte\\/internal\\/server[\"'];?/g,\r\n 'const $1 = __svelteInternal;'\r\n );\r\n processedCode = processedCode.replace(\r\n /import\\s*\\{([^}]+)\\}\\s*from\\s*[\"']svelte\\/internal\\/server[\"'];?/g,\r\n (match, imports) => {\r\n const importList = imports.split(',').map((i: string) => i.trim());\r\n return `const { ${importList.join(', ')} } = __svelteInternal;`;\r\n }\r\n );\r\n\r\n // Handle external module imports (default imports)\r\n processedCode = processedCode.replace(\r\n /import\\s+(\\w+)\\s+from\\s*[\"']([^\"']+)[\"'];?/g,\r\n (match, varName, modulePath) => {\r\n // Skip svelte imports\r\n if (modulePath.startsWith('svelte')) return '';\r\n try {\r\n const mod = require(modulePath);\r\n externalModules[varName] = mod.default || mod;\r\n return `const ${varName} = __externalModules.${varName};`;\r\n } catch (e) {\r\n return '';\r\n }\r\n }\r\n );\r\n\r\n // Handle named imports from external modules\r\n processedCode = processedCode.replace(\r\n /import\\s*\\{([^}]+)\\}\\s*from\\s*[\"']([^\"']+)[\"'];?/g,\r\n (match, imports, modulePath) => {\r\n // Skip svelte imports\r\n if (modulePath.startsWith('svelte')) return '';\r\n try {\r\n const mod = require(modulePath);\r\n const importList = imports.split(',').map((i: string) => i.trim());\r\n importList.forEach((importName: string) => {\r\n const [name, alias] = importName.split(' as ').map(s => s.trim());\r\n externalModules[alias || name] = mod[name] || mod.default?.[name];\r\n });\r\n return importList.map((importName: string) => {\r\n const [name, alias] = importName.split(' as ').map(s => s.trim());\r\n return `const ${alias || name} = __externalModules.${alias || name};`;\r\n }).join('\\n');\r\n } catch (e) {\r\n return '';\r\n }\r\n }\r\n );\r\n\r\n // Handle namespace imports from external modules\r\n processedCode = processedCode.replace(\r\n /import\\s*\\*\\s*as\\s*(\\w+)\\s*from\\s*[\"']([^\"']+)[\"'];?/g,\r\n (match, varName, modulePath) => {\r\n // Skip svelte imports\r\n if (modulePath.startsWith('svelte')) return '';\r\n try {\r\n const mod = require(modulePath);\r\n externalModules[varName] = mod;\r\n return `const ${varName} = __externalModules.${varName};`;\r\n } catch (e) {\r\n return '';\r\n }\r\n }\r\n );\r\n\r\n // Remove any remaining import statements\r\n processedCode = processedCode\r\n .split('\\n')\r\n .filter(line => !line.trim().startsWith('import '))\r\n .join('\\n');\r\n\r\n // Replace 'export default' with assignment\r\n processedCode = processedCode.replace(/export\\s+default\\s+/g, '__exports.default = ');\r\n // Replace 'export function' with assignment\r\n processedCode = processedCode.replace(/export\\s+function\\s+(\\w+)/g, '__exports.$1 = function $1');\r\n // Replace 'export const' with assignment\r\n processedCode = processedCode.replace(/export\\s+const\\s+(\\w+)/g, '__exports.$1 = ');\r\n // Replace 'export let' with assignment \r\n processedCode = processedCode.replace(/export\\s+let\\s+(\\w+)/g, '__exports.$1 = ');\r\n\r\n // Create the sandbox context\r\n const __exports: any = {};\r\n // Svelte lifecycle functions - no-ops for SSR\r\n const svelteLifecycle = {\r\n onMount: () => () => { }, // Returns cleanup function\r\n onDestroy: () => { },\r\n beforeUpdate: () => { },\r\n afterUpdate: () => { },\r\n tick: () => Promise.resolve(),\r\n untrack: (fn: () => any) => fn(),\r\n createEventDispatcher: () => () => { },\r\n };\r\n\r\n // Note: Svelte 5 runes ($state, $derived, etc.) are compile-time features\r\n // The compiler transforms them, so we don't need runtime implementations.\r\n // The `$` variable is used by compiled code as the svelte/internal/server namespace.\r\n\r\n const sandbox = {\r\n __svelteInternal: svelteInternal,\r\n __externalModules: externalModules,\r\n $: svelteInternal, // Direct alias for compiled Svelte code that uses `$`\r\n __exports,\r\n console,\r\n ...svelteLifecycle,\r\n ...context,\r\n };\r\n\r\n // Wrap code in IIFE\r\n const wrappedCode = `\r\n (function() {\r\n ${processedCode}\r\n })();\r\n `;\r\n\r\n // Run in VM context for better isolation\r\n vm.createContext(sandbox);\r\n vm.runInContext(wrappedCode, sandbox);\r\n\r\n // Return the component\r\n const Component = sandbox.__exports.default;\r\n\r\n if (!Component) {\r\n throw new Error(\"Svelte component did not export a default component\");\r\n }\r\n\r\n return Component;\r\n } catch (error) {\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Render a Svelte component from a file\r\n */\r\nexport async function renderSvelteComponentFromFile(\r\n dbi: DBI<NamespaceEnums>,\r\n filePath: string,\r\n dbiName: string,\r\n options: SvelteRenderOptions = {}\r\n): Promise<SvelteRenderResult> {\r\n const fs = require(\"fs\");\r\n const source = fs.readFileSync(filePath, \"utf-8\");\r\n return await renderSvelteComponent(dbi, source, dbiName, options);\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"recursiveImport.d.ts","sourceRoot":"","sources":["../../../src/utils/recursiveImport.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAY,EAAE,MAAM,GAAE,MAAM,EAAoC,GAAG,OAAO,CAAC,GAAG,CAAC,CA2BpJ"}
1
+ {"version":3,"file":"recursiveImport.d.ts","sourceRoot":"","sources":["../../../src/utils/recursiveImport.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAY,EAAE,MAAM,GAAE,MAAM,EAAsC,GAAG,OAAO,CAAC,GAAG,CAAC,CA2BtJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"recursiveImport.js","sourceRoot":"","sources":["../../../src/utils/recursiveImport.ts"],"names":[],"mappings":";;AAOA,0CA2BC;;AAlCD,oDAAoB;AACpB,wDAAwB;AAExB;;;GAGG;AACI,KAAK,UAAU,eAAe,CAAC,UAAkB,EAAE,OAAiB,CAAC,KAAK,CAAC,EAAE,SAAmB,CAAC,OAAO,EAAC,SAAS,EAAC,WAAW,CAAC;IACpI,IAAI,KAAK,GAAG,MAAM,YAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,IAAI,OAAO,GAAG,SAAS,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,QAAQ,GAAG,cAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,cAAI,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,MAAM,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAChD,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7F,yCAAyC;gBACzC,kFAAkF;gBAClF,oEAAoE;gBACpE,IAAI,CAAC;oBACH,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACpB,CAAC;gBAAC,OAAO,CAAM,EAAE,CAAC;oBAChB,0DAA0D;oBAC1D,qEAAqE;oBACrE,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,0BAA0B,CAAC;wBAChD,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,4CAA4C,CAAC,EAAE,CAAC;wBACvE,MAAM,CAAC,CAAC;oBACV,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import fs from \"fs\";\r\nimport path from \"path\";\r\n\r\n/**\r\n * @example\r\n * await recursiveImport(\"./src\", [\".js\"], [\".d.ts\"])\r\n */\r\nexport async function recursiveImport(folderPath: string, exts: string[] = [\".js\"], ignore: string[] = [\".d.ts\",\".js.map\",\".d.ts.map\"]): Promise<any> {\r\n let files = await fs.promises.readdir(folderPath, { withFileTypes: true });\r\n let dirName = __dirname;\r\n\r\n for (const file of files) {\r\n let filePath = path.resolve(folderPath, file.name);\r\n let relative = path.relative(dirName, filePath);\r\n if (!relative.includes(`${path.sep}-`)) {\r\n if (file.isDirectory()) {\r\n await recursiveImport(filePath, exts, ignore);\r\n } else if (exts.some(i => file.name.endsWith(i)) && !ignore.some(i => file.name.endsWith(i))) {\r\n // Use require for CommonJS compatibility\r\n // Wrap in try-catch for Bun compatibility - Bun throws \"Missing 'default' export\"\r\n // but still executes the module's side effects (dbi.register calls)\r\n try {\r\n require(filePath);\r\n } catch (e: any) {\r\n // Ignore \"Missing 'default' export\" errors in Bun runtime\r\n // The module's side effects still execute before the error is thrown\r\n if (!e.message?.includes(\"Missing 'default' export\") && \r\n !e.message?.includes(\"does not provide an export named 'default'\")) {\r\n throw e;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}"]}
1
+ {"version":3,"file":"recursiveImport.js","sourceRoot":"","sources":["../../../src/utils/recursiveImport.ts"],"names":[],"mappings":";;AAOA,0CA2BC;;AAlCD,oDAAoB;AACpB,wDAAwB;AAExB;;;GAGG;AACI,KAAK,UAAU,eAAe,CAAC,UAAkB,EAAE,OAAiB,CAAC,KAAK,CAAC,EAAE,SAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC;IACtI,IAAI,KAAK,GAAG,MAAM,YAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,IAAI,OAAO,GAAG,SAAS,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,QAAQ,GAAG,cAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,cAAI,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,MAAM,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAChD,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7F,yCAAyC;gBACzC,kFAAkF;gBAClF,oEAAoE;gBACpE,IAAI,CAAC;oBACH,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACpB,CAAC;gBAAC,OAAO,CAAM,EAAE,CAAC;oBAChB,0DAA0D;oBAC1D,qEAAqE;oBACrE,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,0BAA0B,CAAC;wBAClD,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,4CAA4C,CAAC,EAAE,CAAC;wBACrE,MAAM,CAAC,CAAC;oBACV,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import fs from \"fs\";\r\nimport path from \"path\";\r\n\r\n/**\r\n * @example\r\n * await recursiveImport(\"./src\", [\".js\"], [\".d.ts\"])\r\n */\r\nexport async function recursiveImport(folderPath: string, exts: string[] = [\".js\"], ignore: string[] = [\".d.ts\", \".js.map\", \".d.ts.map\"]): Promise<any> {\r\n let files = await fs.promises.readdir(folderPath, { withFileTypes: true });\r\n let dirName = __dirname;\r\n\r\n for (const file of files) {\r\n let filePath = path.resolve(folderPath, file.name);\r\n let relative = path.relative(dirName, filePath);\r\n if (!relative.includes(`${path.sep}-`)) {\r\n if (file.isDirectory()) {\r\n await recursiveImport(filePath, exts, ignore);\r\n } else if (exts.some(i => file.name.endsWith(i)) && !ignore.some(i => file.name.endsWith(i))) {\r\n // Use require for CommonJS compatibility\r\n // Wrap in try-catch for Bun compatibility - Bun throws \"Missing 'default' export\"\r\n // but still executes the module's side effects (dbi.register calls)\r\n try {\r\n require(filePath);\r\n } catch (e: any) {\r\n // Ignore \"Missing 'default' export\" errors in Bun runtime\r\n // The module's side effects still execute before the error is thrown\r\n if (!e.message?.includes(\"Missing 'default' export\") &&\r\n !e.message?.includes(\"does not provide an export named 'default'\")) {\r\n throw e;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}"]}
@@ -5,7 +5,7 @@ const src_1 = require("../src");
5
5
  const path_1 = tslib_1.__importDefault(require("path"));
6
6
  const dbi = (0, src_1.createDBI)("svelte", {
7
7
  discord: {
8
- token: "YOUR_BOT_TOKEN_HERE",
8
+ token: "ODI0MjEwMTMyMzUwMDA5MzY2.GFvvpD.FsVgZH6oNtUYTapngDjurqCBovx5cpQ4ErwsKg",
9
9
  options: {
10
10
  intents: [
11
11
  "GuildMessages",
@@ -27,10 +27,7 @@ dbi.register(({ ChatInput, HTMLComponentsV2 }) => {
27
27
  HTMLComponentsV2({
28
28
  name: "product-showcase",
29
29
  mode: 'svelte',
30
- file: path_1.default.join(__dirname, "product-showcase.svelte"),
31
- onExecute(ctx) {
32
- console.log("Product showcase interaction:", ctx.data[0]);
33
- }
30
+ file: path_1.default.join(__dirname, "product-showcase.svelte")
34
31
  });
35
32
  // Test command
36
33
  ChatInput({
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../test/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { createDBI } from \"../src\";\r\nimport path from \"path\";\r\n\r\nconst dbi = createDBI(\"svelte\", {\r\n discord: {\r\n token: \"YOUR_BOT_TOKEN_HERE\",\r\n options: {\r\n intents: [\r\n \"GuildMessages\",\r\n \"Guilds\",\r\n \"MessageContent\",\r\n \"GuildMessageReactions\"\r\n ],\r\n }\r\n },\r\n references: {\r\n autoClear: {\r\n ttl: 60000 * 60, // 60 minutes\r\n check: 60000 // every 60 seconds\r\n }\r\n }\r\n});\r\n\r\ndbi.register(({ ChatInput, HTMLComponentsV2 }) => {\r\n // Svelte product showcase with Components V2\r\n HTMLComponentsV2({\r\n name: \"product-showcase\",\r\n mode: 'svelte',\r\n file: path.join(__dirname, \"product-showcase.svelte\"),\r\n onExecute(ctx) {\r\n console.log(\"Product showcase interaction:\", ctx.data[0]);\r\n }\r\n });\r\n\r\n // Test command\r\n ChatInput({\r\n name: \"test-svelte\",\r\n description: \"Test Svelte product showcase\",\r\n async onExecute({ interaction, dbi }) {\r\n const showcase = dbi.interaction(\"product-showcase\") as any;\r\n\r\n const products = [\r\n {\r\n name: \"Gaming Keyboard\",\r\n description: \"RGB mechanical keyboard with Cherry MX switches\",\r\n price: 149,\r\n image: \"https://cdn.discordapp.com/embed/avatars/0.png\",\r\n category: \"Electronics\",\r\n rating: 4.8,\r\n stock: 25\r\n },\r\n {\r\n name: \"Wireless Mouse\",\r\n description: \"Ergonomic wireless mouse with 16000 DPI sensor\",\r\n price: 79,\r\n image: \"https://cdn.discordapp.com/embed/avatars/1.png\",\r\n category: \"Electronics\",\r\n rating: 4.5,\r\n stock: 42\r\n },\r\n {\r\n name: \"USB-C Hub\",\r\n description: \"7-in-1 USB-C hub with HDMI, USB 3.0, and SD card reader\",\r\n price: 59,\r\n image: \"https://cdn.discordapp.com/embed/avatars/2.png\",\r\n category: \"Accessories\",\r\n rating: 4.3,\r\n stock: 18\r\n },\r\n {\r\n name: \"Monitor Stand\",\r\n description: \"Adjustable monitor stand with cable management\",\r\n price: 89,\r\n image: \"https://cdn.discordapp.com/embed/avatars/3.png\",\r\n category: \"Furniture\",\r\n rating: 4.6,\r\n stock: 31\r\n }\r\n ];\r\n\r\n // Use send() method - this sends the message AND initializes lifecycle hooks (onMount)\r\n // The interval in onMount will start immediately after the message is sent\r\n await showcase.send(interaction, {\r\n data: {\r\n products,\r\n currentIndex: 0,\r\n cart: [],\r\n view: 'browse',\r\n elapsedTime: 0\r\n }\r\n });\r\n }\r\n });\r\n});\r\n\r\nsetTimeout(() => {\r\n console.log(\"Loading DBI...\");\r\n dbi.load().then(() => {\r\n dbi.publish(\"Guild\", \"1341841733511806978\")\r\n console.log(\"DBI loaded.\");\r\n dbi.login().then(() => {\r\n console.log(\"Bot is running with Svelte components!\");\r\n });\r\n });\r\n}, 100);"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../test/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { createDBI } from \"../src\";\r\nimport path from \"path\";\r\n\r\nconst dbi = createDBI(\"svelte\", {\r\n discord: {\r\n token: \"ODI0MjEwMTMyMzUwMDA5MzY2.GFvvpD.FsVgZH6oNtUYTapngDjurqCBovx5cpQ4ErwsKg\",\r\n options: {\r\n intents: [\r\n \"GuildMessages\",\r\n \"Guilds\",\r\n \"MessageContent\",\r\n \"GuildMessageReactions\"\r\n ],\r\n }\r\n },\r\n references: {\r\n autoClear: {\r\n ttl: 60000 * 60, // 60 minutes\r\n check: 60000 // every 60 seconds\r\n }\r\n }\r\n});\r\n\r\ndbi.register(({ ChatInput, HTMLComponentsV2 }) => {\r\n // Svelte product showcase with Components V2\r\n HTMLComponentsV2({\r\n name: \"product-showcase\",\r\n mode: 'svelte',\r\n file: path.join(__dirname, \"product-showcase.svelte\")\r\n });\r\n\r\n // Test command\r\n ChatInput({\r\n name: \"test-svelte\",\r\n description: \"Test Svelte product showcase\",\r\n async onExecute({ interaction, dbi }) {\r\n const showcase = dbi.interaction(\"product-showcase\") as any;\r\n\r\n const products = [\r\n {\r\n name: \"Gaming Keyboard\",\r\n description: \"RGB mechanical keyboard with Cherry MX switches\",\r\n price: 149,\r\n image: \"https://cdn.discordapp.com/embed/avatars/0.png\",\r\n category: \"Electronics\",\r\n rating: 4.8,\r\n stock: 25\r\n },\r\n {\r\n name: \"Wireless Mouse\",\r\n description: \"Ergonomic wireless mouse with 16000 DPI sensor\",\r\n price: 79,\r\n image: \"https://cdn.discordapp.com/embed/avatars/1.png\",\r\n category: \"Electronics\",\r\n rating: 4.5,\r\n stock: 42\r\n },\r\n {\r\n name: \"USB-C Hub\",\r\n description: \"7-in-1 USB-C hub with HDMI, USB 3.0, and SD card reader\",\r\n price: 59,\r\n image: \"https://cdn.discordapp.com/embed/avatars/2.png\",\r\n category: \"Accessories\",\r\n rating: 4.3,\r\n stock: 18\r\n },\r\n {\r\n name: \"Monitor Stand\",\r\n description: \"Adjustable monitor stand with cable management\",\r\n price: 89,\r\n image: \"https://cdn.discordapp.com/embed/avatars/3.png\",\r\n category: \"Furniture\",\r\n rating: 4.6,\r\n stock: 31\r\n }\r\n ];\r\n\r\n // Use send() method - this sends the message AND initializes lifecycle hooks (onMount)\r\n // The interval in onMount will start immediately after the message is sent\r\n await showcase.send(interaction, {\r\n data: {\r\n products,\r\n currentIndex: 0,\r\n cart: [],\r\n view: 'browse',\r\n elapsedTime: 0\r\n }\r\n });\r\n }\r\n });\r\n});\r\n\r\nsetTimeout(() => {\r\n console.log(\"Loading DBI...\");\r\n dbi.load().then(() => {\r\n dbi.publish(\"Guild\", \"1341841733511806978\")\r\n console.log(\"DBI loaded.\");\r\n dbi.login().then(() => {\r\n console.log(\"Bot is running with Svelte components!\");\r\n });\r\n });\r\n}, 100);"]}
package/package.json CHANGED
@@ -5,7 +5,6 @@
5
5
  "discord-api-types": "^0.37.100",
6
6
  "discord-hybrid-sharding": "^2.2.6",
7
7
  "discord.js": "^14.25.1",
8
- "estree-walker": "^3.0.3",
9
8
  "eta": "^3.5.0",
10
9
  "jsdom": "^26.1.0",
11
10
  "lodash": "^4.17.21",
@@ -16,7 +15,7 @@
16
15
  "tslib": "^2.6.3"
17
16
  },
18
17
  "name": "@mostfeatured/dbi",
19
- "version": "0.2.8",
18
+ "version": "0.2.10",
20
19
  "main": "dist/src/index.js",
21
20
  "types": "dist/src/index.d.ts",
22
21
  "typesVersions": {
@@ -77,13 +76,9 @@
77
76
  "typescript": "^5.2.2"
78
77
  },
79
78
  "peerDependencies": {
80
- "estree-walker": "^3.0.0",
81
79
  "svelte": "^5.0.0"
82
80
  },
83
81
  "peerDependenciesMeta": {
84
- "estree-walker": {
85
- "optional": true
86
- },
87
82
  "svelte": {
88
83
  "optional": true
89
84
  }
@@ -235,8 +235,6 @@ export function hookInteractionListeners(dbi: DBI<NamespaceEnums>): () => any {
235
235
  if (dbiInter.type === "HTMLComponentsV2") {
236
236
  // For HTMLComponentsV2, first element of data is the element name (button name, etc.)
237
237
  const elementName = data?.[0];
238
- console.log("[Hook] HTMLComponentsV2 interaction found, elementName:", elementName);
239
- console.log("[Hook] onExecute exists:", typeof dbiInter.onExecute);
240
238
 
241
239
  if (dbi.config.strict) {
242
240
  // @ts-ignore
@@ -83,17 +83,10 @@ export class DBIHTMLComponentsV2<TNamespace extends NamespaceEnums> extends DBIB
83
83
  private async _initSvelteComponent() {
84
84
  if (this.template && !this.svelteComponentInfo) {
85
85
  this.svelteComponentInfo = await parseSvelteComponent(this.template);
86
-
87
- // Debug log
88
- console.log(`[Svelte] Component "${this.name}" registered with handlers:`,
89
- Array.from(this.svelteComponentInfo.handlers.entries())
90
- );
91
86
  }
92
87
  }
93
88
 
94
89
  private _handleExecute(ctx: IDBIHTMLComponentsV2ExecuteCtx<TNamespace>) {
95
- console.log("[Svelte] onExecute called with data:", ctx.data);
96
-
97
90
  // Call user's onExecute callback first if provided
98
91
  if (this._userOnExecute) {
99
92
  this._userOnExecute(ctx);
@@ -102,18 +95,15 @@ export class DBIHTMLComponentsV2<TNamespace extends NamespaceEnums> extends DBIB
102
95
  // If using Svelte mode, find and execute the handler
103
96
  if (this.mode === 'svelte' && this.svelteComponentInfo) {
104
97
  const [elementName, ...handlerData] = ctx.data;
105
- console.log("[Svelte] Element name:", elementName, "Handler data:", handlerData);
106
98
 
107
99
  if (typeof elementName === 'string') {
108
100
  // Find the handler info for this element
109
101
  const handlerInfo = this.svelteComponentInfo.handlers.get(elementName);
110
- console.log("[Svelte] Handler info:", handlerInfo);
111
102
 
112
103
  if (handlerInfo) {
113
104
  // Extract current state from handlerData (refs that were passed)
114
105
  // The second element in data array contains the current state
115
106
  const currentState = handlerData[0] || {} as Record<string, any>;
116
- console.log("[Svelte] Current state:", currentState);
117
107
 
118
108
  // Get ref id for lifecycle tracking (if available)
119
109
  const refId = (currentState as any)?.$ref || null;
@@ -136,7 +126,6 @@ export class DBIHTMLComponentsV2<TNamespace extends NamespaceEnums> extends DBIB
136
126
  );
137
127
 
138
128
  const handlerFn = handlerContext.handlers[handlerInfo.handlerName];
139
- console.log("[Svelte] Handler function:", handlerFn ? "found" : "not found", handlerInfo.handlerName);
140
129
 
141
130
  if (handlerFn && typeof handlerFn === 'function') {
142
131
  try {
@@ -195,13 +184,9 @@ export class DBIHTMLComponentsV2<TNamespace extends NamespaceEnums> extends DBIB
195
184
  handlerContext.flushRender();
196
185
  }
197
186
  } catch (error) {
198
- console.error(`Error executing Svelte handler '${handlerInfo.handlerName}':`, error);
187
+ // Handler execution failed
199
188
  }
200
- } else {
201
- console.warn(`Handler function '${handlerInfo.handlerName}' not found for element '${elementName}'`);
202
189
  }
203
- } else {
204
- console.warn(`No handler info found for element '${elementName}'`);
205
190
  }
206
191
  }
207
192
  }
@@ -259,8 +244,8 @@ export class DBIHTMLComponentsV2<TNamespace extends NamespaceEnums> extends DBIB
259
244
  async send(target: any, options: TDBIHTMLComponentsV2SendOptions = {}): Promise<any> {
260
245
  const { data = {}, flags = ["IsComponentsV2"], content, ephemeral, reply, followUp } = options;
261
246
 
262
- // Render components
263
- const components = this.toJSON({ data });
247
+ // Render components (toJSON is async)
248
+ const components = await this.toJSON({ data });
264
249
 
265
250
  // Build message options
266
251
  const messageOptions: any = { components, flags };
@@ -352,7 +337,6 @@ export class DBIHTMLComponentsV2<TNamespace extends NamespaceEnums> extends DBIB
352
337
  const refId = typeof refOrData === 'string' ? refOrData : refOrData?.$ref;
353
338
 
354
339
  if (!refId) {
355
- console.warn("[Svelte] Cannot destroy: no ref ID provided");
356
340
  return false;
357
341
  }
358
342