# @cryptoguard/manifest-astro

Astro integration for CryptoGuard manifest generation. Automatically generates a manifest file mapping your Astro build output to served URL paths for binary transparency verification.

## Installation

```bash
pnpm add @cryptoguard/manifest-astro
```

## Usage

Add the integration to your `astro.config.mjs`:

```javascript
import { defineConfig } from 'astro/config';
import node from '@astrojs/node';
import { cryptoGuardManifest } from '@cryptoguard/manifest-astro';

export default defineConfig({
  output: 'server',
  adapter: node({ mode: 'standalone' }),
  integrations: [cryptoGuardManifest()]
});
```

## Configuration

### With Astro Config

Pass your Astro configuration to the integration:

```javascript
import { defineConfig } from 'astro/config';
import node from '@astrojs/node';
import { cryptoGuardManifest } from '@cryptoguard/manifest-astro';

const astroConfig = {
  base: '/docs'
};

export default defineConfig({
  base: astroConfig.base,
  output: 'server',
  adapter: node({ mode: 'standalone' }),
  integrations: [cryptoGuardManifest(astroConfig)]
});
```

### Integration Options

```javascript
cryptoGuardManifest(astroConfig, {
  verbose: true,   // Enable detailed logging
  disabled: false, // Disable manifest generation
  projectRoot: process.cwd() // Project root directory
})
```

### Environment Variables

You can use environment variables for dynamic configuration:

```javascript
const astroConfig = {
  base: process.env.PUBLIC_BASE_PATH || ''
};

export default defineConfig({
  base: astroConfig.base,
  output: 'server',
  adapter: node({ mode: 'standalone' }),
  integrations: [
    cryptoGuardManifest(astroConfig, {
      verbose: process.env.MANIFEST_VERBOSE === 'true',
      disabled: process.env.MANIFEST_DISABLED === 'true'
    })
  ]
});
```

## Generated Manifest

The integration generates a `manifest.json` file in your project root:

```json
{
  "version": "1.0",
  "framework": "astro",
  "frameworkVersion": "5.0.0",
  "sources": [
    {
      "dir": "dist/client",
      "serveAt": "/"
    }
  ]
}
```

### With Base Path

When using `base` configuration:

```json
{
  "version": "1.0",
  "framework": "astro",
  "frameworkVersion": "5.0.0",
  "sources": [
    {
      "dir": "dist/client",
      "serveAt": "/docs"
    }
  ]
}
```

## How It Works

1. **Build Hook**: Runs after Astro build completes (`astro:build:done`)
2. **Path Detection**: Extracts `base` and `outDir` from your config
3. **Manifest Generation**: Maps `dist/client/` to the appropriate serve path
4. **Smart Updates**: Only updates manifest.json when content changes
5. **Validation**: Ensures manifest security (no path traversal, proper structure)

## Astro Build Output Structure

Astro generates:
- `dist/client/` - Static client assets and application code
- `dist/client/_astro/` - Framework assets (chunks, CSS, etc.)
- `dist/server/` - Server-side rendering code (not served to clients)

The integration maps the `dist/client/` directory to your configured base path, as Astro serves all client assets (including `_astro/`) from this location.

## License

MIT
