diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..cb1dedd --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,35 @@ +name: Deploy to GitHub Pages + +on: + push: + branches: + - main + +jobs: + build-and-deploy: + runs-on: windows-latest + + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v4 + + - name: Setup Node.js ⚙️ + uses: actions/setup-node@v4 + with: + node-version: '18' + + - name: Install Dependencies 📦 + run: | + npm ci + working-directory: .pages + + - name: Build 🔧 + run: | + npm run build + working-directory: .pages + + - name: Deploy to GitHub Pages 🚀 + uses: JamesIves/github-pages-deploy-action@v4 + with: + folder: .pages/dist + branch: gh-pages \ No newline at end of file diff --git a/.github/workflows/static-pages.yml b/.github/workflows/static-pages.yml deleted file mode 100644 index df3c293..0000000 --- a/.github/workflows/static-pages.yml +++ /dev/null @@ -1,43 +0,0 @@ -# Simple workflow for deploying static content to GitHub Pages -name: Deploy static content to Pages - -on: - # Runs on pushes targeting the default branch - push: - branches: ["develop"] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. -# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. -concurrency: - group: "pages" - cancel-in-progress: false - -jobs: - # Single deploy job since we're just deploying - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Setup Pages - uses: actions/configure-pages@v5 - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - # Upload entire repository - path: '.pages' - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 \ No newline at end of file diff --git a/.pages/.dockerignore b/.pages/.dockerignore new file mode 100644 index 0000000..41db07c --- /dev/null +++ b/.pages/.dockerignore @@ -0,0 +1,8 @@ +node_modules +dist +.git +.gitignore +README.md +.env* +.editorconfig +.DS_Store diff --git a/.pages/.eslintrc.js b/.pages/.eslintrc.js new file mode 100644 index 0000000..2691c4d --- /dev/null +++ b/.pages/.eslintrc.js @@ -0,0 +1,17 @@ +module.exports = { + root: true, + env: { + node: true + }, + extends: [ + 'plugin:vue/vue3-essential', + 'eslint:recommended' + ], + parserOptions: { + parser: '@babel/eslint-parser' + }, + rules: { + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off' + } +} diff --git a/.pages/Dockerfile b/.pages/Dockerfile new file mode 100644 index 0000000..4d4421a --- /dev/null +++ b/.pages/Dockerfile @@ -0,0 +1,29 @@ +# Build aşaması +FROM node:18-alpine as build-stage + +# Çalışma dizinini belirleme +WORKDIR /app + +# Package.json ve package-lock.json dosyalarını kopyalama +COPY package*.json ./ + +# Bağımlılıkları yükleme +RUN npm install + +# Proje dosyalarını kopyalama +COPY . . + +# Projeyi build etme +RUN npm run build + +# Production aşaması +FROM nginx:stable-alpine as production-stage + +# Build dosyalarını nginx'e kopyalama +COPY --from=build-stage /app/dist /usr/share/nginx/html + +# 80 portunu dışarı açma +EXPOSE 80 + +# Nginx'i başlatma +CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/.pages/assets/css/style.css b/.pages/assets/css/style.css deleted file mode 100644 index 2d73369..0000000 --- a/.pages/assets/css/style.css +++ /dev/null @@ -1,680 +0,0 @@ -:root { - --bg-primary: #1a1a1a; - --bg-secondary: #252525; - --bg-tertiary: #2d2d2d; - --text-primary: #ffffff; - --text-secondary: #b3b3b3; - --accent-primary: #3498db; - --accent-secondary: #2980b9; - --sidebar-width: 280px; - --background-primary: #252525; -} - -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; - background-color: var(--bg-primary); - color: var(--text-primary); - line-height: 1.6; -} - -.sidebar { - position: fixed; - width: var(--sidebar-width); - height: 100vh; - background-color: var(--bg-secondary); - padding: 2rem; - overflow-y: auto; -} - -.sidebar-header { - text-align: center; - margin-bottom: 2rem; -} - -.sidebar-header a { - display: flex; - align-items: center; - text-decoration: none; - color: var(--text-primary); - padding: 1rem; -} - -.sidebar-header h1 { - margin-left: 1rem; - font-size: 1.5rem; - color: var(--text-primary); -} - -.sidebar-header a:hover { - text-decoration: none; - color: var(--text-primary); -} - -.logo { - width: 80px; - height: 80px; - margin-bottom: 1rem; -} - -.nav-links { - list-style: none; -} - -.nav-links li { - margin-bottom: 0.5rem; -} - -.nav-links a { - display: flex; - align-items: center; - padding: 0.75rem 1.5rem; - color: var(--text-secondary); - text-decoration: none; - transition: all 0.3s ease; - position: relative; - border-left: 4px solid transparent; -} - -.nav-links a:hover { - color: var(--text-primary); - background-color: var(--bg-secondary); - border-left-color: var(--accent-primary); -} - -.nav-links a.active { - color: var(--text-primary); - background-color: var(--bg-secondary); - border-left-color: var(--accent-primary); -} - -.nav-links a i { - margin-right: 0.75rem; - width: 20px; - text-align: center; -} - -.social-links { - margin-top: 2rem; - display: flex; - justify-content: center; - gap: 1rem; -} - -.social-links a { - color: var(--text-secondary); - font-size: 1.5rem; - transition: color 0.3s ease; -} - -.social-links a:hover { - color: var(--accent-primary); -} - -/* Social media icons at sidebar bottom */ -.social-links.fixed { - position: fixed; - bottom: 0; - left: 0; - width: var(--sidebar-width); - background-color: var(--background-primary); - padding: 1rem; - display: flex; - justify-content: center; - gap: 1.5rem; - border-top: 1px solid rgba(255, 255, 255, 0.1); -} - -.social-links.fixed a { - color: #888; - font-size: 1.2rem; - transition: color 0.3s ease; -} - -.social-links.fixed a:hover { - color: var(--accent-primary); -} - -@media (max-width: 768px) { - .social-links.fixed { - width: 250px; - transform: translateX(-100%); - transition: transform 0.3s ease; - } - - .sidebar.active + .social-links.fixed, - .sidebar.active ~ .social-links.fixed { - transform: translateX(0); - } -} - -.content { - margin-left: var(--sidebar-width); - padding: 2rem; -} - -.hero { - text-align: center; - padding: 4rem 0; -} - -.hero h1 { - font-size: 3rem; - margin-bottom: 1rem; -} - -.hero p { - font-size: 1.25rem; - color: var(--text-secondary); - margin-bottom: 2rem; -} - -.cta-buttons { - display: flex; - justify-content: center; - gap: 1rem; -} - -.btn { - display: inline-block; - padding: 0.75rem 1.5rem; - border-radius: 8px; - text-decoration: none; - font-weight: 600; - transition: all 0.3s ease; -} - -.btn.primary { - background-color: var(--accent-primary); - color: white; -} - -.btn.primary:hover { - background-color: var(--accent-secondary); -} - -.btn.secondary { - background-color: var(--bg-tertiary); - color: var(--text-primary); -} - -.btn.secondary:hover { - background-color: var(--bg-secondary); -} - -.features { - padding: 4rem 0; -} - -.feature-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); - gap: 2rem; - margin-top: 2rem; -} - -.feature-card { - background-color: var(--bg-secondary); - padding: 2rem; - border-radius: 12px; - text-align: center; -} - -.feature-card i { - font-size: 2.5rem; - color: var(--accent-primary); - margin-bottom: 1rem; -} - -.feature-card h3 { - margin-bottom: 1rem; -} - -.feature-card p { - color: var(--text-secondary); -} - -.code-example { - padding: 4rem 0; -} - -.code-block { - position: relative; - margin: 1.5em 0; -} - -.code-block pre { - margin: 0; - background: #1e1e1e !important; - border-radius: 8px; - padding: 1em; - overflow: auto; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - white-space: pre-wrap !important; - word-wrap: break-word !important; - word-break: break-all !important; -} - -.code-block code { - text-shadow: none !important; - background: none !important; - font-family: 'Fira Code', 'Consolas', monospace; - font-size: 14px; - line-height: 1.5; - tab-size: 4; - white-space: pre-wrap !important; - word-wrap: break-word !important; - word-break: break-all !important; -} - -.token.comment { - color: #6a9955 !important; -} - -.token.keyword { - color: #569cd6 !important; -} - -.token.string { - color: #ce9178 !important; -} - -.token.function { - color: #dcdcaa !important; -} - -.token.class-name { - color: #4ec9b0 !important; -} - -.token.number { - color: #b5cea8 !important; -} - -.token.operator { - color: #d4d4d4 !important; - background: none !important; -} - -.token.punctuation { - color: #d4d4d4 !important; -} - -.token.property { - color: #9cdcfe !important; -} - -.token.variable { - color: #9cdcfe !important; -} - -.copy-button { - position: absolute; - top: 0.5em; - right: 0.5em; - padding: 0.5em 1em; - background: rgba(255, 255, 255, 0.1); - border: 1px solid rgba(255, 255, 255, 0.2); - border-radius: 4px; - color: #d4d4d4; - font-size: 0.85em; - cursor: pointer; - transition: all 0.2s ease; - opacity: 0; -} - -.code-block:hover .copy-button { - opacity: 1; -} - -.copy-button:hover { - background: rgba(255, 255, 255, 0.2); - border-color: rgba(255, 255, 255, 0.3); -} - -.copy-button:active { - transform: translateY(1px); -} - -.benchmarks { - padding: 4rem 0; -} - -.benchmark-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 2rem; - margin-top: 2rem; -} - -.benchmark-card { - background-color: var(--bg-secondary); - padding: 2rem; - border-radius: 12px; - text-align: center; -} - -.benchmark-card .number { - font-size: 2.5rem; - font-weight: 700; - color: var(--accent-primary); - margin: 1rem 0; -} - -.benchmark-card .label { - color: var(--text-secondary); -} - -h2 { - text-align: center; - margin-bottom: 2rem; -} - -/* Documentation specific styles */ -.tip-card { - background-color: var(--bg-secondary); - padding: 1.5rem; - border-radius: 12px; - margin-bottom: 1.5rem; -} - -.tip-card h3 { - display: flex; - align-items: center; - margin-bottom: 1rem; -} - -.tip-card h3 i { - margin-right: 0.75rem; - color: var(--accent-primary); -} - -.tip-card ul { - list-style-type: none; -} - -.tip-card li { - margin-bottom: 0.5rem; - padding-left: 1.5rem; - position: relative; -} - -.tip-card li:before { - content: "•"; - color: var(--accent-primary); - position: absolute; - left: 0; -} - -.next-steps-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); - gap: 1.5rem; - margin-top: 2rem; -} - -.next-step-card { - background-color: var(--bg-secondary); - padding: 1.5rem; - border-radius: 12px; - text-decoration: none; - color: var(--text-primary); - transition: transform 0.3s ease; - text-align: center; -} - -.next-step-card:hover { - transform: translateY(-5px); -} - -.next-step-card i { - font-size: 2rem; - color: var(--accent-primary); - margin-bottom: 1rem; -} - -.next-step-card h3 { - margin-bottom: 0.5rem; -} - -.next-step-card p { - color: var(--text-secondary); - font-size: 0.9rem; -} - -/* API Reference specific styles */ -.api-table { - overflow-x: auto; - margin: 1.5rem 0; -} - -.api-table table { - width: 100%; - border-collapse: collapse; - background-color: var(--bg-secondary); - border-radius: 12px; -} - -.api-table th, -.api-table td { - padding: 1rem; - text-align: left; - border-bottom: 1px solid var(--bg-tertiary); -} - -.api-table th { - background-color: var(--bg-tertiary); - font-weight: 600; -} - -.api-table tr:last-child td { - border-bottom: none; -} - -.api-table tr:hover { - background-color: var(--bg-tertiary); -} - -/* Example and Performance page specific styles */ -.example-card, -.practice-card, -.tool-card { - background-color: var(--bg-secondary); - padding: 1.5rem; - border-radius: 12px; - margin-bottom: 1.5rem; -} - -.example-card h3, -.practice-card h3, -.tool-card h3 { - display: flex; - align-items: center; - margin-bottom: 1rem; -} - -.example-card h3 i, -.practice-card h3 i, -.tool-card h3 i { - margin-right: 0.75rem; - color: var(--accent-primary); -} - -.comparison-table { - overflow-x: auto; - margin: 1.5rem 0; -} - -.comparison-table table { - width: 100%; - border-collapse: collapse; - background-color: var(--bg-secondary); - border-radius: 12px; -} - -.comparison-table th, -.comparison-table td { - padding: 1rem; - text-align: left; - border-bottom: 1px solid var(--bg-tertiary); -} - -.comparison-table th { - background-color: var(--bg-tertiary); - font-weight: 600; -} - -.comparison-table .improvement { - color: #2ecc71; - font-weight: 600; -} - -.practice-card ul { - list-style: none; - margin: 0; - padding: 0; -} - -.practice-card li { - margin-bottom: 0.5rem; - padding-left: 1.5rem; - position: relative; -} - -.practice-card li:before { - content: "•"; - color: var(--accent-primary); - position: absolute; - left: 0; -} - -/* Security and FAQ page specific styles */ -.security-card, -.faq-card { - background-color: var(--bg-secondary); - padding: 1.5rem; - border-radius: 12px; - margin-bottom: 1.5rem; -} - -.security-card h3, -.faq-card h3 { - display: flex; - align-items: center; - margin-bottom: 1rem; -} - -.security-card h3 i, -.faq-card h3 i { - margin-right: 0.75rem; - color: var(--accent-primary); -} - -.security-card ul, -.faq-card ul { - list-style: none; - margin: 0; - padding: 0; -} - -.security-card li, -.faq-card li { - margin-bottom: 0.5rem; - padding-left: 1.5rem; - position: relative; -} - -.security-card li:before, -.faq-card li:before { - content: "•"; - color: var(--accent-primary); - position: absolute; - left: 0; -} - -.security-card.warning { - border: 1px solid #e74c3c; -} - -.security-card.warning h3 i { - color: #e74c3c; -} - -.security-card.warning li:before { - color: #e74c3c; -} - -@media (max-width: 768px) { - .menu-toggle { - display: flex; - align-items: center; - justify-content: center; - } - - .sidebar { - position: fixed; - top: 0; - left: -250px; - width: 250px; - height: 100vh; - z-index: 1000; - background-color: var(--background-primary); - transition: left 0.3s ease; - overflow-y: auto; - box-shadow: 2px 0 10px rgba(0, 0, 0, 0.3); - padding: 1rem; - } - - .sidebar.active { - left: 0; - } - - body.menu-open { - overflow: hidden; - } - - .content { - margin-left: 0; - width: 100%; - } - - .hero h1 { - font-size: 2rem; - } -} - -/* Mobile menu button */ -.menu-toggle { - display: none; - position: fixed; - bottom: 2rem; - right: 2rem; - background-color: var(--accent-primary); - color: white; - border: none; - border-radius: 50%; - width: 50px; - height: 50px; - font-size: 1.5rem; - cursor: pointer; - z-index: 1001; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3); - transition: all 0.3s ease; -} - -.menu-toggle:hover { - transform: scale(1.1); -} - -@media (max-width: 768px) { - .menu-toggle { - display: flex; - align-items: center; - justify-content: center; - } -} \ No newline at end of file diff --git a/.pages/assets/js/main.js b/.pages/assets/js/main.js deleted file mode 100644 index 13d5fde..0000000 --- a/.pages/assets/js/main.js +++ /dev/null @@ -1,84 +0,0 @@ -document.addEventListener('DOMContentLoaded', () => { - // Create mobile menu button if it doesn't exist - if (!document.querySelector('.menu-toggle')) { - const menuButton = document.createElement('button'); - menuButton.className = 'menu-toggle'; - menuButton.innerHTML = ''; - document.body.appendChild(menuButton); - } - - const menuToggle = document.querySelector('.menu-toggle'); - const sidebar = document.querySelector('.sidebar'); - const body = document.body; - - if (menuToggle && sidebar) { - menuToggle.addEventListener('click', function(e) { - e.stopPropagation(); - sidebar.classList.toggle('active'); - body.classList.toggle('menu-open'); - }); - - // Close sidebar when clicking outside - document.addEventListener('click', function(e) { - if (!sidebar.contains(e.target) && !menuToggle.contains(e.target)) { - sidebar.classList.remove('active'); - body.classList.remove('menu-open'); - } - }); - - // Prevent clicks inside sidebar from closing it - sidebar.addEventListener('click', function(e) { - e.stopPropagation(); - }); - } - - // Add copy button to code blocks - document.querySelectorAll('pre code').forEach((block) => { - const button = document.createElement('button'); - button.className = 'copy-button'; - button.textContent = 'Copy'; - - button.addEventListener('click', async () => { - try { - await navigator.clipboard.writeText(block.textContent); - button.textContent = 'Copied!'; - setTimeout(() => { - button.textContent = 'Copy'; - }, 2000); - } catch (err) { - console.error('Failed to copy text:', err); - } - }); - - const wrapper = document.createElement('div'); - wrapper.className = 'code-wrapper'; - block.parentNode.insertBefore(wrapper, block); - wrapper.appendChild(block); - wrapper.appendChild(button); - }); - - // Highlight active nav item based on scroll position - const sections = document.querySelectorAll('section[id]'); - const navLinks = document.querySelectorAll('.nav-links a'); - - function highlightNavItem() { - const scrollY = window.scrollY; - - sections.forEach(section => { - const sectionTop = section.offsetTop - 100; - const sectionBottom = sectionTop + section.offsetHeight; - const sectionId = section.getAttribute('id'); - - if (scrollY >= sectionTop && scrollY < sectionBottom) { - navLinks.forEach(link => { - link.classList.remove('active'); - if (link.getAttribute('href').includes(sectionId)) { - link.classList.add('active'); - } - }); - } - }); - } - - window.addEventListener('scroll', highlightNavItem); -}); \ No newline at end of file diff --git a/.pages/assets/js/scroll.js b/.pages/assets/js/scroll.js deleted file mode 100644 index 7b9926d..0000000 --- a/.pages/assets/js/scroll.js +++ /dev/null @@ -1,34 +0,0 @@ -document.addEventListener('DOMContentLoaded', function() { - // Get current page path - const currentPath = window.location.pathname; - const pageName = currentPath.split('/').pop() || 'index.html'; - - // Find the corresponding nav link - const navLinks = document.querySelectorAll('.nav-links a'); - navLinks.forEach(link => { - // Remove any existing active classes - link.classList.remove('active'); - - // If this link matches current page, add active class - if (link.getAttribute('href') === pageName) { - link.classList.add('active'); - } - }); - - // Keep the active state when scrolling - let ticking = false; - window.addEventListener('scroll', function() { - if (!ticking) { - window.requestAnimationFrame(function() { - // Find the active link again and ensure it stays active - const activeLink = document.querySelector('.nav-links a[href="' + pageName + '"]'); - if (activeLink && !activeLink.classList.contains('active')) { - navLinks.forEach(link => link.classList.remove('active')); - activeLink.classList.add('active'); - } - ticking = false; - }); - ticking = true; - } - }); -}); \ No newline at end of file diff --git a/.pages/babel.config.js b/.pages/babel.config.js new file mode 100644 index 0000000..e955840 --- /dev/null +++ b/.pages/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + '@vue/cli-plugin-babel/preset' + ] +} diff --git a/.pages/docker-compose.yml b/.pages/docker-compose.yml new file mode 100644 index 0000000..39f1f95 --- /dev/null +++ b/.pages/docker-compose.yml @@ -0,0 +1,13 @@ +services: + app: + build: + context: . + target: build-stage + ports: + - "8080:8080" + volumes: + - .:/app + - /app/node_modules + environment: + - NODE_ENV=development + command: npm run serve \ No newline at end of file diff --git a/.pages/docs/api-reference.html b/.pages/docs/api-reference.html deleted file mode 100644 index 6e535c4..0000000 --- a/.pages/docs/api-reference.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - - API Reference - UUID Documentation - - - - - - - - - - - - -
-

