feat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functions - #14104

Merged
s1gr1d merged 5 commits into
developfrom
sig/nuxt-reexport-functions
Nov 4, 2024
Merged

feat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functions#14104
s1gr1d merged 5 commits into
developfrom
sig/nuxt-reexport-functions

Conversation

@s1gr1d

@s1gr1ds1gr1d commented Oct 28, 2024

Copy link
Copy Markdown
Member

Based on this PR: #14086

We get the names of the exports with Rollup's exportedBindings, but we cannot know whether this is a function or something else. As we need to re-export serverless functions for Netlify, Vercel and so on, an educated guess is made that 'default', 'handler', 'server' are potential serverless functions that need to be wrapped by Sentry and re-exported.

In case users experience issues, this can be changed with entrypointWrappedFunctions.

All other exports are exported as they were before.

@s1gr1d
s1gr1dforce-pushed the sig/nuxt-reexport-functions branch from 75db7b5 to 031e219CompareOctober 28, 2024 16:24
@github-actions

github-actionsBot commented Oct 28, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser22.74 KB--
@sentry/browser - with treeshaking flags21.53 KB--
@sentry/browser (incl. Tracing)35.14 KB--
@sentry/browser (incl. Tracing, Replay)71.86 KB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags62.29 KB--
@sentry/browser (incl. Tracing, Replay with Canvas)76.17 KB--
@sentry/browser (incl. Tracing, Replay, Feedback)88.97 KB--
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)90.81 KB--
@sentry/browser (incl. metrics)26.99 KB--
@sentry/browser (incl. Feedback)39.89 KB--
@sentry/browser (incl. sendFeedback)27.39 KB--
@sentry/browser (incl. FeedbackAsync)32.18 KB--
@sentry/react25.5 KB--
@sentry/react (incl. Tracing)38.1 KB--
@sentry/vue26.89 KB--
@sentry/vue (incl. Tracing)37.02 KB--
@sentry/svelte22.88 KB--
CDN Bundle24.1 KB--
CDN Bundle (incl. Tracing)36.96 KB--
CDN Bundle (incl. Tracing, Replay)71.62 KB--
CDN Bundle (incl. Tracing, Replay, Feedback)76.96 KB--
CDN Bundle - uncompressed70.64 KB--
CDN Bundle (incl. Tracing) - uncompressed109.71 KB--
CDN Bundle (incl. Tracing, Replay) - uncompressed222.23 KB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed235.45 KB--
@sentry/nextjs (client)38.18 KB--
@sentry/sveltekit (client)35.75 KB--
@sentry/node129.6 KB+0.01%+1 B 🔺
@sentry/node - without tracing94.3 KB--
@sentry/aws-serverless105.17 KB-0.01%-1 B 🔽

View base workflow run

Comment threadpackages/nuxt/src/common/types.ts Outdated
Comment on lines +132 to +136
* The `asyncFunctionReExports` option is only relevant when `dynamicImportForServerEntry: true` (default value).
*
* As the server entry file is wrapped with a dynamic `import()`, previous async function exports need to be re-exported.
* The SDK detects and re-exports those exports (mostly serverless functions). This is why they are re-exported as async functions.
* In case you have a custom setup and your server exports other async functions, you can override the default array with this option.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: Maybe we can rewrite this a bit, to a perspective of somebody who does not have deep understanding of all of this :D

Suggested change
*The`asyncFunctionReExports`option is onlyrelevantwhen`dynamicImportForServerEntry: true`(defaultvalue).
*
*Astheserverentryfileiswrappedwithadynamic`import()`,previousasyncfunctionexportsneedtobere-exported.
*TheSDKdetectsandre-exportsthoseexports(mostlyserverlessfunctions).Thisiswhytheyarere-exportedasasyncfunctions.
*Incaseyouhaveacustomsetupandyourserverexportsotherasyncfunctions,youcanoverridethedefaultarraywiththisoption.
*Bydefault(unlessyouconfigure`dynamicImportForServerEntry: false`)theSDKwilltrytowrapyourapplicationentrypointwithadynamic`import()`toensurealldependenciescanbeproperlyinstrumented.
*
*Bydefault,theSDKwillwrapthedefaultexportaswellasa `handler` or `server` exportfromtheentrypoint.Ifyourapplicationhasadifferentmainexportthatisusedtoruntheapplication,youcanoverwritethisbyprovidinganarrayofexportnamestowrap.
*Anywrappedexportisexpectedtobeanasyncfunction.

Comment threadpackages/nuxt/src/module.ts Outdated
Comment on lines +24 to +26
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports
? moduleOptionsParam.asyncFunctionReExports
: ['default', 'handler', 'server'],

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

super-l: I find it slightly easier to read:

Suggested change
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports
? moduleOptionsParam.asyncFunctionReExports
: ['default','handler','server'],
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports||['default','handler','server'],

Base automatically changed from sig/nuxt-reexport-firebase to developOctober 29, 2024 08:04
Comment threadpackages/nuxt/src/common/types.ts
Comment threadpackages/nuxt/src/vite/utils.ts Outdated

