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

php-app

v0.5.0

Published

PHP loyihasini desktop ilovaga aylantiruvchi CLI (PHP, HTML, CSS, JS)

Readme

PHP APP

PHP loyihasini desktop ilovaga aylantiruvchi CLI. Ilovani PHP, HTML, CSS va JS bilan yozasiz.

Butun runtime (Electron, PHP, xavfsizlik) php-app paketi ichida turadi. Sizning loyiha papkangizda faqat o'z fayllaringiz bo'ladi.


O'rnatish (bir marta)

cd php-app
npm install            # Electron o'rnatiladi
./bin/fetch-php.sh      # static PHP yuklab olinadi
npm link               # `php-app` buyrug'i tizimga o'rnatiladi
php-app doctor         # hammasi tayyorligini tekshiradi

Endi php-app istalgan joydan ishlaydi.


Buyruqlar

php-app create <nom>     # yangi loyiha papkasini yaratadi
php-app run [papka]      # loyihani oynada ochadi; fayl o'zgarsa avtomatik yangilanadi
php-app check [papka]    # php-app.json to'g'ri to'ldirilganini tekshiradi
php-app build [papka]    # test uchun ilova yig'adi (tez, o'rnatgichsiz)
php-app release [papka]  # tarqatish uchun o'rnatgich yasaydi (.dmg / .exe / .AppImage)
php-app doctor           # tizim tayyorligini va yangilanishni tekshiradi
php-app update           # yangi versiya bo'lsa yangilaydi

Platforma tanlash (build / release bilan): --mac, --win, --linux.

Yangilanish: php-app doctor yangi versiyani ko'rsatadi, php-app update yangilaydi (-y bilan so'rovsiz). Boshqa buyruqlar ham yangilanish bo'lsa bir qatorda eslatadi.

Ish jarayoni:

php-app create hisobchi
cd hisobchi
php-app run              # ishlab chiqish (app.php o'zgarsa oyna avtomatik yangilanadi)
php-app release          # tayyor bo'lgach: dist/ ichida o'rnatgich fayl paydo bo'ladi

build va release avval php-app.json ni tekshiradi. Zarur maydon bo'lmasa jarayon to'xtaydi va nima yetishmayotgani ko'rsatiladi. Natija loyihaning dist/ papkasiga chiqadi.


📁 Sizning loyihangiz (toza!)

php-app create shundan iborat papka yaratadi:

mening_ilovam/
├── app.php          ← butun ilovangiz shu yerda (PHP + HTML + CSS + JS)
├── icon.png         ← ilova ikonkasi (512x512, almashtiring)
└── php-app.json     ← sozlamalar

Hech qanday node_modules, electron, php-binhech narsa. Hammasi global php-app da.

php-app.json — sozlamalar

{
  "name": "Mening ilovam",              // ilova nomi
  "version": "1.0.0",                    // versiya (x.y.z)
  "appId": "com.kompaniya.ilova",        // noyob identifikator (reverse-domain)
  "author": "Abbosjon <email>",          // muallif
  "description": "Qisqa tavsif",         // tavsif
  "icon": "icon.png",                    // ikonka (≥512x512 PNG)
  "index": "app.php",                    // bosh fayl
  "window": { "width": 720, "height": 640, "title": "Mening ilovam" }
}

Build uchun majburiy: name, version, appId, author, icon. Ular bo'lmasa php-app build to'xtaydi va nima yetishmayotganini aytadi. Istalgan vaqtda tekshirish: php-app check.


🧩 Native funksiyalar

JS'dan (window.PhpApp)

<button onclick="PhpApp.notify('Salom', 'Matn')">Bildirishnoma</button>
<script>
  await PhpApp.confirm('Rozimisiz?');       // true/false
  await PhpApp.openFile();                    // fayl dialogi
  await PhpApp.clipboard.write('matn');
  PhpApp.openExternal('https://php.net');
  PhpApp.window.minimize();                    // oyna boshqaruvi
</script>

PHP'dan (PhpApp::)

<?php require 'phpapp.php'; ?>
<?php
  PhpApp::notify('Salom', 'PHP dan bildirishnoma');
  PhpApp::alert('Xabar');
  if (PhpApp::isNative()) { /* native oynadamiz */ }
?>

require 'phpapp.php'; — bu framework kutubxonasini ulaydi. Fayl global paketda turadi (lib/phpapp.php), PHP uni include_path orqali avtomatik topadi — loyihangizga nusxalanmaydi.

Tray, menyu, global tugmalar va hodisalar (v0.2.0)

