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.
- package/README.md +12 -0
- package/dist/chunk-CfYAbeIz.mjs +13 -0
- package/dist/frontend/assets/main-C8XFvlzY.js +147 -0
- package/dist/frontend/assets/main-C8XFvlzY.js.br +0 -0
- package/dist/frontend/assets/main-C8XFvlzY.js.gz +0 -0
- package/dist/frontend/assets/main-CoERzZAr.css +1 -0
- package/dist/frontend/assets/main-CoERzZAr.css.br +0 -0
- package/dist/frontend/assets/main-CoERzZAr.css.gz +0 -0
- package/dist/frontend/index.html +2 -2
- package/dist/frontend/index.html.br +0 -0
- package/dist/frontend/index.html.gz +0 -0
- package/dist/index.d.mts +3 -2
- package/dist/index.mjs +18 -176
- package/dist/index.mjs.map +1 -1
- package/dist/{oracledb-mock-Dn8aHtd7.mjs → oracledb-mock-Cya43xKB.mjs} +3 -4
- package/dist/oracledb-mock-Cya43xKB.mjs.map +1 -0
- package/package.json +45 -48
- package/dist/chunk-DQk6qfdC.mjs +0 -18
- package/dist/frontend/assets/main-C_esuqtI.js +0 -147
- package/dist/frontend/assets/main-C_esuqtI.js.br +0 -0
- package/dist/frontend/assets/main-C_esuqtI.js.gz +0 -0
- package/dist/frontend/assets/main-bU4x_yEW.css +0 -1
- package/dist/frontend/assets/main-bU4x_yEW.css.br +0 -0
- package/dist/frontend/assets/main-bU4x_yEW.css.gz +0 -0
- package/dist/oracledb-mock-Dn8aHtd7.mjs.map +0 -1
|
Binary file
|
|
Binary file
|
|
@@ -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}
|
|
Binary file
|
|
Binary file
|
package/dist/frontend/index.html
CHANGED
|
@@ -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-
|
|
10
|
-
<link rel="stylesheet" crossorigin href="/admin/assets/main-
|
|
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
|
|
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-
|
|
2
|
-
import { n as setExecuteCallback } from "./oracledb-mock-
|
|
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-
|
|
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
|
|
210
|
+
* @returns Version.
|
|
216
211
|
*/
|
|
217
|
-
const getVersion = () => "1.
|
|
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:
|
|
1226
|
-
interval:
|
|
1227
|
-
maxFiles:
|
|
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:
|
|
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:
|
|
3015
|
-
interval:
|
|
3016
|
-
maxFiles:
|
|
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
|
-
},
|
|
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
|