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 🙏

© 2024 – Pkg Stats / Ryan Hefner

@vcd/route-analyzer

v0.0.13

Published

Analyzes an angular project and builds a list of all routes, including dynamic routes. Two files are generated:

Downloads

7

Readme

Route Analyzer

Analyzes an angular project and builds a list of all routes, including dynamic routes. Two files are generated:

Routes JSON

JSON containing a tree structure for all routes defined in your application.

Example output of app-routes.json

Note that data is included in the output since it's often used to contain information that is used to determine access to a route or to update document.title

Also note that a tagName property will be output within the data attribute. This is useful for automated tests that would like to be sure all routes in an application at least load the expected component.

[
  {
    "path": "plugins",
    "component": "PluginContainerComponent",
    "children": []
  },
  {
    "path": "monitor",
    "children": [
      {
        "path": "",
        "redirectTo": "tasks"
      },
      {
        "path": "tasks",
        "component": "AllTasksComponent",
        "data": {
          "title": "nav.tasks",
          "tagName": "vcd-all-tasks",
          "actions": [
            {
              "xml": {
                "response": {
                  "dtoType": "TaskType",
                  "queryResultDtoType": "QueryResultTaskRecordsType"
                }
              },
              "queryType": "task"
            }
          ]
        }
      },
      {
        "path": "events",
        "component": "AllEventsComponent",
        "data": {
          "title": "nav.events",
          "tagName": "vcd-all-events",
          "actions": [
            {
              "queryType": "AuditTrailEvents"
            }
          ]
        }
      },

Example Usage:

  • Allow the user to search for pages without having to click through menus

Routes Typescript

A flat list of objects containing a route builder function and the HTML tagName associated with the component that will be rendered by that route. Objects are exported as separate objects like the example below

Example output

export const administration_accessControl_users_userId_general = {
    route(userId: string) {
        return `/administration/access-control/users/${userId}/general`;
    },
    tagName: 'vcd-user-general-details',
};

export const administration_identityProviders_oidcSettings = {
    route() {
        return `/administration/identity-providers/oidcSettings`;
    },
    tagName: 'vcd-oidc',
};

Example usage

  • Calling router.navigateByUrl(users_userId.route(someId)) within your application
  • E2e testing going directly to deep URLs instead of clicking a menu hierarchy
  • Smoke e2e tests by automating navigation to all pages in application.
// Note that importing `*` may cause tree shakers not to be able to tree shake content
// Only use `import *` when you need to iterate over all routes
import * as allRoutes from './path/to/app-routes.ts';

// Visit route functions that don't take parameters
const topLevelRoutes = Object.values(allRoutes).filter((e) => e.route.length === 0);
for (const entry of topLevelRoutes) {
    cy.visit(entry.route());
    cy.get(entry.tagName).should('exist');
}

Benefits

  • Compilation errors if routes change
  • No hard coding or joining path segments from application.

Segments Typescript

A list of strings representing each segment found in the application. Each string is prepended with segment_.

Example output

If we use /administration/access-control/users/:userId/general as an example route, the following variables will be generated

export const segment_administration = 'administration';
export const segment_accessControl = 'access-control';
export const segment_users = 'users';
export const segment_userId = ':userId';
export const segment_general = 'general';

Example usage

Do not use variables in your route definitions

Your route definitions are the source of truth, just define them using regular strings. It will be easier to read your routes.

const routes = [
    {
        path: CLOUD_RESOURCES.ORGANIZATIONS,
        component: OrganizationsListTenantComponent,
    },
    {
        path: `${CLOUD_RESOURCES.ORGANIZATIONS}/:${CLOUD_RESOURCES.ORGANIZATION_ID}`,
        loadChildren: () => import('@my/org-details.module').then((m) => m.OrgDetailsModule),
    },
];

Becomes

const routes = [
    {
        path: 'organizations',
        component: OrgListComponent,
    },
    {
        path: 'organizations/:orgId',
        loadChildren: () => import('@my/org-details.module').then((m) => m.OrgDetailsModule),
    },
];

And you use it from places where you need relative links or when reading router attributes

constructor(private activatedRoute: ActivatedRoute) {
    this.activatedRoute.queryParams.subscribe(params => {
        let date = params[segment_orgId];
    });
}
router.navigate(`../${segments_general}`);

Benefits

  • Partial string value checking through compilation if segments change
    • Not fail-proof since the segments aren't scoped to whole routes. That means you won't get an error if the same segment still exists somewhere else in your route definitions
  • Leave your route definitions easier to read if you had been previously using manually maintained constants for your route.
    • At the expense of being forced to duplicate strings in route definitions

Public API

  1. AppRoute interface definition which is structure of the route tree so you can easily work with the JSON
  2. CLI tool to analyze the angular source code starting from a given entry point.

Build

Run npm run build:route-analyzer

Testing script on existing ng application

When making changes to this library, you will want to run it on a host application to test your changes. We avoid using the npm link approach because it runs slightly differently from when using links because of node module resolution and symlinks that are created. That is, it may work in development because it was using a different version of a dependency, the one in vcd-ui-common, instead of the one in the target application.

Instead, we prefer to use a local file npm install. It may take a few more seconds after every change, but it behaves more closely to an actual installation from npm.

There are two steps required:

Link Application to vcd-ui-common's dist folder

Modify your application's package.json to use the file protocol to point to the dist folder

"devDependencies": [{
        "@vcd/route-analyzer": "file:/path/to/my/vcduicommon/dist/route-analyzer"
}]

Install in test application

cd /path/to/your/project/using/route-analyzer
npm i @vcd/route-analyzer
# You must re-run this after building route-analyzer

Unit Testing

To run unit tests

npm run test:route-analyzer

Installation

npm i @vcd/route-analyzer

Running the CLI

After the package is installed you can run:

route-analyzer -e /entry/file/path -o /path/to/folder

If you installed it locally, you can use npx to run it from your project. For additional options, pass -h for help.