web_plsql 1.4.0 → 1.5.1

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-C8XFvlzY.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.1";
219
213
  //#endregion
220
214
  //#region src/backend/server/config.ts
221
215
  const paddedLine = (title, value) => {
@@ -230,6 +224,7 @@ const showConfig = (config) => {
230
224
  console.log(LINE);
231
225
  console.log(`NODE PL/SQL SERVER version ${getVersion()}`);
232
226
  console.log(LINE);
227
+ paddedLine("Started", (/* @__PURE__ */ new Date()).toString());
233
228
  paddedLine("Server port", config.port);
234
229
  paddedLine("Admin route", `${config.adminRoute ?? "/admin"}${config.adminUser ? " (authenticated)" : ""}`);
235
230
  paddedLine("Access log", config.loggerFilename.length > 0 ? config.loggerFilename : "-");
@@ -266,7 +261,6 @@ const showConfig = (config) => {
266
261
  }
267
262
  console.log(LINE);
268
263
  };
269
-
270
264
  //#endregion
271
265
  //#region src/backend/server/server.ts
272
266
  const debug$14 = debugModule("webplsql:server");
@@ -340,6 +334,7 @@ const startServer = async (config, ssl) => {
340
334
  });
341
335
  }
342
336
  if (internalConfig.loggerFilename.length > 0) app.use(handlerLogger(internalConfig.loggerFilename));