API Reference

- -
-

UUID Struct

-

The core struct representing a UUID value.

- -
-
public readonly partial struct UUID : IEquatable<UUID>, IComparable<UUID>, IComparable
-
- -

Properties

-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
EmptyUUIDGets the empty UUID value (all zeros)
VersionbyteGets the UUID version number (7 for UUIDv7)
VariantbyteGets the UUID variant number (2 for RFC 4122)
TimeDateTimeOffsetGets the timestamp embedded in the UUID (UUIDv7 only)
-
- -

Constructors

-
-
// Create a new random UUID
-public UUID()
-
-// Create from bytes
-public UUID(ReadOnlySpan<byte> bytes)
-
-// Create from string
-public static UUID Parse(string input)
-public static UUID Parse(ReadOnlySpan<char> input)
-
-// Try parse from string
-public static bool TryParse(string input, out UUID result)
-public static bool TryParse(ReadOnlySpan<char> input, out UUID result)
-
-
- -
-

Methods

- -

String Formatting

-
-
// Convert to standard string format
-public override string ToString()
-
-// Convert to Base32 format
-public string ToBase32()
-
-// Convert to Base64 format
-public string ToBase64()
-
-// Convert from Base64 format
-public static UUID FromBase64(string base64)
-public static bool TryFromBase64(string base64, out UUID result)
-
- -