<script>
  // Tray ikonka + menyu
  PhpApp.tray.set({
    tooltip: 'Mening ilovam',
    icon: 'icon.png',        // ixtiyoriy, loyihaga nisbatan; macOS uchun: template: true + monoxrom PNG
    menu: [
      { id: 'open',  label: 'Ochish', accelerator: 'CmdOrCtrl+O' },
      { type: 'separator' },
      { id: 'quit',  label: 'Chiqish' },
    ],
  });

  // Ilova menyusi (yuqori panel) va kontekst menyu
  PhpApp.menu.setApp([{ label: 'Fayl', submenu: [{ id: 'new', label: 'Yangi' }] }]);
  PhpApp.menu.context([{ id: 'copy', label: 'Nusxa olish' }], x, y); // x/y yo'q → kursor joyida

  // Global tugma (ilova fonda bo'lsa ham ishlaydi)
  PhpApp.shortcut.register('CmdOrCtrl+Shift+P', 'ping');

  // Hodisalarni tinglash
  PhpApp.on('tray.click',  ()  => PhpApp.notify('Tray bosildi'));
  PhpApp.on('menu.click',  (p) => console.log('menyu:', p.id, p.checked));
  PhpApp.on('shortcut',    (p) => PhpApp.notify('Tugma', p.accelerator));
</script>

Hodisalar (PhpApp.on(event, cb)):

| event | payload | qachon | |---|---|---| | tray.click | {} | tray ikonka bosilganda | | menu.click | {id, checked, type} | tray/app/context menyu elementi bosilganda | | shortcut | {id, accelerator} | global tugma bosilganda |

Menyu elementi maydonlari: id, label, type (normal/separator/checkbox/radio), accelerator, enabled, visible, checked, submenu[], role (native rol).

⚠️ Hodisalar faqat JS tomonda. PHP (PhpApp::tray(), PhpApp::appMenu(), PhpApp::registerShortcut()) tray/menyu/tugmani yaratadi, lekin bosilishini tinglay olmaydi — uni PhpApp.on() bilan JS'da tinglang.

