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

dvforge

v0.2.1

Published

YAML → pac-ready Dataverse table solutions.

Readme

dvforge

YAML → pac-ready Dataverse table solutions.

Compile compact, human-friendly YAML into a complete Microsoft Dataverse solution — ready to pack with pac solution pack.

[!WARNING] This is pre-production. Breaking changes between minor versions to be expected.

Commands

dvforge build

Compile your input YAML into a Dataverse solution tree.

npx dvforge build --input ./my-solution --output ./output

| Flag | Description | |------|-------------| | --input | Path to your input YAML directory (required) | | --output | Path to write the compiled solution files (required) | | --version | Override the solution version, e.g. 1.2.0.0 | | --unmanaged | Generate an unmanaged solution (default: managed) | | --dry-run | Print output paths without writing any files |

To get it into Dataverse

Pack with the PAC CLI:

pac solution pack -z MySolution.zip -f ./output -p Managed

And import

pac solution import -p MySolution.zip -env $(DV_ENV_URL) -up -pc
# where DV_ENV_URL = https://your-dynamics-url.crm.dynamics.com

Schemas

my-solution/
├── solution.yml
├── optionsets.yml      (optional)
└── entities/
    ├── deal.yml
    ├── contact.yml
    └── transactioncurrency.yml

solution.yml

solution:
  name: MySolution
  display_name: My Solution
  version: 1.0.0.0
  publisher:
    name: TomLumborg
    display_name: TomLumborg
    prefix: tl
    option_value_prefix: 12687

optionsets.yml

optionsets:
  - name: deal_stage          # no prefix needed — dvforge adds tl_
    display_name: deal_stage
    options:
      - label: Talks Open
        value: 1
      - label: Verbal Agreement
        value: 2

entities/*.yml

One entity per file

entities:
  - name: deal                # no prefix needed — dvforge adds tl_
    display_name: Deal
    display_name_plural: Deals
    description:
    ownership: user           # user | organization
    columns:
      - name: name
        type: string
        display_name: Name
        required: true
        max_length: 850

      - name: account
        type: lookup
        display_name: Account
        related_table: account  # no prefix needed

      - name: stage_choice
        type: choice
        display_name: Stage
        option_set: deal_stage  # no prefix needed

    relationships:
      - related_table: account  # the "one" side entity
        lookup_column: account  # the FK column on this entity

Existing (system) Entity

To reference system or built-in entities, add them to the entity list and mark them as an existing table. Use the logical name and display name exactly as they appear in Dataverse. You can also reference custom tables from other solutions by including their prefix.

Once declared, these tables can be used as lookup targets on other tables.

entities:
  - name: TransactionCurrency
    existing_table: true
    display_name: Currency

Column types: string, lookup, choice, datetime, dateonly, int

  • choice requires option_set
  • lookup requires related_table and a relationship

Prefixes: never write the publisher prefix in your input files - dvforge stamps {prefix}_ on all names at compile time.

Relationships: defined on the entity that holds the lookup column (the "many" side). Only one-to-many is supported.

YAML Schemas: run npx dvforge schema from your project root to generate and configure schemas for your dvforge input files. This enables inline validation, field suggestions, and autocompletion in VS Code.

What gets generated

For each entity:

  • entity.yml
  • One attribute file per column, plus ~14 system attributes (createdby, createdon, ownerid, statecode, statuscode, etc.)
  • Main, card, and quick forms
  • 7 standard views (Active, Inactive, My Records, Advanced Find, Associated, Lookup, Quick Find)
  • Empty ribbon scaffold
  • 6 system relationships + any custom lookup relationships

Globally: publisher.yml, option set files, solution.yml, solutioncomponents.yml, rootcomponents.yml, missingdependencies.yml.

The output directory is wiped and recreated on every build.