Browse Source

ref(onboarding): Convert platforms dotnet aspnetcore & gcpfunctions to new structure (#58239)

- relates to https://github.com/getsentry/sentry/issues/56549
ArthurKnaus 1 year ago
parent
commit
37cdb15cf3

+ 23 - 12
static/app/gettingStartedDocs/dotnet/awslambda.spec.tsx

@@ -1,18 +1,29 @@
-import {render, screen} from 'sentry-test/reactTestingLibrary';
+import {renderWithOnboardingLayout} from 'sentry-test/onboarding/renderWithOnboardingLayout';
+import {screen} from 'sentry-test/reactTestingLibrary';
+import {textWithMarkupMatcher} from 'sentry-test/utils';
 
-import {StepTitle} from 'sentry/components/onboarding/gettingStartedDoc/step';
+import docs from './awslambda';
 
-import {GettingStartedAwsLambda, steps} from './awslambda';
+describe('awslambda onboarding docs', function () {
+  it('renders docs correctly', async function () {
+    renderWithOnboardingLayout(docs, {
+      releaseRegistry: {
+        'sentry.dotnet.aspnetcore': {
+          version: '1.99.9',
+        },
+      },
+    });
 
-describe('GettingStartedAwsLambda', function () {
-  it('renders doc correctly', function () {
-    render(<GettingStartedAwsLambda dsn="test-dsn" projectSlug="test-project" />);
+    // Renders main headings
+    expect(screen.getByRole('heading', {name: 'Install'})).toBeInTheDocument();
+    expect(screen.getByRole('heading', {name: 'Configure SDK'})).toBeInTheDocument();
+    expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument();
 
-    // Steps
-    for (const step of steps()) {
-      expect(
-        screen.getByRole('heading', {name: step.title ?? StepTitle[step.type]})
-      ).toBeInTheDocument();
-    }
+    // Renders SDK version from registry
+    expect(
+      await screen.findByText(
+        textWithMarkupMatcher(/Install-Package Sentry.AspNetCore -Version 1\.99\.9/)
+      )
+    ).toBeInTheDocument();
   });
 });

+ 127 - 128
static/app/gettingStartedDocs/dotnet/awslambda.tsx

@@ -1,88 +1,32 @@
 import {Fragment} from 'react';
 
 import ExternalLink from 'sentry/components/links/externalLink';
-import {Layout, LayoutProps} from 'sentry/components/onboarding/gettingStartedDoc/layout';
-import {ModuleProps} from 'sentry/components/onboarding/gettingStartedDoc/sdkDocumentation';
 import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/step';
+import type {
+  Docs,
+  DocsParams,
+  OnboardingConfig,
+} from 'sentry/components/onboarding/gettingStartedDoc/types';
 import {t, tct} from 'sentry/locale';
+import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion';
 
-// Configuration Start
-const introduction = (
-  <p>
-    {tct(
-      'Sentry provides an integration with AWS Lambda ASP.NET Core Server through the Sentry.AspNetCore NuGet package.',
-      {
-        link: <ExternalLink href="https://www.nuget.org/packages/Sentry.AspNetCore" />,
-      }
-    )}
-  </p>
-);
-export const steps = ({
-  dsn,
-  sourcePackageRegistries,
-}: Partial<
-  Pick<ModuleProps, 'dsn' | 'sourcePackageRegistries'>
-> = {}): LayoutProps['steps'] => [
-  {
-    type: StepType.INSTALL,
-    description: t('Add the Sentry dependency:'),
-    configurations: [
-      {
-        language: 'powershell',
-        partialLoading: sourcePackageRegistries?.isLoading,
-        code: `Install-Package Sentry.AspNetCore -Version ${
-          sourcePackageRegistries?.isLoading
-            ? t('\u2026loading')
-            : sourcePackageRegistries?.data?.['sentry.dotnet.aspnetcore']?.version ??
-              '3.34.0'
-        }`,
-      },
-      {
-        language: 'shell',
-        partialLoading: sourcePackageRegistries?.isLoading,
-        code: `dotnet add package Sentry.AspNetCore -v ${
-          sourcePackageRegistries?.isLoading
-            ? t('\u2026loading')
-            : sourcePackageRegistries?.data?.['sentry.dotnet.aspnetcore']?.version ??
-              '3.34.0'
-        }`,
-      },
-    ],
-    additionalInfo: (
-      <p>
-        {tct(
-          'You can combine this integration with a logging library like [strong:log4net, NLog, or Serilog] to include both request data as well as your logs as breadcrumbs. The logging ingrations also capture events when an error is logged.',
-          {strong: <strong />}
-        )}
-      </p>
-    ),
-  },
-  {
-    type: StepType.CONFIGURE,
-    description: (
-      <Fragment>
-        <p>
-          {tct(
-            'All [code:ASP.NET Core] configurations are valid here. But one configuration in particular is relevant.',
-            {
-              code: <code />,
-            }
-          )}
-        </p>
-        <p>
-          {tct(
-            '[code:FlushOnCompletedRequest] ensures all events are flushed out. This is because the general ASP.NET Core hooks for when the process is exiting are not guaranteed to run in a serverless environment. This setting ensures that no event is lost if AWS recycles the process.',
-            {
-              code: <code />,
-            }
-          )}
-        </p>
-      </Fragment>
-    ),
-    configurations: [
-      {
-        language: 'csharp',
-        code: `
+type Params = DocsParams;
+
+const getInstallSnippetPackageManager = (params: Params) => `
+Install-Package Sentry.AspNetCore -Version ${getPackageVersion(
+  params,
+  'sentry.dotnet.aspnetcore',
+  '3.34.0'
+)}`;
+
+const getInstallSnippetCoreCli = (params: Params) => `
+dotnet add package Sentry.AspNetCore -v ${getPackageVersion(
+  params,
+  'sentry.dotnet.aspnetcore',
+  '3.34.0'
+)}`;
+
+const getConfigureSnippet = (params: Params) => `
 public class LambdaEntryPoint : Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction
 {
     protected override void Init(IWebHostBuilder builder)
@@ -91,7 +35,7 @@ public class LambdaEntryPoint : Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFu
             // Add Sentry
             .UseSentry(o =>
             {
-              o.Dsn = "${dsn}";
+              o.Dsn = "${params.dsn}";
               // When configuring for the first time, to see what the SDK is doing:
               o.Debug = true;
               // Required in Serverless environments
@@ -102,60 +46,115 @@ public class LambdaEntryPoint : Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFu
             })
             .UseStartup<Startup>();
     }
-}
-        `,
-      },
-    ],
-  },
-  {
-    type: StepType.VERIFY,
-    description: t('You can verify your setup by throwing an exception from a function:'),
-    configurations: [
-      {
-        language: 'csharp',
-        code: `
+}`;
+
+const getVerifySnippet = () => `
 [Route("api/[controller]")]
 public class BadController
 {
   [HttpGet]
   public string Get() => throw null;
-}
-        `,
-      },
+}`;
+
+const onboarding: OnboardingConfig = {
+  introduction: () =>
+    tct(
+      'Sentry provides an integration with AWS Lambda ASP.NET Core Server through the Sentry.AspNetCore NuGet package.',
       {
-        language: 'shell',
-        description: t('And make a request to that lambda:'),
-        code: 'curl -X GET -I https://url.of.server.aws/api/bad',
-      },
-    ],
-    additionalInfo: (
-      <p>
-        {tct(
-          'Check out the [link:Sentry ASP.NET Core] documentation for the complete set of options.',
-          {
-            link: (
-              <ExternalLink href="https://docs.sentry.io/platforms/dotnet/guides/aspnetcore/" />
-            ),
-          }
-        )}
-      </p>
+        link: <ExternalLink href="https://www.nuget.org/packages/Sentry.AspNetCore" />,
+      }
     ),
-  },
-];
-// Configuration End
+  install: params => [
+    {
+      type: StepType.INSTALL,
+      description: t('Add the Sentry dependency:'),
+      configurations: [
+        {
+          partialLoading: params.sourcePackageRegistries.isLoading,
+          code: [
+            {
+              language: 'powershell',
+              label: 'Package Manager',
+              value: 'packageManager',
+              code: getInstallSnippetPackageManager(params),
+            },
+            {
+              language: 'shell',
+              label: '.NET Core CLI',
+              value: 'coreCli',
+              code: getInstallSnippetCoreCli(params),
+            },
+          ],
+        },
+      ],
+      additionalInfo: tct(
+        'You can combine this integration with a logging library like [strong:log4net, NLog, or Serilog] to include both request data as well as your logs as breadcrumbs. The logging ingrations also capture events when an error is logged.',
+        {strong: <strong />}
+      ),
+    },
+  ],
+  configure: params => [
+    {
+      type: StepType.CONFIGURE,
+      description: (
+        <Fragment>
+          <p>
+            {tct(
+              'All [code:ASP.NET Core] configurations are valid here. But one configuration in particular is relevant.',
+              {
+                code: <code />,
+              }
+            )}
+          </p>
+          <p>
+            {tct(
+              '[code:FlushOnCompletedRequest] ensures all events are flushed out. This is because the general ASP.NET Core hooks for when the process is exiting are not guaranteed to run in a serverless environment. This setting ensures that no event is lost if AWS recycles the process.',
+              {
+                code: <code />,
+              }
+            )}
+          </p>
+        </Fragment>
+      ),
+      configurations: [
+        {
+          language: 'csharp',
+          code: getConfigureSnippet(params),
+        },
+      ],
+    },
+  ],
+  verify: () => [
+    {
+      type: StepType.VERIFY,
+      description: t(
+        'You can verify your setup by throwing an exception from a function:'
+      ),
+      configurations: [
+        {
+          language: 'csharp',
+          code: getVerifySnippet(),
+        },
+        {
+          language: 'shell',
+          description: t('And make a request to that lambda:'),
+          code: 'curl -X GET -I https://url.of.server.aws/api/bad',
+        },
+      ],
+      additionalInfo: tct(
+        'Check out the [link:Sentry ASP.NET Core] documentation for the complete set of options.',
+        {
+          link: (
+            <ExternalLink href="https://docs.sentry.io/platforms/dotnet/guides/aspnetcore/" />
+          ),
+        }
+      ),
+    },
+  ],
+};
 
-export function GettingStartedAwsLambda({
-  dsn,
-  sourcePackageRegistries,
-  ...props
-}: ModuleProps) {
-  return (
-    <Layout
-      steps={steps({dsn, sourcePackageRegistries})}
-      introduction={introduction}
-      {...props}
-    />
-  );
-}
+const docs: Docs = {
+  onboarding,
+};
 
-export default GettingStartedAwsLambda;
+export default docs;

+ 5 - 5
static/app/gettingStartedDocs/dotnet/dotnet.tsx

@@ -4,7 +4,7 @@ import ExternalLink from 'sentry/components/links/externalLink';
 import List from 'sentry/components/list';
 import ListItem from 'sentry/components/list/listItem';
 import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/step';
-import {
+import type {
   Docs,
   DocsParams,
   OnboardingConfig,
@@ -14,10 +14,10 @@ import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersi
 
 type Params = DocsParams;
 
-const installSnippetPackageManager = (params: Params) => `
+const getInstallSnippetPackageManager = (params: Params) => `
 Install-Package Sentry -Version ${getPackageVersion(params, 'sentry.dotnet', '3.34.0')}`;
 
-const installSnippetCoreCli = (params: Params) => `
+const getInstallSnippetCoreCli = (params: Params) => `
 dotnet add package Sentry -v ${getPackageVersion(params, 'sentry.dotnet', '3.34.0')}`;
 
 const getConfigureSnippet = (params: Params) => `
@@ -87,13 +87,13 @@ const onboarding: OnboardingConfig = {
               language: 'shell',
               label: 'Package Manager',
               value: 'packageManager',
-              code: installSnippetPackageManager(params),
+              code: getInstallSnippetPackageManager(params),
             },
             {
               language: 'shell',
               label: '.NET Core CLI',
               value: 'coreCli',
-              code: installSnippetCoreCli(params),
+              code: getInstallSnippetCoreCli(params),
             },
           ],
         },

+ 33 - 12
static/app/gettingStartedDocs/dotnet/gcpfunctions.spec.tsx

@@ -1,18 +1,39 @@
-import {render, screen} from 'sentry-test/reactTestingLibrary';
+import {renderWithOnboardingLayout} from 'sentry-test/onboarding/renderWithOnboardingLayout';
+import {screen} from 'sentry-test/reactTestingLibrary';
+import {textWithMarkupMatcher} from 'sentry-test/utils';
 
-import {StepTitle} from 'sentry/components/onboarding/gettingStartedDoc/step';
+import docs from './gcpfunctions';
 
-import {GettingStartedWithGCPFunctions, steps} from './gcpfunctions';
+describe('gcpfunctions onboarding docs', function () {
+  it('renders docs correctly', async function () {
+    renderWithOnboardingLayout(docs, {
+      releaseRegistry: {
+        'sentry.dotnet.google-cloud-function': {
+          version: '1.99.9',
+        },
+      },
+    });
 
-describe('GettingStartedWithGCPFunctions', function () {
-  it('renders doc correctly', function () {
-    render(<GettingStartedWithGCPFunctions dsn="test-dsn" projectSlug="test-project" />);
+    // Renders main headings
+    expect(screen.getByRole('heading', {name: 'Install'})).toBeInTheDocument();
+    expect(screen.getByRole('heading', {name: 'Configure SDK'})).toBeInTheDocument();
+    expect(screen.getByRole('heading', {name: 'Verify'})).toBeInTheDocument();
+    expect(screen.getByRole('heading', {name: 'Samples'})).toBeInTheDocument();
 
-    // Steps
-    for (const step of steps()) {
-      expect(
-        screen.getByRole('heading', {name: step.title ?? StepTitle[step.type]})
-      ).toBeInTheDocument();
-    }
+    // Renders SDK version from registry
+    expect(
+      await screen.findByText(
+        textWithMarkupMatcher(
+          /Install-Package Sentry.Google.Cloud.Functions -Version 1\.99\.9/
+        )
+      )
+    ).toBeInTheDocument();
+    expect(
+      await screen.findByText(
+        textWithMarkupMatcher(
+          /<PackageReference Include="Sentry\.Google\.Cloud\.Functions" Version="1\.99\.9"\/>/
+        )
+      )
+    ).toBeInTheDocument();
   });
 });

+ 158 - 150
static/app/gettingStartedDocs/dotnet/gcpfunctions.tsx

@@ -3,84 +3,41 @@ import {Fragment} from 'react';
 import ExternalLink from 'sentry/components/links/externalLink';
 import List from 'sentry/components/list';
 import ListItem from 'sentry/components/list/listItem';
-import {Layout, LayoutProps} from 'sentry/components/onboarding/gettingStartedDoc/layout';
-import {ModuleProps} from 'sentry/components/onboarding/gettingStartedDoc/sdkDocumentation';
 import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/step';
+import type {
+  Docs,
+  DocsParams,
+  OnboardingConfig,
+} from 'sentry/components/onboarding/gettingStartedDoc/types';
 import {t, tct} from 'sentry/locale';
+import {getPackageVersion} from 'sentry/utils/gettingStartedDocs/getPackageVersion';
 
-// Configuration Start
-export const steps = ({
-  dsn,
-  sourcePackageRegistries,
-}: Partial<
-  Pick<ModuleProps, 'dsn' | 'sourcePackageRegistries'>
-> = {}): LayoutProps['steps'] => [
-  {
-    type: StepType.INSTALL,
-    description: (
-      <p>
-        {tct('Install the [strong:NuGet] package:', {
-          strong: <strong />,
-        })}
-      </p>
-    ),
-    configurations: [
-      {
-        language: 'shell',
-        partialLoading: sourcePackageRegistries?.isLoading,
-        description: t('Package Manager:'),
-        code: `Install-Package Sentry.Google.Cloud.Functions -Version ${
-          sourcePackageRegistries?.isLoading
-            ? t('\u2026loading')
-            : sourcePackageRegistries?.data?.['sentry.dotnet.google-cloud-function']
-                ?.version ?? '3.34.0'
-        }`,
-      },
-      {
-        language: 'shell',
-        partialLoading: sourcePackageRegistries?.isLoading,
-        description: t('Or .NET Core CLI:'),
-        code: `dotnet add package Sentry.Google.Cloud.Functions -v ${
-          sourcePackageRegistries?.isLoading
-            ? t('\u2026loading')
-            : sourcePackageRegistries?.data?.['sentry.dotnet.google-cloud-function']
-                ?.version ?? '3.34.0'
-        }`,
-      },
-      {
-        language: 'xml',
-        partialLoading: sourcePackageRegistries?.isLoading,
-        description: t('Or, manually add the Sentry dependency into your csproj file:'),
-        code: `
+type Params = DocsParams;
+
+const getInstallSnippetPackageManager = (params: Params) => `
+Install-Package Sentry.Google.Cloud.Functions -Version ${getPackageVersion(
+  params,
+  'sentry.dotnet.google-cloud-function',
+  '3.34.0'
+)}`;
+
+const getInstallSnippetCoreCli = (params: Params) => `
+dotnet add package Sentry.Google.Cloud.Functions -v ${getPackageVersion(
+  params,
+  'sentry.dotnet.google-cloud-function',
+  '3.34.0'
+)}`;
+
+const getInstallSnippetManual = (params: Params) => `
 <ItemGroup>
-  <PackageReference Include="Sentry.Google.Cloud.Functions" Version="${
-    sourcePackageRegistries?.isLoading
-      ? t('\u2026loading')
-      : sourcePackageRegistries?.data?.['sentry.dotnet.google-cloud-function']?.version ??
-        '3.34.0'
-  }"/>
-</ItemGroup>
-        `,
-      },
-    ],
-  },
-  {
-    type: StepType.CONFIGURE,
-    description: (
-      <p>
-        {tct(
-          'Then, add Sentry to the [functionCode:Function] class through [functionStartupCode:FunctionsStartup]:',
-          {
-            functionCode: <code />,
-            functionStartupCode: <code />,
-          }
-        )}
-      </p>
-    ),
-    configurations: [
-      {
-        language: 'csharp',
-        code: `
+  <PackageReference Include="Sentry.Google.Cloud.Functions" Version="${getPackageVersion(
+    params,
+    'sentry.dotnet.google-cloud-function',
+    '3.34.0'
+  )}"/>
+</ItemGroup>`;
+
+const getConfigureCSharpSnippet = () => `
 // Add the following line:
 [assembly: FunctionsStartup(typeof(SentryStartup))]
 
@@ -90,23 +47,12 @@ public class Function : IHttpFunction
     {
         // Your function code here.
     }
-}
-        `,
-      },
-      {
-        language: 'json',
-        description: (
-          <p>
-            {tct(
-              "Additionally, you'll need to set up your [sentryCode:Sentry] settings on [appsettingsCode:appsettings.json]:",
-              {sentryCode: <code />, appsettingsCode: <code />}
-            )}
-          </p>
-        ),
-        code: `
+}`;
+
+const getConfigureJsonSnippet = (params: Params) => `
 {
   "Sentry": {
-    "Dsn": "${dsn}",
+    "Dsn": "${params.dsn}",
     // Sends Cookies, User Id when one is logged on and user IP address to sentry. It's turned off by default.
     "SendDefaultPii": true,
     // When configuring for the first time, to see what the SDK is doing:
@@ -117,18 +63,9 @@ public class Function : IHttpFunction
     // We recommend adjusting this value in production.
     "TracesSampleRate": 1
   }
-}
-        `,
-      },
-    ],
-  },
-  {
-    type: StepType.VERIFY,
-    description: t('To verify your setup, you can capture a message with the SDK:'),
-    configurations: [
-      {
-        language: 'csharp',
-        code: `
+}`;
+
+const getVerifySnippet = () => `
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Http;
 using Sentry;
@@ -136,57 +73,128 @@ using Sentry;
 public Task HandleAsync(HttpContext context)
 {
     SentrySdk.CaptureMessage("Hello Sentry");
-}
-        `,
-      },
-    ],
-  },
-  {
-    title: t('Samples'),
-    description: (
-      <Fragment>
-        {t(
-          'See the following examples that demonstrate how to integrate Sentry with various frameworks.'
-        )}
-        <List symbol="bullet">
-          <ListItem>
-            {tct('[link:Google Cloud Functions sample]', {
-              link: (
-                <ExternalLink href="https://github.com/getsentry/sentry-dotnet/tree/main/samples/Sentry.Samples.Google.Cloud.Functions" />
-              ),
-            })}
-          </ListItem>
-          <ListItem>
-            {tct(
-              '[link:Multiple samples in the [code:dotnet] SDK repository] [strong:(C#)]',
-              {
+}`;
+
+const onboarding: OnboardingConfig = {
+  install: params => [
+    {
+      type: StepType.INSTALL,
+      configurations: [
+        {
+          description: tct(
+            'Install the [strong:NuGet] package with Package Manager or .NET Core CLI:',
+            {
+              strong: <strong />,
+            }
+          ),
+          partialLoading: params.sourcePackageRegistries.isLoading,
+          code: [
+            {
+              language: 'shell',
+              label: 'Package Manager',
+              value: 'packageManager',
+              code: getInstallSnippetPackageManager(params),
+            },
+            {
+              language: 'shell',
+              label: '.NET Core CLI',
+              value: 'coreCli',
+              code: getInstallSnippetCoreCli(params),
+            },
+          ],
+        },
+        {
+          language: 'xml',
+          partialLoading: params.sourcePackageRegistries?.isLoading,
+          description: t('Or, manually add the Sentry dependency into your csproj file:'),
+          code: getInstallSnippetManual(params),
+        },
+      ],
+    },
+  ],
+  configure: params => [
+    {
+      type: StepType.CONFIGURE,
+      description: tct(
+        'Then, add Sentry to the [functionCode:Function] class through [functionStartupCode:FunctionsStartup]:',
+        {
+          functionCode: <code />,
+          functionStartupCode: <code />,
+        }
+      ),
+      configurations: [
+        {
+          language: 'csharp',
+          code: getConfigureCSharpSnippet(),
+        },
+        {
+          language: 'json',
+          description: (
+            <p>
+              {tct(
+                "Additionally, you'll need to set up your [sentryCode:Sentry] settings on [appsettingsCode:appsettings.json]:",
+                {sentryCode: <code />, appsettingsCode: <code />}
+              )}
+            </p>
+          ),
+          code: getConfigureJsonSnippet(params),
+        },
+      ],
+    },
+  ],
+  verify: () => [
+    {
+      type: StepType.VERIFY,
+      description: t('To verify your setup, you can capture a message with the SDK:'),
+      configurations: [
+        {
+          language: 'csharp',
+          code: getVerifySnippet(),
+        },
+      ],
+    },
+    {
+      title: t('Samples'),
+      description: (
+        <Fragment>
+          {t(
+            'See the following examples that demonstrate how to integrate Sentry with various frameworks.'
+          )}
+          <List symbol="bullet">
+            <ListItem>
+              {tct('[link:Google Cloud Functions sample]', {
                 link: (
-                  <ExternalLink href="https://github.com/getsentry/sentry-dotnet/tree/main/samples" />
+                  <ExternalLink href="https://github.com/getsentry/sentry-dotnet/tree/main/samples/Sentry.Samples.Google.Cloud.Functions" />
                 ),
+              })}
+            </ListItem>
+            <ListItem>
+              {tct(
+                '[link:Multiple samples in the [code:dotnet] SDK repository] [strong:(C#)]',
+                {
+                  link: (
+                    <ExternalLink href="https://github.com/getsentry/sentry-dotnet/tree/main/samples" />
+                  ),
+                  strong: <strong />,
+                  code: <code />,
+                }
+              )}
+            </ListItem>
+            <ListItem>
+              {tct('[link:Basic F# sample] [strong:(F#)]', {
+                link: <ExternalLink href="https://github.com/sentry-demos/fsharp" />,
                 strong: <strong />,
-                code: <code />,
-              }
-            )}
-          </ListItem>
-          <ListItem>
-            {tct('[link:Basic F# sample] [strong:(F#)]', {
-              link: <ExternalLink href="https://github.com/sentry-demos/fsharp" />,
-              strong: <strong />,
-            })}
-          </ListItem>
-        </List>
-      </Fragment>
-    ),
-  },
-];
-// Configuration End
+              })}
+            </ListItem>
+          </List>
+        </Fragment>
+      ),
+    },
+  ],
+};
 
-export function GettingStartedWithGCPFunctions({
-  dsn,
-  sourcePackageRegistries,
-  ...props
-}: ModuleProps) {
-  return <Layout steps={steps({dsn, sourcePackageRegistries})} {...props} />;
-}
+const docs: Docs = {
+  onboarding,
+};
 
-export default GettingStartedWithGCPFunctions;
+export default docs;