livecodes
Version:
A Code Playground That Just Works!
269 lines (197 loc) • 7.3 kB
Markdown
name: livecodes/gh-action
description: >
Use the "Preview in LiveCodes" GitHub Action to generate preview playground links
for pull request code changes. Automates playground creation and PR comments.
type: composition
library: livecodes
library_version: 0.13.0
requires: []
sources:
- live-codes/preview-in-livecodes:README.md
- live-codes/livecodes:docs/docs/gh-action.mdx
# LiveCodes — GitHub Action: Preview in LiveCodes
The [Preview in LiveCodes](https://github.com/live-codes/preview-in-livecodes) GitHub Action generates preview links to LiveCodes playgrounds for code changes in pull requests and posts them as PR comments.
**Use case:** Library authors can preview changes in the playground before merging PRs.
## How It Works
1. PR is created or updated
2. Action optionally installs dependencies and builds the project
3. Action scans `.livecodes/` folder for playground configurations
4. Generates playground URLs with your new code
5. Posts comment with preview links to the PR
## Setup
### Two Required Workflow Files
The action requires two workflow files that must be merged to the default branch first.
**1. Trigger workflow `.github/workflows/livecodes-preview.yml`:**
```yaml
name: livecodes
on: [pull_request]
jobs:
build_and_prepare:
runs-on: ubuntu-latest
name: Generate Playgrounds
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Build and generate
uses: live-codes/preview-in-livecodes@v1
with:
# Optional: install-command: "npm install"
# Optional: build-command: "npm run build"
# Optional: base-url: "https://{{LC::REF}}.my-project.pages.dev"
```
**2. Comment workflow `.github/workflows/livecodes-post-comment.yml`:**
```yaml
name: comment
on:
workflow_run:
workflows: ['livecodes']
types:
- completed
jobs:
upload:
runs-on: ubuntu-latest
permissions:
pull-requests: write
if: >
github.event.workflow_run.event == 'pull_request' &&
github.event.workflow_run.conclusion == 'success'
steps:
- uses: live-codes/pr-comment-from-artifact@v1
with:
GITHUB_TOKEN: ${{ github.token }}
```
Two separate workflows are needed because each runs in a different security context. See [GitHub security article](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/) for details.
## Action Inputs
| Input | Required | Description |
| ----------------- | -------- | ------------------------------------------------------ |
| `install-command` | No | Install command (e.g., `npm install`) |
| `build-command` | No | Build command (e.g., `npm run build`) |
| `base-url` | No | Base URL for deployed assets. Supports dynamic values. |
| `artifact` | No | Artifact name (default: `pr`) |
| `GITHUB_TOKEN` | No | GitHub token (default: `${{ github.token }}`) |
## Action Outputs
| Output | Description |
| --------- | -------------------------------------------------- |
| `message` | Markdown message with preview links for PR comment |
## Configure Playgrounds
Create JSON files in `.livecodes/` folder. Each file becomes a playground link.
### Example Configure Project JSON
**`.livecodes/hello-world.json`:**
```json
{
"title": "JavaScript Starter",
"markup": {
"language": "html",
"content": "<h1>Hello, World!</h1>"
},
"script": {
"language": "javascript",
"content": "import { demo } from 'my-lib';\n\ndemo();"
},
"imports": {
"my-lib": "{{LC::TO_DATA_URL(./index.js)}}"
}
}
```
The `title` property becomes the playground name in the message. If omitted, filename is used.
## Dynamic Values
Use these placeholders in project JSON and `base-url`:
| Placeholder | Description |
| ------------------- | ------------------------------ |
| `{{LC::REF}}` | Branch or tag name of PR head |
| `{{LC::SHA}}` | Full commit SHA |
| `{{LC::SHORT_SHA}}` | Short SHA (first 7 characters) |
| `{{LC::PR}}` | Pull request number |
| `{{LC::REPO}}` | Repository name |
### File Placeholders (project JSON only)
| Placeholder | Description |
| -------------------------------- | -------------------------------------------- |
| `{{LC::TO_URL(./file.js)}}` | URL of file with `base-url` prepended |
| `{{LC::TO_DATA_URL(./file.js)}}` | File converted to data URL (for small files) |
## Using Newly Added Code in Playgrounds
Three strategies to make PR code available to playgrounds:
### 1. Deploy to Preview URL (Recommended)
Use Cloudflare Pages or Netlify for automatic preview deployments.
```yaml
# workflow
base-url: 'https://{{LC::REF}}.my-project.pages.dev'
```
In project JSON:
```json
{
"imports": {
"my-lib": "{{LC::TO_URL(./dist/index.js)}}"
}
}
```
### 2. Use CDN Mirroring GitHub
Link to files via jsDelivr or similar:
```yaml
# workflow
base-url: 'https://cdn.jsdelivr.net/gh/{{LC::REPO}}@{{LC::SHA}}/'
```
### 3. Data URLs (Small Files Only)
Encode files directly. Stored at dpaste.com (limit: 1M chars, expires after 365 days).
```json
{
"imports": {
"my-lib": "{{LC::TO_DATA_URL(./index.js)}}"
}
}
```
## Common Mistakes
### HIGH Workflow files not on default branch
The workflow files must be merged to the default branch (e.g., `main`) before the action can be triggered by PRs.
Wrong:
```yaml
# Creating PR with workflow files
# Action won't run until merged to default branch
```
Correct:
```bash
# First merge workflow files to default branch
git checkout main
git merge feature/add-gh-action
git push
# Now PRs can trigger the action
```
Source: GitHub Actions documentation on workflow_run event
### MEDIUM Missing permissions for PR comments
The comment workflow needs `pull-requests: write` permission.
```yaml
jobs:
upload:
permissions:
pull-requests: write # Required!
```
### MEDIUM Using data URLs for large files
Data URLs are limited to ~1M characters at dpaste.com. Large builds will fail.
Wrong:
```json
{
"imports": {
"my-lib": "{{LC::TO_DATA_URL(./dist/bundle.js)}}" // Too large!
}
}
```
Correct:
```yaml
# Use base-url and TO_URL for large files
base-url: 'https://{{LC::REF}}.my-project.pages.dev'
```
## Example PR Comment Output
```markdown
## Preview in LiveCodes
**Latest commit:** abc1234
**Last updated:** Jan 15, 2024 3pm (UTC)
| Playground | Link |
| :------------: | ------------------------------------------------------------------ |
| **JavaScript** | [https://livecodes.io?x=code/...](https://livecodes.io?x=code/...) |
| **React** | [https://livecodes.io?x=code/...](https://livecodes.io?x=code/...) |
See [documentations](https://github.com/live-codes/preview-in-livecodes) for usage instructions.
```
## Related Skills
- **import-export** - Understanding project configuration objects
- **self-hosting** - Using custom `appUrl` for self-hosted playgrounds