Byte Array Operations

-
-
// Convert to byte array
-public byte[] ToByteArray()
-public bool TryWriteBytes(byte[] destination)
-public bool TryWriteBytes(Span<byte> destination)
-
-// Convert from byte array
-public static UUID FromByteArray(byte[] bytes)
-public static bool TryFromByteArray(byte[] bytes, out UUID result)
-
- -

Guid Operations

-
-
// Convert to/from Guid (implicit operators)
-public static implicit operator Guid(UUID uuid)
-public static implicit operator UUID(Guid guid)
-
-// Explicit conversion methods
-public Guid ToGuid()
-public static UUID FromGuid(Guid guid)
-
- -

Comparison Methods

-
-
// Standard equality methods
-public bool Equals(UUID other)
-public override bool Equals(object obj)
-public override int GetHashCode()
-
-// Comparison methods (implements IComparable)
-public int CompareTo(UUID other)
-public int CompareTo(object obj)
-
-// Comparison operators
-public static bool operator ==(UUID left, UUID right)
-public static bool operator !=(UUID left, UUID right)
-public static bool operator <(UUID left, UUID right)
-public static bool operator >(UUID left, UUID right)
-public static bool operator <=(UUID left, UUID right)
-public static bool operator >=(UUID left, UUID right)
-
-// UUIDv7 specific comparisons
-public bool IsOrderedAfter(UUID other)
-public static int CompareTimestamps(UUID a, UUID b)
-public static bool AreMonotonicallyOrdered(UUID[] uuids)
-
-
- -
-

Extension Methods

-
-
// Array extensions
-public static class ArrayExtension
-{
-    // Generate array of UUIDs
-    public static UUID[] Generate(int count)
-    
-    // Try generate array of UUIDs
-    public static bool TryGenerate(int count, out UUID[]? result)
-    
-    // Fill array with UUIDs
-    public static void Fill(this UUID[] array)
-    
-    // Try fill array with UUIDs
-    public static bool TryFill(this UUID[] array)
-}
-
-
- -
-

Exceptions

-
-

FormatException

-

Thrown when:

-
    -
  • Invalid string format in Parse methods
  • -
  • Invalid byte array length in constructor
  • -
-
- -
-

ArgumentNullException

-

Thrown when:

-
    -
  • Null input string in Parse methods
  • -
  • Null byte array in constructor
  • -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.pages/docs/examples.html b/.pages/docs/examples.html deleted file mode 100644 index ba81567..0000000 --- a/.pages/docs/examples.html +++ /dev/null @@ -1,348 +0,0 @@ - - - - - - Examples - UUID Documentation - - - - - - - - - - - - -
-

Examples

- -
-

Basic Examples

- -
-

Generate and Format UUIDs

-
-
// Generate a new UUID
-var id = new UUID();
-
-// Different string formats
-Console.WriteLine(id.ToString()); // Standard format
-Console.WriteLine(id.ToBase64()); // Base64 format
-Console.WriteLine(id.ToBase32()); // Base32 format
-Console.WriteLine(id.Int64()); // Int64 format
-
-// Get raw bytes
-byte[] bytes = id.ToByteArray();
-
-

This example shows different ways to create and format UUIDs.

-
- -
-

Parse UUIDs

-
-
// Parse from string
-var id1 = UUID.Parse("0123456789abcdef0123456789abcdef");
-
-// Try parse pattern
-if (UUID.TryParse("0123456789abcdef0123456789abcdef", out var id2))
-{
-    Console.WriteLine("Successfully parsed: " + id2);
-}
-
-

Examples of parsing UUIDs from different string formats.

-
-
- -
-

Advanced Examples

- -
-

Bulk UUID Generation

-
-
// Generate multiple UUIDs efficiently
-UUID[] uuids = new UUID[1000];
-ArrayExtension.Fill(uuids);
-
-// Process in parallel
-Parallel.ForEach(uuids, uuid =>
-{
-    ProcessUUID(uuid);
-});
-
-private void ProcessUUID(UUID uuid)
-{
-    // Your processing logic here
-    var str = uuid.ToString();
-    // ...
-}
-
-

Example of generating and processing multiple UUIDs efficiently.

-
- -
-

Custom Formatting

-
-
var uuid = new UUID();
-
-// Custom string builder formatting
-var sb = new StringBuilder();
-sb.Append("UUID-");
-sb.Append(uuid.ToString());
-sb.Append("-END");
-
-// Format with prefix
-string prefixed = $"ID_{uuid}";
-
-

Examples of custom UUID string formatting.

-
-
- -
-

String Format Examples

- -
-

String Format Conversions

-
-
// Create a new UUID
-var id = new UUID();
-
-// Convert to different formats
-string standard = id.ToString();
-string base64 = id.ToBase64();
-string base32 = id.ToBase32();
-long int64 = id.ToInt64();
-
-Console.WriteLine($"Standard: {standard}");
-Console.WriteLine($"Base64: {base64}");
-Console.WriteLine($"Base32: {base32}");
-Console.WriteLine($"Int64: {int64}");
-
-// Convert back from Base64
-UUID fromBase64 = UUID.FromBase64(base64);
-Console.WriteLine($"Restored from Base64: {fromBase64}");
-
-// Safe parsing from Base64
-if (UUID.TryFromBase64(base64, out UUID parsed))
-{
-    Console.WriteLine($"Successfully parsed from Base64: {parsed}");
-}
-
-

Examples of converting UUIDs to and from different string formats.

-
- -
-

Byte Array Operations

-
-
// Create a new UUID
-var id = new UUID();
-
-// Convert to byte array
-byte[] bytes = id.ToByteArray();
-Console.WriteLine($"As bytes: {BitConverter.ToString(bytes)}");
-
-// Convert back from bytes
-UUID fromBytes = UUID.FromByteArray(bytes);
-Console.WriteLine($"Restored from bytes: {fromBytes}");
-
-// Safe conversion with TryFromByteArray
-if (UUID.TryFromByteArray(bytes, out UUID parsed))
-{
-    Console.WriteLine($"Successfully parsed from bytes: {parsed}");
-}
-
-// Write directly to a byte array
-byte[] destination = new byte[16];
-if (id.TryWriteBytes(destination))
-{
-    Console.WriteLine($"Successfully wrote to byte array: {BitConverter.ToString(destination)}");
-}
-
-

