const test = require('node:test') const assert = require('node:assert/strict') const fs = require('node:fs') const path = require('node:path') const root = path.resolve(__dirname, '../..') const core = require(path.join(root, 'assets/widgets/admin-core.js')) const admin = fs.readFileSync(path.join(root, 'assets/widgets/admin.js'), 'utf8') const wie = fs.readFileSync(path.join(root, 'assets/widgets/admin-transfer.js'), 'utf8') const controller =fs.readFileSync(path.join(root, 'src/WidgetSystem/AdminFormController.php'), 'utf8') const transfer = fs.readFileSync(path.join(root, 'src/WidgetSystem/TransferController.php'), 'utf8') const renderer = fs.readFileSync(path.join(root, 'src/WidgetSystem/FormRenderer.php'), 'utf8') const styles = fs.readFileSync(path.join(root, 'assets/widgets/admin.css'), 'utf8') test('lazy widget forms resolve assigned instances across core and customizer markup', () => { assert.equal(core.resolveWidgetNumber('widget-jio_widget_posts[12][title]', 'widget-jio_widget_posts-12', '__i__'), '12') assert.equal(core.resolveWidgetNumber('', 'widget-jio_widget_posts-8', '__i__'), '8') assert.equal(core.resolveWidgetNumber('', '', '4'), '4') assert.equal(core.resolveWidgetNumber('', '', '__i__'), '') assert.equal(core.resolveWidgetNumber('', 'widget-jio_widget_posts-0', ''), '') assert.match(admin, /customize-control-widget_form \.jio-widget-form-lazy/) }) test('lazy form AJAX failures remain retryable and instance filters match WordPress widget forms', () => { assert.match(admin, /data\('loading', false\)/) assert.match(controller, /apply_filters\('widget_form_callback', \$instance, \$widget\)/) }) test('sidebar toolbars drive reference-style AJAX export, import and template modals', () => { assert.match(wie, /widgets-holder-wrap:not\(#available-widgets\)/) assert.match(wie, /control-section-sidebar/) assert.match(wie, /data-jio-wie-action/) assert.match(wie, /data-sidebar-id/) assert.match(wie, /jio-wie-btn-delete/) assert.match(wie, /nonce: config\.transferNonce/) for (const action of ['export_sidebar', 'import_sidebar', 'list_templates', 'import_template']) { assert.match(wie, new RegExp(`jio_widgets_${action}`)) assert.match(transfer, new RegExp(`wp_ajax_jio_widgets_${action}`)) } assert.match(transfer, /check_ajax_referer\(self::NONCE, 'nonce'\)/) assert.match(transfer, /edit_theme_options/) assert.doesNotMatch(transfer, /jio_widgets_template_preview|admin_post_|admin_notices/) assert.doesNotMatch(admin, /data-jio-transfer-action|jio-widget-customizer-remove|jio-widget-form-lazy__load/) assert.match(styles, /\.jio-wie-modal__dialog/) }) test('widget fields follow the current CSF compact palette and cloneable group patterns', () => { assert.match(renderer, /jio-widget-palette-choice/) assert.match(renderer, /