const expected = `
async function reExport(...args) {
async function reExport0(...args) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

m: Can we also have a test here to show that it does not change/wrap an export that does not match?

@s1gr1ds1gr1dOct 30, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That would require changing a lot of logic in the code. The here tested function constructFunctionReExport is only getting the input from the query parameters and creating a function for each query param.

The part, where those query params are actually added is here:

constfunctionsToExport=flatten(Object.values(moduleInfo.exportedBindings||{})).filter(functionName=>asyncFunctionReExports.includes(functionName),);

One thing I could do is extracting this part as a function to test this step as well. But as adding the query params and generating the function code happen in two different Rollup hooks, I cannot combine those two things in one function or test.

@lforst

Copy link
Copy Markdown
Contributor

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

@mydea

Copy link
Copy Markdown
Member

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

@lforst

Copy link
Copy Markdown
Contributor

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

Right, I feel like we need a mechanism that will just exclude certain exports from the whole shebang

@mydea

Copy link
Copy Markdown
Member

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

Right, I feel like we need a mechanism that will just exclude certain exports from the whole shebang

I think the idea is (Sigrid correct me if I'm wrong):

We do not wrap anything, generally, except the exports defined in this array (all of which are assumed to be async functions). If you do not want to wrap anything you could define [], if you only want to wrap e.g. the myServer export but nothing else you could do ['myServer']. Does that make sense? Any other export will remain untouched (e.g. be exported normally as before, without dynamic import)

@s1gr1d

Copy link
Copy Markdown
MemberAuthor

I think the suggestion of @lforst makes sense because if nothing is re-exported it's not exported at all. The problem here is that exportedBindings from Rollup only provides strings and I cannot know what this export should be. Assuming this will always be serverless functions, it's re-exported as an async function.

@s1gr1d
s1gr1dforce-pushed the sig/nuxt-reexport-functions branch from 84ff708 to b8a73caCompareOctober 31, 2024 12:31
@s1gr1ds1gr1d changed the title feat(nuxt): Add asyncFunctionReExports to define re-exported server functionsfeat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functionsOct 31, 2024
@s1gr1ds1gr1d self-assigned this Oct 31, 2024
Comment threadpackages/nuxt/src/common/types.ts Outdated
Comment threadpackages/nuxt/src/vite/utils.ts
Comment threadpackages/nuxt/src/vite/utils.ts
Comment threadpackages/nuxt/src/vite/utils.ts Outdated
Comment threadpackages/nuxt/src/vite/utils.ts Outdated
@s1gr1d
s1gr1d merged commit c579a45 into developNov 4, 2024
@s1gr1d
s1gr1d deleted the sig/nuxt-reexport-functions branch November 4, 2024 08:36
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@s1gr1d@lforst@mydea@andreiborza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functions - #14104

Merged
s1gr1d merged 5 commits into
developfrom
sig/nuxt-reexport-functions
Nov 4, 2024
Merged

feat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functions#14104
s1gr1d merged 5 commits into
developfrom
sig/nuxt-reexport-functions

Conversation

@s1gr1d

@s1gr1ds1gr1d commented Oct 28, 2024

Copy link
Copy Markdown
Member

Based on this PR: #14086

We get the names of the exports with Rollup's exportedBindings, but we cannot know whether this is a function or something else. As we need to re-export serverless functions for Netlify, Vercel and so on, an educated guess is made that 'default', 'handler', 'server' are potential serverless functions that need to be wrapped by Sentry and re-exported.

In case users experience issues, this can be changed with entrypointWrappedFunctions.

All other exports are exported as they were before.

@s1gr1d
s1gr1dforce-pushed the sig/nuxt-reexport-functions branch from 75db7b5 to 031e219CompareOctober 28, 2024 16:24
@github-actions

github-actionsBot commented Oct 28, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser22.74 KB--
@sentry/browser - with treeshaking flags21.53 KB--
@sentry/browser (incl. Tracing)35.14 KB--
@sentry/browser (incl. Tracing, Replay)71.86 KB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags62.29 KB--
@sentry/browser (incl. Tracing, Replay with Canvas)76.17 KB--
@sentry/browser (incl. Tracing, Replay, Feedback)88.97 KB--
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)90.81 KB--
@sentry/browser (incl. metrics)26.99 KB--
@sentry/browser (incl. Feedback)39.89 KB--
@sentry/browser (incl. sendFeedback)27.39 KB--
@sentry/browser (incl. FeedbackAsync)32.18 KB--
@sentry/react25.5 KB--
@sentry/react (incl. Tracing)38.1 KB--
@sentry/vue26.89 KB--
@sentry/vue (incl. Tracing)37.02 KB--
@sentry/svelte22.88 KB--
CDN Bundle24.1 KB--
CDN Bundle (incl. Tracing)36.96 KB--
CDN Bundle (incl. Tracing, Replay)71.62 KB--
CDN Bundle (incl. Tracing, Replay, Feedback)76.96 KB--
CDN Bundle - uncompressed70.64 KB--
CDN Bundle (incl. Tracing) - uncompressed109.71 KB--
CDN Bundle (incl. Tracing, Replay) - uncompressed222.23 KB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed235.45 KB--
@sentry/nextjs (client)38.18 KB--
@sentry/sveltekit (client)35.75 KB--
@sentry/node129.6 KB+0.01%+1 B 🔺
@sentry/node - without tracing94.3 KB--
@sentry/aws-serverless105.17 KB-0.01%-1 B 🔽

View base workflow run

Comment threadpackages/nuxt/src/common/types.ts Outdated
Comment on lines +132 to +136
* The `asyncFunctionReExports` option is only relevant when `dynamicImportForServerEntry: true` (default value).
*
* As the server entry file is wrapped with a dynamic `import()`, previous async function exports need to be re-exported.
* The SDK detects and re-exports those exports (mostly serverless functions). This is why they are re-exported as async functions.
* In case you have a custom setup and your server exports other async functions, you can override the default array with this option.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: Maybe we can rewrite this a bit, to a perspective of somebody who does not have deep understanding of all of this :D

Suggested change
*The`asyncFunctionReExports`option is onlyrelevantwhen`dynamicImportForServerEntry: true`(defaultvalue).
*
*Astheserverentryfileiswrappedwithadynamic`import()`,previousasyncfunctionexportsneedtobere-exported.
*TheSDKdetectsandre-exportsthoseexports(mostlyserverlessfunctions).Thisiswhytheyarere-exportedasasyncfunctions.
*Incaseyouhaveacustomsetupandyourserverexportsotherasyncfunctions,youcanoverridethedefaultarraywiththisoption.
*Bydefault(unlessyouconfigure`dynamicImportForServerEntry: false`)theSDKwilltrytowrapyourapplicationentrypointwithadynamic`import()`toensurealldependenciescanbeproperlyinstrumented.
*
*Bydefault,theSDKwillwrapthedefaultexportaswellasa `handler` or `server` exportfromtheentrypoint.Ifyourapplicationhasadifferentmainexportthatisusedtoruntheapplication,youcanoverwritethisbyprovidinganarrayofexportnamestowrap.
*Anywrappedexportisexpectedtobeanasyncfunction.

Comment threadpackages/nuxt/src/module.ts Outdated
Comment on lines +24 to +26
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports
? moduleOptionsParam.asyncFunctionReExports
: ['default', 'handler', 'server'],

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

super-l: I find it slightly easier to read:

Suggested change
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports
? moduleOptionsParam.asyncFunctionReExports
: ['default','handler','server'],
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports||['default','handler','server'],

Base automatically changed from sig/nuxt-reexport-firebase to developOctober 29, 2024 08:04
Comment threadpackages/nuxt/src/common/types.ts
Comment threadpackages/nuxt/src/vite/utils.ts Outdated

const expected = `
async function reExport(...args) {
async function reExport0(...args) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

m: Can we also have a test here to show that it does not change/wrap an export that does not match?

@s1gr1ds1gr1dOct 30, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That would require changing a lot of logic in the code. The here tested function constructFunctionReExport is only getting the input from the query parameters and creating a function for each query param.

The part, where those query params are actually added is here:

constfunctionsToExport=flatten(Object.values(moduleInfo.exportedBindings||{})).filter(functionName=>asyncFunctionReExports.includes(functionName),);

One thing I could do is extracting this part as a function to test this step as well. But as adding the query params and generating the function code happen in two different Rollup hooks, I cannot combine those two things in one function or test.

@lforst

Copy link
Copy Markdown
Contributor

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

@mydea

Copy link
Copy Markdown
Member

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

@lforst

Copy link
Copy Markdown
Contributor

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

Right, I feel like we need a mechanism that will just exclude certain exports from the whole shebang

@mydea

Copy link
Copy Markdown
Member

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

Right, I feel like we need a mechanism that will just exclude certain exports from the whole shebang

I think the idea is (Sigrid correct me if I'm wrong):

We do not wrap anything, generally, except the exports defined in this array (all of which are assumed to be async functions). If you do not want to wrap anything you could define [], if you only want to wrap e.g. the myServer export but nothing else you could do ['myServer']. Does that make sense? Any other export will remain untouched (e.g. be exported normally as before, without dynamic import)

@s1gr1d

Copy link
Copy Markdown
MemberAuthor

I think the suggestion of @lforst makes sense because if nothing is re-exported it's not exported at all. The problem here is that exportedBindings from Rollup only provides strings and I cannot know what this export should be. Assuming this will always be serverless functions, it's re-exported as an async function.

@s1gr1d
s1gr1dforce-pushed the sig/nuxt-reexport-functions branch from 84ff708 to b8a73caCompareOctober 31, 2024 12:31
@s1gr1ds1gr1d changed the title feat(nuxt): Add asyncFunctionReExports to define re-exported server functionsfeat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functionsOct 31, 2024
@s1gr1ds1gr1d self-assigned this Oct 31, 2024
Comment threadpackages/nuxt/src/common/types.ts Outdated
Comment threadpackages/nuxt/src/vite/utils.ts
Comment threadpackages/nuxt/src/vite/utils.ts
Comment threadpackages/nuxt/src/vite/utils.ts Outdated
Comment threadpackages/nuxt/src/vite/utils.ts Outdated
@s1gr1d
s1gr1d merged commit c579a45 into developNov 4, 2024
@s1gr1d
s1gr1d deleted the sig/nuxt-reexport-functions branch November 4, 2024 08:36
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@s1gr1d@lforst@mydea@andreiborza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functions - #14104

Merged
s1gr1d merged 5 commits into
developfrom
sig/nuxt-reexport-functions
Nov 4, 2024
Merged

feat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functions#14104
s1gr1d merged 5 commits into
developfrom
sig/nuxt-reexport-functions

Conversation

@s1gr1d

@s1gr1ds1gr1d commented Oct 28, 2024

Copy link
Copy Markdown
Member

Based on this PR: #14086

We get the names of the exports with Rollup's exportedBindings, but we cannot know whether this is a function or something else. As we need to re-export serverless functions for Netlify, Vercel and so on, an educated guess is made that 'default', 'handler', 'server' are potential serverless functions that need to be wrapped by Sentry and re-exported.

In case users experience issues, this can be changed with entrypointWrappedFunctions.

All other exports are exported as they were before.

@s1gr1d
s1gr1dforce-pushed the sig/nuxt-reexport-functions branch from 75db7b5 to 031e219CompareOctober 28, 2024 16:24
@github-actions

github-actionsBot commented Oct 28, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser22.74 KB--
@sentry/browser - with treeshaking flags21.53 KB--
@sentry/browser (incl. Tracing)35.14 KB--
@sentry/browser (incl. Tracing, Replay)71.86 KB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags62.29 KB--
@sentry/browser (incl. Tracing, Replay with Canvas)76.17 KB--
@sentry/browser (incl. Tracing, Replay, Feedback)88.97 KB--
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)90.81 KB--
@sentry/browser (incl. metrics)26.99 KB--
@sentry/browser (incl. Feedback)39.89 KB--
@sentry/browser (incl. sendFeedback)27.39 KB--
@sentry/browser (incl. FeedbackAsync)32.18 KB--
@sentry/react25.5 KB--
@sentry/react (incl. Tracing)38.1 KB--
@sentry/vue26.89 KB--
@sentry/vue (incl. Tracing)37.02 KB--
@sentry/svelte22.88 KB--
CDN Bundle24.1 KB--
CDN Bundle (incl. Tracing)36.96 KB--
CDN Bundle (incl. Tracing, Replay)71.62 KB--
CDN Bundle (incl. Tracing, Replay, Feedback)76.96 KB--
CDN Bundle - uncompressed70.64 KB--
CDN Bundle (incl. Tracing) - uncompressed109.71 KB--
CDN Bundle (incl. Tracing, Replay) - uncompressed222.23 KB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed235.45 KB--
@sentry/nextjs (client)38.18 KB--
@sentry/sveltekit (client)35.75 KB--
@sentry/node129.6 KB+0.01%+1 B 🔺
@sentry/node - without tracing94.3 KB--
@sentry/aws-serverless105.17 KB-0.01%-1 B 🔽

View base workflow run

Comment threadpackages/nuxt/src/common/types.ts Outdated
Comment on lines +132 to +136
* The `asyncFunctionReExports` option is only relevant when `dynamicImportForServerEntry: true` (default value).
*
* As the server entry file is wrapped with a dynamic `import()`, previous async function exports need to be re-exported.
* The SDK detects and re-exports those exports (mostly serverless functions). This is why they are re-exported as async functions.
* In case you have a custom setup and your server exports other async functions, you can override the default array with this option.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: Maybe we can rewrite this a bit, to a perspective of somebody who does not have deep understanding of all of this :D

Suggested change
*The`asyncFunctionReExports`option is onlyrelevantwhen`dynamicImportForServerEntry: true`(defaultvalue).
*
*Astheserverentryfileiswrappedwithadynamic`import()`,previousasyncfunctionexportsneedtobere-exported.
*TheSDKdetectsandre-exportsthoseexports(mostlyserverlessfunctions).Thisiswhytheyarere-exportedasasyncfunctions.
*Incaseyouhaveacustomsetupandyourserverexportsotherasyncfunctions,youcanoverridethedefaultarraywiththisoption.
*Bydefault(unlessyouconfigure`dynamicImportForServerEntry: false`)theSDKwilltrytowrapyourapplicationentrypointwithadynamic`import()`toensurealldependenciescanbeproperlyinstrumented.
*
*Bydefault,theSDKwillwrapthedefaultexportaswellasa `handler` or `server` exportfromtheentrypoint.Ifyourapplicationhasadifferentmainexportthatisusedtoruntheapplication,youcanoverwritethisbyprovidinganarrayofexportnamestowrap.
*Anywrappedexportisexpectedtobeanasyncfunction.

Comment threadpackages/nuxt/src/module.ts Outdated
Comment on lines +24 to +26
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports
? moduleOptionsParam.asyncFunctionReExports
: ['default', 'handler', 'server'],

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

super-l: I find it slightly easier to read:

Suggested change
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports
? moduleOptionsParam.asyncFunctionReExports
: ['default','handler','server'],
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports||['default','handler','server'],

Base automatically changed from sig/nuxt-reexport-firebase to developOctober 29, 2024 08:04
Comment threadpackages/nuxt/src/common/types.ts
Comment threadpackages/nuxt/src/vite/utils.ts Outdated

const expected = `
async function reExport(...args) {
async function reExport0(...args) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

m: Can we also have a test here to show that it does not change/wrap an export that does not match?

@s1gr1ds1gr1dOct 30, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That would require changing a lot of logic in the code. The here tested function constructFunctionReExport is only getting the input from the query parameters and creating a function for each query param.

The part, where those query params are actually added is here:

constfunctionsToExport=flatten(Object.values(moduleInfo.exportedBindings||{})).filter(functionName=>asyncFunctionReExports.includes(functionName),);

One thing I could do is extracting this part as a function to test this step as well. But as adding the query params and generating the function code happen in two different Rollup hooks, I cannot combine those two things in one function or test.

@lforst

Copy link
Copy Markdown
Contributor

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

@mydea

Copy link
Copy Markdown
Member

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

@lforst

Copy link
Copy Markdown
Contributor

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

Right, I feel like we need a mechanism that will just exclude certain exports from the whole shebang

@mydea

Copy link
Copy Markdown
Member

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

Right, I feel like we need a mechanism that will just exclude certain exports from the whole shebang

I think the idea is (Sigrid correct me if I'm wrong):

We do not wrap anything, generally, except the exports defined in this array (all of which are assumed to be async functions). If you do not want to wrap anything you could define [], if you only want to wrap e.g. the myServer export but nothing else you could do ['myServer']. Does that make sense? Any other export will remain untouched (e.g. be exported normally as before, without dynamic import)

@s1gr1d

Copy link
Copy Markdown
MemberAuthor

I think the suggestion of @lforst makes sense because if nothing is re-exported it's not exported at all. The problem here is that exportedBindings from Rollup only provides strings and I cannot know what this export should be. Assuming this will always be serverless functions, it's re-exported as an async function.

@s1gr1d
s1gr1dforce-pushed the sig/nuxt-reexport-functions branch from 84ff708 to b8a73caCompareOctober 31, 2024 12:31
@s1gr1ds1gr1d changed the title feat(nuxt): Add asyncFunctionReExports to define re-exported server functionsfeat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functionsOct 31, 2024
@s1gr1ds1gr1d self-assigned this Oct 31, 2024
Comment threadpackages/nuxt/src/common/types.ts Outdated
Comment threadpackages/nuxt/src/vite/utils.ts
Comment threadpackages/nuxt/src/vite/utils.ts
Comment threadpackages/nuxt/src/vite/utils.ts Outdated
Comment threadpackages/nuxt/src/vite/utils.ts Outdated
@s1gr1d
s1gr1d merged commit c579a45 into developNov 4, 2024
@s1gr1d
s1gr1d deleted the sig/nuxt-reexport-functions branch November 4, 2024 08:36
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@s1gr1d@lforst@mydea@andreiborza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functions - #14104

Merged
s1gr1d merged 5 commits into
developfrom
sig/nuxt-reexport-functions
Nov 4, 2024
Merged

feat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functions#14104
s1gr1d merged 5 commits into
developfrom
sig/nuxt-reexport-functions

Conversation

@s1gr1d

@s1gr1ds1gr1d commented Oct 28, 2024

Copy link
Copy Markdown
Member

Based on this PR: #14086

We get the names of the exports with Rollup's exportedBindings, but we cannot know whether this is a function or something else. As we need to re-export serverless functions for Netlify, Vercel and so on, an educated guess is made that 'default', 'handler', 'server' are potential serverless functions that need to be wrapped by Sentry and re-exported.

In case users experience issues, this can be changed with entrypointWrappedFunctions.

All other exports are exported as they were before.

@s1gr1d
s1gr1dforce-pushed the sig/nuxt-reexport-functions branch from 75db7b5 to 031e219CompareOctober 28, 2024 16:24
@github-actions

github-actionsBot commented Oct 28, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser22.74 KB--
@sentry/browser - with treeshaking flags21.53 KB--
@sentry/browser (incl. Tracing)35.14 KB--
@sentry/browser (incl. Tracing, Replay)71.86 KB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags62.29 KB--
@sentry/browser (incl. Tracing, Replay with Canvas)76.17 KB--
@sentry/browser (incl. Tracing, Replay, Feedback)88.97 KB--
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)90.81 KB--
@sentry/browser (incl. metrics)26.99 KB--
@sentry/browser (incl. Feedback)39.89 KB--
@sentry/browser (incl. sendFeedback)27.39 KB--
@sentry/browser (incl. FeedbackAsync)32.18 KB--
@sentry/react25.5 KB--
@sentry/react (incl. Tracing)38.1 KB--
@sentry/vue26.89 KB--
@sentry/vue (incl. Tracing)37.02 KB--
@sentry/svelte22.88 KB--
CDN Bundle24.1 KB--
CDN Bundle (incl. Tracing)36.96 KB--
CDN Bundle (incl. Tracing, Replay)71.62 KB--
CDN Bundle (incl. Tracing, Replay, Feedback)76.96 KB--
CDN Bundle - uncompressed70.64 KB--
CDN Bundle (incl. Tracing) - uncompressed109.71 KB--
CDN Bundle (incl. Tracing, Replay) - uncompressed222.23 KB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed235.45 KB--
@sentry/nextjs (client)38.18 KB--
@sentry/sveltekit (client)35.75 KB--
@sentry/node129.6 KB+0.01%+1 B 🔺
@sentry/node - without tracing94.3 KB--
@sentry/aws-serverless105.17 KB-0.01%-1 B 🔽

View base workflow run

Comment threadpackages/nuxt/src/common/types.ts Outdated
Comment on lines +132 to +136
* The `asyncFunctionReExports` option is only relevant when `dynamicImportForServerEntry: true` (default value).
*
* As the server entry file is wrapped with a dynamic `import()`, previous async function exports need to be re-exported.
* The SDK detects and re-exports those exports (mostly serverless functions). This is why they are re-exported as async functions.
* In case you have a custom setup and your server exports other async functions, you can override the default array with this option.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: Maybe we can rewrite this a bit, to a perspective of somebody who does not have deep understanding of all of this :D

Suggested change
*The`asyncFunctionReExports`option is onlyrelevantwhen`dynamicImportForServerEntry: true`(defaultvalue).
*
*Astheserverentryfileiswrappedwithadynamic`import()`,previousasyncfunctionexportsneedtobere-exported.
*TheSDKdetectsandre-exportsthoseexports(mostlyserverlessfunctions).Thisiswhytheyarere-exportedasasyncfunctions.
*Incaseyouhaveacustomsetupandyourserverexportsotherasyncfunctions,youcanoverridethedefaultarraywiththisoption.
*Bydefault(unlessyouconfigure`dynamicImportForServerEntry: false`)theSDKwilltrytowrapyourapplicationentrypointwithadynamic`import()`toensurealldependenciescanbeproperlyinstrumented.
*
*Bydefault,theSDKwillwrapthedefaultexportaswellasa `handler` or `server` exportfromtheentrypoint.Ifyourapplicationhasadifferentmainexportthatisusedtoruntheapplication,youcanoverwritethisbyprovidinganarrayofexportnamestowrap.
*Anywrappedexportisexpectedtobeanasyncfunction.

Comment threadpackages/nuxt/src/module.ts Outdated
Comment on lines +24 to +26
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports
? moduleOptionsParam.asyncFunctionReExports
: ['default', 'handler', 'server'],

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

super-l: I find it slightly easier to read:

Suggested change
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports
? moduleOptionsParam.asyncFunctionReExports
: ['default','handler','server'],
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports||['default','handler','server'],

Base automatically changed from sig/nuxt-reexport-firebase to developOctober 29, 2024 08:04
Comment threadpackages/nuxt/src/common/types.ts
Comment threadpackages/nuxt/src/vite/utils.ts Outdated

const expected = `
async function reExport(...args) {
async function reExport0(...args) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

m: Can we also have a test here to show that it does not change/wrap an export that does not match?

@s1gr1ds1gr1dOct 30, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That would require changing a lot of logic in the code. The here tested function constructFunctionReExport is only getting the input from the query parameters and creating a function for each query param.

The part, where those query params are actually added is here:

constfunctionsToExport=flatten(Object.values(moduleInfo.exportedBindings||{})).filter(functionName=>asyncFunctionReExports.includes(functionName),);

One thing I could do is extracting this part as a function to test this step as well. But as adding the query params and generating the function code happen in two different Rollup hooks, I cannot combine those two things in one function or test.

@lforst

Copy link
Copy Markdown
Contributor

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

@mydea

Copy link
Copy Markdown
Member

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

@lforst

Copy link
Copy Markdown
Contributor

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

Right, I feel like we need a mechanism that will just exclude certain exports from the whole shebang

@mydea

Copy link
Copy Markdown
Member

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

Right, I feel like we need a mechanism that will just exclude certain exports from the whole shebang

I think the idea is (Sigrid correct me if I'm wrong):

We do not wrap anything, generally, except the exports defined in this array (all of which are assumed to be async functions). If you do not want to wrap anything you could define [], if you only want to wrap e.g. the myServer export but nothing else you could do ['myServer']. Does that make sense? Any other export will remain untouched (e.g. be exported normally as before, without dynamic import)

@s1gr1d

Copy link
Copy Markdown
MemberAuthor

I think the suggestion of @lforst makes sense because if nothing is re-exported it's not exported at all. The problem here is that exportedBindings from Rollup only provides strings and I cannot know what this export should be. Assuming this will always be serverless functions, it's re-exported as an async function.

@s1gr1d
s1gr1dforce-pushed the sig/nuxt-reexport-functions branch from 84ff708 to b8a73caCompareOctober 31, 2024 12:31
@s1gr1ds1gr1d changed the title feat(nuxt): Add asyncFunctionReExports to define re-exported server functionsfeat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functionsOct 31, 2024
@s1gr1ds1gr1d self-assigned this Oct 31, 2024
Comment threadpackages/nuxt/src/common/types.ts Outdated
Comment threadpackages/nuxt/src/vite/utils.ts
Comment threadpackages/nuxt/src/vite/utils.ts
Comment threadpackages/nuxt/src/vite/utils.ts Outdated
Comment threadpackages/nuxt/src/vite/utils.ts Outdated
@s1gr1d
s1gr1d merged commit c579a45 into developNov 4, 2024
@s1gr1d
s1gr1d deleted the sig/nuxt-reexport-functions branch November 4, 2024 08:36
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@s1gr1d@lforst@mydea@andreiborza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functions - #14104

Merged
s1gr1d merged 5 commits into
developfrom
sig/nuxt-reexport-functions
Nov 4, 2024
Merged

feat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functions#14104
s1gr1d merged 5 commits into
developfrom
sig/nuxt-reexport-functions

Conversation

@s1gr1d

@s1gr1ds1gr1d commented Oct 28, 2024

Copy link
Copy Markdown
Member

Based on this PR: #14086

We get the names of the exports with Rollup's exportedBindings, but we cannot know whether this is a function or something else. As we need to re-export serverless functions for Netlify, Vercel and so on, an educated guess is made that 'default', 'handler', 'server' are potential serverless functions that need to be wrapped by Sentry and re-exported.

In case users experience issues, this can be changed with entrypointWrappedFunctions.

All other exports are exported as they were before.

@s1gr1d
s1gr1dforce-pushed the sig/nuxt-reexport-functions branch from 75db7b5 to 031e219CompareOctober 28, 2024 16:24
@github-actions

github-actionsBot commented Oct 28, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser22.74 KB--
@sentry/browser - with treeshaking flags21.53 KB--
@sentry/browser (incl. Tracing)35.14 KB--
@sentry/browser (incl. Tracing, Replay)71.86 KB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags62.29 KB--
@sentry/browser (incl. Tracing, Replay with Canvas)76.17 KB--
@sentry/browser (incl. Tracing, Replay, Feedback)88.97 KB--
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)90.81 KB--
@sentry/browser (incl. metrics)26.99 KB--
@sentry/browser (incl. Feedback)39.89 KB--
@sentry/browser (incl. sendFeedback)27.39 KB--
@sentry/browser (incl. FeedbackAsync)32.18 KB--
@sentry/react25.5 KB--
@sentry/react (incl. Tracing)38.1 KB--
@sentry/vue26.89 KB--
@sentry/vue (incl. Tracing)37.02 KB--
@sentry/svelte22.88 KB--
CDN Bundle24.1 KB--
CDN Bundle (incl. Tracing)36.96 KB--
CDN Bundle (incl. Tracing, Replay)71.62 KB--
CDN Bundle (incl. Tracing, Replay, Feedback)76.96 KB--
CDN Bundle - uncompressed70.64 KB--
CDN Bundle (incl. Tracing) - uncompressed109.71 KB--
CDN Bundle (incl. Tracing, Replay) - uncompressed222.23 KB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed235.45 KB--
@sentry/nextjs (client)38.18 KB--
@sentry/sveltekit (client)35.75 KB--
@sentry/node129.6 KB+0.01%+1 B 🔺
@sentry/node - without tracing94.3 KB--
@sentry/aws-serverless105.17 KB-0.01%-1 B 🔽

View base workflow run

Comment threadpackages/nuxt/src/common/types.ts Outdated
Comment on lines +132 to +136
* The `asyncFunctionReExports` option is only relevant when `dynamicImportForServerEntry: true` (default value).
*
* As the server entry file is wrapped with a dynamic `import()`, previous async function exports need to be re-exported.
* The SDK detects and re-exports those exports (mostly serverless functions). This is why they are re-exported as async functions.
* In case you have a custom setup and your server exports other async functions, you can override the default array with this option.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: Maybe we can rewrite this a bit, to a perspective of somebody who does not have deep understanding of all of this :D

Suggested change
*The`asyncFunctionReExports`option is onlyrelevantwhen`dynamicImportForServerEntry: true`(defaultvalue).
*
*Astheserverentryfileiswrappedwithadynamic`import()`,previousasyncfunctionexportsneedtobere-exported.
*TheSDKdetectsandre-exportsthoseexports(mostlyserverlessfunctions).Thisiswhytheyarere-exportedasasyncfunctions.
*Incaseyouhaveacustomsetupandyourserverexportsotherasyncfunctions,youcanoverridethedefaultarraywiththisoption.
*Bydefault(unlessyouconfigure`dynamicImportForServerEntry: false`)theSDKwilltrytowrapyourapplicationentrypointwithadynamic`import()`toensurealldependenciescanbeproperlyinstrumented.
*
*Bydefault,theSDKwillwrapthedefaultexportaswellasa `handler` or `server` exportfromtheentrypoint.Ifyourapplicationhasadifferentmainexportthatisusedtoruntheapplication,youcanoverwritethisbyprovidinganarrayofexportnamestowrap.
*Anywrappedexportisexpectedtobeanasyncfunction.

Comment threadpackages/nuxt/src/module.ts Outdated
Comment on lines +24 to +26
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports
? moduleOptionsParam.asyncFunctionReExports
: ['default', 'handler', 'server'],

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

super-l: I find it slightly easier to read:

Suggested change
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports
? moduleOptionsParam.asyncFunctionReExports
: ['default','handler','server'],
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports||['default','handler','server'],

Base automatically changed from sig/nuxt-reexport-firebase to developOctober 29, 2024 08:04
Comment threadpackages/nuxt/src/common/types.ts
Comment threadpackages/nuxt/src/vite/utils.ts Outdated

const expected = `
async function reExport(...args) {
async function reExport0(...args) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

m: Can we also have a test here to show that it does not change/wrap an export that does not match?

@s1gr1ds1gr1dOct 30, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That would require changing a lot of logic in the code. The here tested function constructFunctionReExport is only getting the input from the query parameters and creating a function for each query param.

The part, where those query params are actually added is here:

constfunctionsToExport=flatten(Object.values(moduleInfo.exportedBindings||{})).filter(functionName=>asyncFunctionReExports.includes(functionName),);

One thing I could do is extracting this part as a function to test this step as well. But as adding the query params and generating the function code happen in two different Rollup hooks, I cannot combine those two things in one function or test.

@lforst

Copy link
Copy Markdown
Contributor

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

@mydea

Copy link
Copy Markdown
Member

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

@lforst

Copy link
Copy Markdown
Contributor

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

Right, I feel like we need a mechanism that will just exclude certain exports from the whole shebang

@mydea

Copy link
Copy Markdown
Member

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

Right, I feel like we need a mechanism that will just exclude certain exports from the whole shebang

I think the idea is (Sigrid correct me if I'm wrong):

We do not wrap anything, generally, except the exports defined in this array (all of which are assumed to be async functions). If you do not want to wrap anything you could define [], if you only want to wrap e.g. the myServer export but nothing else you could do ['myServer']. Does that make sense? Any other export will remain untouched (e.g. be exported normally as before, without dynamic import)

@s1gr1d

Copy link
Copy Markdown
MemberAuthor

I think the suggestion of @lforst makes sense because if nothing is re-exported it's not exported at all. The problem here is that exportedBindings from Rollup only provides strings and I cannot know what this export should be. Assuming this will always be serverless functions, it's re-exported as an async function.

@s1gr1d
s1gr1dforce-pushed the sig/nuxt-reexport-functions branch from 84ff708 to b8a73caCompareOctober 31, 2024 12:31
@s1gr1ds1gr1d changed the title feat(nuxt): Add asyncFunctionReExports to define re-exported server functionsfeat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functionsOct 31, 2024
@s1gr1ds1gr1d self-assigned this Oct 31, 2024
Comment threadpackages/nuxt/src/common/types.ts Outdated
Comment threadpackages/nuxt/src/vite/utils.ts
Comment threadpackages/nuxt/src/vite/utils.ts
Comment threadpackages/nuxt/src/vite/utils.ts Outdated
Comment threadpackages/nuxt/src/vite/utils.ts Outdated
@s1gr1d
s1gr1d merged commit c579a45 into developNov 4, 2024
@s1gr1d
s1gr1d deleted the sig/nuxt-reexport-functions branch November 4, 2024 08:36
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@s1gr1d@lforst@mydea@andreiborza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functions - #14104

Merged
s1gr1d merged 5 commits into
developfrom
sig/nuxt-reexport-functions
Nov 4, 2024
Merged

feat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functions#14104
s1gr1d merged 5 commits into
developfrom
sig/nuxt-reexport-functions

Conversation

@s1gr1d

@s1gr1ds1gr1d commented Oct 28, 2024

Copy link
Copy Markdown
Member

Based on this PR: #14086

We get the names of the exports with Rollup's exportedBindings, but we cannot know whether this is a function or something else. As we need to re-export serverless functions for Netlify, Vercel and so on, an educated guess is made that 'default', 'handler', 'server' are potential serverless functions that need to be wrapped by Sentry and re-exported.

In case users experience issues, this can be changed with entrypointWrappedFunctions.

All other exports are exported as they were before.

@s1gr1d
s1gr1dforce-pushed the sig/nuxt-reexport-functions branch from 75db7b5 to 031e219CompareOctober 28, 2024 16:24
@github-actions

github-actionsBot commented Oct 28, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser22.74 KB--
@sentry/browser - with treeshaking flags21.53 KB--
@sentry/browser (incl. Tracing)35.14 KB--
@sentry/browser (incl. Tracing, Replay)71.86 KB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags62.29 KB--
@sentry/browser (incl. Tracing, Replay with Canvas)76.17 KB--
@sentry/browser (incl. Tracing, Replay, Feedback)88.97 KB--
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)90.81 KB--
@sentry/browser (incl. metrics)26.99 KB--
@sentry/browser (incl. Feedback)39.89 KB--
@sentry/browser (incl. sendFeedback)27.39 KB--
@sentry/browser (incl. FeedbackAsync)32.18 KB--
@sentry/react25.5 KB--
@sentry/react (incl. Tracing)38.1 KB--
@sentry/vue26.89 KB--
@sentry/vue (incl. Tracing)37.02 KB--
@sentry/svelte22.88 KB--
CDN Bundle24.1 KB--
CDN Bundle (incl. Tracing)36.96 KB--
CDN Bundle (incl. Tracing, Replay)71.62 KB--
CDN Bundle (incl. Tracing, Replay, Feedback)76.96 KB--
CDN Bundle - uncompressed70.64 KB--
CDN Bundle (incl. Tracing) - uncompressed109.71 KB--
CDN Bundle (incl. Tracing, Replay) - uncompressed222.23 KB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed235.45 KB--
@sentry/nextjs (client)38.18 KB--
@sentry/sveltekit (client)35.75 KB--
@sentry/node129.6 KB+0.01%+1 B 🔺
@sentry/node - without tracing94.3 KB--
@sentry/aws-serverless105.17 KB-0.01%-1 B 🔽

View base workflow run

Comment threadpackages/nuxt/src/common/types.ts Outdated
Comment on lines +132 to +136
* The `asyncFunctionReExports` option is only relevant when `dynamicImportForServerEntry: true` (default value).
*
* As the server entry file is wrapped with a dynamic `import()`, previous async function exports need to be re-exported.
* The SDK detects and re-exports those exports (mostly serverless functions). This is why they are re-exported as async functions.
* In case you have a custom setup and your server exports other async functions, you can override the default array with this option.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: Maybe we can rewrite this a bit, to a perspective of somebody who does not have deep understanding of all of this :D

Suggested change
*The`asyncFunctionReExports`option is onlyrelevantwhen`dynamicImportForServerEntry: true`(defaultvalue).
*
*Astheserverentryfileiswrappedwithadynamic`import()`,previousasyncfunctionexportsneedtobere-exported.
*TheSDKdetectsandre-exportsthoseexports(mostlyserverlessfunctions).Thisiswhytheyarere-exportedasasyncfunctions.
*Incaseyouhaveacustomsetupandyourserverexportsotherasyncfunctions,youcanoverridethedefaultarraywiththisoption.
*Bydefault(unlessyouconfigure`dynamicImportForServerEntry: false`)theSDKwilltrytowrapyourapplicationentrypointwithadynamic`import()`toensurealldependenciescanbeproperlyinstrumented.
*
*Bydefault,theSDKwillwrapthedefaultexportaswellasa `handler` or `server` exportfromtheentrypoint.Ifyourapplicationhasadifferentmainexportthatisusedtoruntheapplication,youcanoverwritethisbyprovidinganarrayofexportnamestowrap.
*Anywrappedexportisexpectedtobeanasyncfunction.

Comment threadpackages/nuxt/src/module.ts Outdated
Comment on lines +24 to +26
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports
? moduleOptionsParam.asyncFunctionReExports
: ['default', 'handler', 'server'],

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

super-l: I find it slightly easier to read:

Suggested change
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports
? moduleOptionsParam.asyncFunctionReExports
: ['default','handler','server'],
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports||['default','handler','server'],

Base automatically changed from sig/nuxt-reexport-firebase to developOctober 29, 2024 08:04
Comment threadpackages/nuxt/src/common/types.ts
Comment threadpackages/nuxt/src/vite/utils.ts Outdated

const expected = `
async function reExport(...args) {
async function reExport0(...args) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

m: Can we also have a test here to show that it does not change/wrap an export that does not match?

@s1gr1ds1gr1dOct 30, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That would require changing a lot of logic in the code. The here tested function constructFunctionReExport is only getting the input from the query parameters and creating a function for each query param.

The part, where those query params are actually added is here:

constfunctionsToExport=flatten(Object.values(moduleInfo.exportedBindings||{})).filter(functionName=>asyncFunctionReExports.includes(functionName),);

One thing I could do is extracting this part as a function to test this step as well. But as adding the query params and generating the function code happen in two different Rollup hooks, I cannot combine those two things in one function or test.

@lforst

Copy link
Copy Markdown
Contributor

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

@mydea

Copy link
Copy Markdown
Member

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

@lforst

Copy link
Copy Markdown
Contributor

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

Right, I feel like we need a mechanism that will just exclude certain exports from the whole shebang

@mydea

Copy link
Copy Markdown
Member

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

Right, I feel like we need a mechanism that will just exclude certain exports from the whole shebang

I think the idea is (Sigrid correct me if I'm wrong):

We do not wrap anything, generally, except the exports defined in this array (all of which are assumed to be async functions). If you do not want to wrap anything you could define [], if you only want to wrap e.g. the myServer export but nothing else you could do ['myServer']. Does that make sense? Any other export will remain untouched (e.g. be exported normally as before, without dynamic import)

@s1gr1d

Copy link
Copy Markdown
MemberAuthor

I think the suggestion of @lforst makes sense because if nothing is re-exported it's not exported at all. The problem here is that exportedBindings from Rollup only provides strings and I cannot know what this export should be. Assuming this will always be serverless functions, it's re-exported as an async function.

@s1gr1d
s1gr1dforce-pushed the sig/nuxt-reexport-functions branch from 84ff708 to b8a73caCompareOctober 31, 2024 12:31
@s1gr1ds1gr1d changed the title feat(nuxt): Add asyncFunctionReExports to define re-exported server functionsfeat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functionsOct 31, 2024
@s1gr1ds1gr1d self-assigned this Oct 31, 2024
Comment threadpackages/nuxt/src/common/types.ts Outdated
Comment threadpackages/nuxt/src/vite/utils.ts
Comment threadpackages/nuxt/src/vite/utils.ts
Comment threadpackages/nuxt/src/vite/utils.ts Outdated
Comment threadpackages/nuxt/src/vite/utils.ts Outdated
@s1gr1d
s1gr1d merged commit c579a45 into developNov 4, 2024
@s1gr1d
s1gr1d deleted the sig/nuxt-reexport-functions branch November 4, 2024 08:36
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@s1gr1d@lforst@mydea@andreiborza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functions - #14104

Merged
s1gr1d merged 5 commits into
developfrom
sig/nuxt-reexport-functions
Nov 4, 2024
Merged

feat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functions#14104
s1gr1d merged 5 commits into
developfrom
sig/nuxt-reexport-functions

Conversation

@s1gr1d

@s1gr1ds1gr1d commented Oct 28, 2024

Copy link
Copy Markdown
Member

Based on this PR: #14086

We get the names of the exports with Rollup's exportedBindings, but we cannot know whether this is a function or something else. As we need to re-export serverless functions for Netlify, Vercel and so on, an educated guess is made that 'default', 'handler', 'server' are potential serverless functions that need to be wrapped by Sentry and re-exported.

In case users experience issues, this can be changed with entrypointWrappedFunctions.

All other exports are exported as they were before.

@s1gr1d
s1gr1dforce-pushed the sig/nuxt-reexport-functions branch from 75db7b5 to 031e219CompareOctober 28, 2024 16:24
@github-actions

github-actionsBot commented Oct 28, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser22.74 KB--
@sentry/browser - with treeshaking flags21.53 KB--
@sentry/browser (incl. Tracing)35.14 KB--
@sentry/browser (incl. Tracing, Replay)71.86 KB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags62.29 KB--
@sentry/browser (incl. Tracing, Replay with Canvas)76.17 KB--
@sentry/browser (incl. Tracing, Replay, Feedback)88.97 KB--
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)90.81 KB--
@sentry/browser (incl. metrics)26.99 KB--
@sentry/browser (incl. Feedback)39.89 KB--
@sentry/browser (incl. sendFeedback)27.39 KB--
@sentry/browser (incl. FeedbackAsync)32.18 KB--
@sentry/react25.5 KB--
@sentry/react (incl. Tracing)38.1 KB--
@sentry/vue26.89 KB--
@sentry/vue (incl. Tracing)37.02 KB--
@sentry/svelte22.88 KB--
CDN Bundle24.1 KB--
CDN Bundle (incl. Tracing)36.96 KB--
CDN Bundle (incl. Tracing, Replay)71.62 KB--
CDN Bundle (incl. Tracing, Replay, Feedback)76.96 KB--
CDN Bundle - uncompressed70.64 KB--
CDN Bundle (incl. Tracing) - uncompressed109.71 KB--
CDN Bundle (incl. Tracing, Replay) - uncompressed222.23 KB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed235.45 KB--
@sentry/nextjs (client)38.18 KB--
@sentry/sveltekit (client)35.75 KB--
@sentry/node129.6 KB+0.01%+1 B 🔺
@sentry/node - without tracing94.3 KB--
@sentry/aws-serverless105.17 KB-0.01%-1 B 🔽

View base workflow run

Comment threadpackages/nuxt/src/common/types.ts Outdated
Comment on lines +132 to +136
* The `asyncFunctionReExports` option is only relevant when `dynamicImportForServerEntry: true` (default value).
*
* As the server entry file is wrapped with a dynamic `import()`, previous async function exports need to be re-exported.
* The SDK detects and re-exports those exports (mostly serverless functions). This is why they are re-exported as async functions.
* In case you have a custom setup and your server exports other async functions, you can override the default array with this option.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: Maybe we can rewrite this a bit, to a perspective of somebody who does not have deep understanding of all of this :D

Suggested change
*The`asyncFunctionReExports`option is onlyrelevantwhen`dynamicImportForServerEntry: true`(defaultvalue).
*
*Astheserverentryfileiswrappedwithadynamic`import()`,previousasyncfunctionexportsneedtobere-exported.
*TheSDKdetectsandre-exportsthoseexports(mostlyserverlessfunctions).Thisiswhytheyarere-exportedasasyncfunctions.
*Incaseyouhaveacustomsetupandyourserverexportsotherasyncfunctions,youcanoverridethedefaultarraywiththisoption.
*Bydefault(unlessyouconfigure`dynamicImportForServerEntry: false`)theSDKwilltrytowrapyourapplicationentrypointwithadynamic`import()`toensurealldependenciescanbeproperlyinstrumented.
*
*Bydefault,theSDKwillwrapthedefaultexportaswellasa `handler` or `server` exportfromtheentrypoint.Ifyourapplicationhasadifferentmainexportthatisusedtoruntheapplication,youcanoverwritethisbyprovidinganarrayofexportnamestowrap.
*Anywrappedexportisexpectedtobeanasyncfunction.

Comment threadpackages/nuxt/src/module.ts Outdated
Comment on lines +24 to +26
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports
? moduleOptionsParam.asyncFunctionReExports
: ['default', 'handler', 'server'],

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

super-l: I find it slightly easier to read:

Suggested change
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports
? moduleOptionsParam.asyncFunctionReExports
: ['default','handler','server'],
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports||['default','handler','server'],

Base automatically changed from sig/nuxt-reexport-firebase to developOctober 29, 2024 08:04
Comment threadpackages/nuxt/src/common/types.ts
Comment threadpackages/nuxt/src/vite/utils.ts Outdated

const expected = `
async function reExport(...args) {
async function reExport0(...args) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

m: Can we also have a test here to show that it does not change/wrap an export that does not match?

@s1gr1ds1gr1dOct 30, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That would require changing a lot of logic in the code. The here tested function constructFunctionReExport is only getting the input from the query parameters and creating a function for each query param.

The part, where those query params are actually added is here:

constfunctionsToExport=flatten(Object.values(moduleInfo.exportedBindings||{})).filter(functionName=>asyncFunctionReExports.includes(functionName),);

One thing I could do is extracting this part as a function to test this step as well. But as adding the query params and generating the function code happen in two different Rollup hooks, I cannot combine those two things in one function or test.

@lforst

Copy link
Copy Markdown
Contributor

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

@mydea

Copy link
Copy Markdown
Member

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

@lforst

Copy link
Copy Markdown
Contributor

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

Right, I feel like we need a mechanism that will just exclude certain exports from the whole shebang

@mydea

Copy link
Copy Markdown
Member

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

Right, I feel like we need a mechanism that will just exclude certain exports from the whole shebang

I think the idea is (Sigrid correct me if I'm wrong):

We do not wrap anything, generally, except the exports defined in this array (all of which are assumed to be async functions). If you do not want to wrap anything you could define [], if you only want to wrap e.g. the myServer export but nothing else you could do ['myServer']. Does that make sense? Any other export will remain untouched (e.g. be exported normally as before, without dynamic import)

@s1gr1d

Copy link
Copy Markdown
MemberAuthor

I think the suggestion of @lforst makes sense because if nothing is re-exported it's not exported at all. The problem here is that exportedBindings from Rollup only provides strings and I cannot know what this export should be. Assuming this will always be serverless functions, it's re-exported as an async function.

@s1gr1d
s1gr1dforce-pushed the sig/nuxt-reexport-functions branch from 84ff708 to b8a73caCompareOctober 31, 2024 12:31
@s1gr1ds1gr1d changed the title feat(nuxt): Add asyncFunctionReExports to define re-exported server functionsfeat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functionsOct 31, 2024
@s1gr1ds1gr1d self-assigned this Oct 31, 2024
Comment threadpackages/nuxt/src/common/types.ts Outdated
Comment threadpackages/nuxt/src/vite/utils.ts
Comment threadpackages/nuxt/src/vite/utils.ts
Comment threadpackages/nuxt/src/vite/utils.ts Outdated
Comment threadpackages/nuxt/src/vite/utils.ts Outdated
@s1gr1d
s1gr1d merged commit c579a45 into developNov 4, 2024
@s1gr1d
s1gr1d deleted the sig/nuxt-reexport-functions branch November 4, 2024 08:36
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@s1gr1d@lforst@mydea@andreiborza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functions - #14104

Merged
s1gr1d merged 5 commits into
developfrom
sig/nuxt-reexport-functions
Nov 4, 2024
Merged

feat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functions#14104
s1gr1d merged 5 commits into
developfrom
sig/nuxt-reexport-functions

Conversation

@s1gr1d

@s1gr1ds1gr1d commented Oct 28, 2024

Copy link
Copy Markdown
Member

Based on this PR: #14086

We get the names of the exports with Rollup's exportedBindings, but we cannot know whether this is a function or something else. As we need to re-export serverless functions for Netlify, Vercel and so on, an educated guess is made that 'default', 'handler', 'server' are potential serverless functions that need to be wrapped by Sentry and re-exported.

In case users experience issues, this can be changed with entrypointWrappedFunctions.

All other exports are exported as they were before.

@s1gr1d
s1gr1dforce-pushed the sig/nuxt-reexport-functions branch from 75db7b5 to 031e219CompareOctober 28, 2024 16:24
@github-actions

github-actionsBot commented Oct 28, 2024

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser22.74 KB--
@sentry/browser - with treeshaking flags21.53 KB--
@sentry/browser (incl. Tracing)35.14 KB--
@sentry/browser (incl. Tracing, Replay)71.86 KB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags62.29 KB--
@sentry/browser (incl. Tracing, Replay with Canvas)76.17 KB--
@sentry/browser (incl. Tracing, Replay, Feedback)88.97 KB--
@sentry/browser (incl. Tracing, Replay, Feedback, metrics)90.81 KB--
@sentry/browser (incl. metrics)26.99 KB--
@sentry/browser (incl. Feedback)39.89 KB--
@sentry/browser (incl. sendFeedback)27.39 KB--
@sentry/browser (incl. FeedbackAsync)32.18 KB--
@sentry/react25.5 KB--
@sentry/react (incl. Tracing)38.1 KB--
@sentry/vue26.89 KB--
@sentry/vue (incl. Tracing)37.02 KB--
@sentry/svelte22.88 KB--
CDN Bundle24.1 KB--
CDN Bundle (incl. Tracing)36.96 KB--
CDN Bundle (incl. Tracing, Replay)71.62 KB--
CDN Bundle (incl. Tracing, Replay, Feedback)76.96 KB--
CDN Bundle - uncompressed70.64 KB--
CDN Bundle (incl. Tracing) - uncompressed109.71 KB--
CDN Bundle (incl. Tracing, Replay) - uncompressed222.23 KB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed235.45 KB--
@sentry/nextjs (client)38.18 KB--
@sentry/sveltekit (client)35.75 KB--
@sentry/node129.6 KB+0.01%+1 B 🔺
@sentry/node - without tracing94.3 KB--
@sentry/aws-serverless105.17 KB-0.01%-1 B 🔽

View base workflow run

Comment threadpackages/nuxt/src/common/types.ts Outdated
Comment on lines +132 to +136
* The `asyncFunctionReExports` option is only relevant when `dynamicImportForServerEntry: true` (default value).
*
* As the server entry file is wrapped with a dynamic `import()`, previous async function exports need to be re-exported.
* The SDK detects and re-exports those exports (mostly serverless functions). This is why they are re-exported as async functions.
* In case you have a custom setup and your server exports other async functions, you can override the default array with this option.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: Maybe we can rewrite this a bit, to a perspective of somebody who does not have deep understanding of all of this :D

Suggested change
*The`asyncFunctionReExports`option is onlyrelevantwhen`dynamicImportForServerEntry: true`(defaultvalue).
*
*Astheserverentryfileiswrappedwithadynamic`import()`,previousasyncfunctionexportsneedtobere-exported.
*TheSDKdetectsandre-exportsthoseexports(mostlyserverlessfunctions).Thisiswhytheyarere-exportedasasyncfunctions.
*Incaseyouhaveacustomsetupandyourserverexportsotherasyncfunctions,youcanoverridethedefaultarraywiththisoption.
*Bydefault(unlessyouconfigure`dynamicImportForServerEntry: false`)theSDKwilltrytowrapyourapplicationentrypointwithadynamic`import()`toensurealldependenciescanbeproperlyinstrumented.
*
*Bydefault,theSDKwillwrapthedefaultexportaswellasa `handler` or `server` exportfromtheentrypoint.Ifyourapplicationhasadifferentmainexportthatisusedtoruntheapplication,youcanoverwritethisbyprovidinganarrayofexportnamestowrap.
*Anywrappedexportisexpectedtobeanasyncfunction.

Comment threadpackages/nuxt/src/module.ts Outdated
Comment on lines +24 to +26
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports
? moduleOptionsParam.asyncFunctionReExports
: ['default', 'handler', 'server'],

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

super-l: I find it slightly easier to read:

Suggested change
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports
? moduleOptionsParam.asyncFunctionReExports
: ['default','handler','server'],
asyncFunctionReExports: moduleOptionsParam.asyncFunctionReExports||['default','handler','server'],

Base automatically changed from sig/nuxt-reexport-firebase to developOctober 29, 2024 08:04
Comment threadpackages/nuxt/src/common/types.ts
Comment threadpackages/nuxt/src/vite/utils.ts Outdated

const expected = `
async function reExport(...args) {
async function reExport0(...args) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

m: Can we also have a test here to show that it does not change/wrap an export that does not match?

@s1gr1ds1gr1dOct 30, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That would require changing a lot of logic in the code. The here tested function constructFunctionReExport is only getting the input from the query parameters and creating a function for each query param.

The part, where those query params are actually added is here:

constfunctionsToExport=flatten(Object.values(moduleInfo.exportedBindings||{})).filter(functionName=>asyncFunctionReExports.includes(functionName),);

One thing I could do is extracting this part as a function to test this step as well. But as adding the query params and generating the function code happen in two different Rollup hooks, I cannot combine those two things in one function or test.

@lforst

Copy link
Copy Markdown
Contributor

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

@mydea

Copy link
Copy Markdown
Member

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

@lforst

Copy link
Copy Markdown
Contributor

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

Right, I feel like we need a mechanism that will just exclude certain exports from the whole shebang

@mydea

Copy link
Copy Markdown
Member

I'd design the API as follows:

interfaceWhateverOptions{entrypointExportOverrides: {asyncFunctions: string[];functions: string[];}}

We cannot wrap functions this way though, can we? Or we'd turn the sync function into an async one (which we already do anyhow right now if we'd match)?

Right, I feel like we need a mechanism that will just exclude certain exports from the whole shebang

I think the idea is (Sigrid correct me if I'm wrong):

We do not wrap anything, generally, except the exports defined in this array (all of which are assumed to be async functions). If you do not want to wrap anything you could define [], if you only want to wrap e.g. the myServer export but nothing else you could do ['myServer']. Does that make sense? Any other export will remain untouched (e.g. be exported normally as before, without dynamic import)

@s1gr1d

Copy link
Copy Markdown
MemberAuthor

I think the suggestion of @lforst makes sense because if nothing is re-exported it's not exported at all. The problem here is that exportedBindings from Rollup only provides strings and I cannot know what this export should be. Assuming this will always be serverless functions, it's re-exported as an async function.

@s1gr1d
s1gr1dforce-pushed the sig/nuxt-reexport-functions branch from 84ff708 to b8a73caCompareOctober 31, 2024 12:31
@s1gr1ds1gr1d changed the title feat(nuxt): Add asyncFunctionReExports to define re-exported server functionsfeat(nuxt): Add entrypointWrappedFunctions to define async wrapped server functionsOct 31, 2024
@s1gr1ds1gr1d self-assigned this Oct 31, 2024
Comment threadpackages/nuxt/src/common/types.ts Outdated
Comment threadpackages/nuxt/src/vite/utils.ts
Comment threadpackages/nuxt/src/vite/utils.ts
Comment threadpackages/nuxt/src/vite/utils.ts Outdated
Comment threadpackages/nuxt/src/vite/utils.ts Outdated
@s1gr1d
s1gr1d merged commit c579a45 into developNov 4, 2024
@s1gr1d
s1gr1d deleted the sig/nuxt-reexport-functions branch November 4, 2024 08:36
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@s1gr1d@lforst@mydea@andreiborza