Fix async lifecycle ordering, add _spa_init boot phase, update to jqhtml _load_only/_load_render_only flags
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -241,7 +241,7 @@ class Rsx_Breadcrumb_Resolver {
|
||||
|
||||
const parent_action = await Spa.load_detached_action(parent_url, {
|
||||
use_cached_data: true,
|
||||
skip_render_and_ready: true
|
||||
_load_only: true
|
||||
});
|
||||
|
||||
if (!parent_action) break;
|
||||
|
||||
@@ -307,6 +307,11 @@ abstract class Rsx_Bundle_Abstract
|
||||
$rsxapp_data['flash_alerts'] = $flash_messages;
|
||||
}
|
||||
|
||||
// Add realtime WebSocket URL if enabled
|
||||
if (\App\RSpade\Core\Realtime\Realtime::is_enabled()) {
|
||||
$rsxapp_data['realtime_url'] = env('REALTIME_PUBLIC_URL', 'ws://localhost:6200');
|
||||
}
|
||||
|
||||
// Add time data for Rsx_Time initialization
|
||||
$rsxapp_data['server_time'] = \App\RSpade\Core\Time\Rsx_Time::now_iso();
|
||||
$rsxapp_data['user_timezone'] = \App\RSpade\Core\Time\Rsx_Time::get_user_timezone();
|
||||
|
||||
@@ -702,6 +702,7 @@ class Rsx {
|
||||
{ event: 'framework_modules_init', method: '_on_framework_modules_init' },
|
||||
{ event: 'app_modules_init', method: 'on_app_modules_init' },
|
||||
{ event: 'app_init', method: 'on_app_init' },
|
||||
{ event: '_spa_init', method: '_on_spa_init' },
|
||||
{ event: 'app_ready', method: 'on_app_ready' },
|
||||
];
|
||||
|
||||
|
||||
256
app/RSpade/Core/Js/Rsx_Realtime.js
Executable file
256
app/RSpade/Core/Js/Rsx_Realtime.js
Executable file
@@ -0,0 +1,256 @@
|
||||
/**
|
||||
* Rsx_Realtime
|
||||
*
|
||||
* Client-side manager for the WebSocket realtime notification system.
|
||||
*
|
||||
* Connects to the Node.js relay server, handles authentication,
|
||||
* manages subscriptions, and auto-reconnects on disconnect.
|
||||
*
|
||||
* Usage in components:
|
||||
* this.subscribe('Contact_Updated_Topic', {id: this.args.id}, (msg) => {
|
||||
* this.reload();
|
||||
* });
|
||||
*
|
||||
* Usage outside components:
|
||||
* Rsx_Realtime.subscribe('Notification_Topic', (msg) => {
|
||||
* show_notification(msg);
|
||||
* });
|
||||
*/
|
||||
class Rsx_Realtime {
|
||||
|
||||
static _ws = null;
|
||||
static _subscriptions = new Map(); // sub_id → {topic, filter, callback, token}
|
||||
static _sub_counter = 0;
|
||||
static _connected = false;
|
||||
static _authenticated = false;
|
||||
static _reconnect_timer = null;
|
||||
static _reconnect_delay = 1000;
|
||||
static _max_reconnect_delay = 30000;
|
||||
|
||||
/**
|
||||
* Boot: connect if authenticated and realtime is enabled
|
||||
*/
|
||||
static _on_framework_modules_init() {
|
||||
if (!window.rsxapp?.is_auth) return;
|
||||
if (!window.rsxapp?.realtime_url) return;
|
||||
|
||||
Rsx_Realtime._connect();
|
||||
|
||||
// Patch Component prototype for this.subscribe() convenience
|
||||
Rsx_Realtime._patch_component();
|
||||
}
|
||||
|
||||
/**
|
||||
* Connect to the WebSocket server
|
||||
*/
|
||||
static async _connect() {
|
||||
if (Rsx_Realtime._ws) return;
|
||||
|
||||
try {
|
||||
// Get connection token from PHP
|
||||
const response = await Realtime_Controller.get_connection_token();
|
||||
const token = response.token;
|
||||
|
||||
const ws = new WebSocket(window.rsxapp.realtime_url);
|
||||
Rsx_Realtime._ws = ws;
|
||||
|
||||
ws.onopen = () => {
|
||||
console_debug('Realtime', 'Connected, authenticating...');
|
||||
ws.send(JSON.stringify({ type: 'auth', token: token }));
|
||||
};
|
||||
|
||||
ws.onmessage = (e) => {
|
||||
let msg;
|
||||
try {
|
||||
msg = JSON.parse(e.data);
|
||||
} catch {
|
||||
return;
|
||||
}
|
||||
Rsx_Realtime._on_message(msg);
|
||||
};
|
||||
|
||||
ws.onclose = () => {
|
||||
console_debug('Realtime', 'Connection closed');
|
||||
Rsx_Realtime._ws = null;
|
||||
Rsx_Realtime._connected = false;
|
||||
Rsx_Realtime._authenticated = false;
|
||||
Rsx_Realtime._schedule_reconnect();
|
||||
};
|
||||
|
||||
ws.onerror = () => {
|
||||
// onclose will fire after this
|
||||
};
|
||||
} catch (e) {
|
||||
console_debug('Realtime', 'Connection failed: ' + e.message);
|
||||
Rsx_Realtime._schedule_reconnect();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle incoming WebSocket messages
|
||||
*/
|
||||
static _on_message(msg) {
|
||||
if (msg.type === 'auth_ok') {
|
||||
console_debug('Realtime', 'Authenticated');
|
||||
Rsx_Realtime._connected = true;
|
||||
Rsx_Realtime._authenticated = true;
|
||||
Rsx_Realtime._reconnect_delay = 1000;
|
||||
|
||||
// Re-subscribe all active subscriptions
|
||||
Rsx_Realtime._resubscribe_all();
|
||||
return;
|
||||
}
|
||||
|
||||
if (msg.type === 'message') {
|
||||
// Route to matching subscription callbacks
|
||||
for (const [sub_id, sub] of Rsx_Realtime._subscriptions) {
|
||||
if (sub.topic === msg.topic) {
|
||||
try {
|
||||
sub.callback(msg.data);
|
||||
} catch (e) {
|
||||
console.error('[Realtime] Subscription callback error:', e);
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (msg.type === 'error') {
|
||||
console.warn('[Realtime] Server error:', msg.message);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Subscribe to a topic with optional filter
|
||||
*
|
||||
* @param {string} topic - Topic class name (e.g., 'Contact_Updated_Topic')
|
||||
* @param {Object|Function} filter - Filter object or callback if no filter
|
||||
* @param {Function} [callback] - Called when matching message arrives
|
||||
* @returns {Promise<number>} Subscription ID for unsubscribe
|
||||
*/
|
||||
static async subscribe(topic, filter, callback) {
|
||||
if (typeof filter === 'function') {
|
||||
callback = filter;
|
||||
filter = {};
|
||||
}
|
||||
|
||||
const sub_id = ++Rsx_Realtime._sub_counter;
|
||||
|
||||
// Get subscribe token from PHP (checks permissions)
|
||||
const response = await Realtime_Controller.get_subscribe_token({ topic, filter });
|
||||
const token = response.token;
|
||||
|
||||
Rsx_Realtime._subscriptions.set(sub_id, { topic, filter, callback, token });
|
||||
|
||||
// Send subscribe to Node if connected
|
||||
Rsx_Realtime._send_subscribe(sub_id, token);
|
||||
|
||||
return sub_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unsubscribe from a topic
|
||||
*
|
||||
* @param {number} sub_id - Subscription ID from subscribe()
|
||||
*/
|
||||
static unsubscribe(sub_id) {
|
||||
Rsx_Realtime._subscriptions.delete(sub_id);
|
||||
|
||||
if (Rsx_Realtime._ws?.readyState === WebSocket.OPEN) {
|
||||
Rsx_Realtime._ws.send(JSON.stringify({ type: 'unsubscribe', sub_id }));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send subscribe message to Node
|
||||
*/
|
||||
static _send_subscribe(sub_id, token) {
|
||||
if (Rsx_Realtime._ws?.readyState === WebSocket.OPEN && Rsx_Realtime._authenticated) {
|
||||
Rsx_Realtime._ws.send(JSON.stringify({
|
||||
type: 'subscribe',
|
||||
token: token,
|
||||
sub_id: sub_id,
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-subscribe all active subscriptions after reconnect
|
||||
*/
|
||||
static async _resubscribe_all() {
|
||||
for (const [sub_id, sub] of Rsx_Realtime._subscriptions) {
|
||||
// Get fresh subscribe token (old one may have expired)
|
||||
try {
|
||||
const response = await Realtime_Controller.get_subscribe_token({
|
||||
topic: sub.topic,
|
||||
filter: sub.filter,
|
||||
});
|
||||
sub.token = response.token;
|
||||
Rsx_Realtime._send_subscribe(sub_id, sub.token);
|
||||
} catch (e) {
|
||||
// Permission may have changed — remove subscription
|
||||
console_debug('Realtime', 'Re-subscribe failed for ' + sub.topic + ': ' + e.message);
|
||||
Rsx_Realtime._subscriptions.delete(sub_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule reconnection with exponential backoff
|
||||
*/
|
||||
static _schedule_reconnect() {
|
||||
if (Rsx_Realtime._reconnect_timer) return;
|
||||
if (!window.rsxapp?.realtime_url) return;
|
||||
|
||||
console_debug('Realtime', 'Reconnecting in ' + Rsx_Realtime._reconnect_delay + 'ms');
|
||||
|
||||
Rsx_Realtime._reconnect_timer = setTimeout(() => {
|
||||
Rsx_Realtime._reconnect_timer = null;
|
||||
Rsx_Realtime._connect();
|
||||
}, Rsx_Realtime._reconnect_delay);
|
||||
|
||||
// Exponential backoff: 1s, 2s, 4s, 8s, 16s, 30s max
|
||||
Rsx_Realtime._reconnect_delay = Math.min(
|
||||
Rsx_Realtime._reconnect_delay * 2,
|
||||
Rsx_Realtime._max_reconnect_delay
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Patch Component prototype to add this.subscribe() convenience method
|
||||
* and auto-cleanup on stop
|
||||
*/
|
||||
static _patch_component() {
|
||||
// Add subscribe() to Component prototype
|
||||
Component.prototype.subscribe = async function (topic, filter, callback) {
|
||||
if (typeof filter === 'function') {
|
||||
callback = filter;
|
||||
filter = {};
|
||||
}
|
||||
|
||||
const sub_id = await Rsx_Realtime.subscribe(topic, filter, callback);
|
||||
|
||||
if (!this._realtime_subs) this._realtime_subs = [];
|
||||
this._realtime_subs.push(sub_id);
|
||||
|
||||
return sub_id;
|
||||
};
|
||||
|
||||
// Hook into component stop for auto-cleanup
|
||||
const _original_on_stop = Component.prototype.on_stop;
|
||||
Component.prototype.on_stop = function () {
|
||||
// Clean up realtime subscriptions
|
||||
if (this._realtime_subs) {
|
||||
for (const sub_id of this._realtime_subs) {
|
||||
Rsx_Realtime.unsubscribe(sub_id);
|
||||
}
|
||||
this._realtime_subs = null;
|
||||
}
|
||||
|
||||
// Call original on_stop if defined
|
||||
if (_original_on_stop) {
|
||||
_original_on_stop.call(this);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
45
app/RSpade/Core/Realtime/CLAUDE.md
Executable file
45
app/RSpade/Core/Realtime/CLAUDE.md
Executable file
@@ -0,0 +1,45 @@
|
||||
# Realtime WebSocket System
|
||||
|
||||
## Architecture
|
||||
|
||||
PHP (authority) → Redis pub/sub → Node.js relay → WebSocket → Browser
|
||||
|
||||
- **PHP**: Issues HMAC-signed tokens, checks permissions, publishes events
|
||||
- **Node**: Validates tokens, routes messages, stores last-message. Zero business logic
|
||||
- **Browser**: Connects, subscribes, receives notifications, fetches fresh data via Ajax
|
||||
|
||||
## Key Files
|
||||
|
||||
- `Realtime.php` — Static API: `connection_token()`, `subscribe_token()`, `publish()`
|
||||
- `Realtime_Topic_Abstract.php` — Base class for topic permission checks
|
||||
- `Realtime_Controller.php` — Ajax endpoints for browser token requests
|
||||
- `/system/bin/realtime-server.js` — Node.js WebSocket server
|
||||
- `/system/app/RSpade/Core/Js/Rsx_Realtime.js` — Client manager
|
||||
|
||||
## Security Model
|
||||
|
||||
1. **Connection token**: HMAC-signed with APP_KEY, contains user_id + site_id + session_id, expires in 60s
|
||||
2. **Subscribe token**: Per-topic, HMAC-signed, checks `Topic::can_subscribe()` before issuing
|
||||
3. **Site scoping**: Messages only route to connections with matching site_id
|
||||
4. **No confidential data**: Messages are notifications only — clients fetch data through Ajax
|
||||
|
||||
## Token Format
|
||||
|
||||
`base64(json_payload).hmac_sha256_hex`
|
||||
|
||||
Connection: `{user_id, site_id, session_id, exp}`
|
||||
Subscribe: `{topic, filter, site_id, exp}`
|
||||
|
||||
## Redis Channels
|
||||
|
||||
- Pattern: `rsx_rt:{site_id}`
|
||||
- Message: `{topic, data, site_id, ts}`
|
||||
|
||||
## Configuration
|
||||
|
||||
`.env`:
|
||||
```
|
||||
REALTIME_ENABLED=false
|
||||
REALTIME_WS_PORT=6200
|
||||
REALTIME_PUBLIC_URL=ws://localhost:6200
|
||||
```
|
||||
155
app/RSpade/Core/Realtime/Realtime.php
Executable file
155
app/RSpade/Core/Realtime/Realtime.php
Executable file
@@ -0,0 +1,155 @@
|
||||
<?php
|
||||
|
||||
namespace App\RSpade\Core\Realtime;
|
||||
|
||||
use Illuminate\Support\Facades\Redis;
|
||||
use App\RSpade\Core\Manifest\Manifest;
|
||||
use App\RSpade\Core\Realtime\Realtime_Topic_Abstract;
|
||||
use App\RSpade\Core\Session\Session;
|
||||
|
||||
/**
|
||||
* Realtime
|
||||
*
|
||||
* Static API for the WebSocket realtime notification system.
|
||||
*
|
||||
* PHP is the authority — it issues auth tokens, checks permissions,
|
||||
* and publishes events. The Node.js WebSocket server is a dumb relay
|
||||
* that validates HMAC signatures and routes messages.
|
||||
*
|
||||
* Usage:
|
||||
* // Publish after saving a record
|
||||
* Realtime::publish('Contact_Updated_Topic', ['id' => $contact->id]);
|
||||
*
|
||||
* // Generate tokens (called by Realtime_Controller)
|
||||
* $token = Realtime::connection_token();
|
||||
* $token = Realtime::subscribe_token('Contact_Updated_Topic', ['id' => 5]);
|
||||
*/
|
||||
class Realtime
|
||||
{
|
||||
/**
|
||||
* Token expiry in seconds
|
||||
*/
|
||||
private const TOKEN_EXPIRY = 60;
|
||||
|
||||
/**
|
||||
* Redis channel prefix for realtime messages
|
||||
*/
|
||||
private const REDIS_PREFIX = 'rsx_rt';
|
||||
|
||||
/**
|
||||
* Check if realtime is enabled
|
||||
*/
|
||||
public static function is_enabled(): bool
|
||||
{
|
||||
return env('REALTIME_ENABLED', false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a connection token for WebSocket authentication
|
||||
*
|
||||
* Contains user_id, site_id, session_id, and expiry.
|
||||
* Signed with APP_KEY via HMAC-SHA256.
|
||||
* Short-lived (60 seconds) — only valid for initial handshake.
|
||||
*
|
||||
* @return string Signed token
|
||||
*/
|
||||
public static function connection_token(): string
|
||||
{
|
||||
$payload = [
|
||||
'user_id' => Session::get_user_id(),
|
||||
'site_id' => Session::get_site_id(),
|
||||
'session_id' => Session::get_session_id(),
|
||||
'exp' => time() + self::TOKEN_EXPIRY,
|
||||
];
|
||||
|
||||
return self::_sign_token($payload);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a subscribe token for a specific topic
|
||||
*
|
||||
* Checks the topic's can_subscribe() method first.
|
||||
* Contains topic name, filter, site_id, and expiry.
|
||||
*
|
||||
* @param string $topic_class Topic class name (e.g., 'Contact_Updated_Topic')
|
||||
* @param array $filter Subscription filter (e.g., ['id' => 5])
|
||||
* @return string Signed token
|
||||
* @throws \RuntimeException If topic class not found or permission denied
|
||||
*/
|
||||
public static function subscribe_token(string $topic_class, array $filter = []): string
|
||||
{
|
||||
// Resolve topic class
|
||||
$fqcn = Manifest::resolve_class($topic_class);
|
||||
|
||||
if (!$fqcn) {
|
||||
throw new \RuntimeException("Realtime topic class not found: {$topic_class}");
|
||||
}
|
||||
|
||||
if (!is_subclass_of($fqcn, Realtime_Topic_Abstract::class)) {
|
||||
throw new \RuntimeException("Class {$topic_class} is not a Realtime_Topic_Abstract");
|
||||
}
|
||||
|
||||
// Check permission
|
||||
if (!$fqcn::can_subscribe($filter)) {
|
||||
throw new \RuntimeException("Permission denied for topic: {$topic_class}");
|
||||
}
|
||||
|
||||
$payload = [
|
||||
'topic' => $topic_class,
|
||||
'filter' => $filter,
|
||||
'site_id' => Session::get_site_id(),
|
||||
'exp' => time() + self::TOKEN_EXPIRY,
|
||||
];
|
||||
|
||||
return self::_sign_token($payload);
|
||||
}
|
||||
|
||||
/**
|
||||
* Publish a message to all subscribers of a topic
|
||||
*
|
||||
* Sends via Redis pub/sub to the Node.js WebSocket server.
|
||||
* Messages are scoped to the current site_id automatically.
|
||||
*
|
||||
* IMPORTANT: Never include confidential data in the payload.
|
||||
* Messages are notifications only — clients fetch fresh data
|
||||
* through normal Ajax after receiving a notification.
|
||||
*
|
||||
* @param string $topic_class Topic class name (e.g., 'Contact_Updated_Topic')
|
||||
* @param array $data Notification payload (e.g., ['id' => 5, 'updated_by' => 3])
|
||||
*/
|
||||
public static function publish(string $topic_class, array $data = []): void
|
||||
{
|
||||
if (!self::is_enabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
$site_id = Session::get_site_id();
|
||||
|
||||
$message = json_encode([
|
||||
'topic' => $topic_class,
|
||||
'data' => $data,
|
||||
'site_id' => $site_id,
|
||||
'ts' => time(),
|
||||
]);
|
||||
|
||||
$channel = self::REDIS_PREFIX . ':' . $site_id;
|
||||
|
||||
Redis::publish($channel, $message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sign a payload with HMAC-SHA256
|
||||
*
|
||||
* Token format: base64(json_payload).base64(hmac_signature)
|
||||
*
|
||||
* @param array $payload Data to sign
|
||||
* @return string Signed token
|
||||
*/
|
||||
private static function _sign_token(array $payload): string
|
||||
{
|
||||
$json = json_encode($payload);
|
||||
$signature = hash_hmac('sha256', $json, config('app.key'));
|
||||
|
||||
return base64_encode($json) . '.' . $signature;
|
||||
}
|
||||
}
|
||||
65
app/RSpade/Core/Realtime/Realtime_Controller.php
Executable file
65
app/RSpade/Core/Realtime/Realtime_Controller.php
Executable file
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
|
||||
namespace App\RSpade\Core\Realtime;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use App\RSpade\Core\Controller\Rsx_Controller_Abstract;
|
||||
use App\RSpade\Core\Realtime\Realtime;
|
||||
use App\RSpade\Core\Session\Session;
|
||||
|
||||
/**
|
||||
* Realtime_Controller
|
||||
*
|
||||
* Ajax endpoints for WebSocket token generation.
|
||||
* Called by Rsx_Realtime.js to authenticate and subscribe.
|
||||
*/
|
||||
class Realtime_Controller extends Rsx_Controller_Abstract
|
||||
{
|
||||
public static function pre_dispatch(Request $request, array $params = [])
|
||||
{
|
||||
if (!Session::is_logged_in()) {
|
||||
return response_unauthorized();
|
||||
}
|
||||
|
||||
if (!Realtime::is_enabled()) {
|
||||
return response_error(\App\RSpade\Core\Ajax\Ajax::ERROR_GENERIC, 'Realtime is not enabled');
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a connection token for WebSocket authentication
|
||||
*/
|
||||
#[Ajax_Endpoint]
|
||||
public static function get_connection_token(Request $request, array $params = [])
|
||||
{
|
||||
return ['token' => Realtime::connection_token()];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a subscribe token for a specific topic
|
||||
*
|
||||
* Params:
|
||||
* topic - Topic class name (e.g., 'Contact_Updated_Topic')
|
||||
* filter - Optional filter object (e.g., {id: 5})
|
||||
*/
|
||||
#[Ajax_Endpoint]
|
||||
public static function get_subscribe_token(Request $request, array $params = [])
|
||||
{
|
||||
$topic = $params['topic'] ?? null;
|
||||
$filter = $params['filter'] ?? [];
|
||||
|
||||
if (empty($topic)) {
|
||||
return response_error(\App\RSpade\Core\Ajax\Ajax::ERROR_VALIDATION, 'Topic is required');
|
||||
}
|
||||
|
||||
if (!is_array($filter)) {
|
||||
$filter = [];
|
||||
}
|
||||
|
||||
$token = Realtime::subscribe_token($topic, $filter);
|
||||
|
||||
return ['token' => $token];
|
||||
}
|
||||
}
|
||||
35
app/RSpade/Core/Realtime/Realtime_Topic_Abstract.php
Executable file
35
app/RSpade/Core/Realtime/Realtime_Topic_Abstract.php
Executable file
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
namespace App\RSpade\Core\Realtime;
|
||||
|
||||
/**
|
||||
* Realtime_Topic_Abstract
|
||||
*
|
||||
* Base class for realtime notification topics. Each topic class defines
|
||||
* who can subscribe to messages on that topic.
|
||||
*
|
||||
* Topics are notification-only — messages must never contain confidential
|
||||
* data. They indicate that something happened (e.g., "record updated")
|
||||
* and the client reacts by fetching fresh data through normal Ajax.
|
||||
*
|
||||
* Example:
|
||||
* class Contact_Updated_Topic extends Realtime_Topic_Abstract {
|
||||
* public static function can_subscribe(array $filter = []): bool {
|
||||
* return Permission::has_permission(User_Model::PERM_VIEW_DATA);
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
abstract class Realtime_Topic_Abstract
|
||||
{
|
||||
/**
|
||||
* Check if the current user can subscribe to this topic
|
||||
*
|
||||
* Called by Realtime::subscribe_token() before issuing a token.
|
||||
* Use standard RSpade auth patterns: Session::get_user_id(),
|
||||
* Permission::has_permission(), etc.
|
||||
*
|
||||
* @param array $filter The subscription filter (e.g., ['id' => 5])
|
||||
* @return bool
|
||||
*/
|
||||
abstract public static function can_subscribe(array $filter = []): bool;
|
||||
}
|
||||
@@ -175,11 +175,24 @@ class Spa {
|
||||
// See: /docs.dev/SPA_BROWSER_INTEGRATION.md for details
|
||||
console.log('[Spa] Using History API for browser integration');
|
||||
Spa.setup_browser_integration();
|
||||
}
|
||||
|
||||
/**
|
||||
* SPA init phase - dispatches initial route after all app code has initialized
|
||||
*
|
||||
* Runs after on_app_init and before on_app_ready. Awaiting ensures the
|
||||
* initial action's full lifecycle (on_load, on_ready) completes before
|
||||
* on_app_ready fires, so app code in on_app_ready can reference
|
||||
* Spa.action(), layout state, etc.
|
||||
*/
|
||||
static async _on_spa_init() {
|
||||
if (!window.rsxapp || !window.rsxapp.is_spa) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Dispatch to current URL (including hash for initial load)
|
||||
const initial_url = window.location.pathname + window.location.search + window.location.hash;
|
||||
console_debug('Spa', 'Dispatching to initial URL: ' + initial_url);
|
||||
Spa.dispatch(initial_url, { history: 'none' });
|
||||
await Spa.dispatch(initial_url, { history: 'none' });
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1104,12 +1117,11 @@ class Spa {
|
||||
const action_name = action_class.name;
|
||||
|
||||
// Merge URL args with extra_args (extra_args take precedence)
|
||||
// Include skip_render_and_ready to prevent side effects from on_ready()
|
||||
// (e.g., Spa.dispatch() which would cause redirect loops)
|
||||
// Include _load_only to skip render/on_ready (detached, no DOM needed)
|
||||
const args = {
|
||||
...route_match.args,
|
||||
...extra_args,
|
||||
skip_render_and_ready: true
|
||||
_load_only: true
|
||||
};
|
||||
|
||||
console_debug('Spa', `load_detached_action: Loading ${action_name} with args:`, args);
|
||||
|
||||
@@ -133,10 +133,9 @@ class Jqhtml_Integration {
|
||||
* - Recursive nested component handling
|
||||
* - Promise tracking for async components
|
||||
*/
|
||||
static _on_framework_modules_init() {
|
||||
jqhtml.boot().then(() => {
|
||||
Rsx.trigger('jqhtml_ready');
|
||||
});
|
||||
static async _on_framework_modules_init() {
|
||||
await jqhtml.boot();
|
||||
Rsx.trigger('jqhtml_ready');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -563,6 +563,57 @@ COMPONENT LIFECYCLE
|
||||
- on_create(), on_render(), on_stop() must be synchronous
|
||||
- on_load(), after_load(), and on_ready() can be async
|
||||
|
||||
LIFECYCLE SKIP FLAGS
|
||||
Two flags truncate the component lifecycle. Both cascade to children
|
||||
automatically and are excluded from cache identity.
|
||||
|
||||
_load_only
|
||||
on_create + on_load only. No render, no children, no DOM hooks.
|
||||
|
||||
Lifecycle:
|
||||
on_create() → on_load() → READY
|
||||
|
||||
Skips: render, on_render, after_load, on_ready
|
||||
No child components are created (render never runs).
|
||||
|
||||
Use case: Loading data from a component without creating its UI.
|
||||
Example: Spa.load_detached_action() uses this to fetch action data
|
||||
(title, breadcrumbs) without rendering the full page.
|
||||
|
||||
Usage:
|
||||
$('<div>').component('My_Action', { id: 5, _load_only: true });
|
||||
|
||||
_load_render_only
|
||||
on_create + render + on_load + re-render. No DOM-interaction hooks.
|
||||
|
||||
Lifecycle:
|
||||
on_create() → render → on_load() → re-render → READY
|
||||
|
||||
Skips: on_render, after_load, on_ready
|
||||
Children ARE created (render runs), and their on_load() fires too.
|
||||
The full component tree is built with loaded data, but no DOM
|
||||
interaction (event handlers, plugin init, layout measurement).
|
||||
|
||||
Use case: Preloading SPA routes to warm the Ajax/ORM cache. The
|
||||
entire page tree loads data in the background so that when the user
|
||||
navigates, cached data makes the page instant.
|
||||
|
||||
Usage:
|
||||
$('<div>').component('My_Action', {
|
||||
id: 5,
|
||||
_load_render_only: true,
|
||||
use_cached_data: true
|
||||
});
|
||||
|
||||
Cascading:
|
||||
Both flags propagate from parent to children during render.
|
||||
A child can override by explicitly setting the flag to false.
|
||||
|
||||
Cache Identity:
|
||||
These flags (and all _ prefixed args) are excluded from cache keys.
|
||||
A component with {id: 1, _load_only: true} shares the same cache
|
||||
as {id: 1} without the flag.
|
||||
|
||||
ON_CREATE() USE CASES
|
||||
The on_create() method runs BEFORE the first render, making it perfect
|
||||
for initializing default state that templates will reference:
|
||||
@@ -975,9 +1026,9 @@ LIFECYCLE EVENT CALLBACKS
|
||||
- Custom events also supported (see CUSTOM COMPONENT EVENTS)
|
||||
|
||||
Example - Wait for component initialization:
|
||||
// Initialize nested components after parent ready
|
||||
// React when dashboard component is ready
|
||||
$('#parent').component('Dashboard').on('ready', function() {
|
||||
Jqhtml_Integration._on_framework_modules_init($(this));
|
||||
console.log('Dashboard loaded:', this.data);
|
||||
});
|
||||
|
||||
// Process component data after load
|
||||
|
||||
290
app/RSpade/man/realtime.txt
Executable file
290
app/RSpade/man/realtime.txt
Executable file
@@ -0,0 +1,290 @@
|
||||
NAME
|
||||
realtime - WebSocket realtime notification system
|
||||
|
||||
SYNOPSIS
|
||||
// PHP: Publish a notification
|
||||
Realtime::publish('Contact_Updated_Topic', ['id' => $contact->id]);
|
||||
|
||||
// JavaScript: Subscribe in a component (auto-unsubscribes on stop)
|
||||
this.subscribe('Contact_Updated_Topic', {id: this.args.id}, (msg) => {
|
||||
this.reload();
|
||||
});
|
||||
|
||||
// PHP: Define a topic with permission check
|
||||
class Contact_Updated_Topic extends Realtime_Topic_Abstract {
|
||||
public static function can_subscribe(array $filter = []): bool {
|
||||
return Permission::has_permission(User_Model::PERM_VIEW_DATA);
|
||||
}
|
||||
}
|
||||
|
||||
DESCRIPTION
|
||||
The RSpade realtime system provides WebSocket-based notifications so
|
||||
the browser can react to server-side events without polling.
|
||||
|
||||
Messages are NOTIFICATIONS ONLY. They indicate that something happened
|
||||
(e.g., "contact 5 was updated by user 3") and the client reacts by
|
||||
fetching fresh data through normal Ajax. Messages must NEVER contain
|
||||
confidential data — any authenticated user on a site who subscribes to
|
||||
a topic will receive the notification.
|
||||
|
||||
Architecture:
|
||||
|
||||
PHP (authority) Node.js (dumb relay) Browser
|
||||
--------------- -------------------- -------
|
||||
publish() --> Redis pub/sub --> Node --> WebSocket
|
||||
connection_token() --> signed token -----------> WS auth
|
||||
subscribe_token() --> signed token -----------> WS subscribe
|
||||
can_subscribe() <-- called before issuing token
|
||||
|
||||
PHP is the authority — issues HMAC-signed tokens, checks permissions,
|
||||
publishes events. The Node.js process is a stateless relay that validates
|
||||
token signatures, routes messages, and stores last-message for replay.
|
||||
It has zero business logic and zero database access.
|
||||
|
||||
Site ID scoping: Every WebSocket connection is tagged with the user's
|
||||
site_id from their connection token. Messages published with a site_id
|
||||
only route to connections on that site. Messages never cross site
|
||||
boundaries.
|
||||
|
||||
SETUP
|
||||
1. Add to .env:
|
||||
|
||||
REALTIME_ENABLED=true
|
||||
REALTIME_WS_PORT=6200
|
||||
REALTIME_PUBLIC_URL=ws://localhost:6200
|
||||
|
||||
2. Start the Node.js server:
|
||||
|
||||
node system/bin/realtime-server.js
|
||||
|
||||
3. The client auto-connects when REALTIME_ENABLED=true and the user
|
||||
is authenticated. No client-side configuration needed.
|
||||
|
||||
Environment Variables:
|
||||
REALTIME_ENABLED Enable/disable the system (default: false)
|
||||
REALTIME_WS_PORT WebSocket server port (default: 6200)
|
||||
REALTIME_PUBLIC_URL URL clients connect to (default: ws://localhost:6200)
|
||||
|
||||
The server reads APP_KEY from .env for HMAC token validation and
|
||||
REDIS_HOST/REDIS_PORT/REDIS_PASSWORD for pub/sub.
|
||||
|
||||
TOPICS
|
||||
Topics are PHP classes that define who can subscribe to a channel
|
||||
of notifications. Place them in /rsx/lib/topics/.
|
||||
|
||||
Creating a topic:
|
||||
|
||||
// /rsx/lib/topics/Contact_Updated_Topic.php
|
||||
class Contact_Updated_Topic extends Realtime_Topic_Abstract {
|
||||
public static function can_subscribe(array $filter = []): bool {
|
||||
// Any authenticated user on the site can subscribe
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
Permission-restricted topic:
|
||||
|
||||
class Admin_Alert_Topic extends Realtime_Topic_Abstract {
|
||||
public static function can_subscribe(array $filter = []): bool {
|
||||
return Permission::has_role(User_Model::ROLE_ADMIN);
|
||||
}
|
||||
}
|
||||
|
||||
The can_subscribe() method runs in the context of the current user's
|
||||
session. Use Session::get_user_id(), Permission::has_permission(), etc.
|
||||
|
||||
Topic naming convention: {Model_or_Feature}_{Event}_Topic
|
||||
Examples: Contact_Updated_Topic, Invoice_Created_Topic, Chat_Message_Topic
|
||||
|
||||
PUBLISHING
|
||||
Publish from PHP controllers or services after an event occurs:
|
||||
|
||||
#[Ajax_Endpoint]
|
||||
public static function save(Request $request, array $params = []) {
|
||||
$contact = Contact_Model::find($params['id']);
|
||||
$contact->name = $params['name'];
|
||||
$contact->save();
|
||||
|
||||
// Notify subscribers
|
||||
Realtime::publish('Contact_Updated_Topic', [
|
||||
'id' => $contact->id,
|
||||
'updated_by' => Session::get_user_id(),
|
||||
]);
|
||||
|
||||
return ['success' => true];
|
||||
}
|
||||
|
||||
Publishing from scheduled tasks:
|
||||
|
||||
#[Task('Process daily report')]
|
||||
public static function generate_report(Task_Instance $task, array $params = []) {
|
||||
// ... generate report ...
|
||||
Realtime::publish('Report_Ready_Topic', ['report_id' => $report->id]);
|
||||
}
|
||||
|
||||
Publish is a no-op when REALTIME_ENABLED=false. Safe to leave publish
|
||||
calls in code regardless of whether realtime is enabled.
|
||||
|
||||
Payload guidelines:
|
||||
- Include record IDs so clients can filter: ['id' => 5]
|
||||
- Include actor ID for "someone else changed this": ['updated_by' => 3]
|
||||
- NEVER include record data, field values, or PII
|
||||
- Keep payloads small — they are routing hints, not data
|
||||
|
||||
SUBSCRIBING (JavaScript)
|
||||
In components — auto-unsubscribes when component is destroyed:
|
||||
|
||||
class Contacts_View_Action extends Spa_Action {
|
||||
async on_load() {
|
||||
this.data.contact = await Contact_Model.fetch(this.args.id);
|
||||
}
|
||||
|
||||
on_ready() {
|
||||
// Subscribe with filter — only get updates for this contact
|
||||
this.subscribe('Contact_Updated_Topic', {id: this.args.id}, (msg) => {
|
||||
this.reload();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Without filter — receive all messages for a topic:
|
||||
|
||||
on_ready() {
|
||||
this.subscribe('Contact_Updated_Topic', (msg) => {
|
||||
// msg.id tells us which contact was updated
|
||||
this.reload();
|
||||
});
|
||||
}
|
||||
|
||||
Outside components (e.g., in layouts or global code):
|
||||
|
||||
const sub_id = await Rsx_Realtime.subscribe('Notification_Topic', (msg) => {
|
||||
show_notification(msg);
|
||||
});
|
||||
|
||||
// Manual unsubscribe when no longer needed
|
||||
Rsx_Realtime.unsubscribe(sub_id);
|
||||
|
||||
Filter parameters:
|
||||
Filters do shallow key matching. A subscription with filter {id: 5}
|
||||
only receives messages where data.id === 5. Multiple filter keys are
|
||||
AND-ed: {id: 5, type: 'invoice'} matches only when both match.
|
||||
|
||||
SERVER-SIDE FILTERING
|
||||
Filtering happens on the Node.js server, not in the browser. When you
|
||||
subscribe with a filter, only messages matching that filter are sent
|
||||
over the WebSocket. This is efficient — a page watching contact #5
|
||||
does not receive traffic for contacts #1-#4 and #6-#10000.
|
||||
|
||||
LAST-MESSAGE REPLAY
|
||||
When subscribing to a topic, the server sends the last message that
|
||||
matched the subscription (if any). This means if a contact was updated
|
||||
5 minutes ago and you navigate to its view page, you immediately get
|
||||
the last update notification and can decide whether to refresh.
|
||||
|
||||
This is useful for:
|
||||
- Catching updates that happened while navigating
|
||||
- Initial state sync without polling
|
||||
- "Last known update" indicators
|
||||
|
||||
Replay messages have replay: true in the message object. The callback
|
||||
receives them identically to live messages.
|
||||
|
||||
AUTO-RECONNECT
|
||||
The client automatically reconnects with exponential backoff:
|
||||
1s, 2s, 4s, 8s, 16s, up to 30s max. On reconnect, all active
|
||||
subscriptions are re-established with fresh tokens.
|
||||
|
||||
Component subscriptions survive reconnection — no special handling
|
||||
needed. The framework manages the full lifecycle.
|
||||
|
||||
DEPLOYMENT CONSIDERATIONS
|
||||
Starting the server:
|
||||
|
||||
# Development
|
||||
node system/bin/realtime-server.js
|
||||
|
||||
# Production with systemd
|
||||
[Unit]
|
||||
Description=RSpade Realtime Server
|
||||
After=redis.service
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/bin/node /var/www/html/system/bin/realtime-server.js
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
User=www-data
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
||||
Server restart: Clients auto-reconnect. No data loss — messages
|
||||
published while the server is down are not queued (Redis pub/sub is
|
||||
fire-and-forget), but clients will refresh data on next interaction.
|
||||
|
||||
Multiple app servers: All PHP servers publish to the same Redis
|
||||
instance. A single Node.js process handles all WebSocket connections.
|
||||
|
||||
Nginx reverse proxy for wss:// in production:
|
||||
|
||||
location /ws {
|
||||
proxy_pass http://127.0.0.1:6200;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_read_timeout 86400;
|
||||
}
|
||||
|
||||
With this config, set REALTIME_PUBLIC_URL=wss://yourdomain.com/ws
|
||||
|
||||
Scaling: A single Node.js process comfortably handles thousands of
|
||||
concurrent WebSocket connections. The server logs connection and
|
||||
subscription counts every 60 seconds when connections are active.
|
||||
|
||||
Monitoring: The server logs to stdout:
|
||||
[realtime] WebSocket server listening on port 6200
|
||||
[realtime] Connected to Redis at 127.0.0.1:6379
|
||||
[realtime] Connections: 42, Subscriptions: 156, Cached messages: 23
|
||||
|
||||
SECURITY
|
||||
Connection tokens:
|
||||
- HMAC-SHA256 signed with APP_KEY
|
||||
- 60-second expiry (only for initial handshake)
|
||||
- Contains user_id, site_id, session_id
|
||||
|
||||
Subscribe tokens:
|
||||
- Per-topic permission check via can_subscribe()
|
||||
- HMAC-SHA256 signed with APP_KEY
|
||||
- 60-second expiry
|
||||
- Contains topic, filter, site_id
|
||||
|
||||
Site ID scoping:
|
||||
- Connection tagged with site_id from token
|
||||
- Subscribe token site_id must match connection site_id
|
||||
- Messages only route to matching site_id connections
|
||||
- Messages NEVER cross site boundaries
|
||||
|
||||
No confidential data:
|
||||
- Messages are notification hints, not data payloads
|
||||
- Client fetches fresh data through normal Ajax with normal auth
|
||||
- Topic payloads should contain only: IDs, action types, actor IDs
|
||||
|
||||
API REFERENCE
|
||||
PHP:
|
||||
Realtime::is_enabled() Check if realtime is on
|
||||
Realtime::connection_token() Generate WS auth token
|
||||
Realtime::subscribe_token($topic, $filter) Generate subscribe token
|
||||
Realtime::publish($topic, $data) Publish to subscribers
|
||||
|
||||
JavaScript:
|
||||
Rsx_Realtime.subscribe(topic, [filter], callback) Subscribe (returns sub_id)
|
||||
Rsx_Realtime.unsubscribe(sub_id) Unsubscribe
|
||||
this.subscribe(topic, [filter], callback) Component shorthand
|
||||
|
||||
Topic class:
|
||||
Realtime_Topic_Abstract::can_subscribe($filter) Permission check (abstract)
|
||||
|
||||
SEE ALSO
|
||||
rsx:man model_fetch
|
||||
rsx:man spa
|
||||
rsx:man session
|
||||
@@ -189,9 +189,21 @@ JAVASCRIPT INTEGRATION
|
||||
- Use static on_app_ready() method for initialization
|
||||
- No manual registration required
|
||||
|
||||
Lifecycle timing:
|
||||
- on_app_ready(): Runs when page is ready for initialization
|
||||
- For component readiness: await $(element).component().ready()
|
||||
Lifecycle timing (boot phases in order):
|
||||
- _on_framework_core_define() Framework core class registration
|
||||
- _on_framework_modules_define() Component/module registration
|
||||
- _on_framework_core_init() Framework core initialization
|
||||
- on_app_modules_define() App module registration
|
||||
- on_app_define() App class registration
|
||||
- _on_framework_modules_init() Framework module init (jqhtml boot, SPA route setup)
|
||||
- on_app_modules_init() App module initialization
|
||||
- on_app_init() App initialization
|
||||
- _on_spa_init() SPA initial dispatch (awaits action ready)
|
||||
- on_app_ready() App ready (SPA action fully loaded if applicable)
|
||||
|
||||
Underscore-prefixed methods are framework-internal.
|
||||
on_app_ready() is for app code — on SPA pages, Spa.action() is available.
|
||||
For component readiness: await $(element).component().ready()
|
||||
|
||||
Important limitation:
|
||||
JavaScript only executes when bundle is rendered in HTML output.
|
||||
|
||||
@@ -111,10 +111,15 @@ SPA ARCHITECTURE
|
||||
1. User navigates to SPA route (e.g., /contacts)
|
||||
2. Dispatcher calls bootstrap controller
|
||||
3. Bootstrap returns rsx_view(SPA) with window.rsxapp.is_spa = true
|
||||
4. Client JavaScript discovers all actions via manifest
|
||||
5. Router matches URL to action class
|
||||
6. Creates layout on <body>
|
||||
7. Creates action inside layout $sid="content" area
|
||||
4. Framework boot: jqhtml hydrates DOM, SPA discovers actions and
|
||||
sets up browser integration (framework_modules_init phase)
|
||||
5. App modules initialize (app_modules_init, app_init phases)
|
||||
6. SPA dispatches initial URL (_spa_init phase):
|
||||
- Router matches URL to action class
|
||||
- Creates layout on #spa-root
|
||||
- Creates action inside layout $sid="content" area
|
||||
- Awaits action lifecycle (on_load, on_ready) to complete
|
||||
7. on_app_ready fires — Spa.action() is available
|
||||
|
||||
Subsequent Navigation:
|
||||
1. User clicks link or calls Spa.dispatch()
|
||||
@@ -927,8 +932,9 @@ COMMON PATTERNS
|
||||
|
||||
DETACHED ACTION LOADING
|
||||
Spa.load_detached_action() loads an action without affecting the live SPA state.
|
||||
The action is instantiated on a detached DOM element, runs its full lifecycle
|
||||
(including on_load), and returns the component instance for inspection.
|
||||
The action is instantiated on a detached DOM element with the _load_only flag
|
||||
(on_create + on_load only, no render/children), and returns the component
|
||||
instance for inspection.
|
||||
|
||||
Use cases:
|
||||
- Extracting action metadata (titles, breadcrumbs) for navigation UI
|
||||
|
||||
370
bin/realtime-server.js
Executable file
370
bin/realtime-server.js
Executable file
@@ -0,0 +1,370 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* RSpade Realtime WebSocket Server
|
||||
*
|
||||
* Dumb relay: validates HMAC tokens, routes messages by site_id + topic + filter.
|
||||
* Zero business logic, zero database access. PHP is the authority.
|
||||
*
|
||||
* Usage: node system/bin/realtime-server.js
|
||||
*
|
||||
* Requires .env: APP_KEY, REDIS_HOST, REDIS_PORT, REDIS_PASSWORD,
|
||||
* REALTIME_WS_PORT (default 6200)
|
||||
*/
|
||||
|
||||
const { WebSocketServer } = require('ws');
|
||||
const { createClient } = require('redis');
|
||||
const crypto = require('crypto');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Configuration
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
// Load .env from project root
|
||||
const env_path = path.resolve(__dirname, '../../.env');
|
||||
if (fs.existsSync(env_path)) {
|
||||
const env_content = fs.readFileSync(env_path, 'utf8');
|
||||
for (const line of env_content.split('\n')) {
|
||||
const trimmed = line.trim();
|
||||
if (!trimmed || trimmed.startsWith('#')) continue;
|
||||
const eq = trimmed.indexOf('=');
|
||||
if (eq === -1) continue;
|
||||
const key = trimmed.substring(0, eq);
|
||||
let value = trimmed.substring(eq + 1);
|
||||
// Strip surrounding quotes
|
||||
if ((value.startsWith('"') && value.endsWith('"')) ||
|
||||
(value.startsWith("'") && value.endsWith("'"))) {
|
||||
value = value.slice(1, -1);
|
||||
}
|
||||
if (!process.env[key]) {
|
||||
process.env[key] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const WS_PORT = parseInt(process.env.REALTIME_WS_PORT || '6200', 10);
|
||||
const APP_KEY = process.env.APP_KEY || '';
|
||||
const REDIS_HOST = process.env.REDIS_HOST || '127.0.0.1';
|
||||
const REDIS_PORT = parseInt(process.env.REDIS_PORT || '6379', 10);
|
||||
const REDIS_PASSWORD = process.env.REDIS_PASSWORD === 'null' ? undefined : process.env.REDIS_PASSWORD;
|
||||
const REDIS_PREFIX = 'rsx_rt';
|
||||
|
||||
const HEARTBEAT_INTERVAL = 30000; // 30 seconds
|
||||
const PONG_TIMEOUT = 10000; // 10 seconds to respond
|
||||
const AUTH_TIMEOUT = 5000; // 5 seconds to authenticate after connect
|
||||
|
||||
if (!APP_KEY) {
|
||||
console.error('[realtime] APP_KEY not set in .env');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// State
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
// ws → { user_id, site_id, session_id, authenticated, subscriptions: Map<sub_id, {topic, filter}>, alive }
|
||||
const connections = new Map();
|
||||
|
||||
// "site_id:topic:filter_hash" → { topic, data, ts }
|
||||
const last_messages = new Map();
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Token validation
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
function validate_token(token_string) {
|
||||
const dot = token_string.indexOf('.');
|
||||
if (dot === -1) return null;
|
||||
|
||||
const payload_b64 = token_string.substring(0, dot);
|
||||
const signature = token_string.substring(dot + 1);
|
||||
|
||||
let json;
|
||||
try {
|
||||
json = Buffer.from(payload_b64, 'base64').toString('utf8');
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Verify HMAC
|
||||
const expected = crypto.createHmac('sha256', APP_KEY).update(json).digest('hex');
|
||||
if (!crypto.timingSafeEqual(Buffer.from(signature, 'hex'), Buffer.from(expected, 'hex'))) {
|
||||
return null;
|
||||
}
|
||||
|
||||
let payload;
|
||||
try {
|
||||
payload = JSON.parse(json);
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Check expiry
|
||||
if (payload.exp && payload.exp < Math.floor(Date.now() / 1000)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return payload;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Filter matching
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
function matches_filter(subscription_filter, message_data) {
|
||||
if (!subscription_filter || Object.keys(subscription_filter).length === 0) return true;
|
||||
for (const key in subscription_filter) {
|
||||
if (String(message_data[key]) !== String(subscription_filter[key])) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function filter_hash(filter) {
|
||||
if (!filter || Object.keys(filter).length === 0) return '_';
|
||||
const sorted = Object.keys(filter).sort().map(k => k + '=' + filter[k]).join('&');
|
||||
return crypto.createHash('md5').update(sorted).digest('hex').substring(0, 12);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// WebSocket Server
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const wss = new WebSocketServer({ port: WS_PORT });
|
||||
|
||||
wss.on('listening', () => {
|
||||
console.log(`[realtime] WebSocket server listening on port ${WS_PORT}`);
|
||||
});
|
||||
|
||||
wss.on('connection', (ws) => {
|
||||
const conn = {
|
||||
user_id: null,
|
||||
site_id: null,
|
||||
session_id: null,
|
||||
authenticated: false,
|
||||
subscriptions: new Map(),
|
||||
alive: true,
|
||||
};
|
||||
connections.set(ws, conn);
|
||||
|
||||
// Require authentication within timeout
|
||||
const auth_timer = setTimeout(() => {
|
||||
if (!conn.authenticated) {
|
||||
ws.close(4001, 'Authentication timeout');
|
||||
}
|
||||
}, AUTH_TIMEOUT);
|
||||
|
||||
ws.on('pong', () => {
|
||||
conn.alive = true;
|
||||
});
|
||||
|
||||
ws.on('message', (raw) => {
|
||||
let msg;
|
||||
try {
|
||||
msg = JSON.parse(raw.toString());
|
||||
} catch {
|
||||
return;
|
||||
}
|
||||
|
||||
if (msg.type === 'auth') {
|
||||
handle_auth(ws, conn, msg, auth_timer);
|
||||
} else if (!conn.authenticated) {
|
||||
ws.close(4001, 'Not authenticated');
|
||||
} else if (msg.type === 'subscribe') {
|
||||
handle_subscribe(ws, conn, msg);
|
||||
} else if (msg.type === 'unsubscribe') {
|
||||
handle_unsubscribe(conn, msg);
|
||||
}
|
||||
});
|
||||
|
||||
ws.on('close', () => {
|
||||
clearTimeout(auth_timer);
|
||||
connections.delete(ws);
|
||||
});
|
||||
|
||||
ws.on('error', () => {
|
||||
clearTimeout(auth_timer);
|
||||
connections.delete(ws);
|
||||
});
|
||||
});
|
||||
|
||||
function handle_auth(ws, conn, msg, auth_timer) {
|
||||
if (conn.authenticated) return;
|
||||
|
||||
const payload = validate_token(msg.token || '');
|
||||
if (!payload || !payload.user_id || payload.site_id === undefined) {
|
||||
ws.close(4003, 'Invalid token');
|
||||
return;
|
||||
}
|
||||
|
||||
conn.user_id = payload.user_id;
|
||||
conn.site_id = payload.site_id;
|
||||
conn.session_id = payload.session_id;
|
||||
conn.authenticated = true;
|
||||
clearTimeout(auth_timer);
|
||||
|
||||
ws.send(JSON.stringify({ type: 'auth_ok' }));
|
||||
}
|
||||
|
||||
function handle_subscribe(ws, conn, msg) {
|
||||
const payload = validate_token(msg.token || '');
|
||||
if (!payload || !payload.topic) {
|
||||
ws.send(JSON.stringify({ type: 'error', message: 'Invalid subscribe token' }));
|
||||
return;
|
||||
}
|
||||
|
||||
// Site ID must match connection
|
||||
if (payload.site_id !== conn.site_id) {
|
||||
ws.send(JSON.stringify({ type: 'error', message: 'Site mismatch' }));
|
||||
return;
|
||||
}
|
||||
|
||||
const sub_id = msg.sub_id;
|
||||
const topic = payload.topic;
|
||||
const filter = payload.filter || {};
|
||||
|
||||
conn.subscriptions.set(sub_id, { topic, filter });
|
||||
|
||||
ws.send(JSON.stringify({ type: 'subscribed', sub_id }));
|
||||
|
||||
// Replay last message if available
|
||||
const lm_key = `${conn.site_id}:${topic}:${filter_hash(filter)}`;
|
||||
const last = last_messages.get(lm_key);
|
||||
if (last) {
|
||||
ws.send(JSON.stringify({
|
||||
type: 'message',
|
||||
topic: last.topic,
|
||||
data: last.data,
|
||||
ts: last.ts,
|
||||
replay: true,
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
function handle_unsubscribe(conn, msg) {
|
||||
conn.subscriptions.delete(msg.sub_id);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Heartbeat - ping every 30s, kill unresponsive connections
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const heartbeat = setInterval(() => {
|
||||
for (const [ws, conn] of connections) {
|
||||
if (!conn.alive) {
|
||||
ws.terminate();
|
||||
connections.delete(ws);
|
||||
continue;
|
||||
}
|
||||
conn.alive = false;
|
||||
ws.ping();
|
||||
}
|
||||
}, HEARTBEAT_INTERVAL);
|
||||
|
||||
wss.on('close', () => {
|
||||
clearInterval(heartbeat);
|
||||
});
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Redis subscriber - receive messages from PHP
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
async function start_redis() {
|
||||
const subscriber = createClient({
|
||||
socket: {
|
||||
host: REDIS_HOST,
|
||||
port: REDIS_PORT,
|
||||
},
|
||||
password: REDIS_PASSWORD,
|
||||
});
|
||||
|
||||
subscriber.on('error', (err) => {
|
||||
console.error('[realtime] Redis error:', err.message);
|
||||
});
|
||||
|
||||
await subscriber.connect();
|
||||
console.log(`[realtime] Connected to Redis at ${REDIS_HOST}:${REDIS_PORT}`);
|
||||
|
||||
// Subscribe to pattern rsx_rt:*
|
||||
await subscriber.pSubscribe(`${REDIS_PREFIX}:*`, (message, channel) => {
|
||||
let msg;
|
||||
try {
|
||||
msg = JSON.parse(message);
|
||||
} catch {
|
||||
return;
|
||||
}
|
||||
|
||||
const topic = msg.topic;
|
||||
const data = msg.data || {};
|
||||
const site_id = msg.site_id;
|
||||
const ts = msg.ts || Math.floor(Date.now() / 1000);
|
||||
|
||||
// Store as last message for replay
|
||||
// Store both with filter hash and without (wildcard subscribers get unfiltered last msg)
|
||||
const lm_key_unfiltered = `${site_id}:${topic}:_`;
|
||||
last_messages.set(lm_key_unfiltered, { topic, data, ts });
|
||||
|
||||
// Also store with data-derived filter hashes for common filter patterns
|
||||
// (Subscribers with specific filters will match against their own filter hash)
|
||||
if (data.id !== undefined) {
|
||||
const lm_key_id = `${site_id}:${topic}:${filter_hash({ id: data.id })}`;
|
||||
last_messages.set(lm_key_id, { topic, data, ts });
|
||||
}
|
||||
|
||||
// Route to matching WebSocket connections
|
||||
for (const [ws, conn] of connections) {
|
||||
if (!conn.authenticated) continue;
|
||||
if (conn.site_id !== site_id) continue;
|
||||
|
||||
for (const [sub_id, sub] of conn.subscriptions) {
|
||||
if (sub.topic !== topic) continue;
|
||||
if (!matches_filter(sub.filter, data)) continue;
|
||||
|
||||
ws.send(JSON.stringify({
|
||||
type: 'message',
|
||||
topic,
|
||||
data,
|
||||
ts,
|
||||
}));
|
||||
break; // Only send once per connection even if multiple subs match
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return subscriber;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Startup
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
start_redis().catch((err) => {
|
||||
console.error('[realtime] Failed to connect to Redis:', err.message);
|
||||
process.exit(1);
|
||||
});
|
||||
|
||||
// Graceful shutdown
|
||||
process.on('SIGTERM', () => {
|
||||
console.log('[realtime] Shutting down...');
|
||||
wss.close();
|
||||
process.exit(0);
|
||||
});
|
||||
|
||||
process.on('SIGINT', () => {
|
||||
console.log('[realtime] Shutting down...');
|
||||
wss.close();
|
||||
process.exit(0);
|
||||
});
|
||||
|
||||
// Log stats periodically
|
||||
setInterval(() => {
|
||||
const conn_count = connections.size;
|
||||
let sub_count = 0;
|
||||
for (const [, conn] of connections) {
|
||||
sub_count += conn.subscriptions.size;
|
||||
}
|
||||
if (conn_count > 0) {
|
||||
console.log(`[realtime] Connections: ${conn_count}, Subscriptions: ${sub_count}, Cached messages: ${last_messages.size}`);
|
||||
}
|
||||
}, 60000);
|
||||
@@ -899,6 +899,24 @@ Details: `php artisan rsx:man polymorphic`
|
||||
|
||||
---
|
||||
|
||||
## REALTIME (WebSocket)
|
||||
|
||||
WebSocket notification system: PHP publishes via Redis, Node.js relays to browser. Messages are **notification-only** (never confidential data) — clients fetch fresh data through Ajax.
|
||||
|
||||
**Setup**: `.env` → `REALTIME_ENABLED=true`, `REALTIME_WS_PORT=6200`, `REALTIME_PUBLIC_URL=ws://localhost:6200`. Start: `node system/bin/realtime-server.js`
|
||||
|
||||
**Topic classes** (`/rsx/lib/topics/`): Define `can_subscribe(array $filter = []): bool` — checked before issuing subscribe token.
|
||||
|
||||
**Publish** (PHP): `Realtime::publish('Contact_Updated_Topic', ['id' => $contact->id])` — no-op when disabled.
|
||||
|
||||
**Subscribe** (JS): `this.subscribe('Topic', {id: this.args.id}, (msg) => this.reload())` — auto-unsubscribes on component stop. Use `Rsx_Realtime.subscribe()` outside components.
|
||||
|
||||
**Site scoping**: Messages only route to connections matching the publisher's site_id. **Server-side filtering**: Subscriptions with filters only receive matching messages.
|
||||
|
||||
Details: `php artisan rsx:man realtime`
|
||||
|
||||
---
|
||||
|
||||
## AJAX ENDPOINTS
|
||||
|
||||
```php
|
||||
|
||||
318
node_modules/.package-lock.json
generated
vendored
318
node_modules/.package-lock.json
generated
vendored
@@ -158,9 +158,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/helper-define-polyfill-provider": {
|
||||
"version": "0.6.6",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz",
|
||||
"integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==",
|
||||
"version": "0.6.7",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.7.tgz",
|
||||
"integrity": "sha512-6Fqi8MtQ/PweQ9xvux65emkLQ83uB+qAVtfHkC9UodyHMIZdxNI01HjLCLUtybElp2KY2XNE0nOgyP1E1vXw9w==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-compilation-targets": "^7.28.6",
|
||||
@@ -1680,12 +1680,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": {
|
||||
"version": "0.14.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.0.tgz",
|
||||
"integrity": "sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ==",
|
||||
"version": "0.14.1",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.1.tgz",
|
||||
"integrity": "sha512-ENp89vM9Pw4kv/koBb5N2f9bDZsR0hpf3BdPMOg/pkS3pwO4dzNnQZVXtBbeyAadgm865DmQG2jMMLqmZXvuCw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-define-polyfill-provider": "^0.6.6",
|
||||
"@babel/helper-define-polyfill-provider": "^0.6.7",
|
||||
"core-js-compat": "^3.48.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -2224,9 +2224,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@jqhtml/core": {
|
||||
"version": "2.3.37",
|
||||
"resolved": "http://npm.internal.hanson.xyz/@jqhtml/core/-/core-2.3.37.tgz",
|
||||
"integrity": "sha512-05/hHRrRm09+f1j6G36wWI1GTGgmAlJONwoXruAjR3ZilrtvfaIaARNbXH+75R4PI8TDKQ4dVvuPqllgMkX1AQ==",
|
||||
"version": "2.3.38",
|
||||
"resolved": "http://npm.internal.hanson.xyz/@jqhtml/core/-/core-2.3.38.tgz",
|
||||
"integrity": "sha512-7yjkqgYAPuyl9bjw67nm7+NwDTR4nCuem9IHmW99SO5o/iJIuJUB9txuBQBo8l2g+pNbDFFI4wvUxJbFn3fznA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@rollup/plugin-node-resolve": "^16.0.1",
|
||||
@@ -2250,9 +2250,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@jqhtml/parser": {
|
||||
"version": "2.3.37",
|
||||
"resolved": "http://npm.internal.hanson.xyz/@jqhtml/parser/-/parser-2.3.37.tgz",
|
||||
"integrity": "sha512-QRzVopu80Cy3Tgw5ytH5/PrXIFau37jc4CaMMU/EMEXNkp+wK/uJ9Ke7U/qIeTWbtj011291iIpeSCnrCrgw4w==",
|
||||
"version": "2.3.38",
|
||||
"resolved": "http://npm.internal.hanson.xyz/@jqhtml/parser/-/parser-2.3.38.tgz",
|
||||
"integrity": "sha512-kIb9u3p01FDTvQbq7LKmSBaGd5JZzJGZNL7oHQXzjSkvpL6/iTE2NXkOHI/0yiSfMR5s8tsMABnHQX8M8bzZJw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/jest": "^29.5.11",
|
||||
@@ -2290,9 +2290,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@jqhtml/ssr": {
|
||||
"version": "2.3.37",
|
||||
"resolved": "http://npm.internal.hanson.xyz/@jqhtml/ssr/-/ssr-2.3.37.tgz",
|
||||
"integrity": "sha512-e5Ck6UbAGiLPI5MWXnHb7yoomDcfwNe6kIAdfk4Or0vF+QibfzF8d+SnyTUS9pPGH9w4SvzVLxAclSAxLQc8KQ==",
|
||||
"version": "2.3.38",
|
||||
"resolved": "http://npm.internal.hanson.xyz/@jqhtml/ssr/-/ssr-2.3.38.tgz",
|
||||
"integrity": "sha512-C0hFuzMVwAoKGGj2UvBkUqvNa2Q2Q95DYHuGMx+4cD0kCwxA2bpo5MnjcmtSQh2YX4UODKTaqmpHL+03MYOp7g==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"jquery": "^3.7.1",
|
||||
@@ -2386,9 +2386,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@jqhtml/vscode-extension": {
|
||||
"version": "2.3.37",
|
||||
"resolved": "http://npm.internal.hanson.xyz/@jqhtml/vscode-extension/-/vscode-extension-2.3.37.tgz",
|
||||
"integrity": "sha512-G9Xg8BM+xSzt9DssNXM1I0wxFtKYCycO2XLRUFKDsiKmNtSfmEN6eEdHX9gw5o3bOsOSG3WfF0DBXbQCHJWtMA==",
|
||||
"version": "2.3.38",
|
||||
"resolved": "http://npm.internal.hanson.xyz/@jqhtml/vscode-extension/-/vscode-extension-2.3.38.tgz",
|
||||
"integrity": "sha512-/npaSwR6ibKl3z8xFlnMO1salWyzQIgs+1D7JH2QFi62o9TtIJWDhKKO/n2njc6PdUrJcDy6ElT1jYZh4eoNGg==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"vscode": "^1.74.0"
|
||||
@@ -2610,6 +2610,74 @@
|
||||
"prettier": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@redis/bloom": {
|
||||
"version": "5.11.0",
|
||||
"resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.11.0.tgz",
|
||||
"integrity": "sha512-KYiVilAhAFN3057afUb/tfYJpsEyTkQB+tQcn5gVVA7DgcNOAj8lLxe4j8ov8BF6I9C1Fe/kwlbuAICcTMX8Lw==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@redis/client": "^5.11.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@redis/client": {
|
||||
"version": "5.11.0",
|
||||
"resolved": "https://registry.npmjs.org/@redis/client/-/client-5.11.0.tgz",
|
||||
"integrity": "sha512-GHoprlNQD51Xq2Ztd94HHV94MdFZQ3CVrpA04Fz8MVoHM0B7SlbmPEVIjwTbcv58z8QyjnrOuikS0rWF03k5dQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cluster-key-slot": "1.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@node-rs/xxhash": "^1.1.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@node-rs/xxhash": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@redis/json": {
|
||||
"version": "5.11.0",
|
||||
"resolved": "https://registry.npmjs.org/@redis/json/-/json-5.11.0.tgz",
|
||||
"integrity": "sha512-1iAy9kAtcD0quB21RbPTbUqqy+T2Uu2JxucwE+B4A+VaDbIRvpZR6DMqV8Iqaws2YxJYB3GC5JVNzPYio2ErUg==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@redis/client": "^5.11.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@redis/search": {
|
||||
"version": "5.11.0",
|
||||
"resolved": "https://registry.npmjs.org/@redis/search/-/search-5.11.0.tgz",
|
||||
"integrity": "sha512-g1l7f3Rnyk/xI99oGHIgWHSKFl45Re5YTIcO8j/JE8olz389yUFyz2+A6nqVy/Zi031VgPDWscbbgOk8hlhZ3g==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@redis/client": "^5.11.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@redis/time-series": {
|
||||
"version": "5.11.0",
|
||||
"resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-5.11.0.tgz",
|
||||
"integrity": "sha512-TWFeOcU4xkj0DkndnOyhtxvX1KWD+78UHT3XX3x3XRBUGWeQrKo3jqzDsZwxbggUgf9yLJr/akFHXru66X5UQA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@redis/client": "^5.11.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rollup/plugin-node-resolve": {
|
||||
"version": "16.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz",
|
||||
@@ -3112,9 +3180,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "20.19.35",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.35.tgz",
|
||||
"integrity": "sha512-Uarfe6J91b9HAUXxjvSOdiO2UPOKLm07Q1oh0JHxoZ1y8HoqxDAu3gVrsrOHeiio0kSsoVBt4wFrKOm0dKxVPQ==",
|
||||
"version": "20.19.37",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz",
|
||||
"integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"undici-types": "~6.21.0"
|
||||
@@ -3136,9 +3204,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/qs": {
|
||||
"version": "6.14.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
|
||||
"integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
|
||||
"version": "6.15.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz",
|
||||
"integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/range-parser": {
|
||||
@@ -3996,13 +4064,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/babel-plugin-polyfill-corejs2": {
|
||||
"version": "0.4.15",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz",
|
||||
"integrity": "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==",
|
||||
"version": "0.4.16",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.16.tgz",
|
||||
"integrity": "sha512-xaVwwSfebXf0ooE11BJovZYKhFjIvQo7TsyVpETuIeH2JHv0k/T6Y5j22pPTvqYqmpkxdlPAJlyJ0tfOJAoMxw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/compat-data": "^7.28.6",
|
||||
"@babel/helper-define-polyfill-provider": "^0.6.6",
|
||||
"@babel/helper-define-polyfill-provider": "^0.6.7",
|
||||
"semver": "^6.3.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -4023,12 +4091,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/babel-plugin-polyfill-regenerator": {
|
||||
"version": "0.6.6",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz",
|
||||
"integrity": "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==",
|
||||
"version": "0.6.7",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.7.tgz",
|
||||
"integrity": "sha512-OTYbUlSwXhNgr4g6efMZgsO8//jA61P7ZbRX3iTT53VON8l+WQS8IAUEVo4a4cWknrg2W8Cj4gQhRYNCJ8GkAA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-define-polyfill-provider": "^0.6.6"
|
||||
"@babel/helper-define-polyfill-provider": "^0.6.7"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
|
||||
@@ -4524,9 +4592,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/caniuse-lite": {
|
||||
"version": "1.0.30001776",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001776.tgz",
|
||||
"integrity": "sha512-sg01JDPzZ9jGshqKSckOQthXnYwOEP50jeVFhaSFbZcOy05TiuuaffDOfcwtCisJ9kNQuLBFibYywv2Bgm9osw==",
|
||||
"version": "1.0.30001777",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz",
|
||||
"integrity": "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
@@ -4709,6 +4777,15 @@
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/cluster-key-slot": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz",
|
||||
"integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==",
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/co": {
|
||||
"version": "4.6.0",
|
||||
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
|
||||
@@ -5289,14 +5366,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/css-tree": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz",
|
||||
"integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==",
|
||||
"version": "3.2.1",
|
||||
"resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz",
|
||||
"integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"mdn-data": "2.12.2",
|
||||
"source-map-js": "^1.0.1"
|
||||
"mdn-data": "2.27.1",
|
||||
"source-map-js": "^1.2.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
|
||||
@@ -5327,13 +5404,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/cssnano": {
|
||||
"version": "7.1.2",
|
||||
"resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.2.tgz",
|
||||
"integrity": "sha512-HYOPBsNvoiFeR1eghKD5C3ASm64v9YVyJB4Ivnl2gqKoQYvjjN/G0rztvKQq8OxocUtC6sjqY8jwYngIB4AByA==",
|
||||
"version": "7.1.3",
|
||||
"resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.3.tgz",
|
||||
"integrity": "sha512-mLFHQAzyapMVFLiJIn7Ef4C2UCEvtlTlbyILR6B5ZsUAV3D/Pa761R5uC1YPhyBkRd3eqaDm2ncaNrD7R4mTRg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cssnano-preset-default": "^7.0.10",
|
||||
"cssnano-preset-default": "^7.0.11",
|
||||
"lilconfig": "^3.1.3"
|
||||
},
|
||||
"engines": {
|
||||
@@ -5348,42 +5425,42 @@
|
||||
}
|
||||
},
|
||||
"node_modules/cssnano-preset-default": {
|
||||
"version": "7.0.10",
|
||||
"resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.10.tgz",
|
||||
"integrity": "sha512-6ZBjW0Lf1K1Z+0OKUAUpEN62tSXmYChXWi2NAA0afxEVsj9a+MbcB1l5qel6BHJHmULai2fCGRthCeKSFbScpA==",
|
||||
"version": "7.0.11",
|
||||
"resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.11.tgz",
|
||||
"integrity": "sha512-waWlAMuCakP7//UCY+JPrQS1z0OSLeOXk2sKWJximKWGupVxre50bzPlvpbUwZIDylhf/ptf0Pk+Yf7C+hoa3g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"browserslist": "^4.27.0",
|
||||
"browserslist": "^4.28.1",
|
||||
"css-declaration-sorter": "^7.2.0",
|
||||
"cssnano-utils": "^5.0.1",
|
||||
"postcss-calc": "^10.1.1",
|
||||
"postcss-colormin": "^7.0.5",
|
||||
"postcss-convert-values": "^7.0.8",
|
||||
"postcss-discard-comments": "^7.0.5",
|
||||
"postcss-colormin": "^7.0.6",
|
||||
"postcss-convert-values": "^7.0.9",
|
||||
"postcss-discard-comments": "^7.0.6",
|
||||
"postcss-discard-duplicates": "^7.0.2",
|
||||
"postcss-discard-empty": "^7.0.1",
|
||||
"postcss-discard-overridden": "^7.0.1",
|
||||
"postcss-merge-longhand": "^7.0.5",
|
||||
"postcss-merge-rules": "^7.0.7",
|
||||
"postcss-merge-rules": "^7.0.8",
|
||||
"postcss-minify-font-values": "^7.0.1",
|
||||
"postcss-minify-gradients": "^7.0.1",
|
||||
"postcss-minify-params": "^7.0.5",
|
||||
"postcss-minify-selectors": "^7.0.5",
|
||||
"postcss-minify-params": "^7.0.6",
|
||||
"postcss-minify-selectors": "^7.0.6",
|
||||
"postcss-normalize-charset": "^7.0.1",
|
||||
"postcss-normalize-display-values": "^7.0.1",
|
||||
"postcss-normalize-positions": "^7.0.1",
|
||||
"postcss-normalize-repeat-style": "^7.0.1",
|
||||
"postcss-normalize-string": "^7.0.1",
|
||||
"postcss-normalize-timing-functions": "^7.0.1",
|
||||
"postcss-normalize-unicode": "^7.0.5",
|
||||
"postcss-normalize-unicode": "^7.0.6",
|
||||
"postcss-normalize-url": "^7.0.1",
|
||||
"postcss-normalize-whitespace": "^7.0.1",
|
||||
"postcss-ordered-values": "^7.0.2",
|
||||
"postcss-reduce-initial": "^7.0.5",
|
||||
"postcss-reduce-initial": "^7.0.6",
|
||||
"postcss-reduce-transforms": "^7.0.1",
|
||||
"postcss-svgo": "^7.1.0",
|
||||
"postcss-unique-selectors": "^7.0.4"
|
||||
"postcss-svgo": "^7.1.1",
|
||||
"postcss-unique-selectors": "^7.0.5"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.12.0 || ^20.9.0 || >=22.0"
|
||||
@@ -5768,10 +5845,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/dompurify": {
|
||||
"version": "3.3.1",
|
||||
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz",
|
||||
"integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==",
|
||||
"version": "3.3.2",
|
||||
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.2.tgz",
|
||||
"integrity": "sha512-6obghkliLdmKa56xdbLOpUZ43pAR6xFy1uOrxBaIDjT+yaRuuybLjGS9eVBoSR/UPU5fq3OXClEHLJNGvbxKpQ==",
|
||||
"license": "(MPL-2.0 OR Apache-2.0)",
|
||||
"engines": {
|
||||
"node": ">=20"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@types/trusted-types": "^2.0.7"
|
||||
}
|
||||
@@ -9443,9 +9523,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/mdn-data": {
|
||||
"version": "2.12.2",
|
||||
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz",
|
||||
"integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==",
|
||||
"version": "2.27.1",
|
||||
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz",
|
||||
"integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==",
|
||||
"dev": true,
|
||||
"license": "CC0-1.0"
|
||||
},
|
||||
@@ -10394,13 +10474,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss-colormin": {
|
||||
"version": "7.0.5",
|
||||
"resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.5.tgz",
|
||||
"integrity": "sha512-ekIBP/nwzRWhEMmIxHHbXHcMdzd1HIUzBECaj5KEdLz9DVP2HzT065sEhvOx1dkLjYW7jyD0CngThx6bpFi2fA==",
|
||||
"version": "7.0.6",
|
||||
"resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.6.tgz",
|
||||
"integrity": "sha512-oXM2mdx6IBTRm39797QguYzVEWzbdlFiMNfq88fCCN1Wepw3CYmJ/1/Ifa/KjWo+j5ZURDl2NTldLJIw51IeNQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"browserslist": "^4.27.0",
|
||||
"browserslist": "^4.28.1",
|
||||
"caniuse-api": "^3.0.0",
|
||||
"colord": "^2.9.3",
|
||||
"postcss-value-parser": "^4.2.0"
|
||||
@@ -10413,13 +10493,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss-convert-values": {
|
||||
"version": "7.0.8",
|
||||
"resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.8.tgz",
|
||||
"integrity": "sha512-+XNKuPfkHTCEo499VzLMYn94TiL3r9YqRE3Ty+jP7UX4qjewUONey1t7CG21lrlTLN07GtGM8MqFVp86D4uKJg==",
|
||||
"version": "7.0.9",
|
||||
"resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.9.tgz",
|
||||
"integrity": "sha512-l6uATQATZaCa0bckHV+r6dLXfWtUBKXxO3jK+AtxxJJtgMPD+VhhPCCx51I4/5w8U5uHV67g3w7PXj+V3wlMlg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"browserslist": "^4.27.0",
|
||||
"browserslist": "^4.28.1",
|
||||
"postcss-value-parser": "^4.2.0"
|
||||
},
|
||||
"engines": {
|
||||
@@ -10430,13 +10510,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss-discard-comments": {
|
||||
"version": "7.0.5",
|
||||
"resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.5.tgz",
|
||||
"integrity": "sha512-IR2Eja8WfYgN5n32vEGSctVQ1+JARfu4UH8M7bgGh1bC+xI/obsPJXaBpQF7MAByvgwZinhpHpdrmXtvVVlKcQ==",
|
||||
"version": "7.0.6",
|
||||
"resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.6.tgz",
|
||||
"integrity": "sha512-Sq+Fzj1Eg5/CPf1ERb0wS1Im5cvE2gDXCE+si4HCn1sf+jpQZxDI4DXEp8t77B/ImzDceWE2ebJQFXdqZ6GRJw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"postcss-selector-parser": "^7.1.0"
|
||||
"postcss-selector-parser": "^7.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.12.0 || ^20.9.0 || >=22.0"
|
||||
@@ -10574,16 +10654,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss-merge-rules": {
|
||||
"version": "7.0.7",
|
||||
"resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.7.tgz",
|
||||
"integrity": "sha512-njWJrd/Ms6XViwowaaCc+/vqhPG3SmXn725AGrnl+BgTuRPEacjiLEaGq16J6XirMJbtKkTwnt67SS+e2WGoew==",
|
||||
"version": "7.0.8",
|
||||
"resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.8.tgz",
|
||||
"integrity": "sha512-BOR1iAM8jnr7zoQSlpeBmCsWV5Uudi/+5j7k05D0O/WP3+OFMPD86c1j/20xiuRtyt45bhxw/7hnhZNhW2mNFA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"browserslist": "^4.27.0",
|
||||
"browserslist": "^4.28.1",
|
||||
"caniuse-api": "^3.0.0",
|
||||
"cssnano-utils": "^5.0.1",
|
||||
"postcss-selector-parser": "^7.1.0"
|
||||
"postcss-selector-parser": "^7.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.12.0 || ^20.9.0 || >=22.0"
|
||||
@@ -10627,13 +10707,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss-minify-params": {
|
||||
"version": "7.0.5",
|
||||
"resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.5.tgz",
|
||||
"integrity": "sha512-FGK9ky02h6Ighn3UihsyeAH5XmLEE2MSGH5Tc4tXMFtEDx7B+zTG6hD/+/cT+fbF7PbYojsmmWjyTwFwW1JKQQ==",
|
||||
"version": "7.0.6",
|
||||
"resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.6.tgz",
|
||||
"integrity": "sha512-YOn02gC68JijlaXVuKvFSCvQOhTpblkcfDre2hb/Aaa58r2BIaK4AtE/cyZf2wV7YKAG+UlP9DT+By0ry1E4VQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"browserslist": "^4.27.0",
|
||||
"browserslist": "^4.28.1",
|
||||
"cssnano-utils": "^5.0.1",
|
||||
"postcss-value-parser": "^4.2.0"
|
||||
},
|
||||
@@ -10645,14 +10725,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss-minify-selectors": {
|
||||
"version": "7.0.5",
|
||||
"resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.5.tgz",
|
||||
"integrity": "sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==",
|
||||
"version": "7.0.6",
|
||||
"resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.6.tgz",
|
||||
"integrity": "sha512-lIbC0jy3AAwDxEgciZlBullDiMBeBCT+fz5G8RcA9MWqh/hfUkpOI3vNDUNEZHgokaoiv0juB9Y8fGcON7rU/A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cssesc": "^3.0.0",
|
||||
"postcss-selector-parser": "^7.1.0"
|
||||
"postcss-selector-parser": "^7.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.12.0 || ^20.9.0 || >=22.0"
|
||||
@@ -10814,13 +10894,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss-normalize-unicode": {
|
||||
"version": "7.0.5",
|
||||
"resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.5.tgz",
|
||||
"integrity": "sha512-X6BBwiRxVaFHrb2WyBMddIeB5HBjJcAaUHyhLrM2FsxSq5TFqcHSsK7Zu1otag+o0ZphQGJewGH1tAyrD0zX1Q==",
|
||||
"version": "7.0.6",
|
||||
"resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.6.tgz",
|
||||
"integrity": "sha512-z6bwTV84YW6ZvvNoaNLuzRW4/uWxDKYI1iIDrzk6D2YTL7hICApy+Q1LP6vBEsljX8FM7YSuV9qI79XESd4ddQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"browserslist": "^4.27.0",
|
||||
"browserslist": "^4.28.1",
|
||||
"postcss-value-parser": "^4.2.0"
|
||||
},
|
||||
"engines": {
|
||||
@@ -10880,13 +10960,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss-reduce-initial": {
|
||||
"version": "7.0.5",
|
||||
"resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.5.tgz",
|
||||
"integrity": "sha512-RHagHLidG8hTZcnr4FpyMB2jtgd/OcyAazjMhoy5qmWJOx1uxKh4ntk0Pb46ajKM0rkf32lRH4C8c9qQiPR6IA==",
|
||||
"version": "7.0.6",
|
||||
"resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.6.tgz",
|
||||
"integrity": "sha512-G6ZyK68AmrPdMB6wyeA37ejnnRG2S8xinJrZJnOv+IaRKf6koPAVbQsiC7MfkmXaGmF1UO+QCijb27wfpxuRNg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"browserslist": "^4.27.0",
|
||||
"browserslist": "^4.28.1",
|
||||
"caniuse-api": "^3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
@@ -10926,14 +11006,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss-svgo": {
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.0.tgz",
|
||||
"integrity": "sha512-KnAlfmhtoLz6IuU3Sij2ycusNs4jPW+QoFE5kuuUOK8awR6tMxZQrs5Ey3BUz7nFCzT3eqyFgqkyrHiaU2xx3w==",
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.1.tgz",
|
||||
"integrity": "sha512-zU9H9oEDrUFKa0JB7w+IYL7Qs9ey1mZyjhbf0KLxwJDdDRtoPvCmaEfknzqfHj44QS9VD6c5sJnBAVYTLRg/Sg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"postcss-value-parser": "^4.2.0",
|
||||
"svgo": "^4.0.0"
|
||||
"svgo": "^4.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.12.0 || ^20.9.0 || >= 18"
|
||||
@@ -10943,13 +11023,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss-unique-selectors": {
|
||||
"version": "7.0.4",
|
||||
"resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.4.tgz",
|
||||
"integrity": "sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==",
|
||||
"version": "7.0.5",
|
||||
"resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.5.tgz",
|
||||
"integrity": "sha512-3QoYmEt4qg/rUWDn6Tc8+ZVPmbp4G1hXDtCNWDx0st8SjtCbRcxRXDDM1QrEiXGG3A45zscSJFb4QH90LViyxg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"postcss-selector-parser": "^7.1.0"
|
||||
"postcss-selector-parser": "^7.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.12.0 || ^20.9.0 || >=22.0"
|
||||
@@ -11345,6 +11425,22 @@
|
||||
"node": ">= 0.10"
|
||||
}
|
||||
},
|
||||
"node_modules/redis": {
|
||||
"version": "5.11.0",
|
||||
"resolved": "https://registry.npmjs.org/redis/-/redis-5.11.0.tgz",
|
||||
"integrity": "sha512-YwXjATVDT+AuxcyfOwZn046aml9jMlQPvU1VXIlLDVAExe0u93aTfPYSeRgG4p9Q/Jlkj+LXJ1XEoFV+j2JKcQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@redis/bloom": "5.11.0",
|
||||
"@redis/client": "5.11.0",
|
||||
"@redis/json": "5.11.0",
|
||||
"@redis/search": "5.11.0",
|
||||
"@redis/time-series": "5.11.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
}
|
||||
},
|
||||
"node_modules/regenerate": {
|
||||
"version": "1.4.2",
|
||||
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
|
||||
@@ -12524,14 +12620,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/stylehacks": {
|
||||
"version": "7.0.7",
|
||||
"resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.7.tgz",
|
||||
"integrity": "sha512-bJkD0JkEtbRrMFtwgpJyBbFIwfDDONQ1Ov3sDLZQP8HuJ73kBOyx66H4bOcAbVWmnfLdvQ0AJwXxOMkpujcO6g==",
|
||||
"version": "7.0.8",
|
||||
"resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.8.tgz",
|
||||
"integrity": "sha512-I3f053GBLIiS5Fg6OMFhq/c+yW+5Hc2+1fgq7gElDMMSqwlRb3tBf2ef6ucLStYRpId4q//bQO1FjcyNyy4yDQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"browserslist": "^4.27.0",
|
||||
"postcss-selector-parser": "^7.1.0"
|
||||
"browserslist": "^4.28.1",
|
||||
"postcss-selector-parser": "^7.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.12.0 || ^20.9.0 || >=22.0"
|
||||
|
||||
208
node_modules/@babel/helper-define-polyfill-provider/esm/index.browser.mjs
generated
vendored
208
node_modules/@babel/helper-define-polyfill-provider/esm/index.browser.mjs
generated
vendored
@@ -60,6 +60,10 @@ function resolveKey(path, computed = false) {
|
||||
if (typeof value === "string") return value;
|
||||
}
|
||||
}
|
||||
function resolveInstance(obj) {
|
||||
const source = resolveSource(obj);
|
||||
return source.placement === "prototype" ? source.id : null;
|
||||
}
|
||||
function resolveSource(obj) {
|
||||
if (obj.isMemberExpression() && obj.get("property").isIdentifier({
|
||||
name: "prototype"
|
||||
@@ -85,22 +89,23 @@ function resolveSource(obj) {
|
||||
}
|
||||
const path = resolve$1(obj);
|
||||
switch (path == null ? void 0 : path.type) {
|
||||
case "NullLiteral":
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
case "RegExpLiteral":
|
||||
return {
|
||||
id: "RegExp",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "FunctionExpression":
|
||||
return {
|
||||
id: "Function",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "StringLiteral":
|
||||
case "TemplateLiteral":
|
||||
return {
|
||||
id: "String",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "NumberLiteral":
|
||||
case "NumericLiteral":
|
||||
return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
@@ -110,6 +115,11 @@ function resolveSource(obj) {
|
||||
id: "Boolean",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "BigIntLiteral":
|
||||
return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "ObjectExpression":
|
||||
return {
|
||||
id: "Object",
|
||||
@@ -120,6 +130,192 @@ function resolveSource(obj) {
|
||||
id: "Array",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "FunctionExpression":
|
||||
case "ArrowFunctionExpression":
|
||||
case "ClassExpression":
|
||||
return {
|
||||
id: "Function",
|
||||
placement: "prototype"
|
||||
};
|
||||
// new Constructor() -> resolve the constructor name
|
||||
case "NewExpression":
|
||||
{
|
||||
const calleeId = resolveId(path.get("callee"));
|
||||
if (calleeId) return {
|
||||
id: calleeId,
|
||||
placement: "prototype"
|
||||
};
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// Unary expressions -> result type depends on operator
|
||||
case "UnaryExpression":
|
||||
{
|
||||
const {
|
||||
operator
|
||||
} = path.node;
|
||||
if (operator === "typeof") return {
|
||||
id: "String",
|
||||
placement: "prototype"
|
||||
};
|
||||
if (operator === "!" || operator === "delete") return {
|
||||
id: "Boolean",
|
||||
placement: "prototype"
|
||||
};
|
||||
// Unary + always produces Number (throws on BigInt)
|
||||
if (operator === "+") return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
// Unary - and ~ can produce Number or BigInt depending on operand
|
||||
if (operator === "-" || operator === "~") {
|
||||
const arg = resolveInstance(path.get("argument"));
|
||||
if (arg === "BigInt") return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
if (arg !== null) return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// ++i, i++ produce Number or BigInt depending on the argument
|
||||
case "UpdateExpression":
|
||||
{
|
||||
const arg = resolveInstance(path.get("argument"));
|
||||
if (arg === "BigInt") return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
if (arg !== null) return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// Binary expressions -> result type depends on operator
|
||||
case "BinaryExpression":
|
||||
{
|
||||
const {
|
||||
operator
|
||||
} = path.node;
|
||||
if (operator === "==" || operator === "!=" || operator === "===" || operator === "!==" || operator === "<" || operator === ">" || operator === "<=" || operator === ">=" || operator === "instanceof" || operator === "in") {
|
||||
return {
|
||||
id: "Boolean",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
// >>> always produces Number
|
||||
if (operator === ">>>") {
|
||||
return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
// Arithmetic and bitwise operators can produce Number or BigInt
|
||||
if (operator === "-" || operator === "*" || operator === "/" || operator === "%" || operator === "**" || operator === "&" || operator === "|" || operator === "^" || operator === "<<" || operator === ">>") {
|
||||
const left = resolveInstance(path.get("left"));
|
||||
const right = resolveInstance(path.get("right"));
|
||||
if (left === "BigInt" && right === "BigInt") {
|
||||
return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
if (left !== null && right !== null) {
|
||||
return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// + depends on operand types: string wins, otherwise number or bigint
|
||||
if (operator === "+") {
|
||||
const left = resolveInstance(path.get("left"));
|
||||
const right = resolveInstance(path.get("right"));
|
||||
if (left === "String" || right === "String") {
|
||||
return {
|
||||
id: "String",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
if (left === "Number" && right === "Number") {
|
||||
return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
if (left === "BigInt" && right === "BigInt") {
|
||||
return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// (a, b, c) -> the result is the last expression
|
||||
case "SequenceExpression":
|
||||
{
|
||||
const expressions = path.get("expressions");
|
||||
return resolveSource(expressions[expressions.length - 1]);
|
||||
}
|
||||
// a = b -> the result is the right side
|
||||
case "AssignmentExpression":
|
||||
{
|
||||
if (path.node.operator === "=") {
|
||||
return resolveSource(path.get("right"));
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// a ? b : c -> if both branches resolve to the same type, use it
|
||||
case "ConditionalExpression":
|
||||
{
|
||||
const consequent = resolveSource(path.get("consequent"));
|
||||
const alternate = resolveSource(path.get("alternate"));
|
||||
if (consequent.id && consequent.id === alternate.id) {
|
||||
return consequent;
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// (expr) -> unwrap parenthesized expressions
|
||||
case "ParenthesizedExpression":
|
||||
return resolveSource(path.get("expression"));
|
||||
// TypeScript / Flow type wrappers -> unwrap to the inner expression
|
||||
case "TSAsExpression":
|
||||
case "TSSatisfiesExpression":
|
||||
case "TSNonNullExpression":
|
||||
case "TSInstantiationExpression":
|
||||
case "TSTypeAssertion":
|
||||
case "TypeCastExpression":
|
||||
return resolveSource(path.get("expression"));
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
|
||||
2
node_modules/@babel/helper-define-polyfill-provider/esm/index.browser.mjs.map
generated
vendored
2
node_modules/@babel/helper-define-polyfill-provider/esm/index.browser.mjs.map
generated
vendored
File diff suppressed because one or more lines are too long
208
node_modules/@babel/helper-define-polyfill-provider/esm/index.node.mjs
generated
vendored
208
node_modules/@babel/helper-define-polyfill-provider/esm/index.node.mjs
generated
vendored
@@ -64,6 +64,10 @@ function resolveKey(path, computed = false) {
|
||||
if (typeof value === "string") return value;
|
||||
}
|
||||
}
|
||||
function resolveInstance(obj) {
|
||||
const source = resolveSource(obj);
|
||||
return source.placement === "prototype" ? source.id : null;
|
||||
}
|
||||
function resolveSource(obj) {
|
||||
if (obj.isMemberExpression() && obj.get("property").isIdentifier({
|
||||
name: "prototype"
|
||||
@@ -89,22 +93,23 @@ function resolveSource(obj) {
|
||||
}
|
||||
const path = resolve$1(obj);
|
||||
switch (path == null ? void 0 : path.type) {
|
||||
case "NullLiteral":
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
case "RegExpLiteral":
|
||||
return {
|
||||
id: "RegExp",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "FunctionExpression":
|
||||
return {
|
||||
id: "Function",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "StringLiteral":
|
||||
case "TemplateLiteral":
|
||||
return {
|
||||
id: "String",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "NumberLiteral":
|
||||
case "NumericLiteral":
|
||||
return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
@@ -114,6 +119,11 @@ function resolveSource(obj) {
|
||||
id: "Boolean",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "BigIntLiteral":
|
||||
return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "ObjectExpression":
|
||||
return {
|
||||
id: "Object",
|
||||
@@ -124,6 +134,192 @@ function resolveSource(obj) {
|
||||
id: "Array",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "FunctionExpression":
|
||||
case "ArrowFunctionExpression":
|
||||
case "ClassExpression":
|
||||
return {
|
||||
id: "Function",
|
||||
placement: "prototype"
|
||||
};
|
||||
// new Constructor() -> resolve the constructor name
|
||||
case "NewExpression":
|
||||
{
|
||||
const calleeId = resolveId(path.get("callee"));
|
||||
if (calleeId) return {
|
||||
id: calleeId,
|
||||
placement: "prototype"
|
||||
};
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// Unary expressions -> result type depends on operator
|
||||
case "UnaryExpression":
|
||||
{
|
||||
const {
|
||||
operator
|
||||
} = path.node;
|
||||
if (operator === "typeof") return {
|
||||
id: "String",
|
||||
placement: "prototype"
|
||||
};
|
||||
if (operator === "!" || operator === "delete") return {
|
||||
id: "Boolean",
|
||||
placement: "prototype"
|
||||
};
|
||||
// Unary + always produces Number (throws on BigInt)
|
||||
if (operator === "+") return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
// Unary - and ~ can produce Number or BigInt depending on operand
|
||||
if (operator === "-" || operator === "~") {
|
||||
const arg = resolveInstance(path.get("argument"));
|
||||
if (arg === "BigInt") return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
if (arg !== null) return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// ++i, i++ produce Number or BigInt depending on the argument
|
||||
case "UpdateExpression":
|
||||
{
|
||||
const arg = resolveInstance(path.get("argument"));
|
||||
if (arg === "BigInt") return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
if (arg !== null) return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// Binary expressions -> result type depends on operator
|
||||
case "BinaryExpression":
|
||||
{
|
||||
const {
|
||||
operator
|
||||
} = path.node;
|
||||
if (operator === "==" || operator === "!=" || operator === "===" || operator === "!==" || operator === "<" || operator === ">" || operator === "<=" || operator === ">=" || operator === "instanceof" || operator === "in") {
|
||||
return {
|
||||
id: "Boolean",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
// >>> always produces Number
|
||||
if (operator === ">>>") {
|
||||
return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
// Arithmetic and bitwise operators can produce Number or BigInt
|
||||
if (operator === "-" || operator === "*" || operator === "/" || operator === "%" || operator === "**" || operator === "&" || operator === "|" || operator === "^" || operator === "<<" || operator === ">>") {
|
||||
const left = resolveInstance(path.get("left"));
|
||||
const right = resolveInstance(path.get("right"));
|
||||
if (left === "BigInt" && right === "BigInt") {
|
||||
return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
if (left !== null && right !== null) {
|
||||
return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// + depends on operand types: string wins, otherwise number or bigint
|
||||
if (operator === "+") {
|
||||
const left = resolveInstance(path.get("left"));
|
||||
const right = resolveInstance(path.get("right"));
|
||||
if (left === "String" || right === "String") {
|
||||
return {
|
||||
id: "String",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
if (left === "Number" && right === "Number") {
|
||||
return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
if (left === "BigInt" && right === "BigInt") {
|
||||
return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// (a, b, c) -> the result is the last expression
|
||||
case "SequenceExpression":
|
||||
{
|
||||
const expressions = path.get("expressions");
|
||||
return resolveSource(expressions[expressions.length - 1]);
|
||||
}
|
||||
// a = b -> the result is the right side
|
||||
case "AssignmentExpression":
|
||||
{
|
||||
if (path.node.operator === "=") {
|
||||
return resolveSource(path.get("right"));
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// a ? b : c -> if both branches resolve to the same type, use it
|
||||
case "ConditionalExpression":
|
||||
{
|
||||
const consequent = resolveSource(path.get("consequent"));
|
||||
const alternate = resolveSource(path.get("alternate"));
|
||||
if (consequent.id && consequent.id === alternate.id) {
|
||||
return consequent;
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// (expr) -> unwrap parenthesized expressions
|
||||
case "ParenthesizedExpression":
|
||||
return resolveSource(path.get("expression"));
|
||||
// TypeScript / Flow type wrappers -> unwrap to the inner expression
|
||||
case "TSAsExpression":
|
||||
case "TSSatisfiesExpression":
|
||||
case "TSNonNullExpression":
|
||||
case "TSInstantiationExpression":
|
||||
case "TSTypeAssertion":
|
||||
case "TypeCastExpression":
|
||||
return resolveSource(path.get("expression"));
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
|
||||
2
node_modules/@babel/helper-define-polyfill-provider/esm/index.node.mjs.map
generated
vendored
2
node_modules/@babel/helper-define-polyfill-provider/esm/index.node.mjs.map
generated
vendored
File diff suppressed because one or more lines are too long
209
node_modules/@babel/helper-define-polyfill-provider/lib/utils.js
generated
vendored
209
node_modules/@babel/helper-define-polyfill-provider/lib/utils.js
generated
vendored
@@ -6,6 +6,7 @@ exports.getImportSource = getImportSource;
|
||||
exports.getRequireSource = getRequireSource;
|
||||
exports.has = has;
|
||||
exports.intersection = intersection;
|
||||
exports.resolveInstance = resolveInstance;
|
||||
exports.resolveKey = resolveKey;
|
||||
exports.resolveSource = resolveSource;
|
||||
var _babel = _interopRequireWildcard(require("@babel/core"));
|
||||
@@ -68,6 +69,10 @@ function resolveKey(path, computed = false) {
|
||||
if (typeof value === "string") return value;
|
||||
}
|
||||
}
|
||||
function resolveInstance(obj) {
|
||||
const source = resolveSource(obj);
|
||||
return source.placement === "prototype" ? source.id : null;
|
||||
}
|
||||
function resolveSource(obj) {
|
||||
if (obj.isMemberExpression() && obj.get("property").isIdentifier({
|
||||
name: "prototype"
|
||||
@@ -93,22 +98,23 @@ function resolveSource(obj) {
|
||||
}
|
||||
const path = resolve(obj);
|
||||
switch (path == null ? void 0 : path.type) {
|
||||
case "NullLiteral":
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
case "RegExpLiteral":
|
||||
return {
|
||||
id: "RegExp",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "FunctionExpression":
|
||||
return {
|
||||
id: "Function",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "StringLiteral":
|
||||
case "TemplateLiteral":
|
||||
return {
|
||||
id: "String",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "NumberLiteral":
|
||||
case "NumericLiteral":
|
||||
return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
@@ -118,6 +124,11 @@ function resolveSource(obj) {
|
||||
id: "Boolean",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "BigIntLiteral":
|
||||
return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "ObjectExpression":
|
||||
return {
|
||||
id: "Object",
|
||||
@@ -128,6 +139,192 @@ function resolveSource(obj) {
|
||||
id: "Array",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "FunctionExpression":
|
||||
case "ArrowFunctionExpression":
|
||||
case "ClassExpression":
|
||||
return {
|
||||
id: "Function",
|
||||
placement: "prototype"
|
||||
};
|
||||
// new Constructor() -> resolve the constructor name
|
||||
case "NewExpression":
|
||||
{
|
||||
const calleeId = resolveId(path.get("callee"));
|
||||
if (calleeId) return {
|
||||
id: calleeId,
|
||||
placement: "prototype"
|
||||
};
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// Unary expressions -> result type depends on operator
|
||||
case "UnaryExpression":
|
||||
{
|
||||
const {
|
||||
operator
|
||||
} = path.node;
|
||||
if (operator === "typeof") return {
|
||||
id: "String",
|
||||
placement: "prototype"
|
||||
};
|
||||
if (operator === "!" || operator === "delete") return {
|
||||
id: "Boolean",
|
||||
placement: "prototype"
|
||||
};
|
||||
// Unary + always produces Number (throws on BigInt)
|
||||
if (operator === "+") return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
// Unary - and ~ can produce Number or BigInt depending on operand
|
||||
if (operator === "-" || operator === "~") {
|
||||
const arg = resolveInstance(path.get("argument"));
|
||||
if (arg === "BigInt") return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
if (arg !== null) return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// ++i, i++ produce Number or BigInt depending on the argument
|
||||
case "UpdateExpression":
|
||||
{
|
||||
const arg = resolveInstance(path.get("argument"));
|
||||
if (arg === "BigInt") return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
if (arg !== null) return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// Binary expressions -> result type depends on operator
|
||||
case "BinaryExpression":
|
||||
{
|
||||
const {
|
||||
operator
|
||||
} = path.node;
|
||||
if (operator === "==" || operator === "!=" || operator === "===" || operator === "!==" || operator === "<" || operator === ">" || operator === "<=" || operator === ">=" || operator === "instanceof" || operator === "in") {
|
||||
return {
|
||||
id: "Boolean",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
// >>> always produces Number
|
||||
if (operator === ">>>") {
|
||||
return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
// Arithmetic and bitwise operators can produce Number or BigInt
|
||||
if (operator === "-" || operator === "*" || operator === "/" || operator === "%" || operator === "**" || operator === "&" || operator === "|" || operator === "^" || operator === "<<" || operator === ">>") {
|
||||
const left = resolveInstance(path.get("left"));
|
||||
const right = resolveInstance(path.get("right"));
|
||||
if (left === "BigInt" && right === "BigInt") {
|
||||
return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
if (left !== null && right !== null) {
|
||||
return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// + depends on operand types: string wins, otherwise number or bigint
|
||||
if (operator === "+") {
|
||||
const left = resolveInstance(path.get("left"));
|
||||
const right = resolveInstance(path.get("right"));
|
||||
if (left === "String" || right === "String") {
|
||||
return {
|
||||
id: "String",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
if (left === "Number" && right === "Number") {
|
||||
return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
if (left === "BigInt" && right === "BigInt") {
|
||||
return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// (a, b, c) -> the result is the last expression
|
||||
case "SequenceExpression":
|
||||
{
|
||||
const expressions = path.get("expressions");
|
||||
return resolveSource(expressions[expressions.length - 1]);
|
||||
}
|
||||
// a = b -> the result is the right side
|
||||
case "AssignmentExpression":
|
||||
{
|
||||
if (path.node.operator === "=") {
|
||||
return resolveSource(path.get("right"));
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// a ? b : c -> if both branches resolve to the same type, use it
|
||||
case "ConditionalExpression":
|
||||
{
|
||||
const consequent = resolveSource(path.get("consequent"));
|
||||
const alternate = resolveSource(path.get("alternate"));
|
||||
if (consequent.id && consequent.id === alternate.id) {
|
||||
return consequent;
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// (expr) -> unwrap parenthesized expressions
|
||||
case "ParenthesizedExpression":
|
||||
return resolveSource(path.get("expression"));
|
||||
// TypeScript / Flow type wrappers -> unwrap to the inner expression
|
||||
case "TSAsExpression":
|
||||
case "TSSatisfiesExpression":
|
||||
case "TSNonNullExpression":
|
||||
case "TSInstantiationExpression":
|
||||
case "TSTypeAssertion":
|
||||
case "TypeCastExpression":
|
||||
return resolveSource(path.get("expression"));
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
|
||||
4
node_modules/@babel/helper-define-polyfill-provider/package.json
generated
vendored
4
node_modules/@babel/helper-define-polyfill-provider/package.json
generated
vendored
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@babel/helper-define-polyfill-provider",
|
||||
"version": "0.6.6",
|
||||
"version": "0.6.7",
|
||||
"description": "Babel helper to create your own polyfill provider",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -55,5 +55,5 @@
|
||||
"webpack": "^4.47.0",
|
||||
"webpack-cli": "^3.3.12"
|
||||
},
|
||||
"gitHead": "9b040e303af7d703a57f16d46538d1b0d5462237"
|
||||
"gitHead": "35d742c19e250d8908b0fb77340191f268706161"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "babel-plugin-polyfill-corejs3",
|
||||
"version": "0.14.0",
|
||||
"version": "0.14.1",
|
||||
"description": "A Babel plugin to inject imports to core-js@3 polyfills",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -26,7 +26,7 @@
|
||||
"babel-plugin"
|
||||
],
|
||||
"dependencies": {
|
||||
"@babel/helper-define-polyfill-provider": "^0.6.6",
|
||||
"@babel/helper-define-polyfill-provider": "^0.6.7",
|
||||
"core-js-compat": "^3.48.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -45,5 +45,5 @@
|
||||
"peerDependencies": {
|
||||
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
|
||||
},
|
||||
"gitHead": "9b040e303af7d703a57f16d46538d1b0d5462237"
|
||||
"gitHead": "35d742c19e250d8908b0fb77340191f268706161"
|
||||
}
|
||||
56
node_modules/@jqhtml/core/dist/component-cache.d.ts
generated
vendored
Normal file
56
node_modules/@jqhtml/core/dist/component-cache.d.ts
generated
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
/**
|
||||
* JQHTML Component Cache Integration
|
||||
*
|
||||
* Extracted from component.ts - handles cache key generation,
|
||||
* cache reads during create(), cache checks during reload(),
|
||||
* and HTML cache snapshots during ready().
|
||||
*
|
||||
* Uses Jqhtml_Local_Storage as the underlying storage layer.
|
||||
*/
|
||||
/**
|
||||
* Result of generating a cache key for a component.
|
||||
*/
|
||||
interface Cache_Key_Result {
|
||||
cache_key: string | null;
|
||||
uncacheable_property?: string;
|
||||
}
|
||||
/**
|
||||
* Generate a cache key for a component using its name + args.
|
||||
* Supports custom cache_id() override.
|
||||
*
|
||||
* @param component - The component instance
|
||||
* @returns Cache key string or null if caching is disabled
|
||||
*/
|
||||
export declare function generate_cache_key(component: any): Cache_Key_Result;
|
||||
/**
|
||||
* Read cache during create() phase.
|
||||
* Sets component._cache_key, _cached_html, _use_cached_data_hit as side effects.
|
||||
*
|
||||
* @param component - The component instance
|
||||
*/
|
||||
export declare function read_cache_in_create(component: any): void;
|
||||
/**
|
||||
* Check cache during reload() when args have changed.
|
||||
* If cache hit, hydrates data/html and triggers an immediate render.
|
||||
*
|
||||
* @param component - The component instance
|
||||
* @returns true if rendered from cache, false otherwise
|
||||
*/
|
||||
export declare function check_cache_on_reload(component: any): boolean;
|
||||
/**
|
||||
* Write HTML cache snapshot during ready() phase.
|
||||
* Only caches if the component is dynamic (data changed during on_load).
|
||||
*
|
||||
* @param component - The component instance
|
||||
*/
|
||||
export declare function write_html_cache_snapshot(component: any): void;
|
||||
/**
|
||||
* Write data/HTML to cache after on_load() completes.
|
||||
* Called from _apply_load_result().
|
||||
*
|
||||
* @param component - The component instance
|
||||
* @param data_changed - Whether this.data changed during on_load
|
||||
*/
|
||||
export declare function write_cache_after_load(component: any, data_changed: boolean): void;
|
||||
export {};
|
||||
//# sourceMappingURL=component-cache.d.ts.map
|
||||
1
node_modules/@jqhtml/core/dist/component-cache.d.ts.map
generated
vendored
Normal file
1
node_modules/@jqhtml/core/dist/component-cache.d.ts.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"component-cache.d.ts","sourceRoot":"","sources":["../src/component-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH;;GAEG;AACH,UAAU,gBAAgB;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,GAAG,GAAG,gBAAgB,CAanE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI,CA+FzD;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,CAqD7D;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI,CA2B9D;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,GAAG,IAAI,CA4BlF"}
|
||||
57
node_modules/@jqhtml/core/dist/component-events.d.ts
generated
vendored
Normal file
57
node_modules/@jqhtml/core/dist/component-events.d.ts
generated
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
/**
|
||||
* JQHTML Component Event System
|
||||
*
|
||||
* Extracted from component.ts - handles lifecycle event registration,
|
||||
* triggering, and state tracking.
|
||||
*
|
||||
* Events have "sticky" semantics for lifecycle events: if an event has already
|
||||
* occurred, new .on() handlers fire immediately with the stored data.
|
||||
*/
|
||||
/**
|
||||
* Register a callback for an event.
|
||||
*
|
||||
* Lifecycle events (create, render, load, loaded, ready) are "sticky":
|
||||
* If a lifecycle event has already occurred, the callback fires immediately
|
||||
* AND registers for future occurrences.
|
||||
*
|
||||
* Custom events only fire when explicitly triggered via trigger().
|
||||
*
|
||||
* @param component - The component instance
|
||||
* @param event_name - Name of the event
|
||||
* @param callback - Callback: (component, data?) => void
|
||||
*/
|
||||
export declare function event_on(component: any, event_name: string, callback: (comp: any, data?: any) => void): any;
|
||||
/**
|
||||
* Trigger an event - fires all registered callbacks.
|
||||
* Marks event as occurred so future .on() calls fire immediately.
|
||||
*
|
||||
* @param component - The component instance
|
||||
* @param event_name - Name of the event to trigger
|
||||
* @param data - Optional data to pass to callbacks as second parameter
|
||||
*/
|
||||
export declare function event_trigger(component: any, event_name: string, data?: any): void;
|
||||
/**
|
||||
* Check if any callbacks are registered for a given event.
|
||||
*
|
||||
* @param component - The component instance
|
||||
* @param event_name - Name of the event to check
|
||||
*/
|
||||
export declare function event_on_registered(component: any, event_name: string): boolean;
|
||||
/**
|
||||
* Invalidate a lifecycle event - removes the "already occurred" marker.
|
||||
*
|
||||
* After invalidate() is called:
|
||||
* - New .on() handlers will NOT fire immediately
|
||||
* - The ready() promise will NOT resolve immediately
|
||||
* - Handlers wait for the next trigger() call
|
||||
*
|
||||
* Existing registered callbacks are NOT removed - they'll fire on next trigger().
|
||||
*
|
||||
* Use case: Call invalidate('ready') at the start of reload() or render()
|
||||
* so that any new .on('ready') handlers wait for the reload/render to complete.
|
||||
*
|
||||
* @param component - The component instance
|
||||
* @param event_name - Name of the event to invalidate
|
||||
*/
|
||||
export declare function event_invalidate(component: any, event_name: string): void;
|
||||
//# sourceMappingURL=component-events.d.ts.map
|
||||
1
node_modules/@jqhtml/core/dist/component-events.d.ts.map
generated
vendored
Normal file
1
node_modules/@jqhtml/core/dist/component-events.d.ts.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"component-events.d.ts","sourceRoot":"","sources":["../src/component-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,GAAG,GAAG,CAqB3G;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAelF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAG/E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAEzE"}
|
||||
47
node_modules/@jqhtml/core/dist/component-queue.d.ts
generated
vendored
Normal file
47
node_modules/@jqhtml/core/dist/component-queue.d.ts
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
/**
|
||||
* JQHTML Component Lifecycle Queue
|
||||
*
|
||||
* Serializes lifecycle operations (render, reload, refresh) per component.
|
||||
* Replaces _create_debounced_function with a proper queue that:
|
||||
*
|
||||
* - At most one operation runs at a time per component
|
||||
* - At most one operation is pending (waiting for the current to finish)
|
||||
* - Same-type pending operations collapse (fan-in: all callers share one execution)
|
||||
* - Different-type pending operations: new replaces old (old callers get the new result)
|
||||
*
|
||||
* Boot bypasses this queue entirely - it runs the lifecycle directly.
|
||||
*/
|
||||
export declare class Component_Queue {
|
||||
/** Currently executing operation */
|
||||
private _current;
|
||||
/** Next operation waiting to execute after current completes */
|
||||
private _pending;
|
||||
/**
|
||||
* Enqueue a lifecycle operation.
|
||||
*
|
||||
* Behavior:
|
||||
* - Nothing running → execute immediately
|
||||
* - Something running, no pending → create pending entry
|
||||
* - Something running, same type pending → collapse (share pending promise)
|
||||
* - Something running, different type pending → replace pending (all callers get new result)
|
||||
*
|
||||
* @param type - Operation type ('render', 'reload', 'refresh', 'load')
|
||||
* @param executor - The async function to execute
|
||||
* @returns Promise that resolves when the operation completes
|
||||
*/
|
||||
enqueue(type: string, executor: () => Promise<void>): Promise<void>;
|
||||
/**
|
||||
* Execute an operation and handle pending queue after completion.
|
||||
* @private
|
||||
*/
|
||||
private _execute;
|
||||
/**
|
||||
* Check if any operation is currently running.
|
||||
*/
|
||||
get is_busy(): boolean;
|
||||
/**
|
||||
* Check if there's a pending operation waiting.
|
||||
*/
|
||||
get has_pending(): boolean;
|
||||
}
|
||||
//# sourceMappingURL=component-queue.d.ts.map
|
||||
1
node_modules/@jqhtml/core/dist/component-queue.d.ts.map
generated
vendored
Normal file
1
node_modules/@jqhtml/core/dist/component-queue.d.ts.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"component-queue.d.ts","sourceRoot":"","sources":["../src/component-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,qBAAa,eAAe;IAC1B,oCAAoC;IACpC,OAAO,CAAC,QAAQ,CAAyD;IAEzE,gEAAgE;IAChE,OAAO,CAAC,QAAQ,CAA4B;IAE5C;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA4CnE;;;OAGG;IACH,OAAO,CAAC,QAAQ;IA0BhB;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,OAAO,CAEzB;CACF"}
|
||||
84
node_modules/@jqhtml/core/dist/component.d.ts
generated
vendored
84
node_modules/@jqhtml/core/dist/component.d.ts
generated
vendored
@@ -40,7 +40,7 @@ export declare class Jqhtml_Component {
|
||||
private _data_on_last_render;
|
||||
private __initial_data_snapshot;
|
||||
private __data_frozen;
|
||||
private _reload_debounced?;
|
||||
private _queue;
|
||||
private next_reload_force_refresh;
|
||||
private __lifecycle_authorized;
|
||||
private _cache_key;
|
||||
@@ -50,8 +50,8 @@ export declare class Jqhtml_Component {
|
||||
private _is_dynamic;
|
||||
private _on_render_complete;
|
||||
private _use_cached_data_hit;
|
||||
private _skip_render_and_ready;
|
||||
private _skip_ready;
|
||||
private _load_only;
|
||||
private _load_render_only;
|
||||
private _has_rendered;
|
||||
private _load_queue;
|
||||
private __has_custom_on_load;
|
||||
@@ -100,19 +100,21 @@ export declare class Jqhtml_Component {
|
||||
* @returns The current _render_count after incrementing (used to detect stale renders)
|
||||
* @private
|
||||
*/
|
||||
_render(id?: string | null): number;
|
||||
_render(id?: string | null, options?: {
|
||||
skip_on_render?: boolean;
|
||||
}): number;
|
||||
/**
|
||||
* Public render method - re-renders component and completes lifecycle
|
||||
* This is what users should call when they want to update a component.
|
||||
*
|
||||
* Lifecycle sequence:
|
||||
* Lifecycle sequence (serialized via component queue):
|
||||
* 1. _render() - Updates DOM synchronously, calls on_render(), fires 'render' event
|
||||
* 2. Async continuation (fire and forget):
|
||||
* - _wait_for_children_ready() - Waits for all children to reach ready state
|
||||
* - on_ready() - Calls user's ready hook
|
||||
* - trigger('ready') - Fires ready event
|
||||
* 2. _wait_for_children_ready() - Waits for all children to reach ready state
|
||||
* 3. on_ready() - Calls user's ready hook
|
||||
* 4. trigger('ready') - Fires ready event
|
||||
*
|
||||
* Returns immediately after _render() completes - does NOT wait for children
|
||||
* Goes through the component queue to prevent concurrent lifecycle operations.
|
||||
* Returns a Promise that resolves when the full render lifecycle completes.
|
||||
*/
|
||||
render(id?: string | null): void;
|
||||
/**
|
||||
@@ -155,16 +157,7 @@ export declare class Jqhtml_Component {
|
||||
_load(): Promise<void>;
|
||||
/**
|
||||
* Execute on_load() on a fully detached proxy.
|
||||
*
|
||||
* The proxy has:
|
||||
* - A CLONE of this.data (from __initial_data_snapshot)
|
||||
* - Read-only access to this.args
|
||||
* - No access to anything else (this.$, this.sid, etc.)
|
||||
*
|
||||
* This ensures on_load runs completely isolated from the component instance.
|
||||
*
|
||||
* @param use_load_coordinator - If true, register with Load_Coordinator for deduplication
|
||||
* @returns The resulting data from the proxy after on_load completes
|
||||
* @see data-proxy.ts for full implementation
|
||||
* @private
|
||||
*/
|
||||
private _execute_on_load_detached;
|
||||
@@ -346,45 +339,22 @@ export declare class Jqhtml_Component {
|
||||
*/
|
||||
component_name(): string;
|
||||
/**
|
||||
* Register event callback
|
||||
* Supports lifecycle events ('render', 'create', 'load', 'ready', 'stop') and custom events
|
||||
* Lifecycle event callbacks fire after the lifecycle method completes
|
||||
* If a lifecycle event has already occurred, the callback fires immediately AND registers for future occurrences
|
||||
* Custom events only fire when explicitly triggered via .trigger()
|
||||
*
|
||||
* Callback signature: (component, data?) => void
|
||||
* - component: The component instance that triggered the event
|
||||
* - data: Optional data passed as second parameter to trigger()
|
||||
* Register event callback - delegates to component-events.ts
|
||||
* @see component-events.ts for full documentation
|
||||
*/
|
||||
on(event_name: string, callback: (component: Jqhtml_Component, data?: any) => void): this;
|
||||
/**
|
||||
* Trigger a lifecycle event - fires all registered callbacks
|
||||
* Marks event as occurred so future .on() calls fire immediately
|
||||
*
|
||||
* @param event_name - Name of the event to trigger
|
||||
* @param data - Optional data to pass to callbacks as second parameter
|
||||
* Trigger a lifecycle event - delegates to component-events.ts
|
||||
* @see component-events.ts for full documentation
|
||||
*/
|
||||
trigger(event_name: string, data?: any): void;
|
||||
/**
|
||||
* Check if any callbacks are registered for a given event
|
||||
* Used to determine if cleanup logic needs to run
|
||||
*/
|
||||
_on_registered(event_name: string): boolean;
|
||||
/**
|
||||
* Invalidate a lifecycle event - removes the "already occurred" marker
|
||||
*
|
||||
* This is the opposite of trigger(). After invalidate() is called:
|
||||
* - New .on() handlers will NOT fire immediately
|
||||
* - The ready() promise will NOT resolve immediately
|
||||
* - Handlers wait for the next trigger() call
|
||||
*
|
||||
* Existing registered callbacks are NOT removed - they'll fire on next trigger().
|
||||
*
|
||||
* Use case: Call invalidate('ready') at the start of reload() or render()
|
||||
* so that any new .on('ready') handlers wait for the reload/render to complete
|
||||
* rather than firing immediately based on the previous lifecycle's state.
|
||||
*
|
||||
* @param event_name - Name of the event to invalidate
|
||||
* Invalidate a lifecycle event - delegates to component-events.ts
|
||||
* @see component-events.ts for full documentation
|
||||
*/
|
||||
invalidate(event_name: string): void;
|
||||
/**
|
||||
@@ -457,21 +427,5 @@ export declare class Jqhtml_Component {
|
||||
private _get_dom_children;
|
||||
private _log_lifecycle;
|
||||
private _log_debug;
|
||||
/**
|
||||
* Creates a debounced function with exclusivity and promise fan-in
|
||||
*
|
||||
* When invoked, immediately runs the callback exclusively.
|
||||
* For subsequent invocations, applies a delay before running the callback exclusively again.
|
||||
* The delay starts after the current asynchronous operation resolves.
|
||||
*
|
||||
* If delay is 0, the function only prevents enqueueing multiple executions,
|
||||
* but will still run them immediately in an exclusive sequential manner.
|
||||
*
|
||||
* The most recent invocation's parameters are used when the function executes.
|
||||
* Returns a promise that resolves when the next exclusive execution completes.
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
private _create_debounced_function;
|
||||
}
|
||||
//# sourceMappingURL=component.d.ts.map
|
||||
2
node_modules/@jqhtml/core/dist/component.d.ts.map
generated
vendored
2
node_modules/@jqhtml/core/dist/component.d.ts.map
generated
vendored
@@ -1 +1 @@
|
||||
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgBH,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,YAAY,CAAC,EAAE;YACb,GAAG,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;YACjF,UAAU,EAAE,MAAM,IAAI,CAAC;SACxB,CAAC;KACH;CACF;AAED,qBAAa,gBAAgB;IAE3B,MAAM,CAAC,kBAAkB,UAAQ;IACjC,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC;IAGtB,CAAC,EAAE,GAAG,CAAC;IACP,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAK;IAGzB,OAAO,CAAC,kBAAkB,CAAmB;IAC7C,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,oBAAoB,CAAwE;IACpG,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,oBAAoB,CAAoC;IAChE,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,uBAAuB,CAAoC;IACnE,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,iBAAiB,CAAC,CAAsB;IAChD,OAAO,CAAC,yBAAyB,CAAwB;IACzD,OAAO,CAAC,sBAAsB,CAAkB;IAGhD,OAAO,CAAC,UAAU,CAAuB;IAGzC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,8BAA8B,CAAkB;IACxD,OAAO,CAAC,WAAW,CAAkB;IAGrC,OAAO,CAAC,mBAAmB,CAAkB;IAG7C,OAAO,CAAC,oBAAoB,CAAkB;IAI9C,OAAO,CAAC,sBAAsB,CAAkB;IAIhD,OAAO,CAAC,WAAW,CAAkB;IAIrC,OAAO,CAAC,aAAa,CAAkB;IAIvC,OAAO,CAAC,WAAW,CAAoC;IAKvD,OAAO,CAAC,oBAAoB,CAAkB;gBAElC,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM;IA2JzD;;;;OAIG;IACH,OAAO,CAAC,0BAA0B;IAmClC;;;;;;OAMG;YACW,eAAe;IAO7B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAIpB;;;OAGG;IACH;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB5B;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,GAAE,MAAM,GAAG,IAAW,GAAG,MAAM;IAsUzC;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,EAAE,GAAE,MAAM,GAAG,IAAW,GAAG,IAAI;IAmDtC;;;OAGG;IACH,MAAM,CAAC,EAAE,GAAE,MAAM,GAAG,IAAW,GAAG,IAAI;IAItC;;;;;;;;;;;;;;OAcG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAkD9B;;;OAGG;IACH,MAAM,IAAI,IAAI;IAwJd;;;;;;;;;;OAUG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6I5B;;;;;;;;;;;;;OAaG;YACW,yBAAyB;IAkKvC;;;;;;;;;OASG;YACW,kBAAkB;IAyFhC;;;;OAIG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAuD7B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB3C;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9C;;;;OAIG;YACW,wBAAwB;IAqCtC;;;;;;;;;;OAUG;YACW,4BAA4B;IAqC1C;;;;;;;;OAQG;IACG,MAAM,CAAC,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBpD;;;;;;;;OAQG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA2K9B;;;;OAIG;IACH;;;;OAIG;IACH,KAAK,IAAI,IAAI;IA+Cb;;;OAGG;IACH,IAAI,IAAI,IAAI;IAkBZ,SAAS,IAAI,IAAI;IACjB,SAAS,IAAI,IAAI;IACjB,OAAO,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC/B,UAAU,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC5B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAC/B,OAAO,IAAI,IAAI;IAEf;;;;;;;;;OASG;IACH,QAAQ,CAAC,IAAI,MAAM;IAEnB;;;;OAIG;IACH;;;OAGG;IACH,gBAAgB,IAAI,OAAO;IAmC3B;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;;;;;;;;;OAUG;IACH,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAuBzF;;;;;;OAMG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAiB7C;;;OAGG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAK3C;;;;;;;;;;;;;;;OAeG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIpC;;;;;;;;;;;;;;;OAeG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG;IAgB3B;;;;;;;;;;;;;;;OAeG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAgB9C;;;OAGG;IACH,YAAY,IAAI,gBAAgB,GAAG,IAAI;IAIvC;;OAEG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAa1C;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAoBlD;;OAEG;IACH,MAAM,CAAC,mBAAmB,IAAI,MAAM,EAAE;IA0CtC,OAAO,CAAC,aAAa;IAIrB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAkB7B,OAAO,CAAC,kBAAkB;IA4B1B,OAAO,CAAC,yBAAyB;IAuHjC,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,gBAAgB;IAcxB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IA+BzB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,UAAU;IAUlB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,0BAA0B;CAqEnC"}
|
||||
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoBH,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,YAAY,CAAC,EAAE;YACb,GAAG,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;YACjF,UAAU,EAAE,MAAM,IAAI,CAAC;SACxB,CAAC;KACH;CACF;AAED,qBAAa,gBAAgB;IAE3B,MAAM,CAAC,kBAAkB,UAAQ;IACjC,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC;IAGtB,CAAC,EAAE,GAAG,CAAC;IACP,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAK;IAGzB,OAAO,CAAC,kBAAkB,CAAmB;IAC7C,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,oBAAoB,CAAwE;IACpG,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,oBAAoB,CAAoC;IAChE,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,uBAAuB,CAAoC;IACnE,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,yBAAyB,CAAwB;IACzD,OAAO,CAAC,sBAAsB,CAAkB;IAGhD,OAAO,CAAC,UAAU,CAAuB;IAGzC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,8BAA8B,CAAkB;IACxD,OAAO,CAAC,WAAW,CAAkB;IAGrC,OAAO,CAAC,mBAAmB,CAAkB;IAG7C,OAAO,CAAC,oBAAoB,CAAkB;IAG9C,OAAO,CAAC,UAAU,CAAkB;IAGpC,OAAO,CAAC,iBAAiB,CAAkB;IAI3C,OAAO,CAAC,aAAa,CAAkB;IAIvC,OAAO,CAAC,WAAW,CAAoC;IAKvD,OAAO,CAAC,oBAAoB,CAAkB;gBAElC,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM;IA6EzD;;;;OAIG;IACH,OAAO,CAAC,0BAA0B;IAmClC;;;;;;OAMG;YACW,eAAe;IAO7B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAIpB;;;OAGG;IACH;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB5B;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,GAAE,MAAM,GAAG,IAAW,EAAE,OAAO,GAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,MAAM;IAiUrF;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,EAAE,GAAE,MAAM,GAAG,IAAW,GAAG,IAAI;IAmDtC;;;OAGG;IACH,MAAM,CAAC,EAAE,GAAE,MAAM,GAAG,IAAW,GAAG,IAAI;IAItC;;;;;;;;;;;;;;OAcG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IA0D9B;;;OAGG;IACH,MAAM,IAAI,IAAI;IAuCd;;;;;;;;;;OAUG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiJ5B;;;;OAIG;YACW,yBAAyB;IAOvC;;;;;;;;;OASG;YACW,kBAAkB;IAqEhC;;;;OAIG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B7B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB3C;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9C;;;;OAIG;YACW,wBAAwB;IAqCtC;;;;;;;;;;OAUG;YACW,4BAA4B;IAqC1C;;;;;;;;OAQG;IACG,MAAM,CAAC,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBpD;;;;;;;;OAQG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA8G9B;;;;OAIG;IACH;;;;OAIG;IACH,KAAK,IAAI,IAAI;IA+Cb;;;OAGG;IACH,IAAI,IAAI,IAAI;IAkBZ,SAAS,IAAI,IAAI;IACjB,SAAS,IAAI,IAAI;IACjB,OAAO,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC/B,UAAU,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC5B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAC/B,OAAO,IAAI,IAAI;IAEf;;;;;;;;;OASG;IACH,QAAQ,CAAC,IAAI,MAAM;IAEnB;;;;OAIG;IACH;;;OAGG;IACH,gBAAgB,IAAI,OAAO;IAmC3B;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;;OAGG;IACH,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAIzF;;;OAGG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAI7C;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI3C;;;OAGG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIpC;;;;;;;;;;;;;;;OAeG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG;IAgB3B;;;;;;;;;;;;;;;OAeG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAgB9C;;;OAGG;IACH,YAAY,IAAI,gBAAgB,GAAG,IAAI;IAIvC;;OAEG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAa1C;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAoBlD;;OAEG;IACH,MAAM,CAAC,mBAAmB,IAAI,MAAM,EAAE;IA0CtC,OAAO,CAAC,aAAa;IAIrB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAkB7B,OAAO,CAAC,kBAAkB;IA4B1B,OAAO,CAAC,yBAAyB;IAuHjC,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,gBAAgB;IAcxB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IA+BzB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,UAAU;CAUnB"}
|
||||
37
node_modules/@jqhtml/core/dist/data-proxy.d.ts
generated
vendored
Normal file
37
node_modules/@jqhtml/core/dist/data-proxy.d.ts
generated
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
/**
|
||||
* JQHTML Data Proxy System
|
||||
*
|
||||
* Extracted from component.ts - handles:
|
||||
* - Data freeze/unfreeze enforcement via Proxy
|
||||
* - Detached on_load() execution with restricted access
|
||||
*/
|
||||
/**
|
||||
* Set up the `this.data` property on a component using Object.defineProperty
|
||||
* with a Proxy that enforces freeze/unfreeze semantics.
|
||||
*
|
||||
* After setup:
|
||||
* - `this.data` reads/writes go through a Proxy
|
||||
* - When `component.__data_frozen === true`, writes throw errors
|
||||
* - When frozen is false, writes pass through normally
|
||||
*
|
||||
* @param component - The component instance to set up data on
|
||||
*/
|
||||
export declare function setup_data_property(component: any): void;
|
||||
/**
|
||||
* Execute on_load() in a detached context with restricted access.
|
||||
*
|
||||
* Creates a sandboxed environment where on_load() can only access:
|
||||
* - this.args (read-only)
|
||||
* - this.data (read/write, cloned from __initial_data_snapshot)
|
||||
*
|
||||
* All other property access (this.$, this.$sid, etc.) throws errors.
|
||||
*
|
||||
* @param component - The component instance
|
||||
* @param use_load_coordinator - Whether to use Load_Coordinator for deduplication
|
||||
* @returns The resulting data and optional coordination completion function
|
||||
*/
|
||||
export declare function execute_on_load_detached(component: any, use_load_coordinator?: boolean): Promise<{
|
||||
data: Record<string, any>;
|
||||
complete_coordination: ((data: Record<string, any>) => void) | null;
|
||||
}>;
|
||||
//# sourceMappingURL=data-proxy.d.ts.map
|
||||
1
node_modules/@jqhtml/core/dist/data-proxy.d.ts.map
generated
vendored
Normal file
1
node_modules/@jqhtml/core/dist/data-proxy.d.ts.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"data-proxy.d.ts","sourceRoot":"","sources":["../src/data-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI,CAiFxD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,wBAAwB,CAAC,SAAS,EAAE,GAAG,EAAE,oBAAoB,GAAE,OAAe,GAAG,OAAO,CAAC;IAC7G,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,qBAAqB,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;CACrE,CAAC,CA8JD"}
|
||||
1455
node_modules/@jqhtml/core/dist/index.cjs
generated
vendored
1455
node_modules/@jqhtml/core/dist/index.cjs
generated
vendored
File diff suppressed because it is too large
Load Diff
2
node_modules/@jqhtml/core/dist/index.cjs.map
generated
vendored
2
node_modules/@jqhtml/core/dist/index.cjs.map
generated
vendored
File diff suppressed because one or more lines are too long
1455
node_modules/@jqhtml/core/dist/index.js
generated
vendored
1455
node_modules/@jqhtml/core/dist/index.js
generated
vendored
File diff suppressed because it is too large
Load Diff
2
node_modules/@jqhtml/core/dist/index.js.map
generated
vendored
2
node_modules/@jqhtml/core/dist/index.js.map
generated
vendored
File diff suppressed because one or more lines are too long
2
node_modules/@jqhtml/core/dist/instruction-processor.d.ts.map
generated
vendored
2
node_modules/@jqhtml/core/dist/instruction-processor.d.ts.map
generated
vendored
@@ -1 +1 @@
|
||||
{"version":3,"file":"instruction-processor.d.ts","sourceRoot":"","sources":["../src/instruction-processor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIlD,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;CAClL;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;CAClF;AAED,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,iBAAiB,GAAG,oBAAoB,GAAG,eAAe,GAAG,MAAM,CAAC;AAqB/G,wBAAgB,GAAG,IAAI,MAAM,CA2C5B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,WAAW,EAAE,EAC3B,MAAM,EAAE,GAAG,EACX,OAAO,EAAE,gBAAgB,EACzB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GACtC,IAAI,CAwCN;AAseD;;GAEG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAW1F"}
|
||||
{"version":3,"file":"instruction-processor.d.ts","sourceRoot":"","sources":["../src/instruction-processor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIlD,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;CAClL;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;CAClF;AAED,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,iBAAiB,GAAG,oBAAoB,GAAG,eAAe,GAAG,MAAM,CAAC;AAqB/G,wBAAgB,GAAG,IAAI,MAAM,CA2C5B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,WAAW,EAAE,EAC3B,MAAM,EAAE,GAAG,EACX,OAAO,EAAE,gBAAgB,EACzB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GACtC,IAAI,CAwCN;AAgfD;;GAEG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAW1F"}
|
||||
1457
node_modules/@jqhtml/core/dist/jqhtml-core.esm.js
generated
vendored
1457
node_modules/@jqhtml/core/dist/jqhtml-core.esm.js
generated
vendored
File diff suppressed because it is too large
Load Diff
2
node_modules/@jqhtml/core/dist/jqhtml-core.esm.js.map
generated
vendored
2
node_modules/@jqhtml/core/dist/jqhtml-core.esm.js.map
generated
vendored
File diff suppressed because one or more lines are too long
8
node_modules/@jqhtml/core/dist/lifecycle-manager.d.ts
generated
vendored
8
node_modules/@jqhtml/core/dist/lifecycle-manager.d.ts
generated
vendored
@@ -26,11 +26,9 @@ export declare class LifecycleManager {
|
||||
* Boot a component - run its full lifecycle
|
||||
* Called when component is created
|
||||
*
|
||||
* Supports lifecycle skip flags:
|
||||
* - skip_render_and_ready: Skip first render/on_render and skip on_ready entirely.
|
||||
* Component reports ready after on_load completes.
|
||||
* - skip_ready: Skip on_ready only.
|
||||
* Component reports ready after on_render completes (after potential re-render from on_load).
|
||||
* Supports lifecycle truncation flags:
|
||||
* - _load_only: on_create + on_load only. No render, no children, no on_render, no after_load, no on_ready.
|
||||
* - _load_render_only: on_create + render + on_load + re-render. No on_render, no after_load, no on_ready.
|
||||
*/
|
||||
boot_component(component: Jqhtml_Component): Promise<void>;
|
||||
/**
|
||||
|
||||
2
node_modules/@jqhtml/core/dist/lifecycle-manager.d.ts.map
generated
vendored
2
node_modules/@jqhtml/core/dist/lifecycle-manager.d.ts.map
generated
vendored
@@ -1 +1 @@
|
||||
{"version":3,"file":"lifecycle-manager.d.ts","sourceRoot":"","sources":["../src/lifecycle-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmB;IAC1C,OAAO,CAAC,iBAAiB,CAAoC;IAE7D,MAAM,CAAC,YAAY,IAAI,gBAAgB;;IAevC;;;;;;;;;OASG;IACG,cAAc,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0IhE;;OAEG;IACH,oBAAoB,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI;IAIvD;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CAetC"}
|
||||
{"version":3,"file":"lifecycle-manager.d.ts","sourceRoot":"","sources":["../src/lifecycle-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmB;IAC1C,OAAO,CAAC,iBAAiB,CAAoC;IAE7D,MAAM,CAAC,YAAY,IAAI,gBAAgB;;IAevC;;;;;;;OAOG;IACG,cAAc,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+IhE;;OAEG;IACH,oBAAoB,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI;IAIvD;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CAetC"}
|
||||
2
node_modules/@jqhtml/core/dist/load-coordinator.d.ts.map
generated
vendored
2
node_modules/@jqhtml/core/dist/load-coordinator.d.ts.map
generated
vendored
@@ -1 +1 @@
|
||||
{"version":3,"file":"load-coordinator.d.ts","sourceRoot":"","sources":["../src/load-coordinator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAYvD,MAAM,WAAW,mBAAmB;IAChC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,MAAM,CAAC,SAAS,CAA6C;IAErE;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,uBAAuB,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,mBAAmB;IA0EtF;;;OAGG;IACH,MAAM,CAAC,sBAAsB,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO;IAoBnE;;;;;OAKG;IACH,MAAM,CAAC,eAAe,CAClB,SAAS,EAAE,gBAAgB,EAC3B,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,GAC/B,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI;IAyB5C;;;OAGG;IACH,MAAM,CAAC,wBAAwB,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAWlF;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAgCrC;;;;OAIG;IACH,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAyC/E;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAuC3E;;OAEG;IACH,MAAM,CAAC,kBAAkB,IAAI,GAAG;IAahC;;OAEG;IACH,MAAM,CAAC,SAAS,IAAI,IAAI;CAG3B"}
|
||||
{"version":3,"file":"load-coordinator.d.ts","sourceRoot":"","sources":["../src/load-coordinator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAYvD,MAAM,WAAW,mBAAmB;IAChC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,MAAM,CAAC,SAAS,CAA6C;IAErE;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,uBAAuB,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,mBAAmB;IA2EtF;;;OAGG;IACH,MAAM,CAAC,sBAAsB,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO;IAoBnE;;;;;OAKG;IACH,MAAM,CAAC,eAAe,CAClB,SAAS,EAAE,gBAAgB,EAC3B,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,GAC/B,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI;IAyB5C;;;OAGG;IACH,MAAM,CAAC,wBAAwB,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAWlF;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAgCrC;;;;OAIG;IACH,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAyC/E;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAuC3E;;OAEG;IACH,MAAM,CAAC,kBAAkB,IAAI,GAAG;IAahC;;OAEG;IACH,MAAM,CAAC,SAAS,IAAI,IAAI;CAG3B"}
|
||||
2
node_modules/@jqhtml/core/package.json
generated
vendored
2
node_modules/@jqhtml/core/package.json
generated
vendored
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@jqhtml/core",
|
||||
"version": "2.3.37",
|
||||
"version": "2.3.38",
|
||||
"description": "Core runtime library for JQHTML",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
|
||||
2
node_modules/@jqhtml/parser/dist/codegen.js
generated
vendored
2
node_modules/@jqhtml/parser/dist/codegen.js
generated
vendored
@@ -1385,7 +1385,7 @@ export class CodeGenerator {
|
||||
for (const [name, component] of this.components) {
|
||||
code += `// Component: ${name}\n`;
|
||||
code += `jqhtml_components.set('${name}', {\n`;
|
||||
code += ` _jqhtml_version: '2.3.37',\n`; // Version will be replaced during build
|
||||
code += ` _jqhtml_version: '2.3.38',\n`; // Version will be replaced during build
|
||||
code += ` name: '${name}',\n`;
|
||||
code += ` tag: '${component.tagName}',\n`;
|
||||
code += ` defaultAttributes: ${this.serializeAttributeObject(component.defaultAttributes)},\n`;
|
||||
|
||||
2
node_modules/@jqhtml/parser/package.json
generated
vendored
2
node_modules/@jqhtml/parser/package.json
generated
vendored
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@jqhtml/parser",
|
||||
"version": "2.3.37",
|
||||
"version": "2.3.38",
|
||||
"description": "JQHTML template parser - converts templates to JavaScript",
|
||||
"type": "module",
|
||||
"main": "dist/index.js",
|
||||
|
||||
2
node_modules/@jqhtml/ssr/package.json
generated
vendored
2
node_modules/@jqhtml/ssr/package.json
generated
vendored
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@jqhtml/ssr",
|
||||
"version": "2.3.37",
|
||||
"version": "2.3.38",
|
||||
"description": "Server-Side Rendering for JQHTML components - renders components to HTML for SEO",
|
||||
"main": "src/index.js",
|
||||
"bin": {
|
||||
|
||||
2
node_modules/@jqhtml/vscode-extension/.version
generated
vendored
2
node_modules/@jqhtml/vscode-extension/.version
generated
vendored
@@ -1 +1 @@
|
||||
2.3.37
|
||||
2.3.38
|
||||
|
||||
BIN
node_modules/@jqhtml/vscode-extension/jqhtml-vscode-extension-2.3.37.vsix → node_modules/@jqhtml/vscode-extension/jqhtml-vscode-extension-2.3.38.vsix
generated
vendored
Executable file → Normal file
BIN
node_modules/@jqhtml/vscode-extension/jqhtml-vscode-extension-2.3.37.vsix → node_modules/@jqhtml/vscode-extension/jqhtml-vscode-extension-2.3.38.vsix
generated
vendored
Executable file → Normal file
Binary file not shown.
2
node_modules/@jqhtml/vscode-extension/package.json
generated
vendored
2
node_modules/@jqhtml/vscode-extension/package.json
generated
vendored
@@ -2,7 +2,7 @@
|
||||
"name": "@jqhtml/vscode-extension",
|
||||
"displayName": "JQHTML",
|
||||
"description": "Syntax highlighting and language support for JQHTML template files",
|
||||
"version": "2.3.37",
|
||||
"version": "2.3.38",
|
||||
"publisher": "jqhtml",
|
||||
"license": "MIT",
|
||||
"publishConfig": {
|
||||
|
||||
17
node_modules/@redis/bloom/README.md
generated
vendored
Executable file
17
node_modules/@redis/bloom/README.md
generated
vendored
Executable file
@@ -0,0 +1,17 @@
|
||||
# @redis/bloom
|
||||
|
||||
This package provides support for the [RedisBloom](https://redis.io/docs/data-types/probabilistic/) module, which adds additional probabilistic data structures to Redis.
|
||||
|
||||
Should be used with [`redis`/`@redis/client`](https://github.com/redis/node-redis).
|
||||
|
||||
:warning: To use these extra commands, your Redis server must have the RedisBloom module installed.
|
||||
|
||||
RedisBloom provides the following probabilistic data structures:
|
||||
|
||||
* Bloom Filter: for checking set membership with a high degree of certainty.
|
||||
* Cuckoo Filter: for checking set membership with a high degree of certainty.
|
||||
* T-Digest: for estimating the quantiles of a stream of data.
|
||||
* Top-K: Maintain a list of k most frequently seen items.
|
||||
* Count-Min Sketch: Determine the frequency of events in a stream.
|
||||
|
||||
For some examples, see [`bloom-filter.js`](https://github.com/redis/node-redis/tree/master/examples/bloom-filter.js), [`cuckoo-filter.js`](https://github.com/redis/node-redis/tree/master/examples/cuckoo-filter.js), [`count-min-sketch.js`](https://github.com/redis/node-redis/tree/master/examples/count-min-sketch.js) and [`topk.js`](https://github.com/redis/node-redis/tree/master/examples/topk.js) in the [examples folder](https://github.com/redis/node-redis/tree/master/examples).
|
||||
18
node_modules/@redis/bloom/dist/lib/commands/bloom/ADD.d.ts
generated
vendored
Executable file
18
node_modules/@redis/bloom/dist/lib/commands/bloom/ADD.d.ts
generated
vendored
Executable file
@@ -0,0 +1,18 @@
|
||||
import { CommandParser } from '@redis/client/dist/lib/client/parser';
|
||||
import { RedisArgument } from '@redis/client/dist/lib/RESP/types';
|
||||
declare const _default: {
|
||||
readonly IS_READ_ONLY: false;
|
||||
/**
|
||||
* Adds an item to a Bloom Filter
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter
|
||||
* @param item - The item to add to the filter
|
||||
*/
|
||||
readonly parseCommand: (this: void, parser: CommandParser, key: RedisArgument, item: RedisArgument) => void;
|
||||
readonly transformReply: {
|
||||
2: (reply: import("@redis/client/dist/lib/RESP/types").NumberReply<0 | 1>) => boolean;
|
||||
3: () => import("@redis/client/dist/lib/RESP/types").BooleanReply<boolean>;
|
||||
};
|
||||
};
|
||||
export default _default;
|
||||
//# sourceMappingURL=ADD.d.ts.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/ADD.d.ts.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/ADD.d.ts.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ADD.d.ts","sourceRoot":"","sources":["../../../../lib/commands/bloom/ADD.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAW,MAAM,mCAAmC,CAAC;;;IAKzE;;;;;OAKG;gDACkB,aAAa,OAAO,aAAa,QAAQ,aAAa;;;;;;AAR7E,wBAc6B"}
|
||||
19
node_modules/@redis/bloom/dist/lib/commands/bloom/ADD.js
generated
vendored
Executable file
19
node_modules/@redis/bloom/dist/lib/commands/bloom/ADD.js
generated
vendored
Executable file
@@ -0,0 +1,19 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const generic_transformers_1 = require("@redis/client/dist/lib/commands/generic-transformers");
|
||||
exports.default = {
|
||||
IS_READ_ONLY: false,
|
||||
/**
|
||||
* Adds an item to a Bloom Filter
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter
|
||||
* @param item - The item to add to the filter
|
||||
*/
|
||||
parseCommand(parser, key, item) {
|
||||
parser.push('BF.ADD');
|
||||
parser.pushKey(key);
|
||||
parser.push(item);
|
||||
},
|
||||
transformReply: generic_transformers_1.transformBooleanReply
|
||||
};
|
||||
//# sourceMappingURL=ADD.js.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/ADD.js.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/ADD.js.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ADD.js","sourceRoot":"","sources":["../../../../lib/commands/bloom/ADD.ts"],"names":[],"mappings":";;AAEA,+FAA6F;AAE7F,kBAAe;IACb,YAAY,EAAE,KAAK;IACnB;;;;;OAKG;IACH,YAAY,CAAC,MAAqB,EAAE,GAAkB,EAAE,IAAmB;QACzE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,cAAc,EAAE,4CAAqB;CACX,CAAC"}
|
||||
14
node_modules/@redis/bloom/dist/lib/commands/bloom/CARD.d.ts
generated
vendored
Executable file
14
node_modules/@redis/bloom/dist/lib/commands/bloom/CARD.d.ts
generated
vendored
Executable file
@@ -0,0 +1,14 @@
|
||||
import { CommandParser } from '@redis/client/dist/lib/client/parser';
|
||||
import { RedisArgument, NumberReply } from '@redis/client/dist/lib/RESP/types';
|
||||
declare const _default: {
|
||||
readonly IS_READ_ONLY: true;
|
||||
/**
|
||||
* Returns the cardinality (number of items) in a Bloom Filter
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter to query
|
||||
*/
|
||||
readonly parseCommand: (this: void, parser: CommandParser, key: RedisArgument) => void;
|
||||
readonly transformReply: () => NumberReply;
|
||||
};
|
||||
export default _default;
|
||||
//# sourceMappingURL=CARD.d.ts.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/CARD.d.ts.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/CARD.d.ts.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"CARD.d.ts","sourceRoot":"","sources":["../../../../lib/commands/bloom/CARD.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAW,MAAM,mCAAmC,CAAC;;;IAItF;;;;OAIG;gDACkB,aAAa,OAAO,aAAa;mCAIR,WAAW;;AAX3D,wBAY6B"}
|
||||
16
node_modules/@redis/bloom/dist/lib/commands/bloom/CARD.js
generated
vendored
Executable file
16
node_modules/@redis/bloom/dist/lib/commands/bloom/CARD.js
generated
vendored
Executable file
@@ -0,0 +1,16 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.default = {
|
||||
IS_READ_ONLY: true,
|
||||
/**
|
||||
* Returns the cardinality (number of items) in a Bloom Filter
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter to query
|
||||
*/
|
||||
parseCommand(parser, key) {
|
||||
parser.push('BF.CARD');
|
||||
parser.pushKey(key);
|
||||
},
|
||||
transformReply: undefined
|
||||
};
|
||||
//# sourceMappingURL=CARD.js.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/CARD.js.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/CARD.js.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"CARD.js","sourceRoot":"","sources":["../../../../lib/commands/bloom/CARD.ts"],"names":[],"mappings":";;AAGA,kBAAe;IACb,YAAY,EAAE,IAAI;IAClB;;;;OAIG;IACH,YAAY,CAAC,MAAqB,EAAE,GAAkB;QACpD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IACD,cAAc,EAAE,SAAyC;CAC/B,CAAC"}
|
||||
18
node_modules/@redis/bloom/dist/lib/commands/bloom/EXISTS.d.ts
generated
vendored
Executable file
18
node_modules/@redis/bloom/dist/lib/commands/bloom/EXISTS.d.ts
generated
vendored
Executable file
@@ -0,0 +1,18 @@
|
||||
import { CommandParser } from '@redis/client/dist/lib/client/parser';
|
||||
import { RedisArgument } from '@redis/client/dist/lib/RESP/types';
|
||||
declare const _default: {
|
||||
readonly IS_READ_ONLY: true;
|
||||
/**
|
||||
* Checks if an item exists in a Bloom Filter
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter
|
||||
* @param item - The item to check for existence
|
||||
*/
|
||||
readonly parseCommand: (this: void, parser: CommandParser, key: RedisArgument, item: RedisArgument) => void;
|
||||
readonly transformReply: {
|
||||
2: (reply: import("@redis/client/dist/lib/RESP/types").NumberReply<0 | 1>) => boolean;
|
||||
3: () => import("@redis/client/dist/lib/RESP/types").BooleanReply<boolean>;
|
||||
};
|
||||
};
|
||||
export default _default;
|
||||
//# sourceMappingURL=EXISTS.d.ts.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/EXISTS.d.ts.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/EXISTS.d.ts.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"EXISTS.d.ts","sourceRoot":"","sources":["../../../../lib/commands/bloom/EXISTS.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAW,MAAM,mCAAmC,CAAC;;;IAKzE;;;;;OAKG;gDACkB,aAAa,OAAO,aAAa,QAAQ,aAAa;;;;;;AAR7E,wBAc6B"}
|
||||
19
node_modules/@redis/bloom/dist/lib/commands/bloom/EXISTS.js
generated
vendored
Executable file
19
node_modules/@redis/bloom/dist/lib/commands/bloom/EXISTS.js
generated
vendored
Executable file
@@ -0,0 +1,19 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const generic_transformers_1 = require("@redis/client/dist/lib/commands/generic-transformers");
|
||||
exports.default = {
|
||||
IS_READ_ONLY: true,
|
||||
/**
|
||||
* Checks if an item exists in a Bloom Filter
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter
|
||||
* @param item - The item to check for existence
|
||||
*/
|
||||
parseCommand(parser, key, item) {
|
||||
parser.push('BF.EXISTS');
|
||||
parser.pushKey(key);
|
||||
parser.push(item);
|
||||
},
|
||||
transformReply: generic_transformers_1.transformBooleanReply
|
||||
};
|
||||
//# sourceMappingURL=EXISTS.js.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/EXISTS.js.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/EXISTS.js.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"EXISTS.js","sourceRoot":"","sources":["../../../../lib/commands/bloom/EXISTS.ts"],"names":[],"mappings":";;AAEA,+FAA6F;AAE7F,kBAAe;IACb,YAAY,EAAE,IAAI;IAClB;;;;;OAKG;IACH,YAAY,CAAC,MAAqB,EAAE,GAAkB,EAAE,IAAmB;QACzE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,cAAc,EAAE,4CAAqB;CACX,CAAC"}
|
||||
39
node_modules/@redis/bloom/dist/lib/commands/bloom/INFO.d.ts
generated
vendored
Executable file
39
node_modules/@redis/bloom/dist/lib/commands/bloom/INFO.d.ts
generated
vendored
Executable file
@@ -0,0 +1,39 @@
|
||||
import { CommandParser } from '@redis/client/dist/lib/client/parser';
|
||||
import { RedisArgument, NullReply, NumberReply, TuplesToMapReply, SimpleStringReply, TypeMapping } from '@redis/client/dist/lib/RESP/types';
|
||||
export type BfInfoReplyMap = TuplesToMapReply<[
|
||||
[
|
||||
SimpleStringReply<'Capacity'>,
|
||||
NumberReply
|
||||
],
|
||||
[
|
||||
SimpleStringReply<'Size'>,
|
||||
NumberReply
|
||||
],
|
||||
[
|
||||
SimpleStringReply<'Number of filters'>,
|
||||
NumberReply
|
||||
],
|
||||
[
|
||||
SimpleStringReply<'Number of items inserted'>,
|
||||
NumberReply
|
||||
],
|
||||
[
|
||||
SimpleStringReply<'Expansion rate'>,
|
||||
NullReply | NumberReply
|
||||
]
|
||||
]>;
|
||||
declare const _default: {
|
||||
readonly IS_READ_ONLY: true;
|
||||
/**
|
||||
* Returns information about a Bloom Filter, including capacity, size, number of filters, items inserted, and expansion rate
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter to get information about
|
||||
*/
|
||||
readonly parseCommand: (this: void, parser: CommandParser, key: RedisArgument) => void;
|
||||
readonly transformReply: {
|
||||
readonly 2: (this: void, reply: [SimpleStringReply<"Capacity">, NumberReply<number>, SimpleStringReply<"Size">, NumberReply<number>, SimpleStringReply<"Number of filters">, NumberReply<number>, SimpleStringReply<"Number of items inserted">, NumberReply<number>, SimpleStringReply<"Expansion rate">, NullReply | NumberReply<number>], _: any, typeMapping?: TypeMapping) => BfInfoReplyMap;
|
||||
readonly 3: () => BfInfoReplyMap;
|
||||
};
|
||||
};
|
||||
export default _default;
|
||||
//# sourceMappingURL=INFO.d.ts.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/INFO.d.ts.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/INFO.d.ts.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"INFO.d.ts","sourceRoot":"","sources":["../../../../lib/commands/bloom/INFO.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAwB,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAc,iBAAiB,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAG9K,MAAM,MAAM,cAAc,GAAG,gBAAgB,CAAC;IAC5C;QAAC,iBAAiB,CAAC,UAAU,CAAC;QAAE,WAAW;KAAC;IAC5C;QAAC,iBAAiB,CAAC,MAAM,CAAC;QAAE,WAAW;KAAC;IACxC;QAAC,iBAAiB,CAAC,mBAAmB,CAAC;QAAE,WAAW;KAAC;IACrD;QAAC,iBAAiB,CAAC,0BAA0B,CAAC;QAAE,WAAW;KAAC;IAC5D;QAAC,iBAAiB,CAAC,gBAAgB,CAAC;QAAE,SAAS,GAAG,WAAW;KAAC;CAC/D,CAAC,CAAC;;;IAID;;;;OAIG;gDACkB,aAAa,OAAO,aAAa;;2WAKiB,WAAW;;;;AAZpF,wBAiB6B"}
|
||||
22
node_modules/@redis/bloom/dist/lib/commands/bloom/INFO.js
generated
vendored
Executable file
22
node_modules/@redis/bloom/dist/lib/commands/bloom/INFO.js
generated
vendored
Executable file
@@ -0,0 +1,22 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const helpers_1 = require("./helpers");
|
||||
exports.default = {
|
||||
IS_READ_ONLY: true,
|
||||
/**
|
||||
* Returns information about a Bloom Filter, including capacity, size, number of filters, items inserted, and expansion rate
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter to get information about
|
||||
*/
|
||||
parseCommand(parser, key) {
|
||||
parser.push('BF.INFO');
|
||||
parser.pushKey(key);
|
||||
},
|
||||
transformReply: {
|
||||
2: (reply, _, typeMapping) => {
|
||||
return (0, helpers_1.transformInfoV2Reply)(reply, typeMapping);
|
||||
},
|
||||
3: undefined
|
||||
}
|
||||
};
|
||||
//# sourceMappingURL=INFO.js.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/INFO.js.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/INFO.js.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"INFO.js","sourceRoot":"","sources":["../../../../lib/commands/bloom/INFO.ts"],"names":[],"mappings":";;AAEA,uCAAiD;AAUjD,kBAAe;IACb,YAAY,EAAE,IAAI;IAClB;;;;OAIG;IACH,YAAY,CAAC,MAAqB,EAAE,GAAkB;QACpD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IACD,cAAc,EAAE;QACd,CAAC,EAAE,CAAC,KAA8C,EAAE,CAAC,EAAE,WAAyB,EAAkB,EAAE;YAClG,OAAO,IAAA,8BAAoB,EAAiB,KAAK,EAAE,WAAW,CAAC,CAAC;QAClE,CAAC;QACD,CAAC,EAAE,SAA4C;KAChD;CACyB,CAAC"}
|
||||
32
node_modules/@redis/bloom/dist/lib/commands/bloom/INSERT.d.ts
generated
vendored
Executable file
32
node_modules/@redis/bloom/dist/lib/commands/bloom/INSERT.d.ts
generated
vendored
Executable file
@@ -0,0 +1,32 @@
|
||||
import { CommandParser } from '@redis/client/dist/lib/client/parser';
|
||||
import { RedisArgument } from '@redis/client/dist/lib/RESP/types';
|
||||
import { RedisVariadicArgument } from '@redis/client/dist/lib/commands/generic-transformers';
|
||||
export interface BfInsertOptions {
|
||||
CAPACITY?: number;
|
||||
ERROR?: number;
|
||||
EXPANSION?: number;
|
||||
NOCREATE?: boolean;
|
||||
NONSCALING?: boolean;
|
||||
}
|
||||
declare const _default: {
|
||||
readonly IS_READ_ONLY: false;
|
||||
/**
|
||||
* Adds one or more items to a Bloom Filter, creating it if it does not exist
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter
|
||||
* @param items - One or more items to add to the filter
|
||||
* @param options - Optional parameters for filter creation
|
||||
* @param options.CAPACITY - Desired capacity for a new filter
|
||||
* @param options.ERROR - Desired error rate for a new filter
|
||||
* @param options.EXPANSION - Expansion rate for a new filter
|
||||
* @param options.NOCREATE - If true, prevents automatic filter creation
|
||||
* @param options.NONSCALING - Prevents the filter from creating additional sub-filters
|
||||
*/
|
||||
readonly parseCommand: (this: void, parser: CommandParser, key: RedisArgument, items: RedisVariadicArgument, options?: BfInsertOptions) => void;
|
||||
readonly transformReply: {
|
||||
2: (reply: import("@redis/client/dist/lib/RESP/types").ArrayReply<import("@redis/client/dist/lib/RESP/types").NumberReply<0 | 1>>) => boolean[];
|
||||
3: () => import("@redis/client/dist/lib/RESP/types").ArrayReply<import("@redis/client/dist/lib/RESP/types").BooleanReply<boolean>>;
|
||||
};
|
||||
};
|
||||
export default _default;
|
||||
//# sourceMappingURL=INSERT.d.ts.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/INSERT.d.ts.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/INSERT.d.ts.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"INSERT.d.ts","sourceRoot":"","sources":["../../../../lib/commands/bloom/INSERT.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAW,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sDAAsD,CAAC;AAG7F,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;;;IAIC;;;;;;;;;;;OAWG;gDAEO,aAAa,OAChB,aAAa,SACX,qBAAqB,YAClB,eAAe;;;;;;AAlB7B,wBA+C6B"}
|
||||
41
node_modules/@redis/bloom/dist/lib/commands/bloom/INSERT.js
generated
vendored
Executable file
41
node_modules/@redis/bloom/dist/lib/commands/bloom/INSERT.js
generated
vendored
Executable file
@@ -0,0 +1,41 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const generic_transformers_1 = require("@redis/client/dist/lib/commands/generic-transformers");
|
||||
exports.default = {
|
||||
IS_READ_ONLY: false,
|
||||
/**
|
||||
* Adds one or more items to a Bloom Filter, creating it if it does not exist
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter
|
||||
* @param items - One or more items to add to the filter
|
||||
* @param options - Optional parameters for filter creation
|
||||
* @param options.CAPACITY - Desired capacity for a new filter
|
||||
* @param options.ERROR - Desired error rate for a new filter
|
||||
* @param options.EXPANSION - Expansion rate for a new filter
|
||||
* @param options.NOCREATE - If true, prevents automatic filter creation
|
||||
* @param options.NONSCALING - Prevents the filter from creating additional sub-filters
|
||||
*/
|
||||
parseCommand(parser, key, items, options) {
|
||||
parser.push('BF.INSERT');
|
||||
parser.pushKey(key);
|
||||
if (options?.CAPACITY !== undefined) {
|
||||
parser.push('CAPACITY', options.CAPACITY.toString());
|
||||
}
|
||||
if (options?.ERROR !== undefined) {
|
||||
parser.push('ERROR', options.ERROR.toString());
|
||||
}
|
||||
if (options?.EXPANSION !== undefined) {
|
||||
parser.push('EXPANSION', options.EXPANSION.toString());
|
||||
}
|
||||
if (options?.NOCREATE) {
|
||||
parser.push('NOCREATE');
|
||||
}
|
||||
if (options?.NONSCALING) {
|
||||
parser.push('NONSCALING');
|
||||
}
|
||||
parser.push('ITEMS');
|
||||
parser.pushVariadic(items);
|
||||
},
|
||||
transformReply: generic_transformers_1.transformBooleanArrayReply
|
||||
};
|
||||
//# sourceMappingURL=INSERT.js.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/INSERT.js.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/INSERT.js.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"INSERT.js","sourceRoot":"","sources":["../../../../lib/commands/bloom/INSERT.ts"],"names":[],"mappings":";;AAGA,+FAAkG;AAUlG,kBAAe;IACb,YAAY,EAAE,KAAK;IACnB;;;;;;;;;;;OAWG;IACH,YAAY,CACV,MAAqB,EACrB,GAAkB,EAClB,KAA4B,EAC5B,OAAyB;QAEzB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEpB,IAAI,OAAO,EAAE,QAAQ,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,OAAO,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,OAAO,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5B,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IACD,cAAc,EAAE,iDAA0B;CAChB,CAAC"}
|
||||
16
node_modules/@redis/bloom/dist/lib/commands/bloom/LOADCHUNK.d.ts
generated
vendored
Executable file
16
node_modules/@redis/bloom/dist/lib/commands/bloom/LOADCHUNK.d.ts
generated
vendored
Executable file
@@ -0,0 +1,16 @@
|
||||
import { CommandParser } from '@redis/client/dist/lib/client/parser';
|
||||
import { RedisArgument, SimpleStringReply } from '@redis/client/dist/lib/RESP/types';
|
||||
declare const _default: {
|
||||
readonly IS_READ_ONLY: false;
|
||||
/**
|
||||
* Restores a Bloom Filter chunk previously saved using SCANDUMP
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter to restore
|
||||
* @param iterator - Iterator value from the SCANDUMP command
|
||||
* @param chunk - Data chunk from the SCANDUMP command
|
||||
*/
|
||||
readonly parseCommand: (this: void, parser: CommandParser, key: RedisArgument, iterator: number, chunk: RedisArgument) => void;
|
||||
readonly transformReply: () => SimpleStringReply<'OK'>;
|
||||
};
|
||||
export default _default;
|
||||
//# sourceMappingURL=LOADCHUNK.d.ts.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/LOADCHUNK.d.ts.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/LOADCHUNK.d.ts.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"LOADCHUNK.d.ts","sourceRoot":"","sources":["../../../../lib/commands/bloom/LOADCHUNK.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAW,MAAM,mCAAmC,CAAC;;;IAI5F;;;;;;OAMG;gDACkB,aAAa,OAAO,aAAa,YAAY,MAAM,SAAS,aAAa;mCAKhD,kBAAkB,IAAI,CAAC;;AAdvE,wBAe6B"}
|
||||
19
node_modules/@redis/bloom/dist/lib/commands/bloom/LOADCHUNK.js
generated
vendored
Executable file
19
node_modules/@redis/bloom/dist/lib/commands/bloom/LOADCHUNK.js
generated
vendored
Executable file
@@ -0,0 +1,19 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.default = {
|
||||
IS_READ_ONLY: false,
|
||||
/**
|
||||
* Restores a Bloom Filter chunk previously saved using SCANDUMP
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter to restore
|
||||
* @param iterator - Iterator value from the SCANDUMP command
|
||||
* @param chunk - Data chunk from the SCANDUMP command
|
||||
*/
|
||||
parseCommand(parser, key, iterator, chunk) {
|
||||
parser.push('BF.LOADCHUNK');
|
||||
parser.pushKey(key);
|
||||
parser.push(iterator.toString(), chunk);
|
||||
},
|
||||
transformReply: undefined
|
||||
};
|
||||
//# sourceMappingURL=LOADCHUNK.js.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/LOADCHUNK.js.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/LOADCHUNK.js.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"LOADCHUNK.js","sourceRoot":"","sources":["../../../../lib/commands/bloom/LOADCHUNK.ts"],"names":[],"mappings":";;AAGA,kBAAe;IACb,YAAY,EAAE,KAAK;IACnB;;;;;;OAMG;IACH,YAAY,CAAC,MAAqB,EAAE,GAAkB,EAAE,QAAgB,EAAE,KAAoB;QAC5F,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IACD,cAAc,EAAE,SAAqD;CAC3C,CAAC"}
|
||||
19
node_modules/@redis/bloom/dist/lib/commands/bloom/MADD.d.ts
generated
vendored
Executable file
19
node_modules/@redis/bloom/dist/lib/commands/bloom/MADD.d.ts
generated
vendored
Executable file
@@ -0,0 +1,19 @@
|
||||
import { CommandParser } from '@redis/client/dist/lib/client/parser';
|
||||
import { RedisArgument } from '@redis/client/dist/lib/RESP/types';
|
||||
import { RedisVariadicArgument } from '@redis/client/dist/lib/commands/generic-transformers';
|
||||
declare const _default: {
|
||||
readonly IS_READ_ONLY: false;
|
||||
/**
|
||||
* Adds multiple items to a Bloom Filter in a single call
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter
|
||||
* @param items - One or more items to add to the filter
|
||||
*/
|
||||
readonly parseCommand: (this: void, parser: CommandParser, key: RedisArgument, items: RedisVariadicArgument) => void;
|
||||
readonly transformReply: {
|
||||
2: (reply: import("@redis/client/dist/lib/RESP/types").ArrayReply<import("@redis/client/dist/lib/RESP/types").NumberReply<0 | 1>>) => boolean[];
|
||||
3: () => import("@redis/client/dist/lib/RESP/types").ArrayReply<import("@redis/client/dist/lib/RESP/types").BooleanReply<boolean>>;
|
||||
};
|
||||
};
|
||||
export default _default;
|
||||
//# sourceMappingURL=MADD.d.ts.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/MADD.d.ts.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/MADD.d.ts.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"MADD.d.ts","sourceRoot":"","sources":["../../../../lib/commands/bloom/MADD.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAW,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sDAAsD,CAAC;;;IAK3F;;;;;OAKG;gDACkB,aAAa,OAAO,aAAa,SAAS,qBAAqB;;;;;;AARtF,wBAc6B"}
|
||||
19
node_modules/@redis/bloom/dist/lib/commands/bloom/MADD.js
generated
vendored
Executable file
19
node_modules/@redis/bloom/dist/lib/commands/bloom/MADD.js
generated
vendored
Executable file
@@ -0,0 +1,19 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const generic_transformers_1 = require("@redis/client/dist/lib/commands/generic-transformers");
|
||||
exports.default = {
|
||||
IS_READ_ONLY: false,
|
||||
/**
|
||||
* Adds multiple items to a Bloom Filter in a single call
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter
|
||||
* @param items - One or more items to add to the filter
|
||||
*/
|
||||
parseCommand(parser, key, items) {
|
||||
parser.push('BF.MADD');
|
||||
parser.pushKey(key);
|
||||
parser.pushVariadic(items);
|
||||
},
|
||||
transformReply: generic_transformers_1.transformBooleanArrayReply
|
||||
};
|
||||
//# sourceMappingURL=MADD.js.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/MADD.js.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/MADD.js.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"MADD.js","sourceRoot":"","sources":["../../../../lib/commands/bloom/MADD.ts"],"names":[],"mappings":";;AAGA,+FAAkG;AAElG,kBAAe;IACb,YAAY,EAAE,KAAK;IACnB;;;;;OAKG;IACH,YAAY,CAAC,MAAqB,EAAE,GAAkB,EAAE,KAA4B;QAClF,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpB,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IACD,cAAc,EAAE,iDAA0B;CAChB,CAAC"}
|
||||
19
node_modules/@redis/bloom/dist/lib/commands/bloom/MEXISTS.d.ts
generated
vendored
Executable file
19
node_modules/@redis/bloom/dist/lib/commands/bloom/MEXISTS.d.ts
generated
vendored
Executable file
@@ -0,0 +1,19 @@
|
||||
import { CommandParser } from '@redis/client/dist/lib/client/parser';
|
||||
import { RedisArgument } from '@redis/client/dist/lib/RESP/types';
|
||||
import { RedisVariadicArgument } from '@redis/client/dist/lib/commands/generic-transformers';
|
||||
declare const _default: {
|
||||
readonly IS_READ_ONLY: true;
|
||||
/**
|
||||
* Checks if multiple items exist in a Bloom Filter in a single call
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter
|
||||
* @param items - One or more items to check for existence
|
||||
*/
|
||||
readonly parseCommand: (this: void, parser: CommandParser, key: RedisArgument, items: RedisVariadicArgument) => void;
|
||||
readonly transformReply: {
|
||||
2: (reply: import("@redis/client/dist/lib/RESP/types").ArrayReply<import("@redis/client/dist/lib/RESP/types").NumberReply<0 | 1>>) => boolean[];
|
||||
3: () => import("@redis/client/dist/lib/RESP/types").ArrayReply<import("@redis/client/dist/lib/RESP/types").BooleanReply<boolean>>;
|
||||
};
|
||||
};
|
||||
export default _default;
|
||||
//# sourceMappingURL=MEXISTS.d.ts.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/MEXISTS.d.ts.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/MEXISTS.d.ts.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"MEXISTS.d.ts","sourceRoot":"","sources":["../../../../lib/commands/bloom/MEXISTS.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAW,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sDAAsD,CAAC;;;IAK3F;;;;;OAKG;gDACkB,aAAa,OAAO,aAAa,SAAS,qBAAqB;;;;;;AARtF,wBAc6B"}
|
||||
19
node_modules/@redis/bloom/dist/lib/commands/bloom/MEXISTS.js
generated
vendored
Executable file
19
node_modules/@redis/bloom/dist/lib/commands/bloom/MEXISTS.js
generated
vendored
Executable file
@@ -0,0 +1,19 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const generic_transformers_1 = require("@redis/client/dist/lib/commands/generic-transformers");
|
||||
exports.default = {
|
||||
IS_READ_ONLY: true,
|
||||
/**
|
||||
* Checks if multiple items exist in a Bloom Filter in a single call
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter
|
||||
* @param items - One or more items to check for existence
|
||||
*/
|
||||
parseCommand(parser, key, items) {
|
||||
parser.push('BF.MEXISTS');
|
||||
parser.pushKey(key);
|
||||
parser.pushVariadic(items);
|
||||
},
|
||||
transformReply: generic_transformers_1.transformBooleanArrayReply
|
||||
};
|
||||
//# sourceMappingURL=MEXISTS.js.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/MEXISTS.js.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/MEXISTS.js.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"MEXISTS.js","sourceRoot":"","sources":["../../../../lib/commands/bloom/MEXISTS.ts"],"names":[],"mappings":";;AAGA,+FAAkG;AAElG,kBAAe;IACb,YAAY,EAAE,IAAI;IAClB;;;;;OAKG;IACH,YAAY,CAAC,MAAqB,EAAE,GAAkB,EAAE,KAA4B;QAClF,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpB,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IACD,cAAc,EAAE,iDAA0B;CAChB,CAAC"}
|
||||
23
node_modules/@redis/bloom/dist/lib/commands/bloom/RESERVE.d.ts
generated
vendored
Executable file
23
node_modules/@redis/bloom/dist/lib/commands/bloom/RESERVE.d.ts
generated
vendored
Executable file
@@ -0,0 +1,23 @@
|
||||
import { CommandParser } from '@redis/client/dist/lib/client/parser';
|
||||
import { RedisArgument, SimpleStringReply } from '@redis/client/dist/lib/RESP/types';
|
||||
export interface BfReserveOptions {
|
||||
EXPANSION?: number;
|
||||
NONSCALING?: boolean;
|
||||
}
|
||||
declare const _default: {
|
||||
readonly IS_READ_ONLY: true;
|
||||
/**
|
||||
* Creates an empty Bloom Filter with a given desired error ratio and initial capacity
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter to create
|
||||
* @param errorRate - The desired probability for false positives (between 0 and 1)
|
||||
* @param capacity - The number of entries intended to be added to the filter
|
||||
* @param options - Optional parameters to tune the filter
|
||||
* @param options.EXPANSION - Expansion rate for the filter
|
||||
* @param options.NONSCALING - Prevents the filter from creating additional sub-filters
|
||||
*/
|
||||
readonly parseCommand: (this: void, parser: CommandParser, key: RedisArgument, errorRate: number, capacity: number, options?: BfReserveOptions) => void;
|
||||
readonly transformReply: () => SimpleStringReply<'OK'>;
|
||||
};
|
||||
export default _default;
|
||||
//# sourceMappingURL=RESERVE.d.ts.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/RESERVE.d.ts.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/RESERVE.d.ts.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"RESERVE.d.ts","sourceRoot":"","sources":["../../../../lib/commands/bloom/RESERVE.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAW,MAAM,mCAAmC,CAAC;AAE9F,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;;;IAIC;;;;;;;;;OASG;gDAEO,aAAa,OAChB,aAAa,aACP,MAAM,YACP,MAAM,YACN,gBAAgB;mCAckB,kBAAkB,IAAI,CAAC;;AA/BvE,wBAgC6B"}
|
||||
28
node_modules/@redis/bloom/dist/lib/commands/bloom/RESERVE.js
generated
vendored
Executable file
28
node_modules/@redis/bloom/dist/lib/commands/bloom/RESERVE.js
generated
vendored
Executable file
@@ -0,0 +1,28 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.default = {
|
||||
IS_READ_ONLY: true,
|
||||
/**
|
||||
* Creates an empty Bloom Filter with a given desired error ratio and initial capacity
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter to create
|
||||
* @param errorRate - The desired probability for false positives (between 0 and 1)
|
||||
* @param capacity - The number of entries intended to be added to the filter
|
||||
* @param options - Optional parameters to tune the filter
|
||||
* @param options.EXPANSION - Expansion rate for the filter
|
||||
* @param options.NONSCALING - Prevents the filter from creating additional sub-filters
|
||||
*/
|
||||
parseCommand(parser, key, errorRate, capacity, options) {
|
||||
parser.push('BF.RESERVE');
|
||||
parser.pushKey(key);
|
||||
parser.push(errorRate.toString(), capacity.toString());
|
||||
if (options?.EXPANSION) {
|
||||
parser.push('EXPANSION', options.EXPANSION.toString());
|
||||
}
|
||||
if (options?.NONSCALING) {
|
||||
parser.push('NONSCALING');
|
||||
}
|
||||
},
|
||||
transformReply: undefined
|
||||
};
|
||||
//# sourceMappingURL=RESERVE.js.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/RESERVE.js.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/RESERVE.js.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"RESERVE.js","sourceRoot":"","sources":["../../../../lib/commands/bloom/RESERVE.ts"],"names":[],"mappings":";;AAQA,kBAAe;IACb,YAAY,EAAE,IAAI;IAClB;;;;;;;;;OASG;IACH,YAAY,CACV,MAAqB,EACrB,GAAkB,EAClB,SAAiB,EACjB,QAAgB,EAChB,OAA0B;QAE1B,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEvD,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,cAAc,EAAE,SAAqD;CAC3C,CAAC"}
|
||||
18
node_modules/@redis/bloom/dist/lib/commands/bloom/SCANDUMP.d.ts
generated
vendored
Executable file
18
node_modules/@redis/bloom/dist/lib/commands/bloom/SCANDUMP.d.ts
generated
vendored
Executable file
@@ -0,0 +1,18 @@
|
||||
import { CommandParser } from '@redis/client/dist/lib/client/parser';
|
||||
import { RedisArgument, NumberReply, BlobStringReply } from '@redis/client/dist/lib/RESP/types';
|
||||
declare const _default: {
|
||||
readonly IS_READ_ONLY: true;
|
||||
/**
|
||||
* Begins an incremental save of a Bloom Filter. This is useful for large filters that can't be saved at once
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter to save
|
||||
* @param iterator - Iterator value; Start at 0, and use the iterator from the response for the next chunk
|
||||
*/
|
||||
readonly parseCommand: (this: void, parser: CommandParser, key: RedisArgument, iterator: number) => void;
|
||||
readonly transformReply: (this: void, reply: [NumberReply<number>, BlobStringReply<string>]) => {
|
||||
iterator: NumberReply<number>;
|
||||
chunk: BlobStringReply<string>;
|
||||
};
|
||||
};
|
||||
export default _default;
|
||||
//# sourceMappingURL=SCANDUMP.d.ts.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/SCANDUMP.d.ts.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/SCANDUMP.d.ts.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"SCANDUMP.d.ts","sourceRoot":"","sources":["../../../../lib/commands/bloom/SCANDUMP.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAe,WAAW,EAAE,eAAe,EAAwB,MAAM,mCAAmC,CAAC;;;IAIjI;;;;;OAKG;gDACkB,aAAa,OAAO,aAAa,YAAY,MAAM;;;;;;AAR1E,wBAmB6B"}
|
||||
23
node_modules/@redis/bloom/dist/lib/commands/bloom/SCANDUMP.js
generated
vendored
Executable file
23
node_modules/@redis/bloom/dist/lib/commands/bloom/SCANDUMP.js
generated
vendored
Executable file
@@ -0,0 +1,23 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.default = {
|
||||
IS_READ_ONLY: true,
|
||||
/**
|
||||
* Begins an incremental save of a Bloom Filter. This is useful for large filters that can't be saved at once
|
||||
* @param parser - The command parser
|
||||
* @param key - The name of the Bloom filter to save
|
||||
* @param iterator - Iterator value; Start at 0, and use the iterator from the response for the next chunk
|
||||
*/
|
||||
parseCommand(parser, key, iterator) {
|
||||
parser.push('BF.SCANDUMP');
|
||||
parser.pushKey(key);
|
||||
parser.push(iterator.toString());
|
||||
},
|
||||
transformReply(reply) {
|
||||
return {
|
||||
iterator: reply[0],
|
||||
chunk: reply[1]
|
||||
};
|
||||
}
|
||||
};
|
||||
//# sourceMappingURL=SCANDUMP.js.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/SCANDUMP.js.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/SCANDUMP.js.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"SCANDUMP.js","sourceRoot":"","sources":["../../../../lib/commands/bloom/SCANDUMP.ts"],"names":[],"mappings":";;AAGA,kBAAe;IACb,YAAY,EAAE,IAAI;IAClB;;;;;OAKG;IACH,YAAY,CAAC,MAAqB,EAAE,GAAkB,EAAE,QAAgB;QACtE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,cAAc,CAAC,KAA+D;QAC5E,OAAO;YACL,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;YAClB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;SAChB,CAAC;IACJ,CAAC;CACyB,CAAC"}
|
||||
3
node_modules/@redis/bloom/dist/lib/commands/bloom/helpers.d.ts
generated
vendored
Executable file
3
node_modules/@redis/bloom/dist/lib/commands/bloom/helpers.d.ts
generated
vendored
Executable file
@@ -0,0 +1,3 @@
|
||||
import { TypeMapping } from "@redis/client";
|
||||
export declare function transformInfoV2Reply<T>(reply: Array<any>, typeMapping?: TypeMapping): T;
|
||||
//# sourceMappingURL=helpers.d.ts.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/helpers.d.ts.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/helpers.d.ts.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../lib/commands/bloom/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,WAAW,EAAE,MAAM,eAAe,CAAC;AAExD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,CAAC,CA0BvF"}
|
||||
28
node_modules/@redis/bloom/dist/lib/commands/bloom/helpers.js
generated
vendored
Executable file
28
node_modules/@redis/bloom/dist/lib/commands/bloom/helpers.js
generated
vendored
Executable file
@@ -0,0 +1,28 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.transformInfoV2Reply = void 0;
|
||||
const client_1 = require("@redis/client");
|
||||
function transformInfoV2Reply(reply, typeMapping) {
|
||||
const mapType = typeMapping ? typeMapping[client_1.RESP_TYPES.MAP] : undefined;
|
||||
switch (mapType) {
|
||||
case Array: {
|
||||
return reply;
|
||||
}
|
||||
case Map: {
|
||||
const ret = new Map();
|
||||
for (let i = 0; i < reply.length; i += 2) {
|
||||
ret.set(reply[i].toString(), reply[i + 1]);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
default: {
|
||||
const ret = Object.create(null);
|
||||
for (let i = 0; i < reply.length; i += 2) {
|
||||
ret[reply[i].toString()] = reply[i + 1];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.transformInfoV2Reply = transformInfoV2Reply;
|
||||
//# sourceMappingURL=helpers.js.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/helpers.js.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/helpers.js.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../lib/commands/bloom/helpers.ts"],"names":[],"mappings":";;;AAAA,0CAAwD;AAExD,SAAgB,oBAAoB,CAAI,KAAiB,EAAE,WAAyB;IAClF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,mBAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEtE,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,OAAO,KAAqB,CAAC;QAC/B,CAAC;QACD,KAAK,GAAG,CAAC,CAAC,CAAC;YACT,MAAM,GAAG,GAAG,IAAI,GAAG,EAAe,CAAC;YAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC7C,CAAC;YAED,OAAO,GAAmB,CAAC;QAC7B,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1C,CAAC;YAED,OAAO,GAAmB,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC;AA1BD,oDA0BC"}
|
||||
147
node_modules/@redis/bloom/dist/lib/commands/bloom/index.d.ts
generated
vendored
Executable file
147
node_modules/@redis/bloom/dist/lib/commands/bloom/index.d.ts
generated
vendored
Executable file
@@ -0,0 +1,147 @@
|
||||
export * from './helpers';
|
||||
declare const _default: {
|
||||
readonly ADD: {
|
||||
readonly IS_READ_ONLY: false;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument, item: import("@redis/client/dist/lib/RESP/types").RedisArgument) => void;
|
||||
readonly transformReply: {
|
||||
2: (reply: import("@redis/client/dist/lib/RESP/types").NumberReply<0 | 1>) => boolean;
|
||||
3: () => import("@redis/client/dist/lib/RESP/types").BooleanReply<boolean>;
|
||||
};
|
||||
};
|
||||
readonly add: {
|
||||
readonly IS_READ_ONLY: false;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument, item: import("@redis/client/dist/lib/RESP/types").RedisArgument) => void;
|
||||
readonly transformReply: {
|
||||
2: (reply: import("@redis/client/dist/lib/RESP/types").NumberReply<0 | 1>) => boolean;
|
||||
3: () => import("@redis/client/dist/lib/RESP/types").BooleanReply<boolean>;
|
||||
};
|
||||
};
|
||||
readonly CARD: {
|
||||
readonly IS_READ_ONLY: true;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument) => void;
|
||||
readonly transformReply: () => import("@redis/client/dist/lib/RESP/types").NumberReply<number>;
|
||||
};
|
||||
readonly card: {
|
||||
readonly IS_READ_ONLY: true;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument) => void;
|
||||
readonly transformReply: () => import("@redis/client/dist/lib/RESP/types").NumberReply<number>;
|
||||
};
|
||||
readonly EXISTS: {
|
||||
readonly IS_READ_ONLY: true;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument, item: import("@redis/client/dist/lib/RESP/types").RedisArgument) => void;
|
||||
readonly transformReply: {
|
||||
2: (reply: import("@redis/client/dist/lib/RESP/types").NumberReply<0 | 1>) => boolean;
|
||||
3: () => import("@redis/client/dist/lib/RESP/types").BooleanReply<boolean>;
|
||||
};
|
||||
};
|
||||
readonly exists: {
|
||||
readonly IS_READ_ONLY: true;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument, item: import("@redis/client/dist/lib/RESP/types").RedisArgument) => void;
|
||||
readonly transformReply: {
|
||||
2: (reply: import("@redis/client/dist/lib/RESP/types").NumberReply<0 | 1>) => boolean;
|
||||
3: () => import("@redis/client/dist/lib/RESP/types").BooleanReply<boolean>;
|
||||
};
|
||||
};
|
||||
readonly INFO: {
|
||||
readonly IS_READ_ONLY: true;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument) => void;
|
||||
readonly transformReply: {
|
||||
readonly 2: (this: void, reply: [import("@redis/client/dist/lib/RESP/types").SimpleStringReply<"Capacity">, import("@redis/client/dist/lib/RESP/types").NumberReply<number>, import("@redis/client/dist/lib/RESP/types").SimpleStringReply<"Size">, import("@redis/client/dist/lib/RESP/types").NumberReply<number>, import("@redis/client/dist/lib/RESP/types").SimpleStringReply<"Number of filters">, import("@redis/client/dist/lib/RESP/types").NumberReply<number>, import("@redis/client/dist/lib/RESP/types").SimpleStringReply<"Number of items inserted">, import("@redis/client/dist/lib/RESP/types").NumberReply<number>, import("@redis/client/dist/lib/RESP/types").SimpleStringReply<"Expansion rate">, import("@redis/client/dist/lib/RESP/types").NullReply | import("@redis/client/dist/lib/RESP/types").NumberReply<number>], _: any, typeMapping?: import("@redis/client/dist/lib/RESP/types").TypeMapping | undefined) => import("./INFO").BfInfoReplyMap;
|
||||
readonly 3: () => import("./INFO").BfInfoReplyMap;
|
||||
};
|
||||
};
|
||||
readonly info: {
|
||||
readonly IS_READ_ONLY: true;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument) => void;
|
||||
readonly transformReply: {
|
||||
readonly 2: (this: void, reply: [import("@redis/client/dist/lib/RESP/types").SimpleStringReply<"Capacity">, import("@redis/client/dist/lib/RESP/types").NumberReply<number>, import("@redis/client/dist/lib/RESP/types").SimpleStringReply<"Size">, import("@redis/client/dist/lib/RESP/types").NumberReply<number>, import("@redis/client/dist/lib/RESP/types").SimpleStringReply<"Number of filters">, import("@redis/client/dist/lib/RESP/types").NumberReply<number>, import("@redis/client/dist/lib/RESP/types").SimpleStringReply<"Number of items inserted">, import("@redis/client/dist/lib/RESP/types").NumberReply<number>, import("@redis/client/dist/lib/RESP/types").SimpleStringReply<"Expansion rate">, import("@redis/client/dist/lib/RESP/types").NullReply | import("@redis/client/dist/lib/RESP/types").NumberReply<number>], _: any, typeMapping?: import("@redis/client/dist/lib/RESP/types").TypeMapping | undefined) => import("./INFO").BfInfoReplyMap;
|
||||
readonly 3: () => import("./INFO").BfInfoReplyMap;
|
||||
};
|
||||
};
|
||||
readonly INSERT: {
|
||||
readonly IS_READ_ONLY: false;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument, items: import("@redis/client/dist/lib/commands/generic-transformers").RedisVariadicArgument, options?: import("./INSERT").BfInsertOptions | undefined) => void;
|
||||
readonly transformReply: {
|
||||
2: (reply: import("@redis/client/dist/lib/RESP/types").ArrayReply<import("@redis/client/dist/lib/RESP/types").NumberReply<0 | 1>>) => boolean[];
|
||||
3: () => import("@redis/client/dist/lib/RESP/types").ArrayReply<import("@redis/client/dist/lib/RESP/types").BooleanReply<boolean>>;
|
||||
};
|
||||
};
|
||||
readonly insert: {
|
||||
readonly IS_READ_ONLY: false;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument, items: import("@redis/client/dist/lib/commands/generic-transformers").RedisVariadicArgument, options?: import("./INSERT").BfInsertOptions | undefined) => void;
|
||||
readonly transformReply: {
|
||||
2: (reply: import("@redis/client/dist/lib/RESP/types").ArrayReply<import("@redis/client/dist/lib/RESP/types").NumberReply<0 | 1>>) => boolean[];
|
||||
3: () => import("@redis/client/dist/lib/RESP/types").ArrayReply<import("@redis/client/dist/lib/RESP/types").BooleanReply<boolean>>;
|
||||
};
|
||||
};
|
||||
readonly LOADCHUNK: {
|
||||
readonly IS_READ_ONLY: false;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument, iterator: number, chunk: import("@redis/client/dist/lib/RESP/types").RedisArgument) => void;
|
||||
readonly transformReply: () => import("@redis/client/dist/lib/RESP/types").SimpleStringReply<"OK">;
|
||||
};
|
||||
readonly loadChunk: {
|
||||
readonly IS_READ_ONLY: false;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument, iterator: number, chunk: import("@redis/client/dist/lib/RESP/types").RedisArgument) => void;
|
||||
readonly transformReply: () => import("@redis/client/dist/lib/RESP/types").SimpleStringReply<"OK">;
|
||||
};
|
||||
readonly MADD: {
|
||||
readonly IS_READ_ONLY: false;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument, items: import("@redis/client/dist/lib/commands/generic-transformers").RedisVariadicArgument) => void;
|
||||
readonly transformReply: {
|
||||
2: (reply: import("@redis/client/dist/lib/RESP/types").ArrayReply<import("@redis/client/dist/lib/RESP/types").NumberReply<0 | 1>>) => boolean[];
|
||||
3: () => import("@redis/client/dist/lib/RESP/types").ArrayReply<import("@redis/client/dist/lib/RESP/types").BooleanReply<boolean>>;
|
||||
};
|
||||
};
|
||||
readonly mAdd: {
|
||||
readonly IS_READ_ONLY: false;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument, items: import("@redis/client/dist/lib/commands/generic-transformers").RedisVariadicArgument) => void;
|
||||
readonly transformReply: {
|
||||
2: (reply: import("@redis/client/dist/lib/RESP/types").ArrayReply<import("@redis/client/dist/lib/RESP/types").NumberReply<0 | 1>>) => boolean[];
|
||||
3: () => import("@redis/client/dist/lib/RESP/types").ArrayReply<import("@redis/client/dist/lib/RESP/types").BooleanReply<boolean>>;
|
||||
};
|
||||
};
|
||||
readonly MEXISTS: {
|
||||
readonly IS_READ_ONLY: true;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument, items: import("@redis/client/dist/lib/commands/generic-transformers").RedisVariadicArgument) => void;
|
||||
readonly transformReply: {
|
||||
2: (reply: import("@redis/client/dist/lib/RESP/types").ArrayReply<import("@redis/client/dist/lib/RESP/types").NumberReply<0 | 1>>) => boolean[];
|
||||
3: () => import("@redis/client/dist/lib/RESP/types").ArrayReply<import("@redis/client/dist/lib/RESP/types").BooleanReply<boolean>>;
|
||||
};
|
||||
};
|
||||
readonly mExists: {
|
||||
readonly IS_READ_ONLY: true;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument, items: import("@redis/client/dist/lib/commands/generic-transformers").RedisVariadicArgument) => void;
|
||||
readonly transformReply: {
|
||||
2: (reply: import("@redis/client/dist/lib/RESP/types").ArrayReply<import("@redis/client/dist/lib/RESP/types").NumberReply<0 | 1>>) => boolean[];
|
||||
3: () => import("@redis/client/dist/lib/RESP/types").ArrayReply<import("@redis/client/dist/lib/RESP/types").BooleanReply<boolean>>;
|
||||
};
|
||||
};
|
||||
readonly RESERVE: {
|
||||
readonly IS_READ_ONLY: true;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument, errorRate: number, capacity: number, options?: import("./RESERVE").BfReserveOptions | undefined) => void;
|
||||
readonly transformReply: () => import("@redis/client/dist/lib/RESP/types").SimpleStringReply<"OK">;
|
||||
};
|
||||
readonly reserve: {
|
||||
readonly IS_READ_ONLY: true;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument, errorRate: number, capacity: number, options?: import("./RESERVE").BfReserveOptions | undefined) => void;
|
||||
readonly transformReply: () => import("@redis/client/dist/lib/RESP/types").SimpleStringReply<"OK">;
|
||||
};
|
||||
readonly SCANDUMP: {
|
||||
readonly IS_READ_ONLY: true;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument, iterator: number) => void;
|
||||
readonly transformReply: (this: void, reply: [import("@redis/client/dist/lib/RESP/types").NumberReply<number>, import("@redis/client/dist/lib/RESP/types").BlobStringReply<string>]) => {
|
||||
iterator: import("@redis/client/dist/lib/RESP/types").NumberReply<number>;
|
||||
chunk: import("@redis/client/dist/lib/RESP/types").BlobStringReply<string>;
|
||||
};
|
||||
};
|
||||
readonly scanDump: {
|
||||
readonly IS_READ_ONLY: true;
|
||||
readonly parseCommand: (this: void, parser: import("@redis/client").CommandParser, key: import("@redis/client/dist/lib/RESP/types").RedisArgument, iterator: number) => void;
|
||||
readonly transformReply: (this: void, reply: [import("@redis/client/dist/lib/RESP/types").NumberReply<number>, import("@redis/client/dist/lib/RESP/types").BlobStringReply<string>]) => {
|
||||
iterator: import("@redis/client/dist/lib/RESP/types").NumberReply<number>;
|
||||
chunk: import("@redis/client/dist/lib/RESP/types").BlobStringReply<string>;
|
||||
};
|
||||
};
|
||||
};
|
||||
export default _default;
|
||||
//# sourceMappingURL=index.d.ts.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/index.d.ts.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/index.d.ts.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../lib/commands/bloom/index.ts"],"names":[],"mappings":"AAaA,cAAc,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE1B,wBAqBmC"}
|
||||
53
node_modules/@redis/bloom/dist/lib/commands/bloom/index.js
generated
vendored
Executable file
53
node_modules/@redis/bloom/dist/lib/commands/bloom/index.js
generated
vendored
Executable file
@@ -0,0 +1,53 @@
|
||||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
||||
}
|
||||
Object.defineProperty(o, k2, desc);
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
||||
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
||||
};
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const ADD_1 = __importDefault(require("./ADD"));
|
||||
const CARD_1 = __importDefault(require("./CARD"));
|
||||
const EXISTS_1 = __importDefault(require("./EXISTS"));
|
||||
const INFO_1 = __importDefault(require("./INFO"));
|
||||
const INSERT_1 = __importDefault(require("./INSERT"));
|
||||
const LOADCHUNK_1 = __importDefault(require("./LOADCHUNK"));
|
||||
const MADD_1 = __importDefault(require("./MADD"));
|
||||
const MEXISTS_1 = __importDefault(require("./MEXISTS"));
|
||||
const RESERVE_1 = __importDefault(require("./RESERVE"));
|
||||
const SCANDUMP_1 = __importDefault(require("./SCANDUMP"));
|
||||
__exportStar(require("./helpers"), exports);
|
||||
exports.default = {
|
||||
ADD: ADD_1.default,
|
||||
add: ADD_1.default,
|
||||
CARD: CARD_1.default,
|
||||
card: CARD_1.default,
|
||||
EXISTS: EXISTS_1.default,
|
||||
exists: EXISTS_1.default,
|
||||
INFO: INFO_1.default,
|
||||
info: INFO_1.default,
|
||||
INSERT: INSERT_1.default,
|
||||
insert: INSERT_1.default,
|
||||
LOADCHUNK: LOADCHUNK_1.default,
|
||||
loadChunk: LOADCHUNK_1.default,
|
||||
MADD: MADD_1.default,
|
||||
mAdd: MADD_1.default,
|
||||
MEXISTS: MEXISTS_1.default,
|
||||
mExists: MEXISTS_1.default,
|
||||
RESERVE: RESERVE_1.default,
|
||||
reserve: RESERVE_1.default,
|
||||
SCANDUMP: SCANDUMP_1.default,
|
||||
scanDump: SCANDUMP_1.default
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
||||
1
node_modules/@redis/bloom/dist/lib/commands/bloom/index.js.map
generated
vendored
Executable file
1
node_modules/@redis/bloom/dist/lib/commands/bloom/index.js.map
generated
vendored
Executable file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/commands/bloom/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAEA,gDAAwB;AACxB,kDAA0B;AAC1B,sDAA8B;AAC9B,kDAA0B;AAC1B,sDAA8B;AAC9B,4DAAoC;AACpC,kDAA0B;AAC1B,wDAAgC;AAChC,wDAAgC;AAChC,0DAAkC;AAElC,4CAA0B;AAE1B,kBAAe;IACb,GAAG,EAAH,aAAG;IACH,GAAG,EAAE,aAAG;IACR,IAAI,EAAJ,cAAI;IACJ,IAAI,EAAE,cAAI;IACV,MAAM,EAAN,gBAAM;IACN,MAAM,EAAE,gBAAM;IACd,IAAI,EAAJ,cAAI;IACJ,IAAI,EAAE,cAAI;IACV,MAAM,EAAN,gBAAM;IACN,MAAM,EAAE,gBAAM;IACd,SAAS,EAAT,mBAAS;IACT,SAAS,EAAE,mBAAS;IACpB,IAAI,EAAJ,cAAI;IACJ,IAAI,EAAE,cAAI;IACV,OAAO,EAAP,iBAAO;IACP,OAAO,EAAE,iBAAO;IAChB,OAAO,EAAP,iBAAO;IACP,OAAO,EAAE,iBAAO;IAChB,QAAQ,EAAR,kBAAQ;IACR,QAAQ,EAAE,kBAAQ;CACc,CAAC"}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user