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

@bigbinary/neeto-team-members-playwright

v1.0.5

Published

Playwright helpers for the neeto team members nano.

Readme

Team members Playwright helpers

@bigbinary/neeto-team-members-playwright contains the team member and role POMs, selectors, and types owned by this nano. It is versioned and published independently of @bigbinary/neeto-team-members-frontend.

Generic helpers stay in @bigbinary/neeto-playwright-commons. These POMs use commons for page commands, common selectors, filters, and exampleEmail.

Usage

Install it in the consuming product's playwright-tests/ directory:

yarn add -D @bigbinary/neeto-team-members-playwright

The product supplies the peer dependencies listed in package.json, including @bigbinary/neeto-playwright-commons. The frontend package is not required.

Like commons, the package is ES-module only, and Playwright loads specs as CommonJS. Add a path alias next to @neetoplaywright in the product's playwright-tests/tsconfig.json, and import through it.

"paths": {
  "@neetoteammembers": [
    "./node_modules/@bigbinary/neeto-team-members-playwright"
  ]
}
import {
  MEMBER_SELECTORS,
  Member,
  MemberApis,
  ROLES_SELECTORS,
  RoleApis,
  RolesPage,
  TeamMembers,
} from "@neetoteammembers";
  • Construct TeamMembers with { page, neetoPlaywrightUtilities }. It drives the neeto-atoms sheet UI: radios, menuitem bulk actions, and column menus opened from the column header's button.
  • searchMemberByEmail(email) lowercases the address, then searches and verifies the row.
  • new Member(neetoPlaywrightUtilities) creates and updates members through the nano's REST API. Create sends user (emails, organization_role, app_roles). Update sends team (active, first_name, last_name, organization_role, email, and optional profile). Bulk update sends users (organization_role, active, emails).
  • Construct RolesPage with (page, neetoPlaywrightUtilities). It checks permissions by label. new RoleApis(neetoPlaywrightUtilities) sends organization_role (name, kind, description, permission_ids) and delete new_role_id.
  • The host's i18next fixture must load the nano translations before a POM is created.

Member helpers

  • MemberApis.fetchByEmail(email) queries active members using the server-side neeto_filters email condition and a lowercased email. fetch(params = {}) remains available for other scopes and pagination.
  • Member.getUserIdViaAPI(email) polls that filtered request for up to 60 seconds, matches case-insensitively, and returns the member id. It fails if no active member becomes available.
  • Member.addMemberViaRequest({ email, appName, ... }) waits for the creation job to finish, then returns the member id using that lookup.
  • Member.editMemberViaRequest, deactivateMemberViaRequest, and updateEmailViaAPI update profiles, deactivate members, and change email. generateRandomTeamMembers({ count, role }) creates test-data objects.
  • MemberApis.create, jobStatus, fetchPermissions, update, and bulkUpdate expose member creation, job polling, permission listing, and member updates.
  • TeamMembers.pageTitle is the members page title from the nano's taxonomyDefaultLabels.member.plural translation. Use it in page-title assertions instead of hard-coding the text.
  • TeamMembers.openMemberShowPage(email) searches by email, opens the matching name cell, and verifies the member page heading.
  • TeamMembers.navigateToTeamMembers, openMemberPane, fillMemberForm, submit, addMemberViaUI, editMemberViaUI, and removeMemberViaUI drive the members table and V2 member sheet.
  • searchAndVerifyMemberByEmail({ email }) and searchMemberByEmail(email) search and verify a row; getMemberRowByName(name) returns its row locator.
  • openFilterPane, filterMembersByMultiSelect, and filterMembers set member filters. takeActionOnMembers performs bulk actions; performColumnAction and toggleMemberColumns control table columns.
  • verifyMemberInTable({ name, email }) checks the row details; verifyNoDataTitle(email) verifies an empty search result; exportDetails(fileType, adminEmail) requests a member export.

Role helpers

  • RolesPage.pageTitle is the roles page title from the nano's neetoTeamMembers.common.role translation (plural). Use it in page-title assertions instead of hard-coding "Roles".

  • fetchSortedPermissions() returns permissions in numeric sequence order.

  • getPermissionIdsByName(names) verifies every requested name exists and returns its ids in sequence order. getPermissionDescriptionsByName(names) returns matching descriptions in the same order.

  • addCustomRoleByPermissionNamesViaRequest(roleName, names) creates a role with permissions selected by their internal names.

  • grantPermissionsByNameViaRequest(roleName, names) replaces the role's permissions and verifies the requested ids were granted. Its request contains id, kind, name, and permission_ids, without organization_id.

  • getRolePermissionCheckboxes(roleName, category) returns the category's permission checkboxes, excluding its first, category-level checkbox.

  • getTableCheckboxBesidePermission(roleName, description) returns the checkbox aligned with a permission description, excluding category-level rows.

  • verifyRolePermissionCheckboxStates({ roleName, checkedPermissionNames }) verifies checked and unchecked permissions across the expanded, unfiltered table. verifyAddRolePanePermissionStates(checkedPermissionNames) verifies the open role sheet using each permission's internal name.

  • getPermissionIds(targetPermissions, isGranularPermission) looks up permission ids by category, or by description when the second argument is true.

  • getRoleIdAndOrganizationId(roleName) resolves a role's identifiers. addCustomRoleViaRequest, editRoleViaRequest, and deleteRoleViaRequest create, edit, and delete roles through the API.

  • addRoleViaUI, editRoleViaUI, selectAndSubmitPermissions, and deleteRoleViaUI drive the role sheet and table actions.

  • verifyAddAndDeleteRole({ route, roleName }) opens the roles page, then adds and deletes a role with no permissions through the UI. route defaults to commons' ROUTES.adminPanel.roles, and roleName to a random 8-character name. Production health tests pass it to commons' health.verifyAppIsLive(customSteps), which no longer checks roles itself:

    test("should verify application is live", ({
      health,
      page,
      neetoPlaywrightUtilities,
    }) =>
      health.verifyAppIsLive(() =>
        test.step("3: Verify adding & removing roles", () =>
          new RolesPage(page, neetoPlaywrightUtilities).verifyAddAndDeleteRole())
      ));

    Products whose roles page is elsewhere pass route: CRM uses /admin/admin-panel/manageUsers/roles, Planner /admin-panel/general/roles, and Code, Runner, CI, Git, Tower, and Quiz /admin/admin-panel/roles.

  • verifyPermissions checks element visibility for a permission set; verifyRoleSpecificLinkAccess checks access to product-supplied routes.

  • RoleApis.fetch, addRole, editRole, and deleteRole expose the underlying member/permission/role listing and role mutation requests.

VerifyRolePermissionCheckboxStatesParams is explicitly exported alongside the existing public argument and response types.

Selector changes (breaking)

Added MEMBER_SELECTORS.manageRolesButton, changeRoleButton, rolesSearchInput, changeRoleOption(role), and filteredMembersCount from V2's action block. Added ROLES_SELECTORS.tablePermissionCard(category), tableCategoryTitle, and emptyCategoryRow from the V2 roles table.

Removed selectors with no literal or generated counterpart in the nano:

  • MEMBER_SELECTORS.deactivatedAgentsButton
  • MEMBER_SELECTORS.activatedMembersButton
  • MEMBER_SELECTORS.menuBarHeading
  • MEMBER_SELECTORS.statusTag
  • MEMBER_SELECTORS.subscriptionPlanTag
  • ROLES_SELECTORS.searchTextField

These removals require a minor release. The existing sheet selectors ROLES_SELECTORS.permissionCard, permissionCategoryTitle, and permissionCheckbox(name) remain distinct from the table selectors.

Local development

To try unreleased changes in a product, publish with yalc from this directory, then add the package in the product's playwright-tests/ directory. Remove the yalc link before committing so the product's manifest and lockfile stay unchanged:

yarn build && yalc publish
cd path/to/product/playwright-tests
yalc add --dev @bigbinary/neeto-team-members-playwright

After the first publish, yalc push from playwright/ updates every product that added the package. Remove it with yalc remove @bigbinary/neeto-team-members-playwright.

Releasing

Merge a PR with the playwright label and a patch, minor, or major label. The existing NeetoCI bump workflow publishes this package and opens the Bump version PR.