{"_id":"@eldrin-project/eldrin-app-svelte","name":"@eldrin-project/eldrin-app-svelte","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"name":"@eldrin-project/eldrin-app-svelte","version":"0.0.2","description":"Svelte adapter for Eldrin apps providing single-spa lifecycle and database stores","publishConfig":{"access":"public"},"type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"svelte":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit","lint":"eslint src"},"keywords":["eldrin","svelte","single-spa","cloudflare","d1"],"author":{"name":"Eldrin Team"},"license":"MIT","peerDependencies":{"svelte":"^4.0.0 || ^5.0.0"},"dependencies":{"@eldrin-project/eldrin-app-core":"^0.0.5","single-spa-svelte":"^2.1.0"},"devDependencies":{"@cloudflare/workers-types":"^4.20251216.0","@types/node":"^22.0.0","svelte":"^5.0.0","tsup":"^8.0.0","typescript":"^5.8.0"},"engines":{"node":">=18.0.0"},"_id":"@eldrin-project/eldrin-app-svelte@0.0.2","gitHead":"94801ba0f8db683f14d550cc4f11ce36c2798856","_nodeVersion":"22.14.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-TO5BBu1ngbCm4geS6LvAYlOoaXAuSzs3m+Lwc43JAoqOTjJo7jnPDSnO7uzWfzX71o7lpr2KsX5cGIjrLAphlg==","shasum":"d8cdbb95ce939019000fc887fe60f4ddc1feb37d","tarball":"https://registry.npmjs.org/@eldrin-project/eldrin-app-svelte/-/eldrin-app-svelte-0.0.2.tgz","fileCount":8,"unpackedSize":58906,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDsWN6yQb8b5NDJ5CmouN0WRxIJSQSb/gIk9pH4etG9dgIgd99j8/bc+mX2oaqTODhgj1xAnSLYRKbLyDd3Cvo+rT8="}]},"_npmUser":{"name":"tiborkiray","email":"tibor.kiray@gmail.com"},"directories":{},"maintainers":[{"name":"tiborkiray","email":"tibor.kiray@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/eldrin-app-svelte_0.0.2_1767432804793_0.4990179820876255"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-03T09:33:24.714Z","0.0.2":"2026-01-03T09:33:24.971Z","modified":"2026-01-03T09:33:25.272Z"},"maintainers":[{"name":"tiborkiray","email":"tibor.kiray@gmail.com"}],"description":"Svelte adapter for Eldrin apps providing single-spa lifecycle and database stores","keywords":["eldrin","svelte","single-spa","cloudflare","d1"],"author":{"name":"Eldrin Team"},"license":"MIT","readme":"# @eldrin-project/eldrin-app-svelte\n\nSvelte adapter for building Eldrin marketplace apps with single-spa micro-frontend architecture and Cloudflare D1 database support.\n\n## Overview\n\nThis package is the **Svelte adapter layer** in the Eldrin ecosystem:\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│                     Your Svelte App                         │\n├─────────────────────────────────────────────────────────────┤\n│              @eldrin-project/eldrin-app-svelte              │\n│  • single-spa lifecycle management                          │\n│  • Svelte stores for database access                        │\n│  • Shell communication (auth, user context)                 │\n├─────────────────────────────────────────────────────────────┤\n│              @eldrin-project/eldrin-app-core                │\n│  • Database migrations with checksum verification           │\n│  • Auth utilities (JWT, permissions)                        │\n│  • Event communication                                      │\n├─────────────────────────────────────────────────────────────┤\n│                    Eldrin Shell                             │\n│  • Micro-frontend orchestration                             │\n│  • User authentication                                      │\n│  • D1 database provisioning                                 │\n└─────────────────────────────────────────────────────────────┘\n```\n\n## Installation\n\n```bash\nnpm install @eldrin-project/eldrin-app-svelte\n```\n\n**Peer dependencies:**\n- `svelte` ^4.0.0 || ^5.0.0\n\n## Quick Start\n\n### 1. Set up single-spa entry point (`main.ts`)\n\n```ts\nimport { createApp } from '@eldrin-project/eldrin-app-svelte';\nimport App from './App.svelte';\nimport migrations from './migrations';\n\nexport const { bootstrap, mount, unmount } = createApp({\n  name: 'my-svelte-app',\n  root: App,\n  migrations,\n  onMigrationsComplete: (result) => {\n    console.log(`Executed ${result.executed} migrations`);\n  },\n});\n```\n\n### 2. Use stores in components\n\n```svelte\n<script>\n  import {\n    database,\n    migrationsComplete,\n    getAuthHeaders,\n    getEldrinGlobal,\n  } from '@eldrin-project/eldrin-app-svelte';\n\n  let items = [];\n\n  $: if ($migrationsComplete && $database) {\n    loadItems();\n  }\n\n  async function loadItems() {\n    // Option 1: Direct D1 query\n    const result = await $database.prepare('SELECT * FROM items').all();\n    items = result.results;\n\n    // Option 2: API call with auth\n    const response = await fetch('/api/items', {\n      headers: getAuthHeaders(),\n    });\n    items = await response.json();\n  }\n\n  const eldrin = getEldrinGlobal();\n</script>\n\n{#if $migrationsComplete}\n  <p>Welcome, {eldrin?.user?.name}</p>\n  <ul>\n    {#each items as item}\n      <li>{item.name}</li>\n    {/each}\n  </ul>\n{:else}\n  <p>Loading...</p>\n{/if}\n```\n\n## API Reference\n\n### Lifecycle Functions\n\n#### `createApp(options: CreateAppOptions): AppLifecycle`\n\nCreates a single-spa compatible Svelte app with Eldrin integration.\n\n```ts\ninterface CreateAppOptions {\n  name: string;                                      // App name (for logging)\n  root: ComponentType<SvelteComponent>;              // Root Svelte component\n  migrations?: MigrationFile[];                      // SQL migrations to run\n  onMigrationsComplete?: (result: MigrationResult) => void;\n  onMigrationError?: (error: Error) => void;\n  domElementGetter?: () => HTMLElement;              // Custom DOM element getter\n}\n```\n\n#### `combineLifecycles(eldrinLifecycle, svelteLifecycle): AppLifecycle`\n\nCombines Eldrin lifecycle with another single-spa lifecycle. Useful for advanced scenarios.\n\n```ts\nimport { createApp, combineLifecycles } from '@eldrin-project/eldrin-app-svelte';\nimport singleSpaSvelte from 'single-spa-svelte';\n\nconst eldrinLifecycle = createApp({ name: 'my-app', root: App, migrations });\nconst customLifecycle = singleSpaSvelte({ /* custom config */ });\n\nexport const { bootstrap, mount, unmount } = combineLifecycles(\n  eldrinLifecycle,\n  customLifecycle\n);\n```\n\n### Stores\n\n| Store | Type | Description |\n|-------|------|-------------|\n| `database` | `Readable<D1Database \\| null>` | D1 database instance |\n| `migrationsComplete` | `Readable<boolean>` | Migration completion status |\n| `migrationResult` | `Readable<MigrationResult \\| null>` | Migration result details |\n| `authHeaders` | `Readable<Record<string, string>>` | Auth headers for API calls |\n| `databaseContextStore` | `Writable<DatabaseContext>` | Internal context store |\n\n### Helper Functions\n\n#### `getEldrinGlobal(): EldrinGlobal | null`\n\nGet the shell context directly.\n\n```ts\nimport { getEldrinGlobal } from '@eldrin-project/eldrin-app-svelte';\n\nconst eldrin = getEldrinGlobal();\nconst user = eldrin?.user;\n```\n\n#### `getAuthHeaders(): Record<string, string>`\n\nGet auth headers for API calls.\n\n```ts\nimport { getAuthHeaders } from '@eldrin-project/eldrin-app-svelte';\n\nconst response = await fetch('/api/items', {\n  headers: getAuthHeaders(),\n});\n```\n\n### Types\n\n```ts\n// Global context exposed by the Eldrin shell\ninterface EldrinGlobal {\n  getAuthHeaders?: () => Record<string, string>;\n  user?: {\n    id: string;\n    email: string;\n    name?: string;\n  };\n}\n\n// Database context with migration status\ninterface DatabaseContext {\n  db: D1Database | null;\n  migrationsComplete: boolean;\n  migrationResult: MigrationResult | null;\n}\n\n// Single-spa lifecycle props\ninterface LifecycleProps {\n  name: string;\n  singleSpa: unknown;\n  mountParcel: unknown;\n  db?: D1Database;\n  manifest?: { baseUrl?: string; [key: string]: unknown };\n}\n```\n\n## Migration System\n\nMigrations run automatically during the single-spa bootstrap phase, before your Svelte app mounts.\n\n```ts\n// migrations.ts (auto-generated by Vite plugin)\nimport type { MigrationFile } from '@eldrin-project/eldrin-app-core';\n\nconst migrations: MigrationFile[] = [\n  {\n    name: '20240101120000-create-items.sql',\n    content: 'CREATE TABLE IF NOT EXISTS items (id TEXT PRIMARY KEY, name TEXT);',\n  },\n];\n\nexport default migrations;\n```\n\nMigrations are tracked in `_eldrin_migrations` table with SHA-256 checksums.\n\n## Shell Integration\n\nThe Eldrin shell provides:\n\n- **Authentication**: Access via `getAuthHeaders()` or `authHeaders` store\n- **User context**: Current user via `getEldrinGlobal()?.user`\n- **Database**: D1 instance available through `database` store\n\n## Svelte 5 Runes (Preview)\n\nFor Svelte 5 with runes:\n\n```svelte\n<script>\n  import { database, migrationsComplete, getAuthHeaders } from '@eldrin-project/eldrin-app-svelte';\n\n  let items = $state([]);\n\n  $effect(() => {\n    if ($migrationsComplete && $database) {\n      loadItems();\n    }\n  });\n\n  async function loadItems() {\n    const result = await $database.prepare('SELECT * FROM items').all();\n    items = result.results;\n  }\n</script>\n```\n\n## Related Packages\n\n- [`@eldrin-project/eldrin-app-core`](https://www.npmjs.com/package/@eldrin-project/eldrin-app-core) - Core library\n- [`@eldrin-project/eldrin-app-angular`](https://www.npmjs.com/package/@eldrin-project/eldrin-app-angular) - Angular adapter\n- [`@eldrin-project/eldrin-app-react`](https://www.npmjs.com/package/@eldrin-project/eldrin-app-react) - React adapter\n- [`@eldrin-project/eldrin-app-vue`](https://www.npmjs.com/package/@eldrin-project/eldrin-app-vue) - Vue adapter\n- [`create-eldrin-project`](https://www.npmjs.com/package/create-eldrin-project) - Project scaffolding CLI\n\n## License\n\nMIT\n","readmeFilename":"README.md","_rev":"1-0f53a2ee00eda5d7f7e8af6495ead375"}