npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@wasilabsoftware/jira-extension-plugin

v0.0.3

Published

Web Components for Jira issue management - works with any framework

Readme

Jira Extension Plugin

A complete Jira issue management system built as framework-agnostic Web Components using Stencil.

Built With Stencil

Features

  • 🎯 Complete Jira Integration - View, create, edit, and delete issues
  • 🧩 Framework Agnostic - Works with React, Vue, Angular, or vanilla JavaScript
  • 🎨 Custom Styling - CSS variables for easy theming
  • 📱 Responsive Design - Works on desktop, tablet, and mobile
  • Lazy Loading - Components load on demand for optimal performance
  • 🔒 Type Safe - Built with TypeScript for better DX

Components

Main Components

  1. <jira-dashboard> - Complete dashboard with navigation and state management
  2. <jira-issue-table> - Sortable table view of issues
  3. <jira-issue-detail> - Detailed issue view with comments and transitions
  4. <jira-create-issue> - Form to create new issues
  5. <jira-edit-issue> - Form to edit or delete existing issues

Utility Components

  • <jira-avatar> - User avatar with initials fallback
  • <jira-status-badge> - Status indicator
  • <jira-priority-badge> - Priority indicator
  • <jira-spinner> - Loading spinner
  • <jira-error> - Error display with retry

Installation

npm install jira-extension-plugin

Usage

Option 1: Complete Dashboard (Recommended)

<!DOCTYPE html>
<html>
<head>
  <script type="module" src="https://unpkg.com/jira-extension-plugin/dist/jira-extension-plugin/jira-extension-plugin.esm.js"></script>
</head>
<body>
  <jira-dashboard
    jira-domain="https://your-domain.atlassian.net"
    jira-email="[email protected]"
    jira-token="your-jira-api-token"
    api-token="your-external-api-token"
    api-base-url="https://your-api.workers.dev"
    project-key="PROJ"
    board-id="123"
    initial-view="backlog">
  </jira-dashboard>
</body>
</html>

Option 2: Individual Components

<!-- Issue Table -->
<jira-issue-table
  jira-domain="https://your-domain.atlassian.net"
  jira-email="[email protected]"
  jira-token="your-jira-api-token"
  api-token="your-external-api-token"
  api-base-url="https://your-api.workers.dev"
  project-key="PROJ"
  sprint-type="backlog">
</jira-issue-table>

<!-- Issue Detail -->
<jira-issue-detail
  jira-domain="https://your-domain.atlassian.net"
  jira-email="[email protected]"
  jira-token="your-jira-api-token"
  api-token="your-external-api-token"
  api-base-url="https://your-api.workers.dev"
  issue-key="PROJ-123"
  editable="true">
</jira-issue-detail>

Framework Integration

React

For React applications, install the dedicated React wrapper package:

npm install jira-extension-plugin-react
import { JiraDashboard } from 'jira-extension-plugin-react';

function App() {
  return (
    <JiraDashboard
      jiraDomain="https://your-domain.atlassian.net"
      jiraEmail="[email protected]"
      jiraToken="your-jira-api-token"
      apiToken="your-external-api-token"
      apiBaseUrl="https://your-api.workers.dev"
      projectKey="PROJ"
      boardId="123"
      initialView="backlog"
      onIssueSelected={(e) => console.log(e.detail)}
    />
  );
}

See jira-extension-plugin-react on npm for more details.

Vue

<template>
  <jira-dashboard
    :jira-domain="jiraDomain"
    :jira-email="jiraEmail"
    :jira-token="jiraToken"
    :api-token="apiToken"
    :api-base-url="apiBaseUrl"
    :project-key="projectKey"
    :board-id="boardId"
    initial-view="backlog"
  />
</template>

<script>
import { defineCustomElements } from 'jira-extension-plugin/loader';

defineCustomElements();

export default {
  data() {
    return {
      jiraDomain: 'https://your-domain.atlassian.net',
      jiraEmail: '[email protected]',
      jiraToken: 'your-jira-api-token',
      apiToken: 'your-external-api-token',
      apiBaseUrl: 'https://your-api.workers.dev',
      projectKey: 'PROJ',
      boardId: '123'
    };
  }
};
</script>

