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

gridsome-source-wikidata

v0.1.5

Published

Wikidata source for Gridsome

Downloads

498

Readme

npm npm License

gridsome-source-wikidata

Install

npm install gridsome-source-wikidata

Quick Start

Add the plugin to your gridsome.config.js:

module.exports = {
  plugins: [
    {
      use: "gridsome-source-wikidata",
      options: {
        url: "https://query.wikidata.org/sparql",
        sparql: `SELECT ?item ?label ?image WHERE {
          ?item wdt:P31 wd:Q5;
            rdfs:label ?label;
            wdt:P18 ?image.
          BIND(REPLACE(STR(?item), "^.*/", "") AS ?item)
          FILTER(LANG(?label) = "en")
        } LIMIT 50`,
        typeName: "Person"
      }
    }
  ],
  templates: {
    Person: "/:item"
  }
};

Key options:

  • url — SPARQL endpoint (required)
  • sparql — SPARQL SELECT query (required)
  • typeName — GraphQL collection name, must start with uppercase (required)
  • baseDir — Where to download media files (default: /content/)
  • verbose — Enable progress logging (default: false)

See the Options section below for all available settings.

Example Queries

People (Scientists, Artists, etc.)

SELECT ?item ?personLabel ?birthDate ?image WHERE {
  ?person wdt:P31 wd:Q5;        # Instance of human
    wdt:P106 wd:Q901;            # Occupation: scientist
    wdt:P569 ?birthDate;         # Date of birth
    wdt:P18 ?image.              # Image
  BIND(REPLACE(STR(?person), "^.*/", "") AS ?item)
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en".
    ?person rdfs:label ?personLabel.
  }
}
LIMIT 50

Places with Coordinates

SELECT ?item ?cityLabel ?countryLabel ?latitude ?longitude WHERE {
  ?city wdt:P31 wd:Q515;             # Instance of city
    wdt:P17 ?country;                # Country
    wdt:P625 ?coordinates.           # Coordinates
  BIND(REPLACE(STR(?city), "^.*/", "") AS ?item)
  BIND(xsd:decimal(SUBSTR(STR(?coordinates), 1, 20)) AS ?latitude)
  BIND(xsd:decimal(SUBSTR(STR(?coordinates), 22, 20)) AS ?longitude)
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en".
    ?city rdfs:label ?cityLabel.
    ?country rdfs:label ?countryLabel.
  }
}
LIMIT 50

Books with Authors

SELECT ?item ?bookLabel ?authorLabel ?publicationDate WHERE {
  ?book wdt:P31 wd:Q571;          # Instance of book
    wdt:P50 ?author;              # Author
    wdt:P577 ?publicationDate;    # Publication date
    wdt:P18 ?image.               # Cover image
  BIND(REPLACE(STR(?book), "^.*/", "") AS ?item)
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en".
    ?book rdfs:label ?bookLabel.
    ?author rdfs:label ?authorLabel.
  }
}
LIMIT 100

For more query examples, visit the Wikidata SPARQL query service and test queries directly there.

SPARQL Tips

  • Always include ?item: Use BIND(REPLACE(STR(?entity), "^.*/", "") AS ?item) to create stable node IDs
  • Use labels: Include SERVICE wikibase:label to fetch human-readable labels
  • Filter efficiently: Use FILTER, LIMIT, and ORDER BY to control results
  • Download images: Use wdt:P18 for media URIs that this plugin will automatically download

Options

| Property | Type | Description | Required | Default | | ------------------ | ---------- | ------------------------------------------------------------------------------------- | ------------ | --------------------- | | url | string | SPARQL endpoint URL | ✅ Yes | - | | sparql | string | SPARQL SELECT query | ✅ Yes | - | | typeName | string | GraphQL collection name (uppercase, alphanumeric only) | ✅ Yes | - | | baseDir | string | Directory for downloaded files | ❌ No | "/content/" | | cacheEnabled | boolean | Enable/disable caching | ❌ No | true | | ttl | number | Cache TTL in milliseconds | ❌ No | 86400000 (24 hours) | | timeout | number | HTTP request timeout in milliseconds | ❌ No | 30000 | | maxFileSize | number | Max file size in bytes | ❌ No | 104857600 (100 MB) | | allowedFileTypes | string[] | Allowed file extensions (e.g., ['jpg', 'png']). Undefined = all allowed. | ❌ No | undefined | | rateLimitDelay | number | Delay between requests in milliseconds (prevents rate limiting). Set to 0 to disable. | ❌ No | 100 | | maxRetries | number | Retry attempts for transient errors | ❌ No | 2 | | retryDelay | number | Initial retry delay in milliseconds (exponential backoff applied) | ❌ No | 1000 | | verbose | boolean | Enable verbose logging | ❌ No | false | | cacheFilename | string | Cache file name | ❌ No | ".cache.json" |