337
+ if (internalConfig.setupExtensions) await internalConfig.setupExtensions(app, adminContext.pools);
343
338
  for (const i of internalConfig.routeStatic) {
344
339
  app.use(i.route, expressStaticGzip(i.directoryPath, {
345
340
  enableBrotli: true,
@@ -409,7 +404,6 @@ const loadConfig = (filename = "config.json") => z$configType.parse(getJsonFile(
409
404
  * @returns Promise resolving to the web server object.
410
405
  */
411
406
  const startServerConfig = async (filename = "config.json", ssl) => startServer(loadConfig(filename), ssl);
412
-
413
407
  //#endregion
414
408
  //#region src/backend/util/shutdown.ts
415
409
  const debug$13 = debugModule("webplsql:shutdown");
@@ -456,7 +450,6 @@ const forceShutdown = () => {
456
450
  debug$13("forceShutdown");
457
451
  process.kill(process.pid, "SIGTERM");
458
452
  };
459
-
460
453
  //#endregion
461
454
  //#region src/common/constants.ts
462
455
  /**
@@ -563,27 +556,6 @@ const OWA_STREAM_CHUNK_SIZE = 1e3;
563
556
  */
564
557
  const OWA_STREAM_BUFFER_SIZE = 16384;
565
558
  /**
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
559
  * STATS_INTERVAL_MS = 5000
588
560
  *
589
561
  * Purpose: Duration of each statistical bucket in milliseconds.
@@ -648,107 +620,6 @@ const MAX_HISTORY_BUCKETS = 1e3;
648
620
  * - Under heavy load, older samples are discarded (FIFO)
649
621
  */
650
622
  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
623
  //#endregion
753
624
  //#region src/backend/util/statsManager.ts
754
625
  const debug$12 = debugModule("webplsql:statsManager");
@@ -980,7 +851,6 @@ var StatsManager = class {
980
851
  return this.history;
981
852
  }
982
853
  };
983
-
984
854
  //#endregion
985
855
  //#region src/backend/server/adminContext.ts
986
856
  /**
@@ -1023,7 +893,6 @@ var AdminContext = class {
1023
893
  this._paused = value;
1024
894
  }
1025
895
  };
1026
-
1027
896
  //#endregion
1028
897
  //#region src/backend/util/file.ts
1029
898
  /**
@@ -1100,7 +969,6 @@ const isFile = async (filePath) => {
1100
969
  return false;
1101
970
  }
1102
971
  };
1103
-
1104
972
  //#endregion
1105
973
  //#region src/backend/util/html.ts
1106
974
  /**
@@ -1148,7 +1016,6 @@ ${body}
1148
1016
  </body>
1149
1017
  </html>
1150
1018
  `;
1151
-
1152
1019
  //#endregion
1153
1020
  //#region src/backend/util/trace.ts
1154
1021
  /**
@@ -1222,9 +1089,9 @@ const toTable = (head, body) => {
1222
1089
  */
1223
1090
  const logToFile = (text) => {
1224
1091
  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,
1092
+ size: "10M",
1093
+ interval: "1d",
1094
+ maxFiles: 10,
1228
1095
  compress: "gzip"
1229
1096
  });
1230
1097
  fs.write(text);
@@ -1428,7 +1295,6 @@ const warningMessage = (para) => {
1428
1295
  logToFile(text);
1429
1296
  console.warn(text);
1430
1297
  };
1431
-
1432
1298
  //#endregion
1433
1299
  //#region src/backend/util/errorToString.ts
1434
1300
  /**
@@ -1446,7 +1312,6 @@ const errorToString = (error) => {
1446
1312
  return parts.join("\n");
1447
1313
  } else return inspect(error);
1448
1314
  };
1449
-
1450
1315
  //#endregion
1451
1316
  //#region src/backend/handler/plsql/upload.ts
1452
1317
  const debug$11 = debugModule("webplsql:fileUpload");
@@ -1519,7 +1384,6 @@ const uploadFile = async (file, doctable, databaseConnection) => {
1519
1384
  throw new Error(`Unable to remove file "${file.filename}".\n${errorToString(err)}`);
1520
1385
  }
1521
1386
  };
1522
-
1523
1387
  //#endregion
1524
1388
  //#region src/backend/handler/plsql/procedureVariable.ts
1525
1389
  const debug$10 = debugModule("webplsql:procedureVariable");
@@ -1562,7 +1426,6 @@ const getProcedureVariable = (_req, procName, argObj) => {
1562
1426
  }
1563
1427
  };
1564
1428
  };
1565
-
1566
1429
  //#endregion
1567
1430
  //#region src/backend/handler/plsql/requestError.ts
1568
1431
  var RequestError = class RequestError extends Error {
@@ -1576,7 +1439,6 @@ var RequestError = class RequestError extends Error {
1576
1439
  this.timestamp = /* @__PURE__ */ new Date();
1577
1440
  }
1578
1441
  };
1579
-
1580
1442
  //#endregion
1581
1443
  //#region src/backend/util/util.ts
1582
1444
  /**
@@ -1590,7 +1452,6 @@ const stringToNumber = (value) => {
1590
1452
  if (typeof value !== "string" || !/^[+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:E[+-]?\d+)?$/i.test(value)) return null;
1591
1453
  return Number(value);
1592
1454
  };
1593
-
1594
1455
  //#endregion
1595
1456
  //#region src/backend/handler/plsql/procedureNamed.ts
1596
1457
  const debug$9 = debugModule("webplsql:procedureNamed");
@@ -1821,7 +1682,6 @@ const getProcedureNamed = async (req, procName, argObj, databaseConnection, argu
1821
1682
  bind: bindings
1822
1683
  };
1823
1684
  };
1824
-
1825
1685
  //#endregion
1826
1686
  //#region src/backend/handler/plsql/parsePage.ts
1827
1687
  const debug$8 = debugModule("webplsql:parsePage");
@@ -1954,7 +1814,6 @@ const tryDecodeDate = (value) => {
1954
1814
  if (Number.isNaN(result.getTime())) return null;
1955
1815
  return result;
1956
1816
  };
1957
-
1958
1817
  //#endregion
1959
1818
  //#region src/backend/handler/plsql/sendResponse.ts
1960
1819
  const debug$7 = debugModule("webplsql:sendResponse");
@@ -2060,7 +1919,6 @@ const sendResponse = async (_req, res, page) => {
2060
1919
  });
2061
1920
  else res.send(page.body);
2062
1921
  };
2063
-
2064
1922
  //#endregion
2065
1923
  //#region src/backend/handler/plsql/procedureError.ts
2066
1924
  var ProcedureError = class ProcedureError extends Error {
@@ -2083,7 +1941,6 @@ var ProcedureError = class ProcedureError extends Error {
2083
1941
  this.bind = bind;
2084
1942
  }
2085
1943
  };
2086
-
2087
1944
  //#endregion
2088
1945
  //#region src/backend/util/cache.ts
2089
1946
  /**
@@ -2182,7 +2039,6 @@ var Cache = class {
2182
2039
  };
2183
2040
  }
2184
2041
  };
2185
-
2186
2042
  //#endregion
2187
2043
  //#region src/backend/handler/plsql/procedureSanitize.ts
2188
2044
  const debug$6 = debugModule("webplsql:procedureSanitize");
@@ -2253,7 +2109,7 @@ const resolveProcedureName = async (procName, databaseConnection, procedureNameC
2253
2109
  resolved: {
2254
2110
  dir: BIND_OUT,
2255
2111
  type: STRING,
2256
- maxSize: OWA_RESOLVED_NAME_MAX_LEN
2112
+ maxSize: 400
2257
2113
  }
2258
2114
  };
2259
2115
  try {
@@ -2391,7 +2247,6 @@ const requestValidationFunction = async (procName, validationFunction, databaseC
2391
2247
  validationFunctionCache.set(key, { valid });
2392
2248
  return valid;
2393
2249
  };
2394
-
2395
2250
  //#endregion
2396
2251
  //#region src/backend/handler/plsql/owaPageStream.ts
2397
2252
  const debug$5 = debugModule("webplsql:owaPageStream");
@@ -2461,7 +2316,6 @@ var OWAPageStream = class extends Readable {
2461
2316
  if (content && content.length > 0) this.push(content);
2462
2317
  }
2463
2318
  };
2464
-
2465
2319
  //#endregion
2466
2320
  //#region src/backend/util/traceManager.ts
2467
2321
  var TraceManager = class {
@@ -2514,7 +2368,6 @@ var TraceManager = class {
2514
2368
  }
2515
2369
  };
2516
2370
  const traceManager = new TraceManager();
2517
-
2518
2371
  //#endregion
2519
2372
  //#region src/backend/handler/plsql/procedure.ts
2520
2373
  const debug$4 = debugModule("webplsql:procedure");
@@ -2813,7 +2666,6 @@ const invokeProcedure = async (req, res, argObj, cgiObj, filesToUpload, options,
2813
2666
  }
2814
2667
  debug$4("invokeProcedure: end");
2815
2668
  };
2816
-
2817
2669
  //#endregion
2818
2670
  //#region src/backend/handler/plsql/cgi.ts
2819
2671
  const debug$3 = debugModule("webplsql:cgi");
@@ -2918,7 +2770,6 @@ const getCGI = (req, doctable, cgi, authenticatedUser = null) => {
2918
2770
  };
2919
2771
  return Object.assign({}, DEFAULT_CGI, CGI, cgi);
2920
2772
  };
2921
-
2922
2773
  //#endregion
2923
2774
  //#region src/backend/util/type.ts
2924
2775
  /**
@@ -2927,7 +2778,6 @@ const getCGI = (req, doctable, cgi, authenticatedUser = null) => {
2927
2778
  * @returns True if the value is a string or an array of strings
2928
2779
  */
2929
2780
  const isStringOrArrayOfString = (value) => typeof value === "string" || Array.isArray(value) && value.every((element) => typeof element === "string");
2930
-
2931
2781
  //#endregion
2932
2782
  //#region src/backend/handler/plsql/request.ts
2933
2783
  const debug$2 = debugModule("webplsql:request");
@@ -3004,16 +2854,15 @@ const processRequest = async (req, res, options, connectionPool, procedureNameCa
3004
2854
  }
3005
2855
  debug$2("processRequest: EXIT");
3006
2856
  };
3007
-
3008
2857
  //#endregion
3009
2858
  //#region src/backend/util/jsonLogger.ts
3010
2859
  var JsonLogger = class {
3011
2860
  stream;
3012
2861
  constructor(filename = "error.json.log") {
3013
2862
  this.stream = rotatingFileStream.createStream(filename, {
3014
- size: JSON_LOG_ROTATION_SIZE,
3015
- interval: JSON_LOG_ROTATION_INTERVAL,
3016
- maxFiles: JSON_LOG_MAX_ROTATED_FILES,
2863
+ size: "10M",
2864
+ interval: "1d",
2865
+ maxFiles: 10,
3017
2866
  compress: "gzip"
3018
2867
  });
3019
2868
  }
@@ -3038,7 +2887,6 @@ var JsonLogger = class {
3038
2887
  }
3039
2888
  };
3040
2889
  const jsonLogger = new JsonLogger();
3041
-
3042
2890
  //#endregion
3043
2891
  //#region src/backend/handler/plsql/errorPage.ts
3044
2892
  /**
@@ -3112,7 +2960,6 @@ const errorPage = (req, res, options, error) => {
3112
2960
  if (options.errorStyle === "basic") res.status(404).send("Page not found");
3113
2961
  else res.status(404).send(getHtmlPage(html));
3114
2962
  };
3115
-
3116
2963
  //#endregion
3117
2964
  //#region src/backend/handler/plsql/handlerPlSql.ts
3118
2965
  const debug$1 = debugModule("webplsql:handlerPlSql");
@@ -3184,7 +3031,6 @@ const handlerWebPlSql = (connectionPool, config, adminContext) => {
3184
3031
  handler.argumentCache = argumentCache;
3185
3032
  return handler;
3186
3033
  };
3187
-
3188
3034
  //#endregion
3189
3035
  //#region src/backend/handler/handlerLogger.ts
3190
3036
  const debug = debugModule("webplsql:handlerLogger");
@@ -3197,7 +3043,6 @@ const handlerLogger = (filename) => {
3197
3043
  debug("register");
3198
3044
  return morgan("combined", { stream: fs.createWriteStream(path.join(process.cwd(), filename), { flags: "a" }) });
3199
3045
  };
3200
-
3201
3046
  //#endregion
3202
3047
  //#region src/backend/handler/handlerUpload.ts
3203
3048
  /**
@@ -3211,7 +3056,6 @@ const handlerUpload = (uploadFileSizeLimit) => {
3211
3056
  limits: { fileSize: uploadFileSizeLimit }
3212
3057
  }).any();
3213
3058
  };
3214
-
3215
3059
  //#endregion
3216
3060
  //#region src/backend/handler/handlerAdmin.ts
3217
3061
  const version = () => getVersion();
@@ -3395,7 +3239,7 @@ const createAdminRouter = (adminContext) => {
3395
3239
  res.json({ message: "Server shutting down..." });
3396
3240
  setTimeout(() => {
3397
3241
  forceShutdown();
3398
- }, SHUTDOWN_GRACE_DELAY_MS);
3242
+ }, 100);
3399
3243
  break;
3400
3244
  case "pause":
3401
3245
  adminContext.setPaused(true);
@@ -3447,7 +3291,6 @@ const createAdminRouter = (adminContext) => {
3447
3291
  });
3448
3292
  return router;
3449
3293
  };
3450
-
3451
3294
  //#endregion
3452
3295
  //#region src/backend/handler/handlerAdminConsole.ts
3453
3296
  /**
@@ -3547,7 +3390,6 @@ const handlerAdminConsole = (config, adminContext) => {
3547
3390
  }));
3548
3391
  return router;
3549
3392
  };
3550
-
3551
3393
  //#endregion
3552
3394
  //#region src/backend/handler/handlerSpaFallback.ts
3553
3395
  /**
@@ -3582,7 +3424,7 @@ const createSpaFallback = (directoryPath, _route) => {
3582
3424
  });
3583
3425
  };
3584
3426
  };
3585
-
3586
3427
  //#endregion
3587
3428
  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 };
3429
+
3588
3430
  //# sourceMappingURL=index.mjs.map