livecodes
Version:
A Code Playground That Just Works!
230 lines (180 loc) • 6.09 kB
Markdown
---
name: livecodes/import-export
description: >
Import code from GitHub gists/files/repos, GitLab, URLs, DOM, and local files.
Export projects as HTML, JSON, ZIP, or to external services. Load this skill
when loading projects from external sources or exporting project state.
type: core
library: livecodes
library_version: 0.13.0
sources:
- live-codes/livecodes:docs/docs/features/import.mdx
- live-codes/livecodes:docs/docs/features/export.mdx
---
# LiveCodes — Import and Export Code
LiveCodes imports code from external sources and exports projects in multiple formats.
## Setup
```javascript
import { createPlayground, getPlaygroundUrl } from 'livecodes';
// Import from URL
const playground = await createPlayground('#container', {
import: 'https://github.com/user/repo/blob/main/src/index.js',
});
// Import from URL via query param
// https://livecodes.io/?x=https://github.com/user/repo
// Export to shareable URL
const shareUrl = await playground.getShareUrl();
const shortUrl = await playground.getShareUrl(true);
```
## Core Patterns
### Import from GitHub
```javascript
// GitHub file
createPlayground('#container', {
import: 'https://github.com/lodash/lodash/blob/master/isObject.js',
});
// GitHub directory
createPlayground('#container', {
import: 'https://github.com/user/repo/tree/main/src',
});
// GitHub gist
createPlayground('#container', {
import: 'https://gist.github.com/abc123',
});
// Specify files from multi-file source
createPlayground('#container', {
import: 'https://github.com/user/repo/tree/main/src',
params: { files: 'App.tsx,styles.css,index.html' },
});
```
### Import from GitLab
```javascript
// GitLab snippet
createPlayground('#container', {
import: 'https://gitlab.com/-/snippets/12345',
});
// GitLab file
createPlayground('#container', {
import: 'https://gitlab.com/user/repo/-/blob/main/src/index.js',
});
```
### Import from URL
```javascript
// Raw code URL
createPlayground('#container', {
import: 'https://example.com/code.js',
});
// URL with language specified
createPlayground('#container', {
params: {
x: 'https://example.com/code',
lang: 'typescript', // Force language
},
});
// Import from Vue/TypeScript playgrounds
createPlayground('#container', {
import: 'https://play.vuejs.org/#...',
});
```
### Import from shared project
```javascript
// Short URL
createPlayground('#container', {
import: 'id/abc123', // Shared project ID
});
// Compressed config
createPlayground('#container', {
import: 'code/...', // Compressed base64 config
});
// Via URL
// https://livecodes.io/?x=id/abc123
// https://livecodes.io/?x=code/...
```
### Import from DOM
```javascript
// HTML page with code blocks
createPlayground('#container', {
import: 'https://example.com/blog-post',
});
// HTML must use specific structure:
// <code class="livecodes">
// <pre data-lang="html">...</pre>
// <pre data-lang="css">...</pre>
// <pre data-lang="javascript">...</pre>
// </code>
```
### Import via SDK config
```javascript
// Set config with code
await playground.setConfig({
markup: { language: 'html', content: '<h1>Hello</h1>' },
style: { language: 'css', content: 'h1 { color: blue; }' },
script: { language: 'javascript', content: 'console.log("hi")' },
});
// Set config from URL
await playground.setConfig('https://example.com/config.json');
```
### Specify files from multi-file sources
```javascript
// When importing directory or gist with multiple files
createPlayground('#container', {
import: 'https://github.com/user/repo/tree/main/src',
params: {
files: 'Counter.tsx,counter.css,index.html',
active: 'script', // Which editor to show: 'markup', 'style', 'script', or 0, 1, 2
},
});
```
### Export via SDK
```javascript
const playground = await createPlayground('#container', {
/* ... */
});
// Get share URL
const longUrl = await playground.getShareUrl(); // Long URL with compressed config
const shortUrl = await playground.getShareUrl(true); // Short URL
// Get config to save/export
const config = await playground.getConfig();
```
### Export via URL
```
# Long URL (compressed config)
https://livecodes.io/#config/...
# Short URL
https://livecodes.io/?x=id/abc123
```
## Common Import Sources
| Source | URL Pattern | Notes |
| --------------------- | --------------------------------- | ---------------------- |
| GitHub file | `github.com/user/repo/blob/...` | Single file |
| GitHub directory | `github.com/user/repo/tree/...` | Multiple files |
| GitHub gist | `gist.github.com/...` | Multi-file gists work |
| GitLab file | `gitlab.com/user/repo/-/blob/...` | Single file |
| GitLab snippet | `gitlab.com/-/snippets/...` | Snippet |
| JS Bin | `jsbin.com/...` | JS Bin embeds |
| Vue Playground | `play.vuejs.org/#...` | Vue SFC playground |
| TypeScript Playground | `typescriptlang.org/play#...` | TS playground |
| Raw URL | Any URL | Language auto-detected |
| Local files | Drag & drop | Standalone app only |
## File Selection Priority
When importing multiple files, LiveCodes prioritizes:
1. Files named `index.*`, `default.*` (markup)
2. Files named `style.*`, `styles.*` (style)
3. Files named `script.*`, `app.*`, `main.*`, `index.*` (script)
4. README and markdown files get lower priority
5. Use `files` parameter to explicitly select files
## SDK Import Methods
```javascript
// Option 1: EmbedOptions.import
createPlayground('#container', {
import: 'https://github.com/user/repo',
});
// Option 2: Query param x
createPlayground('#container', {
params: { x: 'https://github.com/user/repo' },
});
// Option 3: URL
// https://livecodes.io/?x=https://github.com/user/repo
// Option 4: setConfig with URL
await playground.setConfig('https://example.com/config.json');
```