Examples of working with byte array representations of UUIDs.

-
- -
-

Guid Conversions

-
-
// Create a new UUID
-var uuid = new UUID();
-
-// Implicit conversion to Guid
-Guid guid = uuid;
-Console.WriteLine($"As Guid: {guid}");
-
-// Implicit conversion from Guid
-UUID fromGuid = guid;
-Console.WriteLine($"Back to UUID: {fromGuid}");
-
-// Using explicit methods
-Guid guidExplicit = uuid.ToGuid();
-UUID uuidExplicit = UUID.FromGuid(guidExplicit);
-
-

Examples of converting between UUID and Guid types.

-
-
- -
-

Database Examples

- -
-

Entity Framework Core

-
-
public class User
-{
-    public UUID Id { get; set; }
-    public string Name { get; set; }
-}
-
-public class AppDbContext : DbContext
-{
-    public DbSet<User> Users { get; set; }
-
-    protected override void OnModelCreating(ModelBuilder modelBuilder)
-    {
-        modelBuilder.Entity<User>()
-            .Property(e => e.Id)
-            .HasConversion(
-                v => v.ToString(),
-                v => UUID.Parse(v));
-    }
-}
-
-

Example of using UUIDs with Entity Framework Core.

-
- -
-

Dapper

-
-
public async Task<User> GetUser(UUID id)
-{
-    using var connection = new SqlConnection(connectionString);
-    return await connection.QuerySingleOrDefaultAsync<User>(
-        "SELECT * FROM Users WHERE Id = @Id",
-        new { Id = id.ToString() }
-    );
-}
-
-

Example of using UUIDs with Dapper.

-
-
- -
-

Web API Examples

- -
-

ASP.NET Core Controller

-
-
public class UserController : ControllerBase
-{
-    [HttpGet("{id}")]
-    public async Task<ActionResult<User>> GetUser(UUID id)
-    {
-        var user = await _userService.GetUserAsync(id);
-        if (user == null)
-            return NotFound();
-        return user;
-    }
-
-    [HttpPost]
-    public async Task<ActionResult<User>> CreateUser(User user)
-    {
-        user.Id = new UUID(); // Generate new UUID
-        await _userService.CreateUserAsync(user);
-        return CreatedAtAction(nameof(GetUser), new { id = user.Id }, user);
-    }
-}
-
-

Example of using UUIDs in ASP.NET Core Web API.

-
-
-
- - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.pages/docs/faq.html b/.pages/docs/faq.html deleted file mode 100644 index 6889c79..0000000 --- a/.pages/docs/faq.html +++ /dev/null @@ -1,309 +0,0 @@ - - - - - - FAQ - UUID Documentation - - - - - - - - - - - - -
-

Frequently Asked Questions

- -
-

General Questions

- -
-

What is UUID?

-

UUID (Universally Unique Identifier) is a 128-bit identifier that's guaranteed to be unique across space and time. Our UUID library provides a high-performance, secure implementation for .NET applications.

-
- -
-

How is UUID different from Guid?

-

While UUID and Guid represent the same concept, our UUID implementation offers:

-
    -
  • Better performance (up to 70% faster)
  • -
  • More modern API design
  • -
  • Additional string format options (Base32, Base64)
  • -
  • Better security by default
  • -
-
- -
-

Is UUID thread-safe?

-

Yes, UUID operations are thread-safe. You can safely generate and manipulate UUIDs from multiple threads without any synchronization.

-
-
- -
-

Usage Questions

- -
-

How do I generate a new UUID?

-
-
// Simple generation
-var uuid = new UUID();
-
-// Generate multiple
-UUID[] uuids = new UUID[1000];
-ArrayExtension.Fill(uuids);
-
-
- -
-

What string formats are supported?

-
-
var uuid = new UUID();
-
-// Standard format (default)
-Console.WriteLine(uuid.ToString());
-// "0123456789abcdef0123456789abcdef"
-
-// Base32 (URL-safe)
-Console.WriteLine(uuid.ToBase32());
-// "028T5CY4TQKFF028T5CY4TQKFF"
-
-// Base64
-Console.WriteLine(uuid.ToBase64());
-// "782riWdFIwHvzauJZ0UjAQ=="
-
-
- -
-

How do I convert between different formats?

-
-
var uuid = new UUID();
-
-// Convert to Base64
-string base64 = uuid.ToBase64();
-UUID fromBase64 = UUID.FromBase64(base64);
-
-// Convert to byte array
-byte[] bytes = uuid.ToByteArray();
-UUID fromBytes = UUID.FromByteArray(bytes);
-
-// Convert to/from Guid (implicit)
-Guid guid = uuid;
-UUID fromGuid = guid;
-
-

UUID supports various conversion methods with both standard and safe parsing options (Try* methods).

-
- -
-

Which string format should I use?

-
    -
  • Standard format: Best for human readability and debugging
  • -
  • Base32: Best for URLs and file names (URL-safe, no special characters)
  • -
  • Base64: Best for storage efficiency (shortest representation)
  • -
-
- -
-

How do I handle conversion errors?

-
-
// Safe Base64 parsing
-if (UUID.TryFromBase64(base64String, out UUID uuid))
-{
-    // Success
-    Console.WriteLine($"Parsed UUID: {uuid}");
-}
-else
-{
-    // Handle invalid input
-    Console.WriteLine("Invalid Base64 string");
-}
-
-// Safe byte array parsing
-if (UUID.TryFromByteArray(bytes, out UUID fromBytes))
-{
-    // Success
-    Console.WriteLine($"Parsed UUID: {fromBytes}");
-}
-else
-{
-    // Handle invalid input
-    Console.WriteLine("Invalid byte array");
-
-

Always use Try* methods when parsing untrusted input to handle errors gracefully.

-
- -
-

How do I use UUIDs with Entity Framework?

-
-
public class User
-{
-    public UUID Id { get; set; }
-    public string Name { get; set; }
-}
-
-protected override void OnModelCreating(ModelBuilder modelBuilder)
-{
-    modelBuilder.Entity<User>()
-        .Property(e => e.Id)
-        .HasConversion(
-            v => v.ToByteArray(),
-            v => new UUID(v));
-}
-
-
-
- -
-

Performance Questions

- -
-

How many UUIDs can be generated per second?

-

On a modern system:

-
    -
  • Single thread: ~20.5M UUIDs/second
  • -
  • Multi-thread (4 cores): ~78.2M UUIDs/second
  • -
  • Multi-thread (8 cores): ~152.3M UUIDs/second
  • -
-
- -
-

How can I improve UUID generation performance?

-

For best performance:

-
    -
  • Use bulk generation methods for multiple UUIDs
  • -
  • Reuse UUID instances when possible
  • -
  • Use TryParse instead of Parse
  • -
  • Store UUIDs in binary format
  • -
-
-
- -
-

Troubleshooting

- -
-

Why am I getting a FormatException?

-

FormatException occurs when parsing invalid UUID strings. Common issues:

-
    -
  • Incorrect string format
  • -
  • Missing or extra hyphens
  • -
  • Invalid characters
  • -
-

Solution: Use TryParse for safer parsing:

-
-
if (UUID.TryParse(input, out var uuid))
-{
-    // Valid UUID
-}
-else
-{
-    // Invalid format
-}
-
-
- -
-

How do I migrate from Guid?

-

UUID provides implicit conversion operators:

-
-
// From Guid to UUID
-Guid guid = Guid.NewGuid();
-UUID uuid = guid;  // Implicit conversion
-
-// From UUID to Guid
-UUID uuid = new UUID();
-Guid guid = uuid;  // Implicit conversion
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.pages/docs/getting-started.html b/.pages/docs/getting-started.html deleted file mode 100644 index 0b45146..0000000 --- a/.pages/docs/getting-started.html +++ /dev/null @@ -1,291 +0,0 @@ - - - - - - - Getting Started - UUID Documentation - - - - - - - - - - - -
-

Getting Started

- -
-

Installation

-

Install the UUID package via NuGet using one of the following methods:

- -
-
# .NET CLI
-dotnet add package UUID
-
-# Package Manager Console
-Install-Package UUID
-
-
- -
-

Basic Usage

-

Here's how to get started with basic UUID operations:

- -
-
// Generate a new UUID
-var id = new UUID();
-
-// Convert to string
-string str = id.ToString();  // "0123456789abcdef0123456789abcdef"
-
-// Parse from string
-UUID parsed = UUID.Parse("0123456789abcdef0123456789abcdef");
-
-// Check UUID version and variant
-Console.WriteLine($"Version: {id.Version}"); // 7 (UUIDv7)
-Console.WriteLine($"Variant: {id.Variant}"); // 2 (RFC 4122)
-
-// Get timestamp from UUID
-Console.WriteLine($"Time: {id.Time:yyyy-MM-dd HH:mm:ss.fff}");
-
-
-
- -
-

String Formats

-

UUID supports multiple string formats for different use cases:

- -
-
var uuid = new UUID();
-
-// Standard format
-string standard = uuid.ToString();
-// "0123456789abcdef0123456789abcdef"
-
-// Int64 format
-long int64 = uuid.ToInt64();
-// "40992764608247672"
-
-// Base32 format (URL-safe)
-string base32 = uuid.ToBase32();
-// "028T5CY4TQKFF028T5CY4TQKFF"
-
-// Base64 format
-string base64 = uuid.ToBase64();
-// "782riWdFIwHvzauJZ0UjAQ=="
-
-// Convert Base64 back to UUID
-UUID fromBase64 = UUID.FromBase64(base64);
-Console.WriteLine($"Base64 -> UUID: {fromBase64}");
-
-// Safe parsing with TryFromBase64
-if (UUID.TryFromBase64(base64, out UUID parsedFromBase64))
-{
-    Console.WriteLine($"Successfully parsed from Base64: {parsedFromBase64}");
-}
-
-
- -
-

Bulk Operations

-

For high-performance scenarios where you need to generate multiple UUIDs efficiently:

- -
-
// Fill an existing array with UUIDs
-UUID[] uuids = new UUID[1000];
-uuids.Fill();  // Thread-safe, efficient bulk generation
-
-// Generate a new array of UUIDs
-UUID[] generated = ArrayExtension.Generate(1000);
-
-// With error handling
-if (ArrayExtension.TryGenerate(1000, out UUID[]? result))
-{
-    foreach (var uuid in result)
-    {
-        // Process each UUID
-        Console.WriteLine(uuid);
-    }
-}
-
- -
-

Performance Tips

-
    -
  • Use Fill() for existing arrays to avoid allocation overhead
  • -
  • Use TryGenerate() for safe bulk generation with error handling
  • -
  • All bulk operations are thread-safe and optimized for concurrent use
  • -
-
-
- -
-

Byte Array Operations

-

UUID provides methods for converting to and from byte arrays:

- -
-
// Convert UUID to byte array
-UUID id = UUID.New();
-byte[] bytes = id.ToByteArray();
-Console.WriteLine($"UUID -> Bytes: {BitConverter.ToString(bytes)}");
-
-// Convert byte array back to UUID
-UUID fromBytes = UUID.FromByteArray(bytes);
-Console.WriteLine($"Bytes -> UUID: {fromBytes}");
-
-// Safe parsing with TryFromByteArray
-if (UUID.TryFromByteArray(bytes, out UUID parsedFromBytes))
-{
-    Console.WriteLine($"Successfully parsed from bytes: {parsedFromBytes}");
-}
-
-// Writing directly to a byte array
-byte[] destination = new byte[16];
-if (id.TryWriteBytes(destination))
-{
-    Console.WriteLine($"Successfully wrote to byte array: {BitConverter.ToString(destination)}");
-}
-
-
- -
-

Performance Tips

- -
-

String Formatting

-
    -
  • Use appropriate string format methods based on your needs
  • -
  • Consider using Base32 for URL-safe strings
  • -
-
- -
-

Bulk Operations

-
    -
  • Use array pooling for bulk operations
  • -
  • Consider parallel processing for large batches
  • -
-
- -
-

Memory Usage

-
    -
  • UUID struct is optimized for minimal memory footprint
  • -
  • Use array pooling for bulk operations
  • -
-
-
- -
-

Next Steps

- -
-
- - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.pages/docs/migration.html b/.pages/docs/migration.html deleted file mode 100644 index 2bca606..0000000 --- a/.pages/docs/migration.html +++ /dev/null @@ -1,302 +0,0 @@ - - - - - - Migration Guide - UUID Documentation - - - - - - - - - - - - - -
-

Migration Guide

- -
-

Migrating from Guid

- -
-

Basic Migration

-
-
// Before (Guid)
-Guid guid = Guid.NewGuid();
-string guidString = guid.ToString();
-
-// After (UUID)
-UUID uuid = new UUID();
-string uuidString = uuid.ToString();
-
-

The UUID library provides a modern, high-performance alternative to System.Guid with additional features and better performance.

-
- -
-

Converting Existing Guids

-
-
// Convert from Guid to UUID
-Guid existingGuid = Guid.NewGuid();
-UUID uuid = UUID.FromGuid(existingGuid);
-
-// Convert back to Guid if needed
-Guid convertedBack = uuid.ToGuid();
-
-// Using implicit operators
-UUID fromGuid = existingGuid;  // Implicit conversion
-Guid toGuid = uuid;           // Implicit conversion
-
-

UUID provides both explicit conversion methods and implicit operators for seamless integration with existing Guid-based code.

-
- -
-

Database Migration

-
-
// Entity Framework Configuration
-public class MyDbContext : DbContext
-{
-    protected override void OnModelCreating(ModelBuilder modelBuilder)
-    {
-        modelBuilder.Entity<MyEntity>()
-            .Property(e => e.Id)
-            .HasConversion(
-                uuid => uuid.ToString(),
-                str => UUID.Parse(str)
-            );
-    }
-}
-
-// Dapper Type Handler
-public class UUIDTypeHandler : SqlMapper.TypeHandler<UUID>
-{
-    public override UUID Parse(object value)
-    {
-        return UUID.Parse((string)value);
-    }
-
-    public override void SetValue(IDbDataParameter parameter, UUID value)
-    {
-        parameter.Value = value.ToString();
-    }
-}
-
-// Register the Dapper handler
-SqlMapper.AddTypeHandler(new UUIDTypeHandler());
-
-

The UUID library integrates seamlessly with popular ORMs and data access libraries.

-
-
- -
-

Migrating from Other UUID Libraries

- -
-

String Format Conversion

-
-
// Common string formats supported
-UUID uuid = new UUID();
-
-// Standard format
-string standard = uuid.ToString();  // "0123456789abcdef0123456789abcdef"
-
-// URL-safe format
-string urlSafe = uuid.ToBase32();   // "028T5CY4TQKFF028T5CY4TQKFF"
-
-// Base64 format
-string base64 = uuid.ToBase64();    // "782riWdFIwHvzauJZ0UjAQ=="
-
-

UUID supports multiple string formats for different use cases, making it easy to migrate from other UUID implementations.

-
- -
-

Performance Optimization

-
-
// Reusable buffers for high-performance scenarios
-public class UUIDConverter
-{
-    private readonly char[] _buffer = new char[32];
-    
-    public string FastConvert(UUID uuid)
-    {
-        if (uuid.TryWriteStringify(_buffer))
-        {
-            return new string(_buffer);
-        }
-        return uuid.ToString();
-    }
-}
-
-// Using Span for better performance
-public class UUIDByteConverter
-{
-    public byte[] ToBytes(UUID uuid)
-    {
-        Span buffer = stackalloc byte[16];
-        if (uuid.TryWriteBytes(buffer))
-        {
-            return buffer.ToArray();
-        }
-        return uuid.ToByteArray();
-    }
-}
-
-

UUID provides high-performance methods and modern C# features like Span<T> for optimal performance.

-
-
- -
-

Migration Checklist

- -
-
-

Before Migration

-
    -
  • Identify all Guid/UUID usages in your codebase
  • -
  • Review string format requirements
  • -
  • Check database schema compatibility
  • -
  • Test performance with your typical workload
  • -
-
- -
-

During Migration

-
    -
  • Update model properties from Guid to UUID
  • -
  • Configure ORM mappings
  • -
  • Update API contracts if necessary
  • -
  • Implement conversion logic for external systems
  • -
-
- -
-

After Migration

-
    -
  • Verify all UUID operations work as expected
  • -
  • Confirm database operations are successful
  • -
  • Run performance tests
  • -
  • Update documentation
  • -
-
-
-
-
- - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.pages/docs/performance.html b/.pages/docs/performance.html deleted file mode 100644 index ce3e7ef..0000000 --- a/.pages/docs/performance.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - Performance Guide - UUID Documentation - - - - - - - - - - - -
-

Performance Guide

- -
-

Benchmarks

- -
-
-

Generation

-

20.5M

-

UUIDs/second (single thread)

-
-
-

Parsing

-

15.8M

-

UUIDs/second

-
-
-

ToString

-

12.3M

-

conversions/second

-
-
-

Memory

-

16

-

bytes per UUID

-
-
-
- -
-

Optimization Tips

- -
-

Bulk Operations

-

When generating multiple UUIDs, use the array methods:

-
-
// More efficient than generating individually
-UUID[] uuids = new UUID[1000];
-ArrayExtension.Fill(uuids);
-
-
- -
-

Memory Management

-

Use the zero-allocation methods when possible:

-
-
// Avoid allocations
-Span<byte> buffer = stackalloc byte[16];
-uuid.TryWriteBytes(buffer);
-
-
- -
-

Parallel Processing

-

Take advantage of parallel processing for bulk operations:

-
-
// Process UUIDs in parallel
-Parallel.ForEach(uuids, uuid =>
-{
-    ProcessUUID(uuid);
-});
-
-
- -
-

String Conversions

-

Choose the right string format for your use case:

-
-
// Base32 is URL-safe and compact
-string base32 = uuid.ToBase32(); // Most efficient for URLs
-
-// Base64 is compact but may need URL encoding
-string base64 = uuid.ToBase64(); // Most space-efficient
-
-// Standard format is human-readable
-string standard = uuid.ToString(); // Most readable
-
-
- -
-

Byte Array Operations

-

Use the most efficient byte array methods:

-
-
// Pre-allocate buffer for multiple writes
-byte[] buffer = new byte[16];
-if (uuid.TryWriteBytes(buffer))
-{
-    // Use buffer directly without allocation
-    ProcessBytes(buffer);
-}
-
-// For single use, ToByteArray is simpler
-byte[] bytes = uuid.ToByteArray();
-
-
- -
-

Guid Conversions

-

Take advantage of implicit conversions:

-
-
// Implicit conversion is most efficient
-UUID uuid = new UUID();
-Guid guid = uuid; // No explicit conversion needed
-
-// Avoid unnecessary conversions
-void ProcessId(UUID uuid)
-{
-    // Don't convert if UUID is accepted
-    ProcessUUID(uuid);
-    
-    // Convert only when Guid is required
-    ProcessGuid(uuid); // Implicit conversion
-}
-
-
-
- -
-

Performance Comparison

- -
- - - - - - - - - - - - - - - - - - - - - - - - - -
OperationUUIDGuidImprovement
Generation20.5M/s12.3M/s+66%
Parse15.8M/s8.9M/s+77%
ToString12.3M/s7.2M/s+70%
-
-
- -
-

Best Practices

- -
-

Do

-
    -
  • Use array pooling for bulk operations
  • -
  • Take advantage of Span<T> APIs
  • -
  • Use TryParse over Parse when possible
  • -
  • Cache frequently used UUIDs
  • -
-
- -
-

Don't

-
    -
  • Generate UUIDs in tight loops individually
  • -
  • Convert to string unnecessarily
  • -
  • Parse the same UUID repeatedly
  • -
  • Ignore the available bulk operations
  • -
-
-
- -
-

Profiling Tools

- -
-

BenchmarkDotNet

-

Our benchmarks are created using BenchmarkDotNet. You can run them yourself:

-
-
public class UUIDBenchmarks
-{
-    [Benchmark]
-    public void GenerateUUID()
-    {
-        var uuid = new UUID();
-    }
-
-    [Benchmark]
-    public void ParseUUID()
-    {
-        UUID.Parse("0123456789abcdef0123456789abcdef");
-    }
-}
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.pages/docs/security.html b/.pages/docs/security.html deleted file mode 100644 index b4151f9..0000000 --- a/.pages/docs/security.html +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - Security Guide - UUID Documentation - - - - - - - - - - - - -
-

Security Guide

- -
-

Security Overview

-

UUID library is designed with security in mind, using cryptographically secure random number generation by default.

- -
-

Key Security Features

-
    -
  • Cryptographically secure random number generation
  • -
  • Protection against timing attacks
  • -
  • Safe string parsing and validation
  • -
  • Thread-safe operations
  • -
-
-
- -
-

Random Number Generation

- -
-

Secure Generation

-

UUID uses System.Security.Cryptography.RandomNumberGenerator for secure random number generation:

-
-
// Automatically uses secure RNG
-var uuid = new UUID();
-
-// For bulk operations
-UUID[] uuids = new UUID[1000];
-ArrayExtension.Fill(uuids); // Still uses secure RNG
-
-
-
- -
-

Security Best Practices

- -
-

Recommended Practices

-
    -
  • Always validate UUID inputs
  • -
  • Use TryParse for untrusted input
  • -
  • Store UUIDs in their binary form when possible
  • -
  • Use URL-safe Base32 encoding for web contexts
  • -
-
- -
-

Practices to Avoid

-
    -
  • Don't use UUIDs for sensitive data encoding
  • -
  • Don't use UUIDs as security tokens
  • -
  • Don't assume sequential UUIDs are secure
  • -
  • Don't expose internal UUID representation
  • -
-
-
- -
-

Input Validation

- -
-

Safe Parsing

-

Always use TryParse for untrusted input:

-
-
// Safe parsing of untrusted input
-public bool ValidateUserInput(string input)
-{
-    if (UUID.TryParse(input, out var uuid))
-    {
-        // Input is a valid UUID
-        ProcessValidUUID(uuid);
-        return true;
-    }
-    return false;
-}
-
-
-
- -
-

Secure Storage

- -
-

Database Storage

-

Best practices for storing UUIDs in databases:

-
-
-- SQL Server
-CREATE TABLE Users (
-    Id BINARY(16) PRIMARY KEY,  -- Most efficient
-    -- or
-    Id UNIQUEIDENTIFIER PRIMARY KEY  -- If you need native UUID type
-);
-
-
- -
-

Entity Framework

-

Configure EF Core for secure UUID handling:

-
-
protected override void OnModelCreating(ModelBuilder modelBuilder)
-{
-    modelBuilder.Entity<User>()
-        .Property(e => e.Id)
-        .HasConversion(
-            v => v.ToByteArray(),  // Store as binary
-            v => new UUID(v));
-}
-
-
-
- -
-

Cryptographic Notes

- -
-

Important Security Notes

-
    -
  • UUIDs are not suitable for cryptographic purposes
  • -
  • Do not use UUIDs to store sensitive information
  • -
  • UUIDs are not guaranteed to be unique across systems
  • -
  • Use proper cryptographic functions for security-critical operations
  • -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.pages/docs/serialization.html b/.pages/docs/serialization.html deleted file mode 100644 index 559d44b..0000000 --- a/.pages/docs/serialization.html +++ /dev/null @@ -1,459 +0,0 @@ - - - - - - Serialization - UUID Documentation - - - - - - - - - - - - -
-

Serialization Examples

- -
-

Installation

- -
-

System.Text.Json Package

-
-
dotnet add package UUID.Serialization.System
-
-

Install the System.Text.Json serialization package via NuGet.

-
- -
-

Newtonsoft.Json Package

-
-
dotnet add package UUID.Serialization.Newtonsoft
-
-

Install the Newtonsoft.Json serialization package via NuGet.

-
-
- -
-

System.Text.Json Examples

- -
-

Basic Serialization

-
-
using System.Text.Json;
-
-// Configure JsonSerializerOptions
-var options = new JsonSerializerOptions();
-options.Converters.Add(new UUIDConverter());
-
-// Create a UUID
-var uuid = UUID.New();
-
-// Serialize
-string json = JsonSerializer.Serialize(uuid, options);
-
-// Deserialize
-UUID deserialized = JsonSerializer.Deserialize(json, options);
-
-

Basic example of UUID serialization and deserialization using System.Text.Json.

-
- -
-

Collection Serialization

-
-
// Create an array of UUIDs
-UUID[] uuids = new[] { UUID.New(), UUID.New(), UUID.New() };
-
-// Serialize array
-string jsonArray = JsonSerializer.Serialize(uuids, options);
-
-// Deserialize array
-UUID[] deserializedArray = JsonSerializer.Deserialize(jsonArray, options);
-
-

Example of serializing and deserializing arrays of UUIDs using System.Text.Json.

-
- -
-

Model Serialization

-
-
public class User
-{
-    public UUID Id { get; set; }
-    public string Name { get; set; }
-}
-
-var user = new User 
-{ 
-    Id = UUID.New(),
-    Name = "John Doe"
-};
-
-// Serialize model
-string json = JsonSerializer.Serialize(user, options);
-
-// Deserialize model
-User deserializedUser = JsonSerializer.Deserialize(json, options);
-
-

Example of using UUIDs in model classes with System.Text.Json serialization.

-
-
- -
-

Newtonsoft.Json Examples

- -
-

Basic Serialization

-
-
using Newtonsoft.Json;
-
-// Configure JsonSerializerSettings
-var settings = new JsonSerializerSettings();
-settings.Converters.Add(new UUIDConverter());
-
-// Create a UUID
-var uuid = UUID.New();
-
-// Serialize
-string json = JsonConvert.SerializeObject(uuid, settings);
-
-// Deserialize
-UUID deserialized = JsonConvert.DeserializeObject(json, settings);
-
-

Basic example of UUID serialization and deserialization using Newtonsoft.Json.

-
- -
-

Collection Serialization

-
-
// Create an array of UUIDs
-UUID[] uuids = new[] { UUID.New(), UUID.New(), UUID.New() };
-
-// Serialize array
-string jsonArray = JsonConvert.SerializeObject(uuids, settings);
-
-// Deserialize array
-UUID[] deserializedArray = JsonConvert.DeserializeObject(jsonArray, settings);
-
-

Example of serializing and deserializing arrays of UUIDs using Newtonsoft.Json.

-
- -
-

Model Serialization

-
-
public class User
-{
-    public UUID Id { get; set; }
-    public string Name { get; set; }
-}
-
-var user = new User 
-{ 
-    Id = UUID.New(),
-    Name = "John Doe"
-};
-
-// Serialize model
-string json = JsonConvert.SerializeObject(user, settings);
-
-// Deserialize model
-User deserializedUser = JsonConvert.DeserializeObject(json, settings);
-
-

Example of using UUIDs in model classes with Newtonsoft.Json serialization.

-
-
- -
-

Advanced Examples

- -
-

Custom Model with UUID List

-
-
public class Team
-{
-    public string Name { get; set; }
-    public List MemberIds { get; set; }
-}
-
-var team = new Team 
-{ 
-    Name = "Development Team",
-    MemberIds = new List 
-    { 
-        UUID.New(), 
-        UUID.New() 
-    }
-};
-
-// System.Text.Json
-string json = JsonSerializer.Serialize(team, options);
-Team deserializedTeam = JsonSerializer.Deserialize(json, options);
-
-// Newtonsoft.Json
-string json = JsonConvert.SerializeObject(team, settings);
-Team deserializedTeam = JsonConvert.DeserializeObject(json, settings);
-
-

Example of serializing a model containing a list of UUIDs.

-
- -
-

Dictionary with UUID Keys

-
-
// Create a dictionary with UUID keys
-Dictionary userNames = new()
-{
-    { UUID.New(), "John Doe" },
-    { UUID.New(), "Jane Smith" }
-};
-
-// System.Text.Json
-string json = JsonSerializer.Serialize(userNames, options);
-Dictionary deserializedDict = JsonSerializer.Deserialize>(json, options);
-
-// Newtonsoft.Json
-string json = JsonConvert.SerializeObject(userNames, settings);
-Dictionary deserializedDict = JsonConvert.DeserializeObject>(json, settings);
-
-

Example of using UUIDs as dictionary keys in serialization.

-
- -
-

Custom JSON Property Name

-
-
public class UserProfile
-{
-    [JsonPropertyName("user_id")]        // System.Text.Json
-    [JsonProperty("user_id")]            // Newtonsoft.Json
-    public UUID Id { get; set; }
-
-    [JsonPropertyName("display_name")]    // System.Text.Json
-    [JsonProperty("display_name")]        // Newtonsoft.Json
-    public string Name { get; set; }
-}
-
-var profile = new UserProfile 
-{ 
-    Id = UUID.New(),
-    Name = "John Doe"
-};
-
-// The serialized JSON will use the custom property names:
-// {
-//   "user_id": "...",
-//   "display_name": "John Doe"
-// }
-
-

Example of customizing JSON property names when serializing UUIDs.

-
- -
-

Nullable UUID Properties

-
-
public class Document
-{
-    public UUID Id { get; set; }
-    public UUID? ParentId { get; set; }    // Nullable UUID
-    public string Title { get; set; }
-}
-
-var document = new Document 
-{ 
-    Id = UUID.New(),
-    ParentId = null,        // This will be serialized as null
-    Title = "My Document"
-};
-
-// System.Text.Json
-string json = JsonSerializer.Serialize(document, options);
-Document deserializedDoc = JsonSerializer.Deserialize(json, options);
-
-// Newtonsoft.Json
-string json = JsonConvert.SerializeObject(document, settings);
-Document deserializedDoc = JsonConvert.DeserializeObject(json, settings);
-
-

Example of working with nullable UUID properties in models.

-
-
- -
-

Best Practices

- -
-

Global Serializer Configuration

-
-
// System.Text.Json in ASP.NET Core
-public void ConfigureServices(IServiceCollection services)
-{
-    services.AddControllers()
-            .AddJsonOptions(options =>
-            {
-                options.JsonSerializerOptions.Converters.Add(new UUIDConverter());
-            });
-}
-
-// Newtonsoft.Json in ASP.NET Core
-public void ConfigureServices(IServiceCollection services)
-{
-    services.AddControllers()
-            .AddNewtonsoftJson(options =>
-            {
-                options.SerializerSettings.Converters.Add(new UUIDConverter());
-            });
-
-

Example of configuring UUID serialization globally in an ASP.NET Core application.

-
- -
-

Custom Serialization Format

-
-
public class CustomUUIDConverter : JsonConverter
-{
-    public override UUID Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
-    {
-        string value = reader.GetString();
-        return value != null ? UUID.Parse($"prefix_{value}") : default;
-    }
-
-    public override void Write(Utf8JsonWriter writer, UUID value, JsonSerializerOptions options)
-    {
-        writer.WriteStringValue($"prefix_{value}");
-    }
-}
-
-

Example of implementing a custom UUID converter with a specific format.

-
-
- -
-

Error Handling Examples

- -
-

System.Text.Json Error Handling

-
-
try
-{
-    // Invalid JSON string
-    string invalidJson = "\"invalid-uuid-format\"";
-    
-    // This will throw an exception
-    UUID uuid = JsonSerializer.Deserialize(invalidJson, options);
-}
-catch (JsonException ex)
-{
-    Console.WriteLine($"Failed to deserialize UUID: {ex.Message}");
-}
-
-

Example of handling invalid UUID deserialization with System.Text.Json.

-
- -
-

Newtonsoft.Json Error Handling

-
-
try
-{
-    // Invalid JSON string
-    string invalidJson = "\"invalid-uuid-format\"";
-    
-    // This will throw an exception
-    UUID uuid = JsonConvert.DeserializeObject(invalidJson, settings);
-}
-catch (JsonReaderException ex)
-{
-    Console.WriteLine($"Failed to deserialize UUID: {ex.Message}");
-}
-
-

Example of handling invalid UUID deserialization with Newtonsoft.Json.

-
-
-
- - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.pages/index.html b/.pages/index.html deleted file mode 100644 index b561a7b..0000000 --- a/.pages/index.html +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - UUID - Modern .NET UUID Generator - - - - - - - - - - - -
-
-

Modern UUID Generator for .NET

-

High-performance, secure, and thread-safe UUID implementation

- -
- -
-

Features

-
-
- -

High Performance

-

Optimized for speed with zero-allocation operations

-
-
- -

Secure by Default

-

Cryptographically secure random number generation

-
-
- -

Thread Safe

-

Safe for concurrent operations in multi-threaded environments

-
-
- -

Memory Efficient

-

Zero-allocation options for high-throughput scenarios

-
-
- -

UUIDv7 Support

-

Time-ordered, monotonic UUIDs with enhanced uniqueness

-
-
- -

Bulk UUID Generation

-

Efficiently generate large arrays of UUIDs with minimal overhead

-
-
-
- -
-

Quick Start

-
-
// Install via NuGet
-dotnet add package UUID
-
-// Generate a new UUID
-var id = new UUID();
-
-// Convert to string
-string str = id.ToString();
-
-// Parse from string
-UUID parsed = UUID.Parse("0123456789abcdef0123456789abcdef");
-
-// Bulk UUID Generation
-UUID[] uuids = new UUID[1000];
-uuids.Fill();  // Efficiently fills array with new UUIDs
-
-// Generate with error handling
-if (UUID.TryGenerate(1000, out UUID[]? result))
-{
-    // Use the generated UUIDs
-    foreach (var uuid in result)
-    {
-        Console.WriteLine(uuid);
-    }
-}
-
-
- -
-

Performance Benchmarks

-
-
-

Single Thread

-

20.5M

-

UUIDs/second

-
-
-

4 Threads

-

78.2M

-

UUIDs/second

-
-
-

8 Threads

-

152.3M

-

UUIDs/second

-
-
-

16 Threads

-

289.8M

-

UUIDs/second

-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.pages/package.json b/.pages/package.json new file mode 100644 index 0000000..91a30b1 --- /dev/null +++ b/.pages/package.json @@ -0,0 +1,34 @@ +{ + "name": "uuid-docs-vue", + "version": "0.1.0", + "private": true, + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build", + "lint": "vue-cli-service lint" + }, + "dependencies": { + "core-js": "^3.8.3", + "vue": "^3.2.13", + "vue-router": "^4.0.3", + "prismjs": "^1.24.1", + "@fortawesome/fontawesome-free": "^6.0.0" + }, + "devDependencies": { + "@babel/core": "^7.12.16", + "@babel/eslint-parser": "^7.12.16", + "@vue/cli-plugin-babel": "~5.0.0", + "@vue/cli-plugin-eslint": "~5.0.0", + "@vue/cli-plugin-router": "~5.0.0", + "@vue/cli-service": "~5.0.0", + "eslint": "^7.32.0", + "eslint-plugin-vue": "^8.0.3", + "babel-eslint": "^10.1.0" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not dead", + "not ie 11" + ] +} diff --git a/.pages/favicon.ico b/.pages/public/favicon.ico similarity index 100% rename from .pages/favicon.ico rename to .pages/public/favicon.ico diff --git a/.pages/public/index.html b/.pages/public/index.html new file mode 100644 index 0000000..9b70f73 --- /dev/null +++ b/.pages/public/index.html @@ -0,0 +1,45 @@ + + + + + + + + UUID - Modern .NET UUID Generator + + + +
+ + + + + + + + + + + diff --git a/.pages/src/App.vue b/.pages/src/App.vue new file mode 100644 index 0000000..bfa9f8f --- /dev/null +++ b/.pages/src/App.vue @@ -0,0 +1,239 @@ + + + + + \ No newline at end of file diff --git a/.pages/src/assets/css/style.css b/.pages/src/assets/css/style.css new file mode 100644 index 0000000..24f811e --- /dev/null +++ b/.pages/src/assets/css/style.css @@ -0,0 +1,195 @@ +:root { + --bg-primary: #1a1a1a; + --bg-secondary: #252525; + --bg-tertiary: #2d2d2d; + --text-primary: #ffffff; + --text-secondary: #b3b3b3; + --accent-primary: #3498db; + --accent-secondary: #2980b9; + --sidebar-width: 280px; + --background-primary: #252525; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + background-color: var(--bg-primary); + color: var(--text-primary); + line-height: 1.6; +} + +.sidebar { + position: fixed; + width: var(--sidebar-width); + height: 100vh; + background-color: var(--bg-secondary); + padding: 2rem; + overflow-y: auto; + transition: transform 0.3s ease; +} + +.sidebar.active { + transform: translateX(0); +} + +@media (max-width: 768px) { + .sidebar { + transform: translateX(-100%); + } +} + +.menu-toggle { + position: fixed; + top: 1rem; + left: 1rem; + z-index: 1000; + background: var(--bg-secondary); + border: none; + color: var(--text-primary); + padding: 0.5rem; + border-radius: 4px; + cursor: pointer; + display: none; +} + +@media (max-width: 768px) { + .menu-toggle { + display: block; + } +} + +.content { + margin-left: var(--sidebar-width); + padding: 2rem; +} + +@media (max-width: 768px) { + .content { + margin-left: 0; + } +} + +.hero { + text-align: center; + padding: 4rem 0; +} + +.hero h1 { + font-size: 3rem; + margin-bottom: 1rem; +} + +.hero p { + font-size: 1.25rem; + color: var(--text-secondary); + margin-bottom: 2rem; +} + +.cta-buttons { + display: flex; + justify-content: center; + gap: 1rem; +} + +.btn { + display: inline-block; + padding: 0.75rem 1.5rem; + border-radius: 8px; + text-decoration: none; + font-weight: 600; + transition: all 0.3s ease; +} + +.btn.primary { + background-color: var(--accent-primary); + color: white; +} + +.btn.secondary { + border: 2px solid var(--accent-primary); + color: var(--accent-primary); +} + +.btn:hover { + transform: translateY(-2px); +} + +.features { + padding: 4rem 0; +} + +.feature-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 2rem; + margin-top: 2rem; +} + +.feature-card { + background-color: var(--bg-secondary); + padding: 2rem; + border-radius: 8px; + text-align: center; +} + +.feature-card i { + font-size: 2.5rem; + color: var(--accent-primary); + margin-bottom: 1rem; +} + +.code-example { + padding: 4rem 0; +} + +.code-block { + background-color: var(--bg-secondary); + border-radius: 8px; + padding: 1rem; + position: relative; + margin-top: 2rem; +} + +.code-block pre { + margin: 0; + padding: 1rem; +} + +.code-block code { + font-family: 'Fira Code', 'Consolas', monospace; + font-size: 14px; +} + +.benchmarks { + padding: 4rem 0; +} + +.benchmark-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 2rem; + margin-top: 2rem; +} + +.benchmark-card { + background-color: var(--bg-secondary); + padding: 2rem; + border-radius: 8px; + text-align: center; +} + +.benchmark-card .number { + font-size: 2.5rem; + font-weight: bold; + color: var(--accent-primary); + margin: 1rem 0; +} + +.benchmark-card .label { + color: var(--text-secondary); +} diff --git a/.pages/assets/img/Logo.png b/.pages/src/assets/img/Logo.png similarity index 100% rename from .pages/assets/img/Logo.png rename to .pages/src/assets/img/Logo.png diff --git a/.pages/assets/img/Logo.svg b/.pages/src/assets/img/Logo.svg similarity index 100% rename from .pages/assets/img/Logo.svg rename to .pages/src/assets/img/Logo.svg diff --git a/.pages/src/components/CodeBlock.vue b/.pages/src/components/CodeBlock.vue new file mode 100644 index 0000000..0f73ea4 --- /dev/null +++ b/.pages/src/components/CodeBlock.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/.pages/src/components/Sidebar.vue b/.pages/src/components/Sidebar.vue new file mode 100644 index 0000000..1c64264 --- /dev/null +++ b/.pages/src/components/Sidebar.vue @@ -0,0 +1,261 @@ + + + + + diff --git a/.pages/src/main.js b/.pages/src/main.js new file mode 100644 index 0000000..abab1c3 --- /dev/null +++ b/.pages/src/main.js @@ -0,0 +1,9 @@ +import { createApp } from 'vue' +import App from './App.vue' +import router from './router' +import '@fortawesome/fontawesome-free/css/all.min.css' +import 'prismjs/themes/prism-tomorrow.css' + +const app = createApp(App) +app.use(router) +app.mount('#app') \ No newline at end of file diff --git a/.pages/src/router/index.js b/.pages/src/router/index.js new file mode 100644 index 0000000..a1b94bf --- /dev/null +++ b/.pages/src/router/index.js @@ -0,0 +1,89 @@ +import { createRouter, createWebHistory } from 'vue-router' +import Home from '../views/Home.vue' + +const routes = [ + { + path: '/', + name: 'Home', + component: Home, + meta: { + title: 'UUID - Modern .NET UUID Implementation' + } + }, + { + path: '/getting-started', + name: 'GettingStarted', + component: () => import('../views/GettingStarted.vue'), + meta: { + title: 'Getting Started - UUID Documentation' + } + }, + { + path: '/api-reference', + name: 'ApiReference', + component: () => import('../views/ApiReference.vue'), + meta: { + title: 'API Reference - UUID Documentation' + } + }, + { + path: '/examples', + name: 'Examples', + component: () => import('../views/Examples.vue'), + meta: { + title: 'Examples - UUID Documentation' + } + }, + { + path: '/serialization', + name: 'Serialization', + component: () => import('../views/Serialization.vue'), + meta: { + title: 'Serialization - UUID Documentation' + } + }, + { + path: '/performance', + name: 'Performance', + component: () => import('../views/Performance.vue'), + meta: { + title: 'Performance - UUID Documentation' + } + }, + { + path: '/security', + name: 'Security', + component: () => import('../views/Security.vue'), + meta: { + title: 'Security - UUID Documentation' + } + }, + { + path: '/migration', + name: 'Migration', + component: () => import('../views/Migration.vue'), + meta: { + title: 'Migration Guide - UUID Documentation' + } + }, + { + path: '/faq', + name: 'FAQ', + component: () => import('../views/FAQ.vue'), + meta: { + title: 'FAQ - UUID Documentation' + } + } +] + +const router = createRouter({ + history: createWebHistory(process.env.BASE_URL), + routes +}) + +router.beforeEach((to, from, next) => { + document.title = to.meta.title || 'UUID Documentation' + next() +}) + +export default router diff --git a/.pages/src/views/ApiReference.vue b/.pages/src/views/ApiReference.vue new file mode 100644 index 0000000..8b3add0 --- /dev/null +++ b/.pages/src/views/ApiReference.vue @@ -0,0 +1,520 @@ + + + + + diff --git a/.pages/src/views/Examples.vue b/.pages/src/views/Examples.vue new file mode 100644 index 0000000..59e53b7 --- /dev/null +++ b/.pages/src/views/Examples.vue @@ -0,0 +1,483 @@ + + + + + diff --git a/.pages/src/views/FAQ.vue b/.pages/src/views/FAQ.vue new file mode 100644 index 0000000..5c11d26 --- /dev/null +++ b/.pages/src/views/FAQ.vue @@ -0,0 +1,459 @@ + + + + + diff --git a/.pages/src/views/GettingStarted.vue b/.pages/src/views/GettingStarted.vue new file mode 100644 index 0000000..9b543d3 --- /dev/null +++ b/.pages/src/views/GettingStarted.vue @@ -0,0 +1,495 @@ + + + + + diff --git a/.pages/src/views/Home.vue b/.pages/src/views/Home.vue new file mode 100644 index 0000000..a3ef42f --- /dev/null +++ b/.pages/src/views/Home.vue @@ -0,0 +1,427 @@ + + + + + diff --git a/.pages/src/views/Migration.vue b/.pages/src/views/Migration.vue new file mode 100644 index 0000000..2e603ec --- /dev/null +++ b/.pages/src/views/Migration.vue @@ -0,0 +1,389 @@ + + + + + diff --git a/.pages/src/views/Performance.vue b/.pages/src/views/Performance.vue new file mode 100644 index 0000000..6ff5196 --- /dev/null +++ b/.pages/src/views/Performance.vue @@ -0,0 +1,608 @@ + + + + + diff --git a/.pages/src/views/Security.vue b/.pages/src/views/Security.vue new file mode 100644 index 0000000..be1a4a2 --- /dev/null +++ b/.pages/src/views/Security.vue @@ -0,0 +1,398 @@ + + + + + diff --git a/.pages/src/views/Serialization.vue b/.pages/src/views/Serialization.vue new file mode 100644 index 0000000..cbb47ca --- /dev/null +++ b/.pages/src/views/Serialization.vue @@ -0,0 +1,561 @@ + + + + + diff --git a/.pages/vue.config.js b/.pages/vue.config.js new file mode 100644 index 0000000..24dd39a --- /dev/null +++ b/.pages/vue.config.js @@ -0,0 +1,6 @@ +const { defineConfig } = require('@vue/cli-service') + +module.exports = defineConfig({ + transpileDependencies: true, + lintOnSave: false // ESLint hataları için build'i engellemeyecek +})