Gridsome Compatibility

This plugin is compatible with:

  • Gridsome ^0.7.0 or ^1.0.0
  • Node.js >=22.0.0

Using Data in Templates

SPARQL query variables map directly to GraphQL fields. For a query with SELECT ?item ?label ?image, the fields become item, label, and image.

Node IDs: Include ?item in your query and extract the Wikidata ID using:

BIND(REPLACE(STR(?item), "^.*/", "") AS ?item)

In gridsome.config.js:

templates: {
  Person: "/people/:item"; // Uses the item field from your query
}

In your Vue template (src/templates/Person.vue):

<template>
  <div>
    <h1>{{ $page.person.label }}</h1>
    <img :src="$page.person.image" :alt="$page.person.label" />
  </div>
</template>

<page-query>
query Person ($id: ID!) {
  person(id: $id) {
    item
    label
    image
  }
}
</page-query>

Troubleshooting

Common Errors

"Missing 'url' endpoint"

  • Cause: The url option is missing or empty
  • Fix: Provide a valid SPARQL endpoint URL

"Invalid 'url' format"

  • Cause: The URL is malformed
  • Fix: Ensure the URL is a valid HTTP/HTTPS URL (e.g., https://query.wikidata.org/sparql)

"Invalid 'sparql' query"

  • Cause: SPARQL query is empty or doesn't contain valid SPARQL keywords
  • Fix: Ensure your query contains SELECT, ASK, CONSTRUCT, or DESCRIBE

"Invalid 'typeName' format"

  • Cause: Type name doesn't follow GraphQL naming conventions
  • Fix: Type name must start with an uppercase letter and contain only alphanumeric characters (e.g., Painting, Artwork, Item123)

"Invalid baseDir: path must be within project directory"

  • Cause: Attempted path traversal detected
  • Fix: Use a relative path within your project (e.g., /content/ or /data/images/)

"Failed to fetch Wikidata"

  • Cause: Network error, timeout, or invalid SPARQL query
  • Fix:
    • Check your internet connection
    • Verify the SPARQL query syntax
    • Increase timeout option if requests are slow
    • Enable verbose: true for detailed error messages

Downloads failing

  • Cause: Network issues, invalid URIs, file system permissions, file size limits, or file type restrictions
  • Fix:
    • Check file system permissions for baseDir
    • Verify URIs in SPARQL results are accessible
    • Check if file size exceeds maxFileSize limit (default: 100MB)
    • Verify file extension is in allowedFileTypes array (if specified)
    • Enable verbose: true to see download progress

"File size exceeds maximum allowed size"

  • Cause: Downloaded file is larger than maxFileSize option
  • Fix: Increase maxFileSize option (in bytes) or download smaller files

"File type not allowed"

  • Cause: File extension is not in allowedFileTypes array
  • Fix: Add the file extension to allowedFileTypes array or remove the restriction

Error Handling Example

module.exports = {
  plugins: [
    {
      use: "gridsome-source-wikidata",
      options: {
        url: "https://query.wikidata.org/sparql",
        sparql: `SELECT ?item WHERE { ... }`,
        typeName: "Item",
        verbose: true, // Enable for debugging
        timeout: 60000, // Increase timeout for slow queries
        maxFileSize: 50 * 1024 * 1024, // 50 MB limit
        allowedFileTypes: ["jpg", "png", "gif", "pdf"] // Only allow these file types
      }
    }
  ]
};

If errors occur during build, they will be logged to the console. Check the error message for specific guidance.

Contributing

Contributions are welcome! Please follow these guidelines:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Make your changes following the existing code style
  4. Test your changes (if tests are added)
  5. Commit your changes (git commit -m 'Add some amazing feature')
  6. Push to the branch (git push origin feature/amazing-feature)
  7. Open a Pull Request

Code Style

  • Follow the existing code style (2-space indentation)
  • Add JSDoc comments for new functions
  • Keep functions focused and small
  • Maintain Gridsome compatibility

Reporting Issues

When reporting issues, please include:

  • Gridsome version
  • Node.js version
  • Plugin version
  • Error messages (with verbose: true enabled)
  • SPARQL query (if applicable)
  • Steps to reproduce

Open Issues

  • Add selective URI downloads with appropriate filter options