tm1npm 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +16 -0
- package/.eslintrc.js +28 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +36 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- package/.github/ISSUE_TEMPLATE/question.md +24 -0
- package/.github/workflows/publish-npm.yml +53 -0
- package/.github/workflows/test-on-tag.yml +172 -0
- package/DEVELOPMENT_GUIDE.md +587 -0
- package/LICENSE +21 -0
- package/README.md +580 -0
- package/jest.ci.config.js +83 -0
- package/jest.config.js +68 -0
- package/lib/exceptions/TM1Exception.d.ts +17 -0
- package/lib/exceptions/TM1Exception.d.ts.map +1 -0
- package/lib/exceptions/TM1Exception.js +36 -0
- package/lib/exceptions/TM1RestException.d.ts +10 -0
- package/lib/exceptions/TM1RestException.d.ts.map +1 -0
- package/lib/exceptions/TM1RestException.js +17 -0
- package/lib/exceptions/TM1TimeoutException.d.ts +9 -0
- package/lib/exceptions/TM1TimeoutException.d.ts.map +1 -0
- package/lib/exceptions/TM1TimeoutException.js +16 -0
- package/lib/index.d.ts +41 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +132 -0
- package/lib/objects/Annotation.d.ts +36 -0
- package/lib/objects/Annotation.d.ts.map +1 -0
- package/lib/objects/Annotation.js +134 -0
- package/lib/objects/Application.d.ts +67 -0
- package/lib/objects/Application.d.ts.map +1 -0
- package/lib/objects/Application.js +125 -0
- package/lib/objects/Axis.d.ts +36 -0
- package/lib/objects/Axis.d.ts.map +1 -0
- package/lib/objects/Axis.js +103 -0
- package/lib/objects/Chore.d.ts +43 -0
- package/lib/objects/Chore.d.ts.map +1 -0
- package/lib/objects/Chore.js +129 -0
- package/lib/objects/ChoreFrequency.d.ts +23 -0
- package/lib/objects/ChoreFrequency.d.ts.map +1 -0
- package/lib/objects/ChoreFrequency.js +61 -0
- package/lib/objects/ChoreStartTime.d.ts +15 -0
- package/lib/objects/ChoreStartTime.d.ts.map +1 -0
- package/lib/objects/ChoreStartTime.js +85 -0
- package/lib/objects/ChoreTask.d.ts +28 -0
- package/lib/objects/ChoreTask.d.ts.map +1 -0
- package/lib/objects/ChoreTask.js +66 -0
- package/lib/objects/Cube.d.ts +26 -0
- package/lib/objects/Cube.d.ts.map +1 -0
- package/lib/objects/Cube.js +109 -0
- package/lib/objects/Dimension.d.ts +26 -0
- package/lib/objects/Dimension.d.ts.map +1 -0
- package/lib/objects/Dimension.js +86 -0
- package/lib/objects/Element.d.ts +35 -0
- package/lib/objects/Element.d.ts.map +1 -0
- package/lib/objects/Element.js +115 -0
- package/lib/objects/ElementAttribute.d.ts +28 -0
- package/lib/objects/ElementAttribute.d.ts.map +1 -0
- package/lib/objects/ElementAttribute.js +97 -0
- package/lib/objects/Git.d.ts +21 -0
- package/lib/objects/Git.d.ts.map +1 -0
- package/lib/objects/Git.js +49 -0
- package/lib/objects/GitCommit.d.ts +12 -0
- package/lib/objects/GitCommit.d.ts.map +1 -0
- package/lib/objects/GitCommit.js +26 -0
- package/lib/objects/GitPlan.d.ts +35 -0
- package/lib/objects/GitPlan.d.ts.map +1 -0
- package/lib/objects/GitPlan.js +78 -0
- package/lib/objects/GitRemote.d.ts +12 -0
- package/lib/objects/GitRemote.d.ts.map +1 -0
- package/lib/objects/GitRemote.js +26 -0
- package/lib/objects/Hierarchy.d.ts +47 -0
- package/lib/objects/Hierarchy.d.ts.map +1 -0
- package/lib/objects/Hierarchy.js +165 -0
- package/lib/objects/MDXView.d.ts +19 -0
- package/lib/objects/MDXView.d.ts.map +1 -0
- package/lib/objects/MDXView.js +67 -0
- package/lib/objects/NativeView.d.ts +39 -0
- package/lib/objects/NativeView.d.ts.map +1 -0
- package/lib/objects/NativeView.js +209 -0
- package/lib/objects/Process.d.ts +70 -0
- package/lib/objects/Process.d.ts.map +1 -0
- package/lib/objects/Process.js +210 -0
- package/lib/objects/ProcessDebugBreakpoint.d.ts +60 -0
- package/lib/objects/ProcessDebugBreakpoint.d.ts.map +1 -0
- package/lib/objects/ProcessDebugBreakpoint.js +168 -0
- package/lib/objects/ProcessParameter.d.ts +23 -0
- package/lib/objects/ProcessParameter.d.ts.map +1 -0
- package/lib/objects/ProcessParameter.js +55 -0
- package/lib/objects/ProcessVariable.d.ts +26 -0
- package/lib/objects/ProcessVariable.d.ts.map +1 -0
- package/lib/objects/ProcessVariable.js +63 -0
- package/lib/objects/Rules.d.ts +30 -0
- package/lib/objects/Rules.d.ts.map +1 -0
- package/lib/objects/Rules.js +103 -0
- package/lib/objects/Sandbox.d.ts +21 -0
- package/lib/objects/Sandbox.d.ts.map +1 -0
- package/lib/objects/Sandbox.js +64 -0
- package/lib/objects/Server.d.ts +27 -0
- package/lib/objects/Server.d.ts.map +1 -0
- package/lib/objects/Server.js +26 -0
- package/lib/objects/Subset.d.ts +44 -0
- package/lib/objects/Subset.d.ts.map +1 -0
- package/lib/objects/Subset.js +222 -0
- package/lib/objects/TM1Object.d.ts +8 -0
- package/lib/objects/TM1Object.d.ts.map +1 -0
- package/lib/objects/TM1Object.js +17 -0
- package/lib/objects/TM1Project.d.ts +74 -0
- package/lib/objects/TM1Project.d.ts.map +1 -0
- package/lib/objects/TM1Project.js +409 -0
- package/lib/objects/User.d.ts +42 -0
- package/lib/objects/User.d.ts.map +1 -0
- package/lib/objects/User.js +157 -0
- package/lib/objects/View.d.ts +19 -0
- package/lib/objects/View.d.ts.map +1 -0
- package/lib/objects/View.js +33 -0
- package/lib/objects/index.d.ts +30 -0
- package/lib/objects/index.d.ts.map +1 -0
- package/lib/objects/index.js +68 -0
- package/lib/services/AnnotationService.d.ts +17 -0
- package/lib/services/AnnotationService.d.ts.map +1 -0
- package/lib/services/AnnotationService.js +91 -0
- package/lib/services/ApplicationService.d.ts +21 -0
- package/lib/services/ApplicationService.d.ts.map +1 -0
- package/lib/services/ApplicationService.js +227 -0
- package/lib/services/AuditLogService.d.ts +15 -0
- package/lib/services/AuditLogService.d.ts.map +1 -0
- package/lib/services/AuditLogService.js +153 -0
- package/lib/services/CellService.d.ts +191 -0
- package/lib/services/CellService.d.ts.map +1 -0
- package/lib/services/CellService.js +597 -0
- package/lib/services/ChoreService.d.ts +24 -0
- package/lib/services/ChoreService.d.ts.map +1 -0
- package/lib/services/ChoreService.js +219 -0
- package/lib/services/ConfigurationService.d.ts +18 -0
- package/lib/services/ConfigurationService.d.ts.map +1 -0
- package/lib/services/ConfigurationService.js +60 -0
- package/lib/services/CubeService.d.ts +43 -0
- package/lib/services/CubeService.d.ts.map +1 -0
- package/lib/services/CubeService.js +296 -0
- package/lib/services/DimensionService.d.ts +21 -0
- package/lib/services/DimensionService.d.ts.map +1 -0
- package/lib/services/DimensionService.js +146 -0
- package/lib/services/ElementService.d.ts +132 -0
- package/lib/services/ElementService.d.ts.map +1 -0
- package/lib/services/ElementService.js +579 -0
- package/lib/services/FileService.d.ts +14 -0
- package/lib/services/FileService.d.ts.map +1 -0
- package/lib/services/FileService.js +65 -0
- package/lib/services/GitService.d.ts +23 -0
- package/lib/services/GitService.d.ts.map +1 -0
- package/lib/services/GitService.js +225 -0
- package/lib/services/HierarchyService.d.ts +32 -0
- package/lib/services/HierarchyService.d.ts.map +1 -0
- package/lib/services/HierarchyService.js +235 -0
- package/lib/services/JobService.d.ts +13 -0
- package/lib/services/JobService.d.ts.map +1 -0
- package/lib/services/JobService.js +83 -0
- package/lib/services/LoggerService.d.ts +16 -0
- package/lib/services/LoggerService.d.ts.map +1 -0
- package/lib/services/LoggerService.js +101 -0
- package/lib/services/ManageService.d.ts +47 -0
- package/lib/services/ManageService.d.ts.map +1 -0
- package/lib/services/ManageService.js +221 -0
- package/lib/services/MessageLogService.d.ts +13 -0
- package/lib/services/MessageLogService.d.ts.map +1 -0
- package/lib/services/MessageLogService.js +175 -0
- package/lib/services/MonitoringService.d.ts +29 -0
- package/lib/services/MonitoringService.d.ts.map +1 -0
- package/lib/services/MonitoringService.js +86 -0
- package/lib/services/ObjectService.d.ts +8 -0
- package/lib/services/ObjectService.d.ts.map +1 -0
- package/lib/services/ObjectService.js +20 -0
- package/lib/services/PowerBiService.d.ts +13 -0
- package/lib/services/PowerBiService.d.ts.map +1 -0
- package/lib/services/PowerBiService.js +52 -0
- package/lib/services/ProcessService.d.ts +57 -0
- package/lib/services/ProcessService.d.ts.map +1 -0
- package/lib/services/ProcessService.js +499 -0
- package/lib/services/RestService.d.ts +68 -0
- package/lib/services/RestService.d.ts.map +1 -0
- package/lib/services/RestService.js +166 -0
- package/lib/services/SandboxService.d.ts +28 -0
- package/lib/services/SandboxService.d.ts.map +1 -0
- package/lib/services/SandboxService.js +197 -0
- package/lib/services/SecurityService.d.ts +33 -0
- package/lib/services/SecurityService.d.ts.map +1 -0
- package/lib/services/SecurityService.js +249 -0
- package/lib/services/ServerService.d.ts +55 -0
- package/lib/services/ServerService.d.ts.map +1 -0
- package/lib/services/ServerService.js +247 -0
- package/lib/services/SessionService.d.ts +15 -0
- package/lib/services/SessionService.d.ts.map +1 -0
- package/lib/services/SessionService.js +68 -0
- package/lib/services/SubsetService.d.ts +13 -0
- package/lib/services/SubsetService.d.ts.map +1 -0
- package/lib/services/SubsetService.js +46 -0
- package/lib/services/TM1Service.d.ts +39 -0
- package/lib/services/TM1Service.d.ts.map +1 -0
- package/lib/services/TM1Service.js +94 -0
- package/lib/services/ThreadService.d.ts +15 -0
- package/lib/services/ThreadService.d.ts.map +1 -0
- package/lib/services/ThreadService.js +104 -0
- package/lib/services/TransactionLogService.d.ts +11 -0
- package/lib/services/TransactionLogService.d.ts.map +1 -0
- package/lib/services/TransactionLogService.js +124 -0
- package/lib/services/UserService.d.ts +14 -0
- package/lib/services/UserService.d.ts.map +1 -0
- package/lib/services/UserService.js +103 -0
- package/lib/services/ViewService.d.ts +30 -0
- package/lib/services/ViewService.d.ts.map +1 -0
- package/lib/services/ViewService.js +331 -0
- package/lib/services/index.d.ts +26 -0
- package/lib/services/index.d.ts.map +1 -0
- package/lib/services/index.js +56 -0
- package/lib/tests/100PercentParityCheck.test.d.ts +6 -0
- package/lib/tests/100PercentParityCheck.test.d.ts.map +1 -0
- package/lib/tests/100PercentParityCheck.test.js +143 -0
- package/lib/tests/basic.test.d.ts +6 -0
- package/lib/tests/basic.test.d.ts.map +1 -0
- package/lib/tests/basic.test.js +52 -0
- package/lib/tests/cellService.test.d.ts +6 -0
- package/lib/tests/cellService.test.d.ts.map +1 -0
- package/lib/tests/cellService.test.js +311 -0
- package/lib/tests/ciSetup.d.ts +6 -0
- package/lib/tests/ciSetup.d.ts.map +1 -0
- package/lib/tests/ciSetup.js +23 -0
- package/lib/tests/comprehensive.service.test.d.ts +6 -0
- package/lib/tests/comprehensive.service.test.d.ts.map +1 -0
- package/lib/tests/comprehensive.service.test.js +507 -0
- package/lib/tests/connection.test.d.ts +6 -0
- package/lib/tests/connection.test.d.ts.map +1 -0
- package/lib/tests/connection.test.js +89 -0
- package/lib/tests/cubeService.test.d.ts +6 -0
- package/lib/tests/cubeService.test.d.ts.map +1 -0
- package/lib/tests/cubeService.test.js +368 -0
- package/lib/tests/dimensionService.comprehensive.test.d.ts +7 -0
- package/lib/tests/dimensionService.comprehensive.test.d.ts.map +1 -0
- package/lib/tests/dimensionService.comprehensive.test.js +614 -0
- package/lib/tests/dimensionService.test.d.ts +6 -0
- package/lib/tests/dimensionService.test.d.ts.map +1 -0
- package/lib/tests/dimensionService.test.js +293 -0
- package/lib/tests/edgeCases.test.d.ts +6 -0
- package/lib/tests/edgeCases.test.d.ts.map +1 -0
- package/lib/tests/edgeCases.test.js +301 -0
- package/lib/tests/elementService.comprehensive.test.d.ts +7 -0
- package/lib/tests/elementService.comprehensive.test.d.ts.map +1 -0
- package/lib/tests/elementService.comprehensive.test.js +846 -0
- package/lib/tests/elementService.test.d.ts +6 -0
- package/lib/tests/elementService.test.d.ts.map +1 -0
- package/lib/tests/elementService.test.js +350 -0
- package/lib/tests/enhancedCellService.test.d.ts +2 -0
- package/lib/tests/enhancedCellService.test.d.ts.map +1 -0
- package/lib/tests/enhancedCellService.test.js +152 -0
- package/lib/tests/enhancedCubeService.test.d.ts +2 -0
- package/lib/tests/enhancedCubeService.test.d.ts.map +1 -0
- package/lib/tests/enhancedCubeService.test.js +246 -0
- package/lib/tests/enhancedElementService.test.d.ts +2 -0
- package/lib/tests/enhancedElementService.test.d.ts.map +1 -0
- package/lib/tests/enhancedElementService.test.js +199 -0
- package/lib/tests/enhancedViewService.test.d.ts +2 -0
- package/lib/tests/enhancedViewService.test.d.ts.map +1 -0
- package/lib/tests/enhancedViewService.test.js +260 -0
- package/lib/tests/errorHandling.test.d.ts +6 -0
- package/lib/tests/errorHandling.test.d.ts.map +1 -0
- package/lib/tests/errorHandling.test.js +227 -0
- package/lib/tests/exceptions.test.d.ts +7 -0
- package/lib/tests/exceptions.test.d.ts.map +1 -0
- package/lib/tests/exceptions.test.js +257 -0
- package/lib/tests/hierarchyService.test.d.ts +6 -0
- package/lib/tests/hierarchyService.test.d.ts.map +1 -0
- package/lib/tests/hierarchyService.test.js +294 -0
- package/lib/tests/index.test.d.ts +6 -0
- package/lib/tests/index.test.d.ts.map +1 -0
- package/lib/tests/index.test.js +346 -0
- package/lib/tests/integration.test.d.ts +6 -0
- package/lib/tests/integration.test.d.ts.map +1 -0
- package/lib/tests/integration.test.js +302 -0
- package/lib/tests/integrationTests.test.d.ts +2 -0
- package/lib/tests/integrationTests.test.d.ts.map +1 -0
- package/lib/tests/integrationTests.test.js +252 -0
- package/lib/tests/mdx.advanced.test.d.ts +6 -0
- package/lib/tests/mdx.advanced.test.d.ts.map +1 -0
- package/lib/tests/mdx.advanced.test.js +437 -0
- package/lib/tests/objects.improved.test.d.ts +7 -0
- package/lib/tests/objects.improved.test.d.ts.map +1 -0
- package/lib/tests/objects.improved.test.js +302 -0
- package/lib/tests/performance.test.d.ts +6 -0
- package/lib/tests/performance.test.d.ts.map +1 -0
- package/lib/tests/performance.test.js +264 -0
- package/lib/tests/processService.comprehensive.test.d.ts +7 -0
- package/lib/tests/processService.comprehensive.test.d.ts.map +1 -0
- package/lib/tests/processService.comprehensive.test.js +656 -0
- package/lib/tests/processService.test.d.ts +6 -0
- package/lib/tests/processService.test.d.ts.map +1 -0
- package/lib/tests/processService.test.js +322 -0
- package/lib/tests/restService.test.d.ts +6 -0
- package/lib/tests/restService.test.d.ts.map +1 -0
- package/lib/tests/restService.test.js +177 -0
- package/lib/tests/security.advanced.test.d.ts +6 -0
- package/lib/tests/security.advanced.test.d.ts.map +1 -0
- package/lib/tests/security.advanced.test.js +407 -0
- package/lib/tests/security.test.d.ts +6 -0
- package/lib/tests/security.test.d.ts.map +1 -0
- package/lib/tests/security.test.js +204 -0
- package/lib/tests/securityService.comprehensive.test.d.ts +7 -0
- package/lib/tests/securityService.comprehensive.test.d.ts.map +1 -0
- package/lib/tests/securityService.comprehensive.test.js +457 -0
- package/lib/tests/setup.d.ts +4 -0
- package/lib/tests/setup.d.ts.map +1 -0
- package/lib/tests/setup.js +40 -0
- package/lib/tests/simpleCoverage.test.d.ts +6 -0
- package/lib/tests/simpleCoverage.test.d.ts.map +1 -0
- package/lib/tests/simpleCoverage.test.js +236 -0
- package/lib/tests/stress.performance.test.d.ts +6 -0
- package/lib/tests/stress.performance.test.d.ts.map +1 -0
- package/lib/tests/stress.performance.test.js +423 -0
- package/lib/tests/subsetService.test.d.ts +6 -0
- package/lib/tests/subsetService.test.d.ts.map +1 -0
- package/lib/tests/subsetService.test.js +271 -0
- package/lib/tests/testConfig.d.ts +18 -0
- package/lib/tests/testConfig.d.ts.map +1 -0
- package/lib/tests/testConfig.js +38 -0
- package/lib/tests/testUtils.d.ts +9 -0
- package/lib/tests/testUtils.d.ts.map +1 -0
- package/lib/tests/testUtils.js +100 -0
- package/lib/tests/tm1Service.test.d.ts +7 -0
- package/lib/tests/tm1Service.test.d.ts.map +1 -0
- package/lib/tests/tm1Service.test.js +290 -0
- package/lib/tests/viewService.test.d.ts +6 -0
- package/lib/tests/viewService.test.d.ts.map +1 -0
- package/lib/tests/viewService.test.js +240 -0
- package/lib/utils/Utils.d.ts +90 -0
- package/lib/utils/Utils.d.ts.map +1 -0
- package/lib/utils/Utils.js +379 -0
- package/package.json +81 -0
- package/run-all-tests.js +296 -0
- package/src/exceptions/TM1Exception.ts +38 -0
- package/src/exceptions/TM1RestException.ts +17 -0
- package/src/exceptions/TM1TimeoutException.ts +15 -0
- package/src/index.ts +94 -0
- package/src/objects/Annotation.ts +194 -0
- package/src/objects/Application.ts +146 -0
- package/src/objects/Axis.ts +149 -0
- package/src/objects/Chore.ts +174 -0
- package/src/objects/ChoreFrequency.ts +83 -0
- package/src/objects/ChoreStartTime.ts +111 -0
- package/src/objects/ChoreTask.ts +92 -0
- package/src/objects/Cube.ts +125 -0
- package/src/objects/Dimension.ts +107 -0
- package/src/objects/Element.ts +153 -0
- package/src/objects/ElementAttribute.ts +115 -0
- package/src/objects/Git.ts +86 -0
- package/src/objects/GitCommit.ts +31 -0
- package/src/objects/GitPlan.ts +121 -0
- package/src/objects/GitRemote.ts +31 -0
- package/src/objects/Hierarchy.ts +229 -0
- package/src/objects/MDXView.ts +91 -0
- package/src/objects/NativeView.ts +268 -0
- package/src/objects/Process.ts +320 -0
- package/src/objects/ProcessDebugBreakpoint.ts +239 -0
- package/src/objects/ProcessParameter.ts +76 -0
- package/src/objects/ProcessVariable.ts +89 -0
- package/src/objects/Rules.ts +117 -0
- package/src/objects/Sandbox.ts +90 -0
- package/src/objects/Server.ts +45 -0
- package/src/objects/Subset.ts +323 -0
- package/src/objects/TM1Object.ts +17 -0
- package/src/objects/TM1Project.ts +587 -0
- package/src/objects/User.ts +198 -0
- package/src/objects/View.ts +43 -0
- package/src/objects/index.ts +36 -0
- package/src/services/AnnotationService.ts +107 -0
- package/src/services/ApplicationService.ts +279 -0
- package/src/services/AuditLogService.ts +172 -0
- package/src/services/CellService.ts +814 -0
- package/src/services/ChoreService.ts +219 -0
- package/src/services/ConfigurationService.ts +69 -0
- package/src/services/CubeService.ts +338 -0
- package/src/services/DimensionService.ts +168 -0
- package/src/services/ElementService.ts +966 -0
- package/src/services/FileService.ts +67 -0
- package/src/services/GitService.ts +324 -0
- package/src/services/HierarchyService.ts +284 -0
- package/src/services/JobService.ts +59 -0
- package/src/services/LoggerService.ts +118 -0
- package/src/services/ManageService.ts +322 -0
- package/src/services/MessageLogService.ts +211 -0
- package/src/services/MonitoringService.ts +105 -0
- package/src/services/ObjectService.ts +21 -0
- package/src/services/PowerBiService.ts +85 -0
- package/src/services/ProcessService.ts +589 -0
- package/src/services/RestService.ts +224 -0
- package/src/services/SandboxService.ts +217 -0
- package/src/services/SecurityService.ts +284 -0
- package/src/services/ServerService.ts +313 -0
- package/src/services/SessionService.ts +81 -0
- package/src/services/SubsetService.ts +52 -0
- package/src/services/TM1Service.ts +133 -0
- package/src/services/ThreadService.ts +83 -0
- package/src/services/TransactionLogService.ts +148 -0
- package/src/services/UserService.ts +77 -0
- package/src/services/ViewService.ts +398 -0
- package/src/services/index.ts +28 -0
- package/src/tests/100PercentParityCheck.test.ts +166 -0
- package/src/tests/basic.test.ts +59 -0
- package/src/tests/cellService.test.ts +405 -0
- package/src/tests/ciSetup.ts +26 -0
- package/src/tests/comprehensive.service.test.ts +653 -0
- package/src/tests/config.ini.template +23 -0
- package/src/tests/connection.test.ts +90 -0
- package/src/tests/cubeService.test.ts +458 -0
- package/src/tests/dimensionService.comprehensive.test.ts +786 -0
- package/src/tests/dimensionService.test.ts +373 -0
- package/src/tests/edgeCases.test.ts +358 -0
- package/src/tests/elementService.comprehensive.test.ts +1190 -0
- package/src/tests/elementService.test.ts +472 -0
- package/src/tests/enhancedCellService.test.ts +237 -0
- package/src/tests/enhancedCubeService.test.ts +384 -0
- package/src/tests/enhancedElementService.test.ts +301 -0
- package/src/tests/enhancedViewService.test.ts +373 -0
- package/src/tests/errorHandling.test.ts +264 -0
- package/src/tests/exceptions.test.ts +313 -0
- package/src/tests/hierarchyService.test.ts +386 -0
- package/src/tests/index.test.ts +376 -0
- package/src/tests/integration.test.ts +333 -0
- package/src/tests/integrationTests.test.ts +302 -0
- package/src/tests/mdx.advanced.test.ts +513 -0
- package/src/tests/objects.improved.test.ts +385 -0
- package/src/tests/performance.test.ts +314 -0
- package/src/tests/processService.comprehensive.test.ts +933 -0
- package/src/tests/processService.test.ts +409 -0
- package/src/tests/restService.test.ts +218 -0
- package/src/tests/security.advanced.test.ts +464 -0
- package/src/tests/security.test.ts +233 -0
- package/src/tests/securityService.comprehensive.test.ts +582 -0
- package/src/tests/setup.ts +42 -0
- package/src/tests/simpleCoverage.test.ts +287 -0
- package/src/tests/stress.performance.test.ts +531 -0
- package/src/tests/subsetService.test.ts +350 -0
- package/src/tests/testConfig.ts +53 -0
- package/src/tests/testUtils.ts +94 -0
- package/src/tests/tm1Service.test.ts +361 -0
- package/src/tests/viewService.test.ts +324 -0
- package/src/utils/Utils.ts +395 -0
- package/tests/README.md +57 -0
- package/tests/connection/test-connection.ts +86 -0
- package/tests/edge-cases/edge-cases-test.ts +244 -0
- package/tests/integration/working-test.ts +193 -0
- package/tests/performance/performance-test.ts +133 -0
- package/tests/run-all-tests.sh +106 -0
- package/tests/security/security-test.ts +103 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.RestService = exports.AuthenticationMode = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const TM1Exception_1 = require("../exceptions/TM1Exception");
|
|
9
|
+
var AuthenticationMode;
|
|
10
|
+
(function (AuthenticationMode) {
|
|
11
|
+
AuthenticationMode[AuthenticationMode["BASIC"] = 1] = "BASIC";
|
|
12
|
+
AuthenticationMode[AuthenticationMode["WIA"] = 2] = "WIA";
|
|
13
|
+
AuthenticationMode[AuthenticationMode["CAM"] = 3] = "CAM";
|
|
14
|
+
AuthenticationMode[AuthenticationMode["CAM_SSO"] = 4] = "CAM_SSO";
|
|
15
|
+
AuthenticationMode[AuthenticationMode["IBM_CLOUD_API_KEY"] = 5] = "IBM_CLOUD_API_KEY";
|
|
16
|
+
AuthenticationMode[AuthenticationMode["SERVICE_TO_SERVICE"] = 6] = "SERVICE_TO_SERVICE";
|
|
17
|
+
AuthenticationMode[AuthenticationMode["PA_PROXY"] = 7] = "PA_PROXY";
|
|
18
|
+
AuthenticationMode[AuthenticationMode["BASIC_API_KEY"] = 8] = "BASIC_API_KEY";
|
|
19
|
+
AuthenticationMode[AuthenticationMode["ACCESS_TOKEN"] = 9] = "ACCESS_TOKEN";
|
|
20
|
+
})(AuthenticationMode || (exports.AuthenticationMode = AuthenticationMode = {}));
|
|
21
|
+
class RestService {
|
|
22
|
+
constructor(config) {
|
|
23
|
+
this.isConnected = false;
|
|
24
|
+
this.config = { ...config };
|
|
25
|
+
this.setupAxiosInstance();
|
|
26
|
+
}
|
|
27
|
+
setupAxiosInstance() {
|
|
28
|
+
const baseURL = this.buildBaseUrl();
|
|
29
|
+
this.axiosInstance = axios_1.default.create({
|
|
30
|
+
baseURL,
|
|
31
|
+
timeout: (this.config.timeout || 60) * 1000,
|
|
32
|
+
headers: {
|
|
33
|
+
...RestService.HEADERS,
|
|
34
|
+
...(this.config.sessionContext && { 'TM1-SessionContext': this.config.sessionContext })
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
this.setupInterceptors();
|
|
38
|
+
}
|
|
39
|
+
buildBaseUrl() {
|
|
40
|
+
if (this.config.baseUrl) {
|
|
41
|
+
return this.config.baseUrl;
|
|
42
|
+
}
|
|
43
|
+
const protocol = this.config.ssl ? 'https' : 'http';
|
|
44
|
+
const address = this.config.address || 'localhost';
|
|
45
|
+
const port = this.config.port || 8001;
|
|
46
|
+
return `${protocol}://${address}:${port}/api/v1`;
|
|
47
|
+
}
|
|
48
|
+
setupInterceptors() {
|
|
49
|
+
// Request interceptor
|
|
50
|
+
this.axiosInstance.interceptors.request.use((config) => {
|
|
51
|
+
if (this.sessionId) {
|
|
52
|
+
config.headers['TM1SessionId'] = this.sessionId;
|
|
53
|
+
}
|
|
54
|
+
if (this.sandboxName) {
|
|
55
|
+
config.headers['TM1-Sandbox'] = this.sandboxName;
|
|
56
|
+
}
|
|
57
|
+
return config;
|
|
58
|
+
}, (error) => Promise.reject(error));
|
|
59
|
+
// Response interceptor
|
|
60
|
+
this.axiosInstance.interceptors.response.use((response) => response, (error) => {
|
|
61
|
+
if (error.code === 'ECONNABORTED' || error.message.includes('timeout')) {
|
|
62
|
+
throw new TM1Exception_1.TM1TimeoutException(`Request timeout: ${error.message}`);
|
|
63
|
+
}
|
|
64
|
+
const response = error.response;
|
|
65
|
+
if (response) {
|
|
66
|
+
const message = this.extractErrorMessage(response);
|
|
67
|
+
throw new TM1Exception_1.TM1RestException(message, response);
|
|
68
|
+
}
|
|
69
|
+
throw new TM1Exception_1.TM1RestException(error.message);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
extractErrorMessage(response) {
|
|
73
|
+
try {
|
|
74
|
+
if (response.data && response.data.error) {
|
|
75
|
+
if (response.data.error.message) {
|
|
76
|
+
return response.data.error.message;
|
|
77
|
+
}
|
|
78
|
+
return JSON.stringify(response.data.error);
|
|
79
|
+
}
|
|
80
|
+
return `HTTP ${response.status}: ${response.statusText}`;
|
|
81
|
+
}
|
|
82
|
+
catch (_a) {
|
|
83
|
+
return `HTTP ${response.status}: ${response.statusText}`;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async connect() {
|
|
87
|
+
try {
|
|
88
|
+
// Basic authentication
|
|
89
|
+
if (this.config.user && this.config.password) {
|
|
90
|
+
const credentials = Buffer.from(`${this.config.user}:${this.config.password}`).toString('base64');
|
|
91
|
+
this.axiosInstance.defaults.headers.common['Authorization'] = `Basic ${credentials}`;
|
|
92
|
+
}
|
|
93
|
+
// Test connection
|
|
94
|
+
const response = await this.axiosInstance.get('/Configuration/ServerName');
|
|
95
|
+
// Extract session ID from response headers
|
|
96
|
+
const setCookie = response.headers['set-cookie'];
|
|
97
|
+
if (setCookie) {
|
|
98
|
+
for (const cookie of setCookie) {
|
|
99
|
+
const match = cookie.match(/TM1SessionId=([^;]+)/);
|
|
100
|
+
if (match) {
|
|
101
|
+
this.sessionId = match[1];
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
this.isConnected = true;
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
throw new TM1Exception_1.TM1RestException(`Failed to connect to TM1: ${error}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async disconnect() {
|
|
113
|
+
if (this.isConnected && this.sessionId) {
|
|
114
|
+
try {
|
|
115
|
+
await this.axiosInstance.post('/ActiveSession/tm1.Close', {});
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
// Ignore errors during disconnect
|
|
119
|
+
}
|
|
120
|
+
this.isConnected = false;
|
|
121
|
+
this.sessionId = undefined;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async get(url, config) {
|
|
125
|
+
return this.axiosInstance.get(url, config);
|
|
126
|
+
}
|
|
127
|
+
async post(url, data, config) {
|
|
128
|
+
return this.axiosInstance.post(url, data, config);
|
|
129
|
+
}
|
|
130
|
+
async patch(url, data, config) {
|
|
131
|
+
return this.axiosInstance.patch(url, data, config);
|
|
132
|
+
}
|
|
133
|
+
async put(url, data, config) {
|
|
134
|
+
return this.axiosInstance.put(url, data, config);
|
|
135
|
+
}
|
|
136
|
+
async delete(url, config) {
|
|
137
|
+
return this.axiosInstance.delete(url, config);
|
|
138
|
+
}
|
|
139
|
+
getSessionId() {
|
|
140
|
+
return this.sessionId;
|
|
141
|
+
}
|
|
142
|
+
setSandbox(sandboxName) {
|
|
143
|
+
this.sandboxName = sandboxName;
|
|
144
|
+
}
|
|
145
|
+
getSandbox() {
|
|
146
|
+
return this.sandboxName;
|
|
147
|
+
}
|
|
148
|
+
isLoggedIn() {
|
|
149
|
+
return this.isConnected && !!this.sessionId;
|
|
150
|
+
}
|
|
151
|
+
async getApiMetadata() {
|
|
152
|
+
const response = await this.get("/$metadata");
|
|
153
|
+
return response.data;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
exports.RestService = RestService;
|
|
157
|
+
RestService.HEADERS = {
|
|
158
|
+
'Connection': 'keep-alive',
|
|
159
|
+
'User-Agent': 'tm1npm',
|
|
160
|
+
'Content-Type': 'application/json; odata.streaming=true; charset=utf-8',
|
|
161
|
+
'Accept': 'application/json;odata.metadata=none,text/plain',
|
|
162
|
+
'TM1-SessionContext': 'tm1npm'
|
|
163
|
+
};
|
|
164
|
+
RestService.DEFAULT_CONNECTION_POOL_SIZE = 10;
|
|
165
|
+
RestService.DEFAULT_POOL_CONNECTIONS = 1;
|
|
166
|
+
//# sourceMappingURL=RestService.js.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { AxiosResponse } from 'axios';
|
|
2
|
+
import { RestService } from './RestService';
|
|
3
|
+
import { ObjectService } from './ObjectService';
|
|
4
|
+
import { Sandbox } from '../objects/Sandbox';
|
|
5
|
+
export declare class SandboxService extends ObjectService {
|
|
6
|
+
/** Service to handle sandboxes in TM1
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
constructor(rest: RestService);
|
|
10
|
+
get(sandboxName: string): Promise<Sandbox>;
|
|
11
|
+
getAll(): Promise<Sandbox[]>;
|
|
12
|
+
getAllNames(): Promise<string[]>;
|
|
13
|
+
create(sandbox: Sandbox): Promise<AxiosResponse>;
|
|
14
|
+
update(sandbox: Sandbox): Promise<AxiosResponse>;
|
|
15
|
+
delete(sandboxName: string): Promise<AxiosResponse>;
|
|
16
|
+
publish(sandboxName: string): Promise<AxiosResponse>;
|
|
17
|
+
reset(sandboxName: string): Promise<AxiosResponse>;
|
|
18
|
+
merge(sourceSandboxName: string, targetSandboxName: string): Promise<AxiosResponse>;
|
|
19
|
+
exists(sandboxName: string): Promise<boolean>;
|
|
20
|
+
getChanges(sandboxName: string): Promise<any>;
|
|
21
|
+
isEmpty(sandboxName: string): Promise<boolean>;
|
|
22
|
+
load(sandboxName: string): Promise<AxiosResponse>;
|
|
23
|
+
unload(sandboxName: string): Promise<AxiosResponse>;
|
|
24
|
+
getSandboxDimensionMembers(): Promise<string[]>;
|
|
25
|
+
createIfNotExists(sandbox: Sandbox): Promise<AxiosResponse | null>;
|
|
26
|
+
cloneSandbox(sourceSandboxName: string, targetSandboxName: string): Promise<AxiosResponse>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=SandboxService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SandboxService.d.ts","sourceRoot":"","sources":["../../src/services/SandboxService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAI7C,qBAAa,cAAe,SAAQ,aAAa;IAC7C;;OAEG;gBAES,IAAI,EAAE,WAAW;IAIhB,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAY1C,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAa5B,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAWhC,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IAUhD,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IAUhD,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAUnD,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAUpD,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAUlD,KAAK,CAAC,iBAAiB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAcnF,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB7C,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAW7C,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc9C,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAUjD,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAUnD,0BAA0B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAU/C,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAYlE,YAAY,CAAC,iBAAiB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CAgB1G"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SandboxService = void 0;
|
|
4
|
+
const ObjectService_1 = require("./ObjectService");
|
|
5
|
+
const Sandbox_1 = require("../objects/Sandbox");
|
|
6
|
+
const TM1Exception_1 = require("../exceptions/TM1Exception");
|
|
7
|
+
const Utils_1 = require("../utils/Utils");
|
|
8
|
+
class SandboxService extends ObjectService_1.ObjectService {
|
|
9
|
+
/** Service to handle sandboxes in TM1
|
|
10
|
+
*
|
|
11
|
+
*/
|
|
12
|
+
constructor(rest) {
|
|
13
|
+
super(rest);
|
|
14
|
+
}
|
|
15
|
+
async get(sandboxName) {
|
|
16
|
+
/** get a sandbox from TM1 Server
|
|
17
|
+
*
|
|
18
|
+
* :param sandbox_name: str
|
|
19
|
+
* :return: instance of .Sandbox
|
|
20
|
+
*/
|
|
21
|
+
const url = (0, Utils_1.formatUrl)("/Sandboxes('{}')", sandboxName);
|
|
22
|
+
const response = await this.rest.get(url);
|
|
23
|
+
const sandbox = Sandbox_1.Sandbox.fromJSON(JSON.stringify(response.data));
|
|
24
|
+
return sandbox;
|
|
25
|
+
}
|
|
26
|
+
async getAll() {
|
|
27
|
+
/** get all sandboxes from TM1 Server
|
|
28
|
+
*
|
|
29
|
+
* :return: List of .Sandbox instances
|
|
30
|
+
*/
|
|
31
|
+
const url = "/Sandboxes?$select=Name,IncludeInSandboxDimension,IsLoaded,IsActive,IsQueued";
|
|
32
|
+
const response = await this.rest.get(url);
|
|
33
|
+
const sandboxes = response.data.value.map((sandboxAsDict) => Sandbox_1.Sandbox.fromDict(sandboxAsDict));
|
|
34
|
+
return sandboxes;
|
|
35
|
+
}
|
|
36
|
+
async getAllNames() {
|
|
37
|
+
/** get all sandbox names
|
|
38
|
+
*
|
|
39
|
+
* :param kwargs:
|
|
40
|
+
* :return:
|
|
41
|
+
*/
|
|
42
|
+
const url = "/Sandboxes?$select=Name";
|
|
43
|
+
const response = await this.rest.get(url);
|
|
44
|
+
return response.data.value.map((entry) => entry.Name);
|
|
45
|
+
}
|
|
46
|
+
async create(sandbox) {
|
|
47
|
+
/** create a new sandbox in TM1 Server
|
|
48
|
+
*
|
|
49
|
+
* :param sandbox: Sandbox
|
|
50
|
+
* :return: response
|
|
51
|
+
*/
|
|
52
|
+
const url = "/Sandboxes";
|
|
53
|
+
return await this.rest.post(url, sandbox.body);
|
|
54
|
+
}
|
|
55
|
+
async update(sandbox) {
|
|
56
|
+
/** update a sandbox in TM1
|
|
57
|
+
*
|
|
58
|
+
* :param sandbox:
|
|
59
|
+
* :return: response
|
|
60
|
+
*/
|
|
61
|
+
const url = (0, Utils_1.formatUrl)("/Sandboxes('{}')", sandbox.name);
|
|
62
|
+
return await this.rest.patch(url, sandbox.body);
|
|
63
|
+
}
|
|
64
|
+
async delete(sandboxName) {
|
|
65
|
+
/** delete a sandbox in TM1
|
|
66
|
+
*
|
|
67
|
+
* :param sandbox_name:
|
|
68
|
+
* :return: response
|
|
69
|
+
*/
|
|
70
|
+
const url = (0, Utils_1.formatUrl)("/Sandboxes('{}')", sandboxName);
|
|
71
|
+
return await this.rest.delete(url);
|
|
72
|
+
}
|
|
73
|
+
async publish(sandboxName) {
|
|
74
|
+
/** publish existing sandbox to base
|
|
75
|
+
*
|
|
76
|
+
* :param sandbox_name: str
|
|
77
|
+
* :return: response
|
|
78
|
+
*/
|
|
79
|
+
const url = (0, Utils_1.formatUrl)("/Sandboxes('{}')/tm1.Publish", sandboxName);
|
|
80
|
+
return await this.rest.post(url, "{}");
|
|
81
|
+
}
|
|
82
|
+
async reset(sandboxName) {
|
|
83
|
+
/** reset all changes in specified sandbox
|
|
84
|
+
*
|
|
85
|
+
* :param sandbox_name: str
|
|
86
|
+
* :return: response
|
|
87
|
+
*/
|
|
88
|
+
const url = (0, Utils_1.formatUrl)("/Sandboxes('{}')/tm1.DiscardChanges", sandboxName);
|
|
89
|
+
return await this.rest.post(url, "{}");
|
|
90
|
+
}
|
|
91
|
+
async merge(sourceSandboxName, targetSandboxName) {
|
|
92
|
+
/** merge changes from source sandbox into target sandbox
|
|
93
|
+
*
|
|
94
|
+
* :param source_sandbox_name: str
|
|
95
|
+
* :param target_sandbox_name: str
|
|
96
|
+
* :return: response
|
|
97
|
+
*/
|
|
98
|
+
const url = (0, Utils_1.formatUrl)("/Sandboxes('{}')/tm1.Merge", targetSandboxName);
|
|
99
|
+
const body = {
|
|
100
|
+
"Source@odata.bind": `Sandboxes('${sourceSandboxName}')`
|
|
101
|
+
};
|
|
102
|
+
return await this.rest.post(url, JSON.stringify(body));
|
|
103
|
+
}
|
|
104
|
+
async exists(sandboxName) {
|
|
105
|
+
/** check if sandbox exists
|
|
106
|
+
*
|
|
107
|
+
* :param sandbox_name: str
|
|
108
|
+
* :return: boolean
|
|
109
|
+
*/
|
|
110
|
+
try {
|
|
111
|
+
await this.get(sandboxName);
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
if (error instanceof TM1Exception_1.TM1RestException && error.statusCode === 404) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async getChanges(sandboxName) {
|
|
122
|
+
/** get all changes in a sandbox
|
|
123
|
+
*
|
|
124
|
+
* :param sandbox_name: str
|
|
125
|
+
* :return: dict of changes
|
|
126
|
+
*/
|
|
127
|
+
const url = (0, Utils_1.formatUrl)("/Sandboxes('{}')/Changes", sandboxName);
|
|
128
|
+
const response = await this.rest.get(url);
|
|
129
|
+
return response.data;
|
|
130
|
+
}
|
|
131
|
+
async isEmpty(sandboxName) {
|
|
132
|
+
/** check if sandbox is empty (has no changes)
|
|
133
|
+
*
|
|
134
|
+
* :param sandbox_name: str
|
|
135
|
+
* :return: boolean
|
|
136
|
+
*/
|
|
137
|
+
try {
|
|
138
|
+
const changes = await this.getChanges(sandboxName);
|
|
139
|
+
return !changes || !changes.value || changes.value.length === 0;
|
|
140
|
+
}
|
|
141
|
+
catch (_a) {
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async load(sandboxName) {
|
|
146
|
+
/** load sandbox into memory
|
|
147
|
+
*
|
|
148
|
+
* :param sandbox_name: str
|
|
149
|
+
* :return: response
|
|
150
|
+
*/
|
|
151
|
+
const url = (0, Utils_1.formatUrl)("/Sandboxes('{}')/tm1.Load", sandboxName);
|
|
152
|
+
return await this.rest.post(url, "{}");
|
|
153
|
+
}
|
|
154
|
+
async unload(sandboxName) {
|
|
155
|
+
/** unload sandbox from memory
|
|
156
|
+
*
|
|
157
|
+
* :param sandbox_name: str
|
|
158
|
+
* :return: response
|
|
159
|
+
*/
|
|
160
|
+
const url = (0, Utils_1.formatUrl)("/Sandboxes('{}')/tm1.Unload", sandboxName);
|
|
161
|
+
return await this.rest.post(url, "{}");
|
|
162
|
+
}
|
|
163
|
+
async getSandboxDimensionMembers() {
|
|
164
|
+
/** get all members of the }Sandboxes dimension
|
|
165
|
+
*
|
|
166
|
+
* :return: list of sandbox names
|
|
167
|
+
*/
|
|
168
|
+
const url = "/Dimensions('}Sandboxes')/Hierarchies('}Sandboxes')/Elements?$select=Name";
|
|
169
|
+
const response = await this.rest.get(url);
|
|
170
|
+
return response.data.value.map((element) => element.Name);
|
|
171
|
+
}
|
|
172
|
+
async createIfNotExists(sandbox) {
|
|
173
|
+
/** create sandbox if it doesn't exist
|
|
174
|
+
*
|
|
175
|
+
* :param sandbox: Sandbox instance
|
|
176
|
+
* :return: response or null if already exists
|
|
177
|
+
*/
|
|
178
|
+
if (await this.exists(sandbox.name)) {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
return await this.create(sandbox);
|
|
182
|
+
}
|
|
183
|
+
async cloneSandbox(sourceSandboxName, targetSandboxName) {
|
|
184
|
+
/** clone a sandbox
|
|
185
|
+
*
|
|
186
|
+
* :param source_sandbox_name: str
|
|
187
|
+
* :param target_sandbox_name: str
|
|
188
|
+
* :return: response
|
|
189
|
+
*/
|
|
190
|
+
const sourceSandbox = await this.get(sourceSandboxName);
|
|
191
|
+
const targetSandbox = new Sandbox_1.Sandbox(targetSandboxName, sourceSandbox.includeInSandboxDimension);
|
|
192
|
+
await this.create(targetSandbox);
|
|
193
|
+
return await this.merge(sourceSandboxName, targetSandboxName);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
exports.SandboxService = SandboxService;
|
|
197
|
+
//# sourceMappingURL=SandboxService.js.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { AxiosResponse } from 'axios';
|
|
2
|
+
import { RestService } from './RestService';
|
|
3
|
+
import { ObjectService } from './ObjectService';
|
|
4
|
+
import { User } from '../objects/User';
|
|
5
|
+
export declare class SecurityService extends ObjectService {
|
|
6
|
+
/** Service to handle Security stuff
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
constructor(rest: RestService);
|
|
10
|
+
determineActualUserName(userName: string): Promise<string>;
|
|
11
|
+
determineActualGroupName(groupName: string): Promise<string>;
|
|
12
|
+
createUser(user: User): Promise<AxiosResponse>;
|
|
13
|
+
createGroup(groupName: string): Promise<AxiosResponse>;
|
|
14
|
+
getUser(userName: string): Promise<User>;
|
|
15
|
+
getCurrentUser(): Promise<User>;
|
|
16
|
+
updateUser(user: User): Promise<AxiosResponse>;
|
|
17
|
+
updateUserPassword(userName: string, password: string): Promise<AxiosResponse>;
|
|
18
|
+
deleteUser(userName: string): Promise<AxiosResponse>;
|
|
19
|
+
deleteGroup(groupName: string): Promise<AxiosResponse>;
|
|
20
|
+
getUserNames(): Promise<string[]>;
|
|
21
|
+
getGroupNames(): Promise<string[]>;
|
|
22
|
+
getAllUsers(): Promise<User[]>;
|
|
23
|
+
getGroups(userName?: string): Promise<string[]>;
|
|
24
|
+
getUsersFromGroup(groupName: string): Promise<string[]>;
|
|
25
|
+
addUserToGroups(userName: string, groupNames: string[]): Promise<AxiosResponse[]>;
|
|
26
|
+
addUserToGroup(groupName: string, userName: string): Promise<AxiosResponse>;
|
|
27
|
+
removeUserFromGroup(groupName: string, userName: string): Promise<AxiosResponse>;
|
|
28
|
+
getSecurityRefreshTime(): Promise<number>;
|
|
29
|
+
userExists(userName: string): Promise<boolean>;
|
|
30
|
+
groupExists(groupName: string): Promise<boolean>;
|
|
31
|
+
private determineActualObjectName;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=SecurityService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecurityService.d.ts","sourceRoot":"","sources":["../../src/services/SecurityService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAGvC,qBAAa,eAAgB,SAAQ,aAAa;IAC9C;;OAEG;gBAES,IAAI,EAAE,WAAW;IAIhB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1D,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK5D,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IAW9C,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAUtD,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAW/B,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IAmB9C,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAO9E,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAYpD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAWtD,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAUjC,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAUlC,WAAW,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAU9B,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAgB/C,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAavD,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAgBjF,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAkB3E,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAehF,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAUzC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc9C,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAgB/C,yBAAyB;CAgB1C"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SecurityService = void 0;
|
|
4
|
+
const ObjectService_1 = require("./ObjectService");
|
|
5
|
+
const User_1 = require("../objects/User");
|
|
6
|
+
const Utils_1 = require("../utils/Utils");
|
|
7
|
+
class SecurityService extends ObjectService_1.ObjectService {
|
|
8
|
+
/** Service to handle Security stuff
|
|
9
|
+
*
|
|
10
|
+
*/
|
|
11
|
+
constructor(rest) {
|
|
12
|
+
super(rest);
|
|
13
|
+
}
|
|
14
|
+
async determineActualUserName(userName) {
|
|
15
|
+
return await this.determineActualObjectName("Users", userName);
|
|
16
|
+
}
|
|
17
|
+
async determineActualGroupName(groupName) {
|
|
18
|
+
return await this.determineActualObjectName("Groups", groupName);
|
|
19
|
+
}
|
|
20
|
+
async createUser(user) {
|
|
21
|
+
/** Create a user on TM1 Server
|
|
22
|
+
*
|
|
23
|
+
* :param user: instance of .User
|
|
24
|
+
* :return: response
|
|
25
|
+
*/
|
|
26
|
+
const url = '/Users';
|
|
27
|
+
return await this.rest.post(url, user.body);
|
|
28
|
+
}
|
|
29
|
+
async createGroup(groupName) {
|
|
30
|
+
/** Create a Security group in the TM1 Server
|
|
31
|
+
*
|
|
32
|
+
* :param group_name:
|
|
33
|
+
* :return:
|
|
34
|
+
*/
|
|
35
|
+
const url = '/Groups';
|
|
36
|
+
return await this.rest.post(url, JSON.stringify({ Name: groupName }));
|
|
37
|
+
}
|
|
38
|
+
async getUser(userName) {
|
|
39
|
+
/** Get user from TM1 Server
|
|
40
|
+
*
|
|
41
|
+
* :param user_name:
|
|
42
|
+
* :return: instance of .User
|
|
43
|
+
*/
|
|
44
|
+
const actualUserName = await this.determineActualUserName(userName);
|
|
45
|
+
const url = (0, Utils_1.formatUrl)("/Users('{}')?$select=Name,FriendlyName,Password,Type,Enabled&$expand=Groups", actualUserName);
|
|
46
|
+
const response = await this.rest.get(url);
|
|
47
|
+
return User_1.User.fromDict(response.data);
|
|
48
|
+
}
|
|
49
|
+
async getCurrentUser() {
|
|
50
|
+
/** Get user and group assignments of this session
|
|
51
|
+
*
|
|
52
|
+
* :return: instance of .User
|
|
53
|
+
*/
|
|
54
|
+
const url = "/ActiveUser?$select=Name,FriendlyName,Password,Type,Enabled&$expand=Groups";
|
|
55
|
+
const response = await this.rest.get(url);
|
|
56
|
+
return User_1.User.fromDict(response.data);
|
|
57
|
+
}
|
|
58
|
+
async updateUser(user) {
|
|
59
|
+
/** Update user on TM1 Server
|
|
60
|
+
*
|
|
61
|
+
* :param user: instance of .User
|
|
62
|
+
* :return: response
|
|
63
|
+
*/
|
|
64
|
+
user.name = await this.determineActualUserName(user.name);
|
|
65
|
+
const currentGroups = await this.getGroups(user.name);
|
|
66
|
+
for (const currentGroup of currentGroups) {
|
|
67
|
+
if (!user.groups.includes(currentGroup)) {
|
|
68
|
+
await this.removeUserFromGroup(currentGroup, user.name);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const url = (0, Utils_1.formatUrl)("/Users('{}')", user.name);
|
|
72
|
+
return await this.rest.patch(url, user.body);
|
|
73
|
+
}
|
|
74
|
+
async updateUserPassword(userName, password) {
|
|
75
|
+
const url = (0, Utils_1.formatUrl)("/Users('{}')", userName);
|
|
76
|
+
const body = { Password: password };
|
|
77
|
+
return await this.rest.patch(url, JSON.stringify(body));
|
|
78
|
+
}
|
|
79
|
+
async deleteUser(userName) {
|
|
80
|
+
/** Delete user on TM1 Server
|
|
81
|
+
*
|
|
82
|
+
* :param user_name:
|
|
83
|
+
* :return: response
|
|
84
|
+
*/
|
|
85
|
+
const actualUserName = await this.determineActualUserName(userName);
|
|
86
|
+
const url = (0, Utils_1.formatUrl)("/Users('{}')", actualUserName);
|
|
87
|
+
return await this.rest.delete(url);
|
|
88
|
+
}
|
|
89
|
+
async deleteGroup(groupName) {
|
|
90
|
+
/** Delete a Security group in the TM1 Server
|
|
91
|
+
*
|
|
92
|
+
* :param group_name:
|
|
93
|
+
* :return: response
|
|
94
|
+
*/
|
|
95
|
+
const actualGroupName = await this.determineActualGroupName(groupName);
|
|
96
|
+
const url = (0, Utils_1.formatUrl)("/Groups('{}')", actualGroupName);
|
|
97
|
+
return await this.rest.delete(url);
|
|
98
|
+
}
|
|
99
|
+
async getUserNames() {
|
|
100
|
+
/** Get all user names
|
|
101
|
+
*
|
|
102
|
+
* :return: List of user names
|
|
103
|
+
*/
|
|
104
|
+
const url = "/Users?$select=Name";
|
|
105
|
+
const response = await this.rest.get(url);
|
|
106
|
+
return response.data.value.map((user) => user.Name);
|
|
107
|
+
}
|
|
108
|
+
async getGroupNames() {
|
|
109
|
+
/** Get all group names
|
|
110
|
+
*
|
|
111
|
+
* :return: List of group names
|
|
112
|
+
*/
|
|
113
|
+
const url = "/Groups?$select=Name";
|
|
114
|
+
const response = await this.rest.get(url);
|
|
115
|
+
return response.data.value.map((group) => group.Name);
|
|
116
|
+
}
|
|
117
|
+
async getAllUsers() {
|
|
118
|
+
/** Get all users
|
|
119
|
+
*
|
|
120
|
+
* :return: List of User instances
|
|
121
|
+
*/
|
|
122
|
+
const url = "/Users?$select=Name,FriendlyName,Password,Type,Enabled&$expand=Groups";
|
|
123
|
+
const response = await this.rest.get(url);
|
|
124
|
+
return response.data.value.map((userDict) => User_1.User.fromDict(userDict));
|
|
125
|
+
}
|
|
126
|
+
async getGroups(userName) {
|
|
127
|
+
/** Get groups for a user or all groups
|
|
128
|
+
*
|
|
129
|
+
* :param user_name: Optional user name
|
|
130
|
+
* :return: List of group names
|
|
131
|
+
*/
|
|
132
|
+
if (userName) {
|
|
133
|
+
const actualUserName = await this.determineActualUserName(userName);
|
|
134
|
+
const url = (0, Utils_1.formatUrl)("/Users('{}')/Groups?$select=Name", actualUserName);
|
|
135
|
+
const response = await this.rest.get(url);
|
|
136
|
+
return response.data.value.map((group) => group.Name);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
return await this.getGroupNames();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async getUsersFromGroup(groupName) {
|
|
143
|
+
/** Get users that belong to a group
|
|
144
|
+
*
|
|
145
|
+
* :param group_name: name of the group
|
|
146
|
+
* :return: List of user names
|
|
147
|
+
*/
|
|
148
|
+
const actualGroupName = await this.determineActualGroupName(groupName);
|
|
149
|
+
const url = (0, Utils_1.formatUrl)("/Groups('{}')/Users?$select=Name", actualGroupName);
|
|
150
|
+
const response = await this.rest.get(url);
|
|
151
|
+
return response.data.value.map((user) => user.Name);
|
|
152
|
+
}
|
|
153
|
+
async addUserToGroups(userName, groupNames) {
|
|
154
|
+
/** Add user to multiple groups
|
|
155
|
+
*
|
|
156
|
+
* :param user_name: name of the user
|
|
157
|
+
* :param group_names: list of group names
|
|
158
|
+
* :return: list of responses
|
|
159
|
+
*/
|
|
160
|
+
const responses = [];
|
|
161
|
+
for (const groupName of groupNames) {
|
|
162
|
+
const response = await this.addUserToGroup(groupName, userName);
|
|
163
|
+
responses.push(response);
|
|
164
|
+
}
|
|
165
|
+
return responses;
|
|
166
|
+
}
|
|
167
|
+
async addUserToGroup(groupName, userName) {
|
|
168
|
+
/** Add user to a group
|
|
169
|
+
*
|
|
170
|
+
* :param group_name: name of the group
|
|
171
|
+
* :param user_name: name of the user
|
|
172
|
+
* :return: response
|
|
173
|
+
*/
|
|
174
|
+
const actualGroupName = await this.determineActualGroupName(groupName);
|
|
175
|
+
const actualUserName = await this.determineActualUserName(userName);
|
|
176
|
+
const url = (0, Utils_1.formatUrl)("/Groups('{}')/Users", actualGroupName);
|
|
177
|
+
const body = {
|
|
178
|
+
'@odata.id': `Users('${actualUserName}')`
|
|
179
|
+
};
|
|
180
|
+
return await this.rest.post(url, JSON.stringify(body));
|
|
181
|
+
}
|
|
182
|
+
async removeUserFromGroup(groupName, userName) {
|
|
183
|
+
/** Remove user from a group
|
|
184
|
+
*
|
|
185
|
+
* :param group_name: name of the group
|
|
186
|
+
* :param user_name: name of the user
|
|
187
|
+
* :return: response
|
|
188
|
+
*/
|
|
189
|
+
const actualGroupName = await this.determineActualGroupName(groupName);
|
|
190
|
+
const actualUserName = await this.determineActualUserName(userName);
|
|
191
|
+
const url = (0, Utils_1.formatUrl)("/Groups('{}')/Users('{}')", actualGroupName, actualUserName);
|
|
192
|
+
return await this.rest.delete(url);
|
|
193
|
+
}
|
|
194
|
+
async getSecurityRefreshTime() {
|
|
195
|
+
/** Get security refresh time in seconds
|
|
196
|
+
*
|
|
197
|
+
* :return: security refresh time
|
|
198
|
+
*/
|
|
199
|
+
const url = "/StaticConfiguration/ServerSettings('SecurityRefreshTime')";
|
|
200
|
+
const response = await this.rest.get(url);
|
|
201
|
+
return parseInt(response.data.Value);
|
|
202
|
+
}
|
|
203
|
+
async userExists(userName) {
|
|
204
|
+
/** Check if user exists
|
|
205
|
+
*
|
|
206
|
+
* :param user_name: name of the user
|
|
207
|
+
* :return: True if user exists
|
|
208
|
+
*/
|
|
209
|
+
try {
|
|
210
|
+
await this.getUser(userName);
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
catch (_a) {
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
async groupExists(groupName) {
|
|
218
|
+
/** Check if group exists
|
|
219
|
+
*
|
|
220
|
+
* :param group_name: name of the group
|
|
221
|
+
* :return: True if group exists
|
|
222
|
+
*/
|
|
223
|
+
try {
|
|
224
|
+
const actualGroupName = await this.determineActualGroupName(groupName);
|
|
225
|
+
const url = (0, Utils_1.formatUrl)("/Groups('{}')", actualGroupName);
|
|
226
|
+
await this.rest.get(url);
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
229
|
+
catch (_a) {
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
async determineActualObjectName(objectClass, objectName) {
|
|
234
|
+
/** Determine the actual object name (case-sensitive) from TM1 Server
|
|
235
|
+
*
|
|
236
|
+
* :param object_class: 'Users' or 'Groups'
|
|
237
|
+
* :param object_name: name to look for
|
|
238
|
+
* :return: actual object name
|
|
239
|
+
*/
|
|
240
|
+
const url = `/${objectClass}?$select=Name&$filter=tolower(Name) eq '${objectName.toLowerCase()}'`;
|
|
241
|
+
const response = await this.rest.get(url);
|
|
242
|
+
if (response.data.value && response.data.value.length > 0) {
|
|
243
|
+
return response.data.value[0].Name;
|
|
244
|
+
}
|
|
245
|
+
return objectName; // fallback to original name
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
exports.SecurityService = SecurityService;
|
|
249
|
+
//# sourceMappingURL=SecurityService.js.map
|