Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 39 additions & 2 deletions astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ export default defineConfig({
starlightLlmsTxt({
projectName: 'LocalStack',
description:
'LocalStack is a cloud service emulator that runs in a single container on your laptop or in your CI environment. It provides an easy-to-use test/mocking framework for developing cloud applications, with support for AWS services and Snowflake.',
'LocalStack is a cloud service emulator that runs in a single container on your laptop or in your CI environment. It provides an easy-to-use test/mocking framework for developing cloud applications, with support for AWS services, Snowflake, and Azure.',
customSets: [
{
label: 'AWS',
Expand All @@ -198,8 +198,13 @@ export default defineConfig({
description: 'Documentation for LocalStack Snowflake emulation',
paths: ['snowflake/**'],
},
{
label: 'Azure',
description: 'Documentation for LocalStack Azure emulation',
paths: ['azure/**'],
},
],
exclude: ['aws/changelog', 'snowflake/changelog'],
exclude: ['aws/changelog', 'snowflake/changelog', 'azure/changelog'],
rawContent: true,
}),
starlightImageZoom({
Expand Down Expand Up @@ -547,6 +552,38 @@ export default defineConfig({
},
],
},
{
label: 'Azure',
collapsed: true,
items: [
{
label: 'Welcome',
slug: 'azure',
},
{
label: 'Getting Started',
autogenerate: { directory: '/azure/getting-started' },
collapsed: true,
},
{
label: 'Local Azure Services',
slug: 'azure/services',
},
{
label: 'Sample Apps',
slug: 'azure/sample-apps',
},
{
label: 'Integrations',
autogenerate: { directory: '/azure/integrations' },
collapsed: true,
},
{
label: 'Changelog',
slug: 'azure/changelog',
},
],
},
],
}),
markdoc(),
Expand Down
3 changes: 3 additions & 0 deletions public/js/icon-loader.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
Welcome: 'cube-icon',
'Getting Started': 'rocket-icon',
'Local AWS Services': 'cube-icon',
'Local Azure Services': 'cube-icon',
Features: 'cube-icon',
'Feature Coverage': 'buildings-icon',
'Sample Apps': 'file-icon',
Expand Down Expand Up @@ -101,6 +102,8 @@
window.location.href = '/aws/';
} else if (selectedValue === 'Snowflake') {
window.location.href = '/snowflake/';
} else if (selectedValue === 'Azure') {
window.location.href = '/azure/';
}

setTimeout(() => {
Expand Down
3 changes: 3 additions & 0 deletions src/components/LanguageSelectWithGetStarted.astro
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@ import Default from '@astrojs/starlight/components/LanguageSelect.astro';
// Get the current page route
const route = Astro.locals.starlightRoute;
const isSnowflakePage = route.id.startsWith('snowflake');
const isAzurePage = route.id.startsWith('azure');

let getStartedUrl = 'https://app.localstack.cloud/sign-up';

if (isSnowflakePage) {
getStartedUrl += '?emulator=snowflake';
} else if (isAzurePage) {
getStartedUrl += '?emulator=azure';
}
---

Expand Down
4 changes: 4 additions & 0 deletions src/components/PageTitleWithCopyButton.astro
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ const hiddenPaths = [
'snowflake/sample-apps',
'snowflake/capabilities',
'snowflake/integrations',
'azure',
'azure/services',
'azure/sample-apps',
'azure/integrations',
];

// Check if copy page should be hidden (via frontmatter or path match)
Expand Down
28 changes: 28 additions & 0 deletions src/components/SearchableAzureServices.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
---
import { getCollection } from 'astro:content';
import { SearchableAzureServices } from './SearchableAzureServices.tsx';

const allServices = await getCollection('docs', ({ id }) => {
return id.startsWith('azure/services/') && !id.includes('/index');
});

const sortedServices = allServices.sort((a, b) => {
const titleA = a.data.title || a.data.linkTitle || '';
const titleB = b.data.title || b.data.linkTitle || '';
return titleA.localeCompare(titleB);
});

const serviceData = sortedServices.map((service) => {
const title = service.data.title || service.data.linkTitle || 'Unknown Service';
const description = service.data.description || `Implementation details for ${title} API`;
const href = `/${service.id}`;

return {
title,
description,
href,
};
});
---

<SearchableAzureServices services={serviceData} client:load />
78 changes: 78 additions & 0 deletions src/components/SearchableAzureServices.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import React, { useMemo, useState } from 'react';
import { ServiceBox } from './ServiceBox.tsx';

interface Service {
title: string;
description: string;
href: string;
}

interface SearchableAzureServicesProps {
services: Service[];
}

export const SearchableAzureServices: React.FC<SearchableAzureServicesProps> = ({
services,
}) => {
const [searchTerm, setSearchTerm] = useState('');

const filteredServices = useMemo(() => {
if (!searchTerm.trim()) {
return services;
}

const lowercaseSearch = searchTerm.toLowerCase();
return services.filter(
(service) =>
service.title.toLowerCase().includes(lowercaseSearch) ||
service.description.toLowerCase().includes(lowercaseSearch)
);
}, [services, searchTerm]);

return (
<div className="searchable-services">
<div className="search-container">
<div className="search-input-wrapper">
<svg
className="search-icon"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"
/>
</svg>
<input
type="text"
placeholder="Search for Azure Service Name ..."
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
className="search-input"
/>
</div>
</div>

{filteredServices.length === 0 && searchTerm.trim() ? (
<div className="no-results">
<p>No services found matching "{searchTerm}"</p>
</div>
) : (
<div className="service-grid">
{filteredServices.map((service, index) => (
<ServiceBox
key={`${service.href}-${index}`}
title={service.title}
description={service.description}
href={service.href}
/>
))}
</div>
)}
</div>
);
};
2 changes: 2 additions & 0 deletions src/config/docsearch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ export default {
boostFilter = "hierarchy.lvl0:LocalStack for AWS";
} else if (pathname.startsWith('/snowflake/')) {
boostFilter = "hierarchy.lvl0:LocalStack for Snowflake";
} else if (pathname.startsWith('/azure/')) {
boostFilter = "hierarchy.lvl0:LocalStack for Azure";
}

if (!boostFilter) {
Expand Down
12 changes: 12 additions & 0 deletions src/content/docs/azure/changelog.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
title: Changelog
description: Changelog for LocalStack for Azure.
template: doc
editUrl: false
---

This changelog will track updates to LocalStack's Azure support, including new services, enhancements, and compatibility fixes.

### Upcoming

- Initial Azure documentation navigation and service discovery pages.
7 changes: 7 additions & 0 deletions src/content/docs/azure/getting-started/index.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
title: Installation
description: Installation guide to get started with LocalStack for Azure.
template: doc
sidebar:
order: 0
---
68 changes: 68 additions & 0 deletions src/content/docs/azure/index.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
---
title: Welcome to LocalStack for Azure Docs
description: Get started with LocalStack for Azure docs.
template: doc
editUrl: false
sidebar:
label: Welcome
order: 1
---

import { OverviewCards, HeroCards } from '../../../components/OverviewCards';
import rocketIcon from '../../../assets/images/GettingStarted_Color.svg';
import connectionsIcon from '../../../assets/images/Integrations_Color.svg';
import cubeIcon from '../../../assets/images/LSAWS_Color.svg';
import fileIcon from '../../../assets/images/file.svg';
import changeIcon from '../../../assets/images/change.svg';

<HeroCards
cards={[
{
title: "Emulate Azure Services",
href: "/azure/services"
},
{
title: "Connect Azure Tooling",
href: "/azure/integrations"
}
]}
client:load
/>

## What would you like to do today?

<OverviewCards
cards={[
{
title: "Getting Started",
description: "Install and run LocalStack for Azure on your machine.",
href: "/azure/getting-started",
icon: rocketIcon.src
},
{
title: "Local Azure Services",
description: "Browse the Azure services currently documented for LocalStack.",
href: "/azure/services",
icon: cubeIcon.src
},
{
title: "Sample Apps",
description: "Find and contribute end-to-end Azure sample apps for local development.",
href: "/azure/sample-apps",
icon: fileIcon.src
},
{
title: "Integrations",
description: "Use LocalStack for Azure with frameworks, SDKs, and developer tooling.",
href: "/azure/integrations",
icon: connectionsIcon.src
},
{
title: "Changelog",
description: "Track Azure emulator updates and release highlights.",
href: "/azure/changelog",
icon: changeIcon.src
}
]}
client:load
/>
7 changes: 7 additions & 0 deletions src/content/docs/azure/integrations/index.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
title: Integrations
description: Integrate LocalStack for Azure with your preferred tools and frameworks.
template: doc
sidebar:
order: 5
---
7 changes: 7 additions & 0 deletions src/content/docs/azure/sample-apps.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
title: Sample Apps
description: Sample apps for LocalStack for Azure.
template: doc
sidebar:
order: 4
---
12 changes: 12 additions & 0 deletions src/content/docs/azure/services/index.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
title: Local Azure Services
description: Browse LocalStack's implemented Azure services and explore their capabilities.
template: doc
editUrl: false
sidebar:
order: 3
---

import SearchableAzureServices from '../../../../components/SearchableAzureServices.astro';

<SearchableAzureServices />