{"id":13596598,"url":"https://github.com/jdhitsolutions/PSFunctionTools","last_synced_at":"2025-04-09T16:33:15.656Z","repository":{"id":46262396,"uuid":"440989146","full_name":"jdhitsolutions/PSFunctionTools","owner":"jdhitsolutions","description":":toolbox: A set of PowerShell 7.x tools for automating and accelerating script and module development. :writing_hand:","archived":false,"fork":false,"pushed_at":"2025-01-14T19:46:07.000Z","size":6690,"stargazers_count":56,"open_issues_count":0,"forks_count":7,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-04-06T07:52:58.126Z","etag":null,"topics":["modules","powershell","scripting"],"latest_commit_sha":null,"homepage":"","language":"PowerShell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jdhitsolutions.png","metadata":{"files":{"readme":"README.md","changelog":"changelog.md","contributing":null,"funding":null,"license":"License.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-12-22T21:31:13.000Z","updated_at":"2025-03-19T19:01:24.000Z","dependencies_parsed_at":"2024-01-15T16:51:39.189Z","dependency_job_id":null,"html_url":"https://github.com/jdhitsolutions/PSFunctionTools","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jdhitsolutions%2FPSFunctionTools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jdhitsolutions%2FPSFunctionTools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jdhitsolutions%2FPSFunctionTools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jdhitsolutions%2FPSFunctionTools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jdhitsolutions","download_url":"https://codeload.github.com/jdhitsolutions/PSFunctionTools/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248068002,"owners_count":21042398,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["modules","powershell","scripting"],"created_at":"2024-08-01T16:02:35.453Z","updated_at":"2025-04-09T16:33:10.647Z","avatar_url":"https://github.com/jdhitsolutions.png","language":"PowerShell","readme":"# PSFunctionTools\n\n[![PSGallery Version](https://img.shields.io/powershellgallery/v/PSFunctionTools.png?style=for-the-badge\u0026label=PowerShell%20Gallery)](https://www.powershellgallery.com/packages/PSFunctionTools/) [![PSGallery Downloads](https://img.shields.io/powershellgallery/dt/PSFunctionTools.png?style=for-the-badge\u0026label=Downloads)](https://www.powershellgallery.com/packages/PSFunctionTools/)\n\nThe commands in this module have been developed to make it easier to automate the PowerShell scripting and module development. These tools were first described in a series of blog posts.\n\n+ [Exporting PowerShell Functions to Files](https://jdhitsolutions.com/blog/powershell/8693/exporting-powershell-functions-to-files/)\n+ [Converting PowerShell Scripts to Functions](https://jdhitsolutions.com/blog/powershell/8709/converting-powershell-scripts-to-functions/)\n+ [Discovering Aliases with the PowerShell AST](https://jdhitsolutions.com/blog/powershell/8724/discovering-aliases-with-the-powershell-ast/)\n+ [Fun with PowerShell Module Layout](https://jdhitsolutions.com/blog/powershell/8731/fun-with-powershell-module-layout/)\n+ [Building a PowerShell Module Inception-Style](https://jdhitsolutions.com/blog/powershell/8741/building-a-powershell-module-inception-style/)\n\nThis module has been written for **PowerShell 7.1** and later. It is most likely that the the commands will work in Windows PowerShell, but you will need to fork this module and revise as necessary. Otherwise, install this module from the PowerShell Gallery.\n\n```powershell\nInstall-Module PSFunctionTools\n```\n\n## Commands\n\nTo see a summary of these commands at any time, run [Get-PSFunctionTools](docs/Get-PSFunctionTools.md)\n\n```dos\nPS C:\\\u003e Get-PSFunctionTools\n\n   Module: PSFunctionTools [v1.2.0]\n\nName                       Alias    Synopsis\n----                       -----    --------\nConvert-ScriptToFunction    csf     Convert a script file to a PowerShell funct…\nExport-FunctionFromFile     eff     Export a PowerShell function from a script …\nExport-FunctionToFile       etf     Export a PowerShell function to a file.\nExport-ModuleLayout         eml     Export a model module layout.\nFormat-FunctionName         ffn     Format a function name to proper case.\nGet-FunctionAlias        {ga, gfal} Get a defined function alias.\nGet-FunctionAttribute       gfa     Get function attributes like cmdletbinding.\nGet-FunctionName            gfn     Identify the names of PowerShell functions …\nGet-FunctionProfile         gfp     Get a technical summary of a PowerShell fun…\nGet-ModuleLayout                    Get information about a module layout file.\nGet-ParameterBlock          gpb     Get a function's parameter block.\nGet-PSFunctionTools                 Get a summary of PSFunctionTools commands.\nGet-PSRequirements                  List PowerShell command requirements.\nImport-ModuleLayout         iml     Create a module structure from a layout fil…\nNew-CommentHelp             nch     Create comment based help.\nNew-ModuleFromFiles                 Create a PowerShell module from a set of fi…\nNew-ModuleFromLayout                Create a new module based on a layout.\nTest-FunctionName           tfn     Test the validity of a PowerShell function …\n```\n\n### [Convert-ScriptToFunction](docs/Convert-ScriptToFunction.md)\n\nThis command takes the body of a script file and wraps it in a function declaration. The command will insert missing elements like `cmdletbinding()` and comment-based help. You will most likely need to edit and clean up the result in your scripting editor. If you run this command in the PowerShell ISE or the VS Code PowerShell integrated terminal, you can use the dynamic parameter `ToEditor` to open a new file with with the output. You can edit and save the file manually.\n\n```powershell\nConvert-ScriptToFunction c:\\scripts\\systemreport.ps1 -name New-SystemReport | Out-File c:\\scripts\\New-SystemReport.ps1\n```\n\nIt is assumed that your script file is complete and without syntax errors.\n\n### [Export-FunctionFromFile](docs/Export-FunctionFromFile.md)\n\nYou should use `Export-FunctionFromFile` when you want to export PowerShell functions defined in in a single script file, placing each function in its own file. You might want to do this to build or restructure a PowerShell module.\n\nYou can export all functions from a file or specific functions. The default behavior is to only export functions that follow a standard verb-noun naming convention. The source must be a .ps1 or .psm1 script file.\n\n```powershell\nExport-FunctionFromFile C:\\scripts\\MyInternetTools.psm1 -Name get-zipinfo -OutputPath c:\\scripts\\psinternettools\\functions\n```\n\nIf you run this command in the PowerShell ISE or the VS Code integrated PowerShell Terminal, you can use the dynamic parameter `Remove` to delete the function from the source file.\n\n### [Export-FunctionToFile](docs/Export-FunctionToFile.md)\n\nYou +can use this command to export a function which is loaded into your PowerShell session. You might need to do this when you create an ad-hoc function and want to save it to a file. This command will take the content of the function and export it to a ps1 file. The function name will be used for the file name. Although, characters like the colon will be stripped to create a filesystem-compatibale filename.\n\nYou can also include `#Requires` statements.\n\n```powershell\n Export-FunctionToFile -Name New-FileLink -Path c:\\scripts -Requires \"#requires -version 5.1\",\"#requires -RunAsAdministrator\"\n```\n\n### [Export-ModuleLayout](docs/Export-ModuleLayout.md)\n\nUse `Export-ModuleLayout` to export a model module directory structure to a json file. You can use `Import-ModuleLayout` to recreate the layout from the json file. The export process will include not only directories, but also text files like a readme or license file.\n\n```dos\nPS C:\\\u003e Export-ModuleLayout c:\\work\\sample -FilePath c:\\work\\layout.json -Verbose\nVERBOSE: Starting Export-ModuleLayout\nVERBOSE: Exporting directory structure from c:\\work\\sample\nVERBOSE: Processing .github\nVERBOSE: Processing .vscode\nVERBOSE: Processing docs\nVERBOSE: Processing en-us\nVERBOSE: Processing formats\nVERBOSE: Processing functions\nVERBOSE: Processing icons\nVERBOSE: Processing images\nVERBOSE: Processing samples\nVERBOSE: Processing tests\nVERBOSE: Processing types\nVERBOSE: Processing changelog.md\nVERBOSE: Processing License.txt\nVERBOSE: Processing README.md\nVERBOSE: Processing scratch-changelog.md\nVERBOSE: Processing .vscode\\tasks.json\nVERBOSE: Processing formats\\readme.txt\nVERBOSE: Processing functions\\private\nVERBOSE: Processing functions\\public\nVERBOSE: Processing functions\\private\\readme.txt\nVERBOSE: Processing functions\\public\\readme.txt\nVERBOSE: Processing tests\\readme.txt\nVERBOSE: Processing types\\readme.txt\nVERBOSE: Exporting module layout to c:\\work\\layout.json.\n```\n\n### [Format-FunctionName](docs/Format-FunctionName.md)\n\n`Format-FunctionName` is intended to be used as a helper function in your scripting automation. This is a simple function that will format a verb-noun function name into proper case. It will take an input such as test-data and format it as Test-Data. It will not format as PascalCase. The command also will not verify that the verb component is acceptable. Use `Test-FunctionName` for that process.\n\n```dos\nPS C:\\\u003e Format-FunctionName test-data\nTest-Data\n```\n\n### [Get-FunctionAlias](docs/Get-FunctionAlias.md)\n\n`Get-FunctionAlias` is a tool you can use in your scripting automation. It will extract function names and aliases from a PowerShell script file. The source must be a .ps1 or .psm1 file. The command will only identify aliases defined as part of the function using code like `[alias('foo')]`.\n\n```dos\nPS C:\\\u003e Get-FunctionAlias -Path C:\\scripts\\SQLBackup.psm1\n\nName                Alias\n----                 -----\nBackup-SQLDatabase  Backup-SQL\nRestore-SQLdatabase rsql\n```\n\n### [Get-FunctionAttribute](docs/Get-FunctionAttribute.md)\n\nThis command can be used to get function attributes such as cmdletbinding or alias settings.\n\n```dos\nGet-Functionattribute -path c:\\scripts\\PSFunctionTools\\functions\\public\\Get-ParameterBlock.ps1 -Name get-parameterblock\n\nType                : cmdletbinding\nNamedArguments      : {}\nPositionalArguments : {}\nString              : [cmdletbinding()]\nFunction            : Get-Parameterblock\nPath                : C:\\scripts\\PSFunctionTools\\functions\\public\\Get-ParameterB\n                      lock.ps1\n\nType                : alias\nNamedArguments      : {}\nPositionalArguments : {\"gpb\"}\nString              : [alias(\"gpb\")]\nFunction            : Get-Parameterblock\nPath                : C:\\scripts\\PSFunctionTools\\functions\\public\\Get-ParameterB\n                      lock.ps1\n\nType                : OutputType\nNamedArguments      : {}\nPositionalArguments : {\"ParamBlockAst\", \"String\"}\nString              : [OutputType(\"ParamBlockAst\",\"String\")]\nFunction            : Get-Parameterblock\nPath                : C:\\scripts\\PSFunctionTools\\functions\\public\\Get-ParameterB\n                      lock.ps1\n```\n\n### [Get-FunctionName](docs/Get-FunctionName.md)\n\nWhen exporting functions from files, you may only want to export specific functions. Which you can do if you know the name. Use `Get-FunctionName` to identify the names of functions. The default behavior is to get names of functions that follow the verb-noun naming convention.\n\n```dos\nPS C:\\\u003e Get-FunctionName C:\\scripts\\MyInternetTools.psm1\nGet-MyWhoIs\nGet-GeoIP\nGet-MyPublicIP\nGet-MyWeather\nGet-WeatherByProxy\nGet-WeatherLocation\nGet-QOTD\nGet-ZipInfo\nGet-RSSFeed\nOpen-URL\n```\n\n### [Get-ModuleLayout](docs/Get-ModuleLayout.md)\n\nThis command will provide information about a module layout folder which was created using `Export-ModuleLayout`. The default output is custom object. You can elect to view the layout as a tree. This parameter requires the tree commandline utility which should be available on Windows systems by default. On non-Windows platforms, you may need to install the utility.\n\n```dos\nPS C:\\\u003e Get-ModuleLayout C:\\scripts\\simplelayout.json -AsTree\nC:\\\u003cPathTo\u003e\\\u003cMYMODULE\u003e\n|   changelog.md\n|   README.md\n|\n+---.vscode\n+---docs\n+---en-us\n+---formats\n|       readme.txt\n|\n+---functions\n|\n+---tests\n|       readme.txt\n|\n\\---types\n        readme.txt\n```\n\n### [Get-ParameterBlock](docs/Get-ParameterBlock.md)\n\nThis command is designed to use the PowerShell AST and retrieve a function's parameter block. You might use this to build comment-based help.\n\n```dos\nPS C:\\\u003e Get-ParameterBlock -path c:\\scripts\\SimpleFunction.ps1 -name Get-FolderData\n\nAttributes Parameters                Extent\n---------- ----------                ------\n{}         {$Path, $Cutoff, $Filter} Param (…\n\nPS C:\\\u003e Get-ParameterBlock  -path c:\\scripts\\SimpleFunction.ps1 -name Get-FolderData -ToString\n[parameter(HelpMessage = \"Specify the folder to analyze\")]\n[string]$Path=\".\"\n[datetime]$Cutoff\n[string]$Filter=\"*.*\"\n```\n\n### [Get-PSRequirements](docs/Get-PSRequirements.md)\n\nAs part of your scripting automation, you may want to capture requirements defined in a script file such as `# requires -version 5.1`. The command `Get-PSRequirements` will process a PowerShell script file for these type of requirements.\n\n```dos\nPS C:\\\u003e Get-PSRequirements -Path C:\\scripts\\SQLBackup.psm1\n\nPath                  : C:\\scripts\\SQLBackup.psm1\nRequiredApplicationId :\nRequiredPSVersion     : 5.1\nRequiredPSEditions    : {}\nRequiredModules       : {}\nRequiresPSSnapIns     : {}\nRequiredAssemblies    : {}\nIsElevationRequired   : True\n```\n\n### [Import-ModuleLayout](docs/Import-ModuleLayout.md)\n\nUse `Import-ModuleLayout` to recreate a module structure from a json file created with `Export-ModuleLayout`. Importing the json file will recreate the folders and files.\n\n```dos\nPS C:\\\u003e Import-ModuleLayout -Name PSDemo -ParentPath D:\\scripts -Layout C:\\work\\layout.json\n\n    Directory: C:\\scripts\\PSDemo\n\nMode                 LastWriteTime         Length Name\n----                 -------------         ------ ----\nd----          12/16/2021  9:45 AM                types\nd----          12/16/2021  9:45 AM                .github\nd----          12/16/2021  9:45 AM                .vscode\nd----          12/16/2021  9:45 AM                docs\n...\n    Directory: D:\\scripts\\PSDemo\\functions\n\nMode                 LastWriteTime         Length Name\n----                 -------------         ------ ----\nd----          12/16/2021  9:45 AM                public\nd----          12/16/2021  9:45 AM                private\n\n    Directory: D:\\scripts\\PSDemo\\functions\\public\n\nMode                 LastWriteTime         Length Name\n----                 -------------         ------ ----\n-a---          12/16/2021  9:49 AM            276 readme.txt\n...\n```\n\n### [New-CommentHelp](docs/New-CommentHelp.md)\n\nYou can use this command in your scripting automation to generate a comment-based help block for a function. The function will use the parameter block which you can get with `Get-ParameterBlock` to define help parameters. If your parameter has a HelpMessage defined, the value will be used in the parameter description. You can also specify a synopsis and/or description. Otherwise, you can edit the placeholders later.\n\n```dos\nPS C:\\\u003e Get-Parameterblock  -path c:\\scripts\\SimpleFunction.ps1 -name Get-FolderData | New-CommentHelp -Synopsis \"Get folder details\"\n\u003c\n    .Synopsis\n      Get folder details\n    .Description\n      \u003clong description\u003e\n    .Parameter Path\n      Specify the folder to analyze\n    .Parameter Cutoff\n      \u003center a parameter description\u003e\n    .Parameter Filter\n      \u003center a parameter description\u003e\n    .Example\n\n      \u003coutput and explanation\u003e\n    .Inputs\n      \u003cInputs to this function (if any)\u003e\n    .Outputs\n      \u003cOutput from this function (if any)\u003e\n    .Notes\n      \u003cGeneral notes\u003e\n    .Link\n      \u003center a link reference\u003e\n```\n\n### [New-ModuleFromFiles](docs/New-ModuleFromFiles.md)\n\n`New-ModuleFromFiles` is an __*experimental*__ command. It is *not* guaranteed to run without error and may change significantly between module versions. The command is designed to process a collection of PowerShell script files which contain PowerShell functions. Each function will be exported to an individual file to a location you specify.\n\nThe function relies on a module layout file to scaffold the module directory.\n\n```powershell\n$splat = @{\n    Description   = \"Demo exported module\"\n    Files         = \"c:\\scripts\\pstools.psm1\",\"c:\\scripts\\servertools.ps1\"\n    Layout        = \"c:\\scripts\\ModuleLayout.json\"\n    NewModuleName = \"PSTools\"\n    ParentPath    = \"c:\\scripts\"\n    CreateHelp    = $True\n    FunctionPath  = \"functions\\public\"\n    InitializeGit = $true\n}\n New-ModuleFromFiles @splat\n ```\n\nIf you have the [Platyps](https://github.com/powershell/platyps) module installed, you can also choose to create help documentation. If you have `git` installed, you can initialize the module as a git repository. This process will also checkout a new branch.\n\n### [New-ModuleFromLayout](docs/New-ModuleFromLayout.md)\n\nThis command is very similar to `New-ModuleFromFiles`. That function builds a module structure from existing files. This function creates a new module but without defining any commands. `New-ModuleFromLayout` will still create a module structure based on a layout and it will still create module files. Specifically,the module manifest and root module files.\n\n```powershell\nNew-ModuleFromLayout -NewModuleName PSDataResource -ParentPath c:\\scripts -Description \"A class-based DSC resource to do something.\" -Layout c:\\scripts\\DSCModuleLayout.json -initializegit\n```\n\nIf `git.exe` is detected, you can use the `InitializeGit` dynamic parameter to initialize the module as a git repository.\n\n### [Test-FunctionName](docs/Test-FunctionName.md)\n\nPowerShell function names should follow naming convention of `Verb-Noun`. The verb should be a standard verb that you see with `Get-Verb`. Use this command in your scripting automation to validate a PowerShell function name.\n\n```dos\nPS C:\\\u003e Test-FunctionName Test-Widget\nTest-Widget\n```\n\nIf the name passes validation it will be written to the pipeline. Or you can use the `-Quiet` parameter to return a traditional boolean result.\n\n```dos\nPS C:\\\u003e Test-FunctionName kill-system -Quiet\nFalse\n```\n\n### [Get-FunctionProfile](docs/Get-FunctionProfile.md)\n\n`Get-FunctionProfile` is designed to give you a technical summary of a PowerShell function. You might use this to preview what commands a function might execute or if it supports `-Whatif`. The function might be something someone else wrote, or perhaps you want to double-check your code.\n\nNote that the analysis may not be 100% accurate. For example, it is difficult to distinguish between the alias `foreach` and the `foreach` enumerator.\n\n```dos\nPS C:\\...\\samples\u003e Get-FunctionProfile -path .\\SampleScript5.ps1 -name Get-Result\n\nName                  : Get-Result\nFunctionAlias         : grx\nSupportsShouldProcess : False\nParameterSets         :\nDynamicParameters     : False\nRequiredVersion       : 5.1\nRequiredModules       : {}\nRequiresElevation     : True\nCommands              : {Get-CimInstance, Get-Random, Join-Path, New-Timespan…}\nExternalCommands      : {c:\\scripts\\cleanup.bat, notepad.exe}\nDotNet                : {[system.datetime]::now,\n                        [system.environment]::getenvironmentvariable(\"temp\")}\nAliases               : {gcim, tee}\nUnresolved            : {w}\nPath                  : C:\\Scripts\\PSFunctionTools\\samples\\SampleScript5.ps1\n```\n\nHere is a sample analysis. Commands should be PowerShell cmdlets, including resolved aliases. Detected command aliases will also be retrieved. Unresolved commands might be undefined aliases or some other command that PowerShell could not resolve.\n\n## Code Samples\n\nThis module includes a [Samples](samples) folder. Here, you can find sample PowerShell scripts and functions that you can use with the commands in this module.\n\n```dos\nPS C:\\...\\PSFunctionTools\\samples\u003e Get-FunctionName .\\Tools.psm1\nGet-WindowsVersion\nGet-WindowsVersionString\nGet-OSInfo\n\nPS C:\\...\\PSFunctionTools\\samples\u003eGet-ModuleLayout .\\ModuleLayout.json -AsTree\n\nC:\\\u003cPathTo\u003e\\\u003cMYMODULE\u003e\n|   changelog.md\n|   README.md\n|\n+---.vscode\n+---docs\n+---en-us\n+---formats\n|       readme.txt\n|\n+---functions\n|   +---private\n|   |       readme.txt\n|   |\n|   \\---public\n|           readme.txt\n|\n+---tests\n|       readme.txt\n|\n\\---types\n        readme.txt\n\nPS C:\\Scripts\\PSFunctionTools\\samples\u003e dir .\\SampleScript* | Get-PSRequirements | Format-Table\n\n   Path: C:\\Scripts\\PSFunctionTools\\samples\\SampleScript.ps1\n\nApplicationId PSVersion PSEditions PSSnapIns Assemblies IsElevationRequired\n------------- --------- ---------- --------- ---------- -------------------\n                    4.0 {}         {}        {}                False\n\n   Path: C:\\Scripts\\PSFunctionTools\\samples\\SampleScript2.ps1\n\nApplicationId PSVersion PSEditions PSSnapIns Assemblies IsElevationRequired\n------------- --------- ---------- --------- ---------- -------------------\n                    3.0 {}         {}        {}                False\n\n   Path: C:\\Scripts\\PSFunctionTools\\samples\\SampleScript3.ps1\n\nApplicationId PSVersion PSEditions PSSnapIns Assemblies IsElevationRequired\n------------- --------- ---------- --------- ---------- -------------------\n                    5.0 {}         {}        {}                True\n\n   Path: C:\\Scripts\\PSFunctionTools\\samples\\SampleScript4.ps1\n...\n```\n\nYou are welcome to copy, paste, and edit these samples as much as you would like.\n\n## Bugs and Enhancements\n\nPlease use the repository's Issues section for reporting bugs and requesting new features. Remember, the commands in this module are designed for PowerShell 7.1 and later.\n\n## Related Commands and Projects\n\nYou might also be interested in the [PSScriptTools](https://github.com/jdhitsolutions/PSScriptTools) module. This module has several commands that you might use in your toolmaking.\n\n+ [New-PSFormatXML](http://bit.ly/31SGo5o)\n+ [New-PSDynamicParameterForm](https://bit.ly/3HNNcpU)\n+ [New-PSDynamicParameter](https://bit.ly/3JX8R0w)\n\nUse the commands in the [PSTypeExtensionTools](https://github.com/jdhitsolutions/PSTypeExtensionTools) to extend standard types as well as custom types and classes in your work.\n","funding_links":[],"categories":["PowerShell"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjdhitsolutions%2FPSFunctionTools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjdhitsolutions%2FPSFunctionTools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjdhitsolutions%2FPSFunctionTools/lists"}