web_plsql 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ :root{--accent-rgb:59, 130, 246;--bg-main:#f8fafc;--bg-side:#fff;--bg-card:#fff;--bg-hover:#f1f5f9;--text-main:#475569;--text-bright:#0f172a;--accent:#3b82f6;--border:#e2e8f0;--success:#10b981;--warning:#f59e0b;--danger:#ef4444;--shadow:0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;--terminal-bg:#1e293b;--config-key:#3b82f6}body.dark{--bg-main:#0f172a;--bg-side:#1e293b;--bg-card:#1e293b;--bg-hover:#334155;--text-main:#94a3b8;--text-bright:#f8fafc;--accent:#3b82f6;--border:#334155;--success:#10b981;--warning:#f59e0b;--danger:#ef4444;--shadow:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--terminal-bg:#000;--config-key:#60a5fa}body{background-color:var(--bg-main);color:var(--text-main);-webkit-font-smoothing:antialiased;margin:0;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;transition:background-color .3s,color .3s}.app-container{height:100vh;display:flex}.sidebar{background-color:var(--bg-side);border-right:1px solid var(--border);z-index:10;flex-direction:column;width:240px;display:flex}.logo{color:var(--text-bright);align-items:center;gap:12px;padding:24px;font-size:1.25rem;font-weight:700;display:flex}.logo .material-symbols-rounded{color:var(--accent);font-size:28px}nav{flex:1;padding:12px}.status-indicator{border-top:1px solid var(--border);align-items:center;padding:20px;font-size:.85rem;font-weight:500;display:flex}.dot{background-color:#64748b;border-radius:50%;width:8px;height:8px;margin-right:12px;display:inline-block;box-shadow:0 0 0 4px #64748b1a}.dot.running{background-color:var(--success);box-shadow:0 0 0 4px #10b98133}.dot.paused{background-color:var(--warning);box-shadow:0 0 0 4px #f59e0b33}.content{flex-direction:column;flex:1;display:flex;overflow:hidden}.main-header{background-color:var(--bg-main);border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;padding:20px 32px;display:flex}.main-header h1{color:var(--text-bright);align-items:center;gap:12px;margin:0;font-size:1.5rem;font-weight:600;display:flex}.main-header h1 .material-symbols-rounded{color:var(--accent);font-size:28px}.header-toolbar{align-items:center;gap:24px;display:flex}.auto-refresh-group{background:var(--bg-side);border:1px solid var(--border);border-radius:6px;align-items:center;gap:12px;padding:6px 12px;font-size:.875rem;display:flex}.auto-refresh-group select{color:var(--text-bright);cursor:pointer;background:0 0;border:none;font-weight:500}.view{flex:1;padding:32px;overflow-y:auto}.metrics-grid,.pools-grid,.cache-grid{grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:24px;margin-bottom:32px;display:grid}.card{background-color:var(--bg-card);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:12px;padding:24px}.card-header{align-items:center;gap:12px;margin-bottom:16px;display:flex}.card-header .material-symbols-rounded{color:var(--accent)}.card h3{text-transform:uppercase;letter-spacing:.05em;color:var(--text-main);margin:0;font-size:.875rem}.card p{color:var(--text-bright);margin:0;font-size:2rem;font-weight:700}.card small{color:var(--text-main);margin-top:8px;font-size:.875rem;display:block}.card.warning{border-left:4px solid var(--warning)}.table-container{background:var(--bg-card);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:12px;overflow:hidden}table{border-collapse:collapse;width:100%}th,td{text-align:left;border-bottom:1px solid var(--border);padding:16px 24px}th{background-color:var(--bg-hover);color:var(--text-main);text-transform:uppercase;letter-spacing:.05em;font-size:.75rem;font-weight:600}td{color:var(--text-bright);font-size:.9375rem}tr:last-child td{border-bottom:none}.terminal-container,.config-container{background-color:var(--bg-side);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:12px;overflow:hidden}.terminal{background-color:var(--terminal-bg);color:#10b981;white-space:pre;margin:0;padding:24px;font-family:JetBrains Mono,Fira Code,monospace;font-size:.875rem;line-height:1.6;overflow-x:auto}.config-view-content{max-width:900px;margin:0 auto;padding:0}.config-table{border-collapse:collapse;width:100%}.config-table tr{border-bottom:1px solid var(--border)}.config-table tr:last-child{border-bottom:none}.config-table td{vertical-align:top;padding:16px 24px}.config-label{color:var(--text-main);background-color:var(--bg-main);width:240px;font-size:.875rem;font-weight:600}.config-value{color:var(--text-bright);word-break:break-all;font-family:JetBrains Mono,monospace;font-size:.875rem}.config-section-header{background-color:var(--bg-hover);text-transform:uppercase;color:var(--accent);letter-spacing:.05em;border-bottom:1px solid var(--border);padding:12px 24px;font-size:.75rem;font-weight:700}.inner-config-table{border-collapse:collapse;width:100%;font-size:.8125rem}.inner-config-table td{border:none;padding:4px 8px}.cache-card .badge{align-self:center}.card-header h4{color:var(--accent)}.stat-row-label{white-space:nowrap;text-overflow:ellipsis;flex:0 0 180px;overflow:hidden}.stat-row-value{text-align:right;flex:1}@media (width<=640px){.stat-row{flex-direction:column;align-items:flex-start;gap:4px}.stat-row-label{opacity:.7;text-align:left;flex:none;font-size:.75rem}.stat-row-value{text-align:left;width:100%}}.view-system-compact{padding:20px 32px}.view-system-compact .metrics-grid{grid-template-columns:repeat(auto-fit,minmax(300px,1fr));align-items:start;gap:16px;margin-bottom:24px;display:grid}.view-system-compact .card{padding:16px}.view-system-compact .stat-row{padding:4px 0}.view-system-compact .card-header{margin-bottom:12px}.resource-card{flex-direction:column;min-height:350px;display:flex}.resource-card .chart-container-mini{margin-top:auto}.chart-container-mini{border:none;border-radius:4px;width:100%;height:100px;position:relative;overflow:hidden}.chart-container{height:300px;margin-bottom:32px;position:relative}.btn,.icon-btn{cursor:pointer;background-color:var(--bg-hover);color:var(--text-bright);border:none;border-radius:8px;justify-content:center;align-items:center;gap:8px;padding:10px 20px;font-size:.875rem;font-weight:600;transition:all .2s;display:inline-flex}.btn .material-symbols-rounded,.icon-btn .material-symbols-rounded{font-size:18px}.btn:hover,.icon-btn:hover{background-color:var(--border)}.btn-primary{background-color:var(--accent);color:#fff}.btn-primary:hover{opacity:.9;background-color:var(--accent)}.btn-success{background-color:var(--success);color:#fff}.btn-success:hover{opacity:.9}.btn-warning{background-color:var(--warning);color:#000}.btn-warning:hover{opacity:.9}.btn-danger{background-color:var(--danger);color:#fff}.btn-danger:hover{opacity:.9}.btn-outline{border:1px solid var(--border);color:var(--accent);background:0 0}.btn-outline:hover{background-color:var(--bg-hover)}.btn-full{width:100%}.btn-sm{padding:6px 12px;font-size:.8125rem}.btn-sm .material-symbols-rounded{font-size:16px}.btn-lg{padding:14px 28px;font-size:1rem}.btn-lg .material-symbols-rounded{font-size:22px}nav button{text-align:left;width:100%;color:var(--text-main);cursor:pointer;background:0 0;border:none;border-radius:8px;align-items:center;gap:12px;margin-bottom:4px;padding:12px 16px;font-size:.95rem;transition:all .2s;display:flex}nav button:hover{background-color:var(--bg-hover);color:var(--text-bright)}nav button.active{background-color:var(--accent);color:#fff}nav button .material-symbols-rounded{font-size:20px}.icon-btn{min-width:40px;min-height:40px;padding:10px}.icon-btn.icon-sm{min-width:32px;min-height:32px;padding:6px}.icon-btn.icon-sm .material-symbols-rounded{font-size:20px}.control-group{flex-wrap:wrap;gap:16px;margin-top:24px;display:flex}.control-group .btn{flex:1;min-width:140px}.gap-1{gap:4px}.mt-1{margin-top:4px}.mt-2{margin-top:8px}.mt-3{margin-top:12px}.mt-4{margin-top:16px}.mt-6{margin-top:24px}.mb-1{margin-bottom:4px}.mb-2{margin-bottom:8px}.mb-3{margin-bottom:12px}.mb-4{margin-bottom:16px}.mb-6{margin-bottom:24px}.p-2{padding:8px}.p-3{padding:12px}.p-4{padding:16px}.p-6{padding:24px}.mx-auto{margin-left:auto;margin-right:auto}.flex{display:flex}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.self-center{align-self:center}.self-end{align-self:flex-end}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.text-center{text-align:center}.text-right{text-align:right}.text-main{color:var(--text-main)}.text-bright{color:var(--text-bright)}.text-accent{color:var(--accent)}.text-success{color:var(--success)}.text-warning{color:var(--warning)}.text-danger{color:var(--danger)}.bg-main{background-color:var(--bg-main)}.bg-card{background-color:var(--bg-card)}.bg-hover{background-color:var(--bg-hover)}.bg-success{background-color:var(--success)}.bg-warning{background-color:var(--warning)}.bg-danger{background-color:var(--danger)}.border{border:1px solid var(--border)}.border-b{border-bottom:1px solid var(--border)}.border-none{border:none}.border-t{border-top:1px solid var(--border)}.border-l{border-left:1px solid var(--border)}.border-r{border-right:1px solid var(--border)}.rounded{border-radius:4px}.rounded-md{border-radius:6px}.rounded-lg{border-radius:8px}.rounded-xl{border-radius:12px}.rounded-full{border-radius:9999px}.shadow-sm{box-shadow:var(--shadow)}.shadow-md{box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.w-full{width:100%}.w-auto{width:auto}.max-w-xs{max-width:120px}.max-w-sm{max-width:200px}.max-w-md{max-width:280px}.overflow-hidden{overflow:hidden}.overflow-auto{overflow:auto}.overflow-x-auto{overflow-x:auto}.cursor-pointer{cursor:pointer}.transition{transition:all .2s}.transition-colors{transition:background-color .2s,color .2s,border-color .2s}.transition-all{transition:all .2s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.hover-bg:hover{background-color:var(--bg-hover)}.hover-border:hover{border-color:var(--accent)}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.opacity-90{opacity:.9}.leading-tight{line-height:1.25}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.break-all{word-break:break-all}.grid{display:grid}.grid-cols-2{grid-template-columns:repeat(2,1fr)}.grid-cols-3{grid-template-columns:repeat(3,1fr)}.grid-cols-auto{grid-template-columns:repeat(auto-fit,minmax(120px,1fr))}.gap-2{gap:8px}.gap-3{gap:12px}.gap-4{gap:16px}.gap-6{gap:24px}.stat-card{background-color:var(--bg-card);border:1px solid var(--border);text-align:center;border-radius:8px;padding:16px}.stat-card-value{color:var(--text-bright);font-size:1.75rem;font-weight:700;line-height:1.2}.stat-card-label{text-transform:uppercase;letter-spacing:.05em;color:var(--text-main);margin-top:4px;font-size:.75rem}.progress-bar{background:var(--bg-main);border-radius:3px;height:6px;overflow:hidden}.progress-bar-fill{border-radius:3px;height:100%;transition:width .3s}.progress-bar-sm{height:4px}.progress-bar-lg{height:8px}.badge{border-radius:9999px;align-items:center;gap:4px;padding:4px 8px;font-size:.75rem;font-weight:600;display:inline-flex}.badge-success{color:var(--success);background-color:#10b98126}.badge-warning{color:var(--warning);background-color:#f59e0b26}.badge-danger{color:var(--danger);background-color:#ef444426}.badge-info{color:var(--accent);background-color:#3b82f626}.status-dot{align-items:center;gap:6px;font-size:.875rem;font-weight:500;display:inline-flex}.status-dot .dot{flex-shrink:0;margin:0}.table-row-hover tbody tr{transition:background-color .15s}.table-row-hover tbody tr:hover{background-color:var(--bg-hover)}.table-cell{text-align:left;border-bottom:1px solid var(--border);padding:12px 16px}.table-cell-sm{padding:8px 12px;font-size:.8125rem}.table-header{background-color:var(--bg-hover);color:var(--text-main);text-transform:uppercase;letter-spacing:.05em;text-align:left;padding:12px 16px;font-size:.75rem;font-weight:600}.dense-table th,.dense-table td{padding:6px 12px;font-size:.8125rem}.table-layout-auto{table-layout:auto}.table-layout-fixed{table-layout:fixed}.code{background-color:var(--bg-main);color:var(--accent);border-radius:4px;padding:2px 6px;font-family:JetBrains Mono,Fira Code,monospace;font-size:.875rem}.code-sm{padding:1px 4px;font-size:.75rem}.description{color:var(--text-main);font-size:.75rem;font-weight:400}.stat-row{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;padding:8px 0;display:flex}.stat-row:last-child{border-bottom:none}.stat-row-label{color:var(--text-main);font-size:.875rem}.stat-row-value{color:var(--text-bright);font-family:monospace;font-weight:600}.card-section{margin-bottom:24px}.card-section:last-child{margin-bottom:0}.card-clickable{cursor:pointer;transition:all .2s}.card-clickable:hover{border-color:var(--accent);box-shadow:0 4px 12px #3b82f626}.icon-xs{font-size:14px}.icon-sm{font-size:18px}.icon-md{font-size:20px}.icon-lg{font-size:24px}.icon-xl{font-size:28px}.modal{z-index:1000;background-color:#000000b3;justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}.modal-content{background-color:var(--bg-card);width:100%;max-width:900px;box-shadow:var(--shadow);border-radius:12px;flex-direction:column;max-height:90vh;display:flex}.modal-header{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;padding:16px 24px;display:flex}.modal-header h3{color:var(--text-bright);margin:0;font-size:1.125rem}.modal-body{padding:24px;overflow-y:auto}.stat-values-inline{align-items:center;gap:8px;display:flex}.stat-values{flex-direction:column;align-items:flex-end;display:flex}.min-max{opacity:.7;margin-top:2px;font-size:.7rem}.search-group{align-items:center;display:flex;position:relative}.input-sm{background-color:var(--bg-side);border:1px solid var(--border);color:var(--text-bright);border-radius:6px;padding:6px 12px;font-size:.875rem}.input-sm:focus{border-color:var(--accent);outline:none}.errors-table-row{cursor:pointer;transition:background-color .2s}.errors-table-row:hover{background-color:rgba(var(--accent-rgb), .08)}.server-status{background-color:var(--bg-card);border:1px solid var(--border);border-radius:8px;align-items:center;gap:8px;padding:8px 12px;display:flex}.server-status-indicator{align-items:center;gap:8px;display:flex}.server-status-dot{border-radius:50%;flex-shrink:0;width:10px;height:10px}.server-status-dot.running{background-color:var(--success);box-shadow:0 0 8px #10b98166}.server-status-dot.paused{background-color:var(--warning);box-shadow:0 0 8px #f59e0b66}.server-status-dot.stopped{background-color:var(--danger);box-shadow:0 0 8px #ef444466}.server-status-text{text-transform:uppercase;letter-spacing:.025em;font-size:.875rem;font-weight:500}.danger-zone{border:1px solid var(--warning);background-color:#f59e0b08;border-left-width:4px}.danger-zone-title{color:var(--warning);margin-bottom:8px;font-weight:600}.empty-state{text-align:center;color:var(--text-main);padding:48px 24px}.empty-state-icon{color:var(--text-main);opacity:.5;margin-bottom:16px;font-size:48px}.empty-state-text{font-size:.875rem}.skeleton{background:linear-gradient(90deg, var(--bg-main) 25%, var(--bg-hover) 50%, var(--bg-main) 75%);background-size:200% 100%;border-radius:4px;animation:1.5s infinite skeleton-loading}@keyframes skeleton-loading{0%{background-position:200% 0}to{background-position:-200% 0}}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--bg-main)}::-webkit-scrollbar-thumb{background:var(--border);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--text-main);opacity:.5}button:focus-visible,input:focus-visible,select:focus-visible{outline:2px solid var(--accent);outline-offset:2px}input[type=checkbox]{width:18px;height:18px;accent-color:var(--accent);cursor:pointer}select{accent-color:var(--accent);cursor:pointer}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:1s linear infinite spin;display:inline-block}.btn.loading{pointer-events:none;opacity:.8}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-medium:500;--font-weight-bold:700;--tracking-wider:.05em;--radius-lg:.5rem;--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-success:#10b981;--color-warning:#f59e0b;--color-danger:#ef4444}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.fixed{position:fixed}.relative{position:relative}.static{position:static}.start{inset-inline-start:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.table{display:table}.w-full{width:100%}.max-w-\[150px\]{max-width:150px}.max-w-\[200px\]{max-width:200px}.max-w-\[300px\]{max-width:300px}.max-w-\[800px\]{max-width:800px}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.items-baseline{align-items:baseline}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-white\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.border-white\/5{border-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.bg-success{background-color:var(--color-success)}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.bg-white\/10{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-2{padding-block:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.text-black{color:var(--color-black)}.text-danger{color:var(--color-danger)}.text-success{color:var(--color-success)}.text-warning{color:var(--color-warning)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.opacity-30{opacity:.3}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}@media (hover:hover){.hover\:bg-success\/80:hover{background-color:#10b981cc}@supports (color:color-mix(in lab, red, red)){.hover\:bg-success\/80:hover{background-color:color-mix(in oklab, var(--color-success) 80%, transparent)}}.hover\:bg-white\/5:hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/5:hover{background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}}@media (width>=48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}}body{-webkit-font-smoothing:antialiased;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}body.dark{--bg-main:#0f172a;--bg-side:#1e293b;--bg-card:#1e293b;--bg-hover:#334155;--text-main:#94a3b8;--text-bright:#f8fafc;--border:#334155}body:not(.dark){--bg-main:#f8fafc;--bg-side:#fff;--bg-card:#fff;--bg-hover:#f1f5f9;--text-main:#475569;--text-bright:#0f172a;--border:#e2e8f0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}
@@ -6,8 +6,8 @@
6
6
  <title>web_plsql Admin Console</title>
7
7
  <link rel="icon" type="image/svg+xml" href="/admin/assets/favicon-mQAM4tVu.svg" />
8
8
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200" />
9
- <script type="module" crossorigin src="/admin/assets/main-C_esuqtI.js"></script>
10
- <link rel="stylesheet" crossorigin href="/admin/assets/main-bU4x_yEW.css">
9
+ <script type="module" crossorigin src="/admin/assets/main-B5q2ur8E.js"></script>
10
+ <link rel="stylesheet" crossorigin href="/admin/assets/main-CoERzZAr.css">
11
11
  </head>
12
12
  <body class="dark">
13
13
  <div class="app-container">
Binary file
Binary file
package/dist/index.d.mts CHANGED
@@ -177,7 +177,8 @@ declare const z$configType: z$1.ZodObject<{
177
177
  adminRoute: z$1.ZodOptional<z$1.ZodString>; /** Username for admin console authentication */
178
178
  adminUser: z$1.ZodOptional<z$1.ZodString>; /** Password for admin console authentication */
179
179
  adminPassword: z$1.ZodOptional<z$1.ZodString>; /** Developer mode (skips frontend build check, enables CORS) */
180
- devMode: z$1.ZodOptional<z$1.ZodBoolean>;
180
+ devMode: z$1.ZodOptional<z$1.ZodBoolean>; /** Callback function to setup custom Express extensions */
181
+ setupExtensions: z$1.ZodOptional<z$1.ZodCustom<(app: Express, pools: Pool[]) => void | Promise<void>, (app: Express, pools: Pool[]) => void | Promise<void>>>;
181
182
  }, z$1.core.$strict>;
182
183
  type configType = z$1.infer<typeof z$configType>;
183
184
  /**
@@ -292,7 +293,7 @@ declare global {
292
293
  }
293
294
  /**
294
295
  * Returns the current library version
295
- * @returns {string} - Version.
296
+ * @returns Version.
296
297
  */
297
298
  declare const getVersion: () => string;
298
299
  //#endregion
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { t as __exportAll } from "./chunk-DQk6qfdC.mjs";
2
- import { n as setExecuteCallback } from "./oracledb-mock-Dn8aHtd7.mjs";
1
+ import { t as __exportAll } from "./chunk-CfYAbeIz.mjs";
2
+ import { n as setExecuteCallback } from "./oracledb-mock-Cya43xKB.mjs";
3
3
  import z$1, { z } from "zod";
4
4
  import oracledb from "oracledb";
5
5
  import debugModule from "debug";
@@ -20,7 +20,6 @@ import path from "node:path";
20
20
  import morgan from "morgan";
21
21
  import multer from "multer";
22
22
  import readline from "node:readline";
23
-
24
23
  //#region src/common/configStaticSchema.ts
25
24
  /**
26
25
  * Configuration for serving static files
@@ -30,7 +29,6 @@ const configStaticSchema = z$1.strictObject({
30
29
  directoryPath: z$1.string(),
31
30
  spaFallback: z$1.boolean().optional()
32
31
  });
33
-
34
32
  //#endregion
35
33
  //#region src/common/procedureTraceEntry.ts
36
34
  const procedureTraceEntrySchema = z.strictObject({
@@ -58,7 +56,6 @@ const procedureTraceEntrySchema = z.strictObject({
58
56
  cgi: z.record(z.string(), z.string()).optional(),
59
57
  error: z.string().optional()
60
58
  });
61
-
62
59
  //#endregion
63
60
  //#region src/common/logEntrySchema.ts
64
61
  /**
@@ -86,7 +83,6 @@ const logEntrySchema = z.strictObject({
86
83
  environment: z.record(z.string(), z.string()).optional()
87
84
  }).optional()
88
85
  });
89
-
90
86
  //#endregion
91
87
  //#region src/backend/types.ts
92
88
  /**
@@ -159,9 +155,9 @@ const z$configType = z$1.strictObject({
159
155
  adminRoute: z$1.string().optional(),
160
156
  adminUser: z$1.string().optional(),
161
157
  adminPassword: z$1.string().optional(),
162
- devMode: z$1.boolean().optional()
158
+ devMode: z$1.boolean().optional(),
159
+ setupExtensions: z$1.custom((val) => typeof val === "function", { message: "Invalid setupExtensions callback" }).optional()
163
160
  });
164
-
165
161
  //#endregion
166
162
  //#region src/backend/util/oracledb-provider.ts
167
163
  var oracledb_provider_exports = /* @__PURE__ */ __exportAll({
@@ -189,7 +185,7 @@ const USE_MOCK = process.env.MOCK_ORACLE === "true";
189
185
  * @returns The pool.
190
186
  */
191
187
  async function createPool(config) {
192
- if (USE_MOCK) return (await import("./oracledb-mock-Dn8aHtd7.mjs").then((n) => n.t)).createPool(config);
188
+ if (USE_MOCK) return (await import("./oracledb-mock-Cya43xKB.mjs").then((n) => n.t)).createPool(config);
193
189
  return await oracledb.createPool(config);
194
190
  }
195
191
  const BIND_IN = oracledb.BIND_IN;
@@ -206,16 +202,14 @@ const DB_TYPE_VARCHAR = oracledb.DB_TYPE_VARCHAR;
206
202
  const DB_TYPE_CLOB = oracledb.DB_TYPE_CLOB;
207
203
  const DB_TYPE_NUMBER = oracledb.DB_TYPE_NUMBER;
208
204
  const DB_TYPE_DATE = oracledb.DB_TYPE_DATE;
209
-
210
205
  //#endregion
211
206
  //#region src/backend/version.ts
212
207
  globalThis.__VERSION__ ??= "**development**";
213
208
  /**
214
209
  * Returns the current library version
215
- * @returns {string} - Version.
210
+ * @returns Version.
216
211
  */
217
- const getVersion = () => "1.4.0";
218
-
212
+ const getVersion = () => "1.5.0";
219
213
  //#endregion
220
214
  //#region src/backend/server/config.ts
221
215
  const paddedLine = (title, value) => {
@@ -266,7 +260,6 @@ const showConfig = (config) => {
266
260
  }
267
261
  console.log(LINE);
268
262
  };
269
-
270
263
  //#endregion
271
264
  //#region src/backend/server/server.ts
272
265
  const debug$14 = debugModule("webplsql:server");
@@ -340,6 +333,7 @@ const startServer = async (config, ssl) => {
340
333
  });
341
334
  }
342
335
  if (internalConfig.loggerFilename.length > 0) app.use(handlerLogger(internalConfig.loggerFilename));
336
+ if (internalConfig.setupExtensions) await internalConfig.setupExtensions(app, adminContext.pools);
343
337
  for (const i of internalConfig.routeStatic) {
344
338
  app.use(i.route, expressStaticGzip(i.directoryPath, {
345
339
  enableBrotli: true,
@@ -409,7 +403,6 @@ const loadConfig = (filename = "config.json") => z$configType.parse(getJsonFile(
409
403
  * @returns Promise resolving to the web server object.
410
404
  */
411
405
  const startServerConfig = async (filename = "config.json", ssl) => startServer(loadConfig(filename), ssl);
412
-
413
406
  //#endregion
414
407
  //#region src/backend/util/shutdown.ts
415
408
  const debug$13 = debugModule("webplsql:shutdown");
@@ -456,7 +449,6 @@ const forceShutdown = () => {
456
449
  debug$13("forceShutdown");
457
450
  process.kill(process.pid, "SIGTERM");
458
451
  };
459
-
460
452
  //#endregion
461
453
  //#region src/common/constants.ts
462
454
  /**
@@ -563,27 +555,6 @@ const OWA_STREAM_CHUNK_SIZE = 1e3;
563
555
  */
564
556
  const OWA_STREAM_BUFFER_SIZE = 16384;
565
557
  /**
566
- * OWA_RESOLVED_NAME_MAX_LEN = 400
567
- *
568
- * Purpose: Maximum string length for resolved Oracle procedure canonical names.
569
- * Canonical format: SCHEMA.PACKAGE.PROCEDURE or SCHEMA.PROCEDURE.
570
- *
571
- * Used By:
572
- * - resolveProcedureName() function for dbms_utility.name_resolve output
573
- * - Procedure name resolution SQL at procedureSanitize.js:46-76
574
- *
575
- * Related Values:
576
- * - dbms_utility.name_resolve context = 1 (procedure/function resolution)
577
- * - Oracle identifier limits: Schema (128) + Package (128) + Procedure (128) + 2 dots = ~386
578
- * - 400 provides comfortable headroom
579
- *
580
- * Implications:
581
- * - Oracle object names: 30 bytes for most, extended to 128 in some contexts
582
- * - Canonical name: schema.package.procedure (max ~128+1+128+1+128 = 386)
583
- * - 400 is safe upper bound with margin
584
- */
585
- const OWA_RESOLVED_NAME_MAX_LEN = 400;
586
- /**
587
558
  * STATS_INTERVAL_MS = 5000
588
559
  *
589
560
  * Purpose: Duration of each statistical bucket in milliseconds.
@@ -648,107 +619,6 @@ const MAX_HISTORY_BUCKETS = 1e3;
648
619
  * - Under heavy load, older samples are discarded (FIFO)
649
620
  */
650
621
  const MAX_PERCENTILE_SAMPLES = 1e3;
651
- /**
652
- * SHUTDOWN_GRACE_DELAY_MS = 100
653
- *
654
- * Purpose: Delay between initiating server shutdown and forced termination.
655
- *
656
- * Used By: POST /api/server/stop handler only
657
- *
658
- * Related Values:
659
- * - forceShutdown() at src/util/shutdown.js
660
- * - SIGTERM/SIGINT handlers at shutdown.js
661
- *
662
- * Implications:
663
- * - Allows graceful completion of in-flight requests
664
- * - Gives Express middleware time to send final responses
665
- * - 100ms is short; may be insufficient under heavy load
666
- * - Consider making configurable for high-traffic deployments
667
- */
668
- const SHUTDOWN_GRACE_DELAY_MS = 100;
669
- /**
670
- * TRACE_LOG_ROTATION_SIZE = '10M'
671
- *
672
- * Purpose: Log file size threshold triggering trace log rotation (10 Megabytes).
673
- *
674
- * Used By: rotating-file-stream library for 'trace.log'
675
- *
676
- * Related Values:
677
- * - TRACE_LOG_ROTATION_INTERVAL ('1d'): Also triggers rotation
678
- * - TRACE_LOG_MAX_ROTATED_FILES (10): Maximum retained files
679
- *
680
- * Implications:
681
- * - When either size OR time threshold is reached, rotation occurs
682
- * - Combined with daily rotation: ~10MB/day minimum
683
- * - gzip compression reduces rotated file size by ~70-90%
684
- */
685
- const TRACE_LOG_ROTATION_SIZE = "10M";
686
- /**
687
- * TRACE_LOG_ROTATION_INTERVAL = '1d'
688
- *
689
- * Purpose: Time-based trace log rotation trigger (daily).
690
- *
691
- * Used By: rotating-file-stream library for 'trace.log'
692
- *
693
- * Implications:
694
- * - Guarantees at least one rotation per day
695
- * - Midnight-based or 24h from first write
696
- */
697
- const TRACE_LOG_ROTATION_INTERVAL = "1d";
698
- /**
699
- * TRACE_LOG_MAX_ROTATED_FILES = 10
700
- *
701
- * Purpose: Maximum number of rotated trace log files to retain.
702
- *
703
- * Used By: rotating-file-stream library for 'trace.log'
704
- *
705
- * Implications:
706
- * - When exceeded, oldest rotated file is deleted
707
- * - Maximum: ~10 files × 10MB = ~100MB (compressed: ~10-30MB)
708
- */
709
- const TRACE_LOG_MAX_ROTATED_FILES = 10;
710
- /**
711
- * JSON_LOG_ROTATION_SIZE = '10M'
712
- *
713
- * Purpose: Log file size threshold triggering JSON error log rotation (10 Megabytes).
714
- *
715
- * Used By: rotating-file-stream library for 'error.json.log'
716
- *
717
- * Related Values:
718
- * - JSON_LOG_ROTATION_INTERVAL ('1d'): Also triggers rotation
719
- * - JSON_LOG_MAX_ROTATED_FILES (10): Maximum retained files
720
- *
721
- * Implications:
722
- * - When either size OR time threshold is reached, rotation occurs
723
- * - Combined with daily rotation: ~10MB/day minimum
724
- * - gzip compression reduces rotated file size by ~70-90%
725
- */
726
- const JSON_LOG_ROTATION_SIZE = "10M";
727
- /**
728
- * JSON_LOG_ROTATION_INTERVAL = '1d'
729
- *
730
- * Purpose: Time-based JSON error log rotation trigger (daily).
731
- *
732
- * Used By: rotating-file-stream library for 'error.json.log'
733
- *
734
- * Implications:
735
- * - Guarantees at least one rotation per day
736
- * - Midnight-based or 24h from first write
737
- */
738
- const JSON_LOG_ROTATION_INTERVAL = "1d";
739
- /**
740
- * JSON_LOG_MAX_ROTATED_FILES = 10
741
- *
742
- * Purpose: Maximum number of rotated JSON error log files to retain.
743
- *
744
- * Used By: rotating-file-stream library for 'error.json.log'
745
- *
746
- * Implications:
747
- * - When exceeded, oldest rotated file is deleted
748
- * - Maximum: ~10 files × 10MB = ~100MB (compressed: ~10-30MB)
749
- */
750
- const JSON_LOG_MAX_ROTATED_FILES = 10;
751
-
752
622
  //#endregion
753
623
  //#region src/backend/util/statsManager.ts
754
624
  const debug$12 = debugModule("webplsql:statsManager");
@@ -980,7 +850,6 @@ var StatsManager = class {
980
850
  return this.history;
981
851
  }
982
852
  };
983
-
984
853
  //#endregion
985
854
  //#region src/backend/server/adminContext.ts
986
855
  /**
@@ -1023,7 +892,6 @@ var AdminContext = class {
1023
892
  this._paused = value;
1024
893
  }
1025
894
  };
1026
-
1027
895
  //#endregion
1028
896
  //#region src/backend/util/file.ts
1029
897
  /**
@@ -1100,7 +968,6 @@ const isFile = async (filePath) => {
1100
968
  return false;
1101
969
  }
1102
970
  };
1103
-
1104
971
  //#endregion
1105
972
  //#region src/backend/util/html.ts
1106
973
  /**
@@ -1148,7 +1015,6 @@ ${body}
1148
1015
  </body>
1149
1016
  </html>
1150
1017
  `;
1151
-
1152
1018
  //#endregion
1153
1019
  //#region src/backend/util/trace.ts
1154
1020
  /**
@@ -1222,9 +1088,9 @@ const toTable = (head, body) => {
1222
1088
  */
1223
1089
  const logToFile = (text) => {
1224
1090
  const fs = rotatingFileStream.createStream("trace.log", {
1225
- size: TRACE_LOG_ROTATION_SIZE,
1226
- interval: TRACE_LOG_ROTATION_INTERVAL,
1227
- maxFiles: TRACE_LOG_MAX_ROTATED_FILES,
1091
+ size: "10M",
1092
+ interval: "1d",
1093
+ maxFiles: 10,
1228
1094
  compress: "gzip"
1229
1095
  });
1230
1096
  fs.write(text);
@@ -1428,7 +1294,6 @@ const warningMessage = (para) => {
1428
1294
  logToFile(text);
1429
1295
  console.warn(text);
1430
1296
  };
1431
-
1432
1297
  //#endregion
1433
1298
  //#region src/backend/util/errorToString.ts
1434
1299
  /**
@@ -1446,7 +1311,6 @@ const errorToString = (error) => {
1446
1311
  return parts.join("\n");
1447
1312
  } else return inspect(error);
1448
1313
  };
1449
-
1450
1314
  //#endregion
1451
1315
  //#region src/backend/handler/plsql/upload.ts
1452
1316
  const debug$11 = debugModule("webplsql:fileUpload");
@@ -1519,7 +1383,6 @@ const uploadFile = async (file, doctable, databaseConnection) => {
1519
1383
  throw new Error(`Unable to remove file "${file.filename}".\n${errorToString(err)}`);
1520
1384
  }
1521
1385
  };
1522
-
1523
1386
  //#endregion
1524
1387
  //#region src/backend/handler/plsql/procedureVariable.ts
1525
1388
  const debug$10 = debugModule("webplsql:procedureVariable");
@@ -1562,7 +1425,6 @@ const getProcedureVariable = (_req, procName, argObj) => {
1562
1425
  }
1563
1426
  };
1564
1427
  };
1565
-
1566
1428
  //#endregion
1567
1429
  //#region src/backend/handler/plsql/requestError.ts
1568
1430
  var RequestError = class RequestError extends Error {
@@ -1576,7 +1438,6 @@ var RequestError = class RequestError extends Error {
1576
1438
  this.timestamp = /* @__PURE__ */ new Date();
1577
1439
  }
1578
1440
  };
1579
-
1580
1441
  //#endregion
1581
1442
  //#region src/backend/util/util.ts
1582
1443
  /**
@@ -1590,7 +1451,6 @@ const stringToNumber = (value) => {
1590
1451
  if (typeof value !== "string" || !/^[+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:E[+-]?\d+)?$/i.test(value)) return null;
1591
1452
  return Number(value);
1592
1453
  };
1593
-
1594
1454
  //#endregion
1595
1455
  //#region src/backend/handler/plsql/procedureNamed.ts
1596
1456
  const debug$9 = debugModule("webplsql:procedureNamed");
@@ -1821,7 +1681,6 @@ const getProcedureNamed = async (req, procName, argObj, databaseConnection, argu
1821
1681
  bind: bindings
1822
1682
  };
1823
1683
  };
1824
-
1825
1684
  //#endregion
1826
1685
  //#region src/backend/handler/plsql/parsePage.ts
1827
1686
  const debug$8 = debugModule("webplsql:parsePage");
@@ -1954,7 +1813,6 @@ const tryDecodeDate = (value) => {
1954
1813
  if (Number.isNaN(result.getTime())) return null;
1955
1814
  return result;
1956
1815
  };
1957
-
1958
1816
  //#endregion
1959
1817
  //#region src/backend/handler/plsql/sendResponse.ts
1960
1818
  const debug$7 = debugModule("webplsql:sendResponse");
@@ -2060,7 +1918,6 @@ const sendResponse = async (_req, res, page) => {
2060
1918
  });
2061
1919
  else res.send(page.body);
2062
1920
  };
2063
-
2064
1921
  //#endregion
2065
1922
  //#region src/backend/handler/plsql/procedureError.ts
2066
1923
  var ProcedureError = class ProcedureError extends Error {
@@ -2083,7 +1940,6 @@ var ProcedureError = class ProcedureError extends Error {
2083
1940
  this.bind = bind;
2084
1941
  }
2085
1942
  };
2086
-
2087
1943
  //#endregion
2088
1944
  //#region src/backend/util/cache.ts
2089
1945
  /**
@@ -2182,7 +2038,6 @@ var Cache = class {
2182
2038
  };
2183
2039
  }
2184
2040
  };
2185
-
2186
2041
  //#endregion
2187
2042
  //#region src/backend/handler/plsql/procedureSanitize.ts
2188
2043
  const debug$6 = debugModule("webplsql:procedureSanitize");
@@ -2253,7 +2108,7 @@ const resolveProcedureName = async (procName, databaseConnection, procedureNameC
2253
2108
  resolved: {
2254
2109
  dir: BIND_OUT,
2255
2110
  type: STRING,
2256
- maxSize: OWA_RESOLVED_NAME_MAX_LEN
2111
+ maxSize: 400
2257
2112
  }
2258
2113
  };
2259
2114
  try {
@@ -2391,7 +2246,6 @@ const requestValidationFunction = async (procName, validationFunction, databaseC
2391
2246
  validationFunctionCache.set(key, { valid });
2392
2247
  return valid;
2393
2248
  };
2394
-
2395
2249
  //#endregion
2396
2250
  //#region src/backend/handler/plsql/owaPageStream.ts
2397
2251
  const debug$5 = debugModule("webplsql:owaPageStream");
@@ -2461,7 +2315,6 @@ var OWAPageStream = class extends Readable {
2461
2315
  if (content && content.length > 0) this.push(content);
2462
2316
  }
2463
2317
  };
2464
-
2465
2318
  //#endregion
2466
2319
  //#region src/backend/util/traceManager.ts
2467
2320
  var TraceManager = class {
@@ -2514,7 +2367,6 @@ var TraceManager = class {
2514
2367
  }
2515
2368
  };
2516
2369
  const traceManager = new TraceManager();
2517
-
2518
2370
  //#endregion
2519
2371
  //#region src/backend/handler/plsql/procedure.ts
2520
2372
  const debug$4 = debugModule("webplsql:procedure");
@@ -2813,7 +2665,6 @@ const invokeProcedure = async (req, res, argObj, cgiObj, filesToUpload, options,
2813
2665
  }
2814
2666
  debug$4("invokeProcedure: end");
2815
2667
  };
2816
-
2817
2668
  //#endregion
2818
2669
  //#region src/backend/handler/plsql/cgi.ts
2819
2670
  const debug$3 = debugModule("webplsql:cgi");
@@ -2918,7 +2769,6 @@ const getCGI = (req, doctable, cgi, authenticatedUser = null) => {
2918
2769
  };
2919
2770
  return Object.assign({}, DEFAULT_CGI, CGI, cgi);
2920
2771
  };
2921
-
2922
2772
  //#endregion
2923
2773
  //#region src/backend/util/type.ts
2924
2774
  /**
@@ -2927,7 +2777,6 @@ const getCGI = (req, doctable, cgi, authenticatedUser = null) => {
2927
2777
  * @returns True if the value is a string or an array of strings
2928
2778
  */
2929
2779
  const isStringOrArrayOfString = (value) => typeof value === "string" || Array.isArray(value) && value.every((element) => typeof element === "string");
2930
-
2931
2780
  //#endregion
2932
2781
  //#region src/backend/handler/plsql/request.ts
2933
2782
  const debug$2 = debugModule("webplsql:request");
@@ -3004,16 +2853,15 @@ const processRequest = async (req, res, options, connectionPool, procedureNameCa
3004
2853
  }
3005
2854
  debug$2("processRequest: EXIT");
3006
2855
  };
3007
-
3008
2856
  //#endregion
3009
2857
  //#region src/backend/util/jsonLogger.ts
3010
2858
  var JsonLogger = class {
3011
2859
  stream;
3012
2860
  constructor(filename = "error.json.log") {
3013
2861
  this.stream = rotatingFileStream.createStream(filename, {
3014
- size: JSON_LOG_ROTATION_SIZE,
3015
- interval: JSON_LOG_ROTATION_INTERVAL,
3016
- maxFiles: JSON_LOG_MAX_ROTATED_FILES,
2862
+ size: "10M",
2863
+ interval: "1d",
2864
+ maxFiles: 10,
3017
2865
  compress: "gzip"
3018
2866
  });
3019
2867
  }
@@ -3038,7 +2886,6 @@ var JsonLogger = class {
3038
2886
  }
3039
2887
  };
3040
2888
  const jsonLogger = new JsonLogger();
3041
-
3042
2889
  //#endregion
3043
2890
  //#region src/backend/handler/plsql/errorPage.ts
3044
2891
  /**
@@ -3112,7 +2959,6 @@ const errorPage = (req, res, options, error) => {
3112
2959
  if (options.errorStyle === "basic") res.status(404).send("Page not found");
3113
2960
  else res.status(404).send(getHtmlPage(html));
3114
2961
  };
3115
-
3116
2962
  //#endregion
3117
2963
  //#region src/backend/handler/plsql/handlerPlSql.ts
3118
2964
  const debug$1 = debugModule("webplsql:handlerPlSql");
@@ -3184,7 +3030,6 @@ const handlerWebPlSql = (connectionPool, config, adminContext) => {
3184
3030
  handler.argumentCache = argumentCache;
3185
3031
  return handler;
3186
3032
  };
3187
-
3188
3033
  //#endregion
3189
3034
  //#region src/backend/handler/handlerLogger.ts
3190
3035
  const debug = debugModule("webplsql:handlerLogger");
@@ -3197,7 +3042,6 @@ const handlerLogger = (filename) => {
3197
3042
  debug("register");
3198
3043
  return morgan("combined", { stream: fs.createWriteStream(path.join(process.cwd(), filename), { flags: "a" }) });
3199
3044
  };
3200
-
3201
3045
  //#endregion
3202
3046
  //#region src/backend/handler/handlerUpload.ts
3203
3047
  /**
@@ -3211,7 +3055,6 @@ const handlerUpload = (uploadFileSizeLimit) => {
3211
3055
  limits: { fileSize: uploadFileSizeLimit }
3212
3056
  }).any();
3213
3057
  };
3214
-
3215
3058
  //#endregion
3216
3059
  //#region src/backend/handler/handlerAdmin.ts
3217
3060
  const version = () => getVersion();
@@ -3395,7 +3238,7 @@ const createAdminRouter = (adminContext) => {
3395
3238
  res.json({ message: "Server shutting down..." });
3396
3239
  setTimeout(() => {
3397
3240
  forceShutdown();
3398
- }, SHUTDOWN_GRACE_DELAY_MS);
3241
+ }, 100);
3399
3242
  break;
3400
3243
  case "pause":
3401
3244
  adminContext.setPaused(true);
@@ -3447,7 +3290,6 @@ const createAdminRouter = (adminContext) => {
3447
3290
  });
3448
3291
  return router;
3449
3292
  };
3450
-
3451
3293
  //#endregion
3452
3294
  //#region src/backend/handler/handlerAdminConsole.ts
3453
3295
  /**
@@ -3547,7 +3389,6 @@ const handlerAdminConsole = (config, adminContext) => {
3547
3389
  }));
3548
3390
  return router;
3549
3391
  };
3550
-
3551
3392
  //#endregion
3552
3393
  //#region src/backend/handler/handlerSpaFallback.ts
3553
3394
  /**
@@ -3582,7 +3423,7 @@ const createSpaFallback = (directoryPath, _route) => {
3582
3423
  });
3583
3424
  };
3584
3425
  };
3585
-
3586
3426
  //#endregion
3587
3427
  export { AdminContext, createAdminRouter, createServer, createSpaFallback, forceShutdown, getJsonFile, getVersion, handlerAdminConsole, handlerLogger, handlerUpload, handlerWebPlSql, installShutdown, isDirectory, isFile, loadConfig, oracledb_provider_exports as oracledb, readFile, readFileSyncUtf8, removeFile, showConfig, startServer, startServerConfig, z$configType };
3428
+
3588
3429
  //# sourceMappingURL=index.mjs.map