macOS menyu panelida eng toza ko'rinish uchun kichik monoxrom PNG bering va template: true qo'shing (rangli ikonka avtomatik 16px'ga kichraytiriladi).


🎨 Screen — faqat PHP UI (v0.3.0)

Butun interfeys, holat va hodisalarни sof PHP'da yozing — HTML/CSS/JS umuman yozmaysiz. app.php ni Screen sifatida yozing:

<?php require 'ui.php';

class Sanoq extends Screen {
    public int $son = 0;                       // public prop = reaktiv holat
    public string $ism = '';

    function build($ui) {
        $ui->appBar('Sanoq');
        $ui->text("Son: {$this->son}")->size(32)->bold()->center();
        $ui->field('ism')->hint('Ismingiz');   // $this->ism ga bog'lanadi
        $ui->row(function ($r) {
            $r->button('−')->onTap('kamayt');
            $r->button('+')->primary()->onTap('oshir');
        })->gap(8)->center();
    }

    function oshir()  { $this->son++; }          // holat o'zgaradi → UI o'zi yangilanadi
    function kamayt() { $this->son--; }
}

App::run(Sanoq::class);

Widgetlar (v0.4.0):

  • Layout: row, column, card, box, grid, scroll, spacer, divider
  • Kontent: appBar, heading, text, link, badge, chip, avatar, progress, spinner, alert, image, icon
  • Input: field, textarea, checkbox, toggle, radio, select, slider
  • Amal: button (variantlar bilan)
  • Ro'yxat: each($items, fn) — dinamik ro'yxat

Modifikatorlar:

  • Matn: ->size() ->bold() ->italic() ->muted() ->small() ->large() ->color() ->align()
  • Quti: ->bg() ->padding() ->paddingX() ->paddingY() ->margin() ->rounded() ->width() ->height() ->shadow() ->border() ->full() ->grow() ->opacity()
  • Flex: ->center() ->between() ->around() ->start() ->end() ->wrap() ->gap() ->cols()
  • Button/badge/alert: ->primary() ->secondary() ->danger() ->success() ->warning() ->ghost() ->outline() ->block() ->disabled()
  • Input: ->hint() ->value() ->type() ->rows() ->min() ->max() ->step() · Hodisa: ->onTap()

Misol (variantlar):

$ui->button('Saqlash')->primary()->block()->onTap('saqla');
$ui->alert('Xato!')->danger();
$ui->each($foydalanuvchilar, function ($u, $item) {
    $u->row(fn($r) => $r->avatar($item['ism'])->text($item['ism'])->grow());
});

Maxsus rang: php-app.json ga "theme": { "primary": "#7c5cff" } qo'shsangiz — butun UI shu rangда. Yoki loyihaga theme.css qo'ysangiz — u avtomatik ulanadi (o'z CSS'ingiz).

Qanday ishlaydi: build() widgetlarni HTML'ga aylantiradi (tayyor light/dark tema bilan). Tugma bosilganda handler (PHP metod) chaqiriladi → public proplar (holat) o'zgaradi → UI qayta chiziladi. Dasturchi bironta HTML/JS yozmaydi.

Qoidalar: reaktiv holat public prop bo'lsin va default qiymatli bo'lsin (public int $son = 0;); app.php faqat class + App::run(...) bo'lsin (har hodisada qaytadan ishlaydi). Handler ichida PhpApp::notify() kabi native chaqiruvlar ham ishlaydi.

Eski uslub (raw PHP+HTML) ham ishlayveradi — ui.phpни require qilmasangiz hech narsa o'zgarmaydi.

Ko'p sahifa (routing) + modular tuzilma (v0.5.0)

Har bir sahifa — alohida Screen class, alohida faylда. app.php ularни ulaydi va route qiladi:

// app.php
<?php require 'ui.php';
require 'pages/HomePage.php';
require 'pages/SettingsPage.php';
App::run([
    'home'     => HomePage::class,   // birinchi = default
    'settings' => SettingsPage::class,
]);
// pages/HomePage.php
<?php class HomePage extends Screen {
    public function build($ui) {
        $ui->appBar('Bosh')->class('bar');
        $ui->button('Sozlamalar →')->onTap('sozlamalar');
    }
    public function sozlamalar() { $this->go('settings'); }   // navigatsiya
}

Handler ичида $this->go('settings') (yoki ->go(SettingsPage::class)) bilan sahifага o'tasiz. Yangi sahифа o'z default holatида ochiladi.

Class-based CSS (PHP'да CSS yozmang)

Widgetlarга ->class('nom') bilan o'z CSS klassingizni ulaysiz; CSS'ни alohida faylда yozasiz:

$ui->text("Son: {$this->son}")->class('counter');
$ui->button('Saqlash')->class('btn primary');
/* styles/app.css — CSS shu yerda, PHP'да emas */
.counter { font-size: 32px; text-align: center; }
.btn { padding: 10px 16px; border-radius: 8px; }

php-app.jsonga ulang:

{ "styles": ["styles/app.css"], "defaultTheme": true }
  • "styles": [...] — o'z CSS fayllaringiz (tartib bilan ulanadi)
  • "defaultTheme": false — tayyor temani butunlay o'chiradi (faqat o'z CSS'ingiz qoladi)
  • theme.css (loyihada) — avtomatik, oxirида ulanadi
  • "theme": {"primary":"#..."} — tez rang o'zgartirish

Komponentlar (qayta ishlatiladigan)

Oddiy PHP funksiya — require qilib chaqirasiz:

// components/userCard.php
function userCard($ui, $u) {
    $ui->card(fn($c) => $c->row(function ($r) use ($u) {
        $r->avatar($u['ism']); $r->text($u['ism'])->class('name')->grow();
    }));
}
// sahifada:  userCard($ui, $foydalanuvchi);

Struktura: app.php · pages/*.php · components/*.php · styles/*.css · theme.css


⚙️ Qanday ishlaydi?

   php-app run
        │
        ▼
  ┌──────────── global php-app paketi ────────────┐
  │  Electron oyna ──→ loyihangizning app.php'si   │
  │                    (bundlangan static PHP)      │
  │       │                                         │
  │  window.PhpApp (JS)      PhpApp:: (PHP)          │
  │       └──────── native ko'prik ────────┘         │
  │                    │                            │
  │              Native OS (bildirishnoma, fayl…)    │
  │                                                 │
  │  📁 fayl o'zgarsa → oyna avtomatik yangilanadi  │
  └─────────────────────────────────────────────────┘
  1. php-app run → Electron loyihangizning app.php'sini bundlangan PHP bilan ishlatadi.
  2. Native amallar: JS'dan IPC orqali, PHP'dan token bilan himoyalangan lokal HTTP orqali.
  3. Loyiha fayllari kuzatiladi — o'zgarish bo'lsa oyna qayta yuklanadi (live reload).

🗂 Paket ichki tuzilishi (dasturchi buni ko'rmaydi)

php-app/
├── bin/php-app.js          ← CLI (create / run / build)
├── runtime/
│   ├── main.js             ← Electron + PHP server + native ko'prik + live reload
│   ├── preload.js          ← window.PhpApp
│   └── php-bin/…/php        ← bundlangan static PHP
├── lib/phpapp.php           ← PHP kutubxonasi (require 'phpapp.php')
└── templates/default/       ← `create` uchun shablon

🔧 Talablar

  • Node.js 18+ (Electron uchun)
  • macOS / Windows / Linux
  • PHP o'rnatilishi shart emasfetch-php.sh ilova ichiga static PHP joylaydi. (Agar bo'lmasa, tizimdagi PHP ishlatiladi.)