Skip to content

RightCapitalHQ/php-parser

Repository files navigation

TypeScript types for PHP Parser JSON representation

made by RightCapital GitHub Workflow Status (with event) Conventional Commits RightCapital frontend style guide

Introduction

This NPM package is focusing on providing to following abilities:

  • A TypeScript/JavaScript wrapper for calling nikic's PHP-Parser
  • Sort of auto generated type definitions to annotate the AST (represented as JSON) from nikic's PHP-Parser cli
  • Some util/helper functions to easily retrieving proper PHP AST node with correct type annotation

Installation

This package needs you have PHP with composer installed first

# pnpm
pnpm add @rightcapital/php-parser
# yarn
yarn add @rightcapital/php-parser
# npm
npm install --save @rightcapital/php-parser

Basic Usage

Supposed you have a PHP file named hello.php with the following content

 <?php
echo "Hello";

Here is your TypeScript code for parsing and retrieving the AST nodes of the above PHP file.

import {
  CliHelpers,
  FullyQualifiedScalarString,
  FullyQualifiedStmtEcho,
  NodeRetrieverHelpers,
  NodeType,
  NodeTypeInheritingFromNodeAbstract,
} from '@rightcapital/php-parser';

// Get the root AST nodes from PHP file
const rootNodes: NodeTypeInheritingFromNodeAbstract[] =
  CliHelpers.parsePhpFileToAst('./hello.php');
// or if you prefer to get AST from code string, just use
// CliHelpers.parsePhpCodeStringToAst(`<?php echo "Hello";`)

console.log(rootNodes);
// [
//   {
//     nodeType: "Stmt_Echo",
//     attributes: { startLine: 2, startFilePos: 6, endLine: 2, endTokenPos: 4, endFilePos: 18 },
//     exprs: [[Object]],
//   },
// ];

const echoNode =
  NodeRetrieverHelpers.findNodeByNodeType<FullyQualifiedStmtEcho>(
    rootNodes,
    NodeType.Stmt_Echo,
  );

// Get the specified node with type annotation
console.log(echoNode);
// {
//   nodeType: 'Stmt_Echo',
//   attributes: { startLine: 2, startFilePos: 6, endLine: 2, endTokenPos: 4, endFilePos: 18 },
//   exprs: [
//     { nodeType: 'Scalar_String', attributes: [Object], value: 'Hello' }
//   ]
// }

const scalarStringNode =
  NodeRetrieverHelpers.findNodeByNodeType<FullyQualifiedScalarString>(
    echoNode!.exprs,
    NodeType.Scalar_String,
  );
console.log(scalarStringNode?.value);
// Hello

License

MIT License © 2023-Present