Configuration

Authentication Props (Required for all components)

| Prop | Type | Description | |------|------|-------------| | jira-domain | string | Your Jira domain (e.g., https://yourcompany.atlassian.net) | | jira-email | string | Email associated with your Jira account | | jira-token | string | Jira API token (create one here) | | api-token | string | External API token for your Cloudflare Workers proxy | | api-base-url | string | Base URL of your Cloudflare Workers API |

Component-Specific Props

<jira-dashboard>

| Prop | Type | Default | Description | |------|------|---------|-------------| | project-key | string | - | Jira project key (e.g., "VINM") | | board-id | string | - | Board ID for sprint view (optional) | | initial-view | 'backlog' \| 'current-sprint' \| 'all' | 'backlog' | Initial view to display |

<jira-issue-table>

| Prop | Type | Default | Description | |------|------|---------|-------------| | project-key | string | - | Jira project key | | sprint-type | 'backlog' \| 'current-sprint' \| 'all' | 'backlog' | Which issues to display | | board-id | string | - | Required for current-sprint type | | max-results | number | 50 | Maximum issues to fetch |

<jira-issue-detail>

| Prop | Type | Default | Description | |------|------|---------|-------------| | issue-key | string | - | Issue key to display (e.g., "VINM-123") | | editable | boolean | true | Show edit button |

<jira-create-issue> / <jira-edit-issue>

| Prop | Type | Default | Description | |------|------|---------|-------------| | project-key | string | - | Jira project key (create only) | | issue-key | string | - | Issue key to edit (edit only) |

Events

All components emit custom events that you can listen to:

const dashboard = document.querySelector('jira-dashboard');

// Issue selected in table
dashboard.addEventListener('issueSelected', (e) => {
  console.log('Selected issue:', e.detail.issueKey);
});

// Issue created
dashboard.addEventListener('issueCreated', (e) => {
  console.log('Created issue:', e.detail.issueKey);
});

// Issue updated
dashboard.addEventListener('issueUpdated', (e) => {
  console.log('Updated issue:', e.detail.issueKey);
});

// Issue deleted
dashboard.addEventListener('issueDeleted', (e) => {
  console.log('Deleted issue:', e.detail.issueKey);
});

// Load errors
dashboard.addEventListener('loadError', (e) => {
  console.error('Error:', e.detail.message);
});

Custom Fields

The components support two hardcoded custom fields:

  • Story Points: customfield_10016
  • Pricing: customfield_10091

To modify these or add more custom fields, edit src/types/jira.types.ts.

Styling & Theming

Components use CSS custom properties for theming. Override these in your CSS:

:root {
  --jira-color-primary: #0052cc;
  --jira-color-text-primary: #172b4d;
  --jira-font-family: 'Your Font', sans-serif;
  /* ... see src/global/variables.css for all available variables */
}

API Requirements

This library requires a backend API (Cloudflare Workers recommended) that proxies requests to Jira. See API.md for the complete API specification.

Required endpoints:

  • GET /api/v1/issues/backlog?project={key}
  • GET /api/v1/issues/current-sprint?boardId={id}
  • GET /api/v1/issues/{key}
  • POST /api/v1/issues
  • PUT /api/v1/issues/{key}
  • DELETE /api/v1/issues/{key}
  • GET /api/v1/issues/{key}/comments
  • POST /api/v1/issues/{key}/comments
  • GET /api/v1/issues/{key}/transitions
  • POST /api/v1/issues/{key}/transitions
  • GET /api/v1/project/metadata?project={key}

Development

Setup

npm install
npm start

Visit http://localhost:3333 to see the components in action.

Build

npm run build

Test

npm test

Generate New Component

npm run generate

Documentation

  • CLAUDE.md - Complete technical documentation for AI assistants
  • API.md - API endpoint specification
  • demo.html - Interactive demo page

Component Documentation

Auto-generated documentation for each component:

Browser Support

  • Chrome (latest)
  • Firefox (latest)
  • Safari (latest)
  • Edge (latest)

License

MIT

Contributing

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Support

For issues and questions, please use the GitHub Issues page.

jira-extension-plugin