@nsshunt/stsdevtools 1.0.97 → 1.0.101

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/dist/index.cjs CHANGED
@@ -176,7 +176,7 @@ var TestHelper = class {
176
176
  DEBUG: "proc*",
177
177
  HTTPS_SERVER_KEY_PATH: "/var/lib/sts/stsglobalresources/keys-tmp/server.key",
178
178
  HTTPS_SERVER_CERT_PATH: "/var/lib/sts/stsglobalresources/keys-tmp/server.cert",
179
- AS_ENDPOINT: "https://stscore.stsmda.org"
179
+ AS_ENDPOINT: "https://stsauthrunnerinit"
180
180
  }).withCommand([
181
181
  "node",
182
182
  "dist/app",
@@ -207,7 +207,7 @@ var TestHelper = class {
207
207
  DEBUG: "proc*",
208
208
  HTTPS_SERVER_KEY_PATH: "/var/lib/sts/stsglobalresources/keys-tmp/server.key",
209
209
  HTTPS_SERVER_CERT_PATH: "/var/lib/sts/stsglobalresources/keys-tmp/server.cert",
210
- AS_ENDPOINT: "https://stscore.stsmda.org",
210
+ AS_ENDPOINT: "https://stsauthrunner",
211
211
  IM_REDIS_MESSAGE_PROCESSOR_URL: "redis://redisstackserver:6379"
212
212
  }).withNetwork(this.#network).withNetworkAliases("stsauthrunner").withWaitStrategy(testcontainers.Wait.forHttp("/stsauth/v1.0/latency", 3002).usingTls().allowInsecure()).start();
213
213
  const httpAuthPort = this.#stsAuthContainer.getMappedPort(3002);
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["#authEndpoint","#network","#authPort","#authHost","#rest01Port","#rest01Host","#rest01Endpoint","#fhirPort","#fhirHost","#fhirEndpoint","#ioRedisMessageProcessorUrl","#databaseContainer","#ioRedisContainer","#stsAuthContainer","#stsFhirContainer","#stsRest01Container","#regexURLSafeStringComponent","#regexSTSBase64","#regexJWT"],"sources":["../src/testHelpers.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\n// stsdevtools\nimport { expect } from 'vitest';\n\nimport chalk from 'chalk'\n\nimport * as tough from 'tough-cookie'\n\nimport crypto from 'node:crypto'\n\nimport axios from 'axios'\n\nimport { GenericContainer, Network, Wait } from \"testcontainers\"\n\nimport { goptions, $ResetOptions } from '@nsshunt/stsconfig'\n\nimport { Sleep, defaultLogger, STSAxiosConfig, createAgentManager } from '@nsshunt/stsutils'\n\nimport http from 'node:http'\nimport https from 'node:https'\n\nexport class TestHelper {\n //#regexBase64URL = /^[A-Za-z0-9_-]+$/ // Base64URL - https://base64.guru/standards/base64url\n #regexURLSafeStringComponent = /[-a-zA-Z0-9@:%._+~#=]{1,256}/ // URL safe string component\n //#regexBase64 = /(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?/ // Base64 - https://stackoverflow.com/questions/475074/regex-to-parse-or-validate-base64-data\n #regexSTSBase64 = /SES_(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?/ // Base64\n #regexJWT = /[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+/ // JWT (Base64URL.Base64URL.Base64URL)\n #network: any;\n\n #databaseContainer: any;\n #stsAuthContainer: any;\n #stsRest01Container: any;\n #ioRedisContainer: any;\n #stsFhirContainer: any;\n\n #ioRedisMessageProcessorUrl: string = '';\n\n #authEndpoint = '';\n #authPort = '';\n #authHost = '';\n\n #rest01Host = '';\n #rest01Port = '';\n #rest01Endpoint = '';\n\n #fhirHost = '';\n #fhirPort = '';\n #fhirEndpoint = '';\n\n constructor() {\n this.#authEndpoint = 'https://localhost:3002'; //@@\n }\n\n LogDebugMessage(message: any) {\n defaultLogger.debug(message);\n }\n\n StartNetwork = async () => {\n this.#network = await new Network().start();\n }\n\n StopNetwork = async () => {\n if (this.#network) {\n await this.#network.stop();\n }\n }\n\n get network() {\n return this.#network;\n }\n\n get authPort() {\n return this.#authPort;\n }\n\n get authHost() {\n return this.#authHost;\n }\n\n get authEndpoint() {\n return this.#authEndpoint;\n }\n\n get rest01Port() {\n return this.#rest01Port;\n }\n\n get rest01Host() {\n return this.#rest01Host;\n }\n\n get rest01Endpoint() {\n return this.#rest01Endpoint;\n }\n\n get fhirPort() {\n return this.#fhirPort;\n }\n\n get fhirHost() {\n return this.#fhirHost;\n }\n\n get fhirEndpoint() {\n return this.#fhirEndpoint;\n }\n\n get ioRedisMessageProcessorUrl() {\n return this.#ioRedisMessageProcessorUrl;\n }\n\n CreateRandomString = () => {\n const charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_~.'; // /[0-9A-Za-z\\-_~.]/\n let random = '';\n const randomValues: number[] = Array.from(crypto.getRandomValues(new Uint8Array(43)));\n randomValues.forEach(v => (random += charset[v % charset.length]));\n return random;\n }\n\n Login = async (username: string, password: string) => {\n const client_id = process.env.CLIENT_ID as string;\n const nonce = crypto.randomBytes(43).toString('base64'); //CreateRandomString();\n const response_type = 'code';\n const redirect_uri = process.env.REDIRECT_URI as string;\n const response_mode = 'query';\n const scope = process.env.SCOPE as string;\n const state = crypto.randomBytes(43).toString('base64'); // CreateRandomString();\n const code_verifier = this.CreateRandomString();\n const code_challenge = crypto.createHash('sha256').update(code_verifier).digest('base64');\n const code_challenge_method = 'S256';\n\n const authoriseOptions: any = {\n email: username,\n password,\n client_id,\n nonce,\n response_type,\n redirect_uri,\n response_mode,\n scope,\n state,\n code_challenge,\n code_challenge_method\n }\n\n const url = `${this.#authEndpoint}${goptions.asapiroot}/login`;\n\n console.log(`Login ---------------------------------------------------------------------------`)\n console.log(`url: [${url}]`);\n console.log(`authoriseOptions: [${JSON.stringify(authoriseOptions)}]`);\n\n const agentManager = createAgentManager({\n httpAgentFactory(options) {\n return new http.Agent(options);\n },\n httpsAgentFactory(options) {\n return new https.Agent(options);\n }\n });\n\n const retVal = await axios(new STSAxiosConfig(url, 'post')\n .withDefaultHeaders()\n .withData(authoriseOptions)\n .withAgentManager(agentManager).config);\n\n //const cookieString = retVal.headers['set-cookie'];\n\n /*\n const api = request(this.#endpoint);\n const retVal: any = await (api as any)\n .post(`${goptions.asapiroot}/login`)\n .send(authoriseOptions)\n //.expect('set-cookie', /consent_cookie=.*; Max-Age=86; Path=\\/; Expires=.*; HttpOnly; Secure; SameSite=Strict/);\n\n const cookieString = retVal.header['set-cookie'];\n\n if (cookieString) {\n retVal.cookie = new Cookie(cookieString[0]);\n }\n */\n\n return retVal;\n }\n\n /*\n GetAuthServerAPITokenFromServer = async (): Promise<string> => {\n return await this.#authUtilsNode.GetAPITokenFromAuthServer(STSClientID.STSTestingService, \n \"eN9u0mHZLGWZrdnE1zit2vL6xwUFW466sTZcbkXDml5KWxlvKaZ1uiOZmA==\", \n goptions.asapiidentifier, this.#authEndpoint)\n }\n */\n\n StartDatabase = async () => {\n this.#databaseContainer = await new GenericContainer(\"postgres\")\n .withExposedPorts(5432)\n .withEnvironment({\n POSTGRES_PASSWORD: \"postgres\",\n //UV_THREADPOOL_SIZE: \"64\"\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"database\")\n .start();\n\n const httpPort = this.#databaseContainer.getMappedPort(5432);\n const host = this.#databaseContainer.getHost();\n const networkIpAddress = this.#databaseContainer.getIpAddress(this.#network.getName());\n \n process.env.DB_HOST = `${host}:${httpPort}`;\n\n $ResetOptions();\n\n this.LogDebugMessage(chalk.green(`httpPort: [${httpPort}]`));\n this.LogDebugMessage(chalk.green(`host: [${host}]`));\n this.LogDebugMessage(chalk.green(`networkIpAddress: [${networkIpAddress}]`));\n this.LogDebugMessage(chalk.green(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.green(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n\n StopDatabase = async () => {\n if (this.#databaseContainer) {\n await this.#databaseContainer.stop();\n\n this.LogDebugMessage(chalk.yellow(`Used the following parameters for the database during testing:`));\n this.LogDebugMessage(chalk.yellow(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.yellow(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n }\n\n // Note: .withCopyFilesToContainer and .withCopyContentToContainer have a defect in that Jest will not close. A file handle/stream is left open\n // within the underlying code.\n InitializeDatabase = async () => {\n const stsAuthContainerInit = await new GenericContainer(\"serza/stsauth:latest\")\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", // \"192.168.14.101\",\n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\"\n })\n .withCommand([\"node\", \"dist/app\", \"create\"])\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunnerinit\")\n .withWaitStrategy(Wait.forLogMessage(`User registered: {\"status\":200,\"detail\":{\"id\":\"USR_STSGlobalAdminUser@stsmda.com\",\"name\":\"STSGlobalAdminUser@stsmda.com\",\"email\":\"STSGlobalAdminUser@stsmda.com\",\"roles\":[]}}`))\n .start();\n\n await Sleep(500);\n\n await stsAuthContainerInit.stop();\n }\n\n StartRedis = async () => {\n this.#ioRedisContainer = await new GenericContainer(\"redis/redis-stack-server\")\n .withEnvironment({\n REDIS_ARGS: \"--save \\\"\\\" --appendonly no\",\n })\n .withExposedPorts(6379)\n .withNetwork(this.#network)\n .withNetworkAliases(\"redisstackserver\")\n //.withWaitStrategy(Wait.forLogMessage(`Ready to accept connections tcp`))\n .start();\n\n this.#ioRedisMessageProcessorUrl = `redis://${this.#ioRedisContainer.getHost()}:${this.#ioRedisContainer.getMappedPort(6379)}`; \n\n await Sleep(2000);\n //expect(goptions.imRedisMessageProcessorUrl).toEqual('redis://localhost:6379');\n // IM_REDIS_MESSAGE_PROCESSOR_URL\n\n this.LogDebugMessage(chalk.green(`redis/redis-stack-server Started. Server Details: ioRedisMessageProcessorUrl: [${this.#ioRedisMessageProcessorUrl}]`));\n }\n\n StopRedis = async () => {\n if (this.#ioRedisContainer) {\n await this.#ioRedisContainer.stop();\n await Sleep(200);\n }\n }\n\n StartAuthService = async () => {\n this.#stsAuthContainer = await new GenericContainer(\"serza/stsauth:latest\")\n .withExposedPorts(3002)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\",\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunner\")\n .withWaitStrategy(Wait.forHttp(\"/stsauth/v1.0/latency\", 3002).usingTls().allowInsecure())\n .start();\n\n const httpAuthPort = this.#stsAuthContainer.getMappedPort(3002);\n\n await Sleep(200);\n this.#authHost = 'https://localhost'\n this.#authPort = httpAuthPort;\n this.#authEndpoint = `${this.#authHost}:${this.#authPort}`;\n this.LogDebugMessage(chalk.green(`STSAuth Started. Server Details: Host: [${this.#authHost}], Port: [${this.#authPort}]`));\n }\n\n StartFhirService = async () => {\n this.#stsFhirContainer = await new GenericContainer(\"serza/stsfhir:latest\")\n .withExposedPorts(3005)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: 'https://stsauthrunner',\n AS_HOST_PORT: \"3002\",\n AS_PORT: \"3002\",\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379',\n SOCKET_IO_REDIS_ADAPTOR_URL: 'redis://redisstackserver:6379',\n STSFHIR_PORT: \"3005\",\n STSFHIR_HOST_PORT: \"3005\",\n STSFHIR_ENDPOINT: \"https://stsfhirserver\", // \"https://stscore.stsmda.org\",\n UV_THREADPOOL_SIZE: \"64\",\n FORCE_COLOR: \"3\",\n //node dist/app usedb postgresResources\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsfhirserver\")\n //.withWaitStrategy(Wait.forHttp(\"/stsfhir/r5/latency\", 3005).usingTls().allowInsecure())\n .start();\n\n this.#stsFhirContainer.logs().then((stream: any) => {\n stream\n .on('data', (line: any) => process.stdout.write(line.toString()))\n .on('err', (line: any) => process.stderr.write(line.toString()))\n .on('end', () => console.log('Stream ended.'));\n });\n\n const httpFhirPort = this.#stsFhirContainer.getMappedPort(3005);\n\n await Sleep(200);\n this.#fhirHost = 'https://localhost'\n this.#fhirPort = httpFhirPort;\n this.#fhirEndpoint = `${this.#fhirHost}:${this.#fhirPort}`;\n this.LogDebugMessage(chalk.green(`STSFhir Started. Server Details: Host: [${this.#fhirHost}], Port: [${this.#fhirPort}]`));\n }\n\n StopAuthService = async () => {\n if (this.#stsAuthContainer) {\n await this.#stsAuthContainer.stop();\n await Sleep(200);\n }\n }\n\n StopRest01Service = async () => {\n if (this.#stsRest01Container) {\n await this.#stsRest01Container.stop();\n await Sleep(200);\n }\n }\n\n StopFhirService = async () => {\n if (this.#stsFhirContainer) {\n await this.#stsFhirContainer.stop();\n await Sleep(200);\n }\n }\n\n TestLoginAndVerify = async () => {\n expect.assertions(4);\n\n console.log(`TestLoginAndVerify:1`);\n\n const retVal = await this.Login('user01@stsmda.com.au', 'user01password');\n expect(retVal.status).toEqual(200);\n\n console.log(`TestLoginAndVerify:2`);\n\n this.LogDebugMessage(chalk.red(`${JSON.stringify(retVal.data)}`));\n this.LogDebugMessage(chalk.magenta(`${JSON.stringify(retVal.headers)}`));\n this.LogDebugMessage(chalk.yellow(`${JSON.stringify(retVal.headers['set-cookie'])}`));\n\n const cookies = retVal.headers['set-cookie'] as string[];\n this.LogDebugMessage(chalk.yellow(`${cookies[0]}`));\n this.LogDebugMessage(chalk.green(`${JSON.stringify(tough.Cookie.parse(cookies[0]))}`));\n\n console.log(`TestLoginAndVerify:3`);\n\n const cookie = tough.Cookie.parse(cookies[0]) as tough.Cookie;\n\n console.log(`TestLoginAndVerify:4`);\n\n const desiredCookieResultAxios = {\n key: 'consent_cookie',\n value: expect.stringMatching(this.#regexURLSafeStringComponent),\n path: '/',\n secure: true,\n httpOnly: true,\n sameSite: 'strict',\n }\n\n const cookieResult = JSON.parse(JSON.stringify(cookie));\n expect(cookieResult).toMatchObject(desiredCookieResultAxios);\n\n console.log(`TestLoginAndVerify:5`);\n\n const cookieExpireDate = new Date(cookie.expires as any);\n expect(cookieExpireDate.getTime()).toBeGreaterThan(new Date().getTime());\n\n const consentRequired = (process.env.CONSENT_REQUIRED as string).split(' ').sort();\n retVal.data.detail.consentRequired = retVal.data.detail.consentRequired.sort();\n\n console.log(`TestLoginAndVerify:6`);\n\n const desiredResult = {\n sessionId: expect.stringMatching(this.#regexSTSBase64),\n id_token: expect.stringMatching(this.#regexJWT),\n consentRequired\n }\n\n console.log(`TestLoginAndVerify:7`);\n\n expect(retVal.data.detail).toMatchObject(desiredResult);\n\n console.log(`TestLoginAndVerify:9`);\n }\n\n StartRest01Service = async () => {\n this.#stsRest01Container = await new GenericContainer(\"serza/stsrest01:latest\")\n .withExposedPorts(3003)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n //AS_ENDPOINT: \"https://stscore.stsmda.org\",\n AS_ENDPOINT: 'https://stsauthrunner', // this.authHost,\n //AS_ENDPOINT: 'https://localhost', // this.authHost,\n AS_HOST_PORT: '3002',\n AS_PORT: '3002',\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n //AS_HOST_PORT: this.authPort,\n //AS_PORT: this.authPort,\n\n //REST01_PORT: '3003',\n //REST01_HOST_PORT: '3003',\n //REST01_ENDPOINT: 'https://localhost' // 'https://stscore.stsmda.org'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"rest01\")\n .withWaitStrategy(Wait.forHttp(\"/stsrest01/v1/latency\", 3003).usingTls().allowInsecure())\n .start();\n\n const httpRest01Port = this.#stsRest01Container.getMappedPort(3003);\n\n await Sleep(200);\n\n this.#rest01Host = 'https://localhost'\n this.#rest01Port = httpRest01Port;\n this.#rest01Endpoint = `${this.#rest01Host}:${this.#rest01Port}`;\n\n this.LogDebugMessage(chalk.green(`STSRest01 Started. Server Details: Host: [${this.rest01Host}], Port: [${this.rest01Port}]`));\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["#authEndpoint","#network","#authPort","#authHost","#rest01Port","#rest01Host","#rest01Endpoint","#fhirPort","#fhirHost","#fhirEndpoint","#ioRedisMessageProcessorUrl","#databaseContainer","#ioRedisContainer","#stsAuthContainer","#stsFhirContainer","#stsRest01Container","#regexURLSafeStringComponent","#regexSTSBase64","#regexJWT"],"sources":["../src/testHelpers.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\n// stsdevtools\nimport { expect } from 'vitest';\n\nimport chalk from 'chalk'\n\nimport * as tough from 'tough-cookie'\n\nimport crypto from 'node:crypto'\n\nimport axios from 'axios'\n\nimport { GenericContainer, Network, Wait } from \"testcontainers\"\n\nimport { goptions, $ResetOptions } from '@nsshunt/stsconfig'\n\nimport { Sleep, defaultLogger, STSAxiosConfig, createAgentManager } from '@nsshunt/stsutils'\n\nimport http from 'node:http'\nimport https from 'node:https'\n\nexport class TestHelper {\n //#regexBase64URL = /^[A-Za-z0-9_-]+$/ // Base64URL - https://base64.guru/standards/base64url\n #regexURLSafeStringComponent = /[-a-zA-Z0-9@:%._+~#=]{1,256}/ // URL safe string component\n //#regexBase64 = /(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?/ // Base64 - https://stackoverflow.com/questions/475074/regex-to-parse-or-validate-base64-data\n #regexSTSBase64 = /SES_(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?/ // Base64\n #regexJWT = /[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+/ // JWT (Base64URL.Base64URL.Base64URL)\n #network: any;\n\n #databaseContainer: any;\n #stsAuthContainer: any;\n #stsRest01Container: any;\n #ioRedisContainer: any;\n #stsFhirContainer: any;\n\n #ioRedisMessageProcessorUrl: string = '';\n\n #authEndpoint = '';\n #authPort = '';\n #authHost = '';\n\n #rest01Host = '';\n #rest01Port = '';\n #rest01Endpoint = '';\n\n #fhirHost = '';\n #fhirPort = '';\n #fhirEndpoint = '';\n\n constructor() {\n this.#authEndpoint = 'https://localhost:3002'; //@@\n }\n\n LogDebugMessage(message: any) {\n defaultLogger.debug(message);\n }\n\n StartNetwork = async () => {\n this.#network = await new Network().start();\n }\n\n StopNetwork = async () => {\n if (this.#network) {\n await this.#network.stop();\n }\n }\n\n get network() {\n return this.#network;\n }\n\n get authPort() {\n return this.#authPort;\n }\n\n get authHost() {\n return this.#authHost;\n }\n\n get authEndpoint() {\n return this.#authEndpoint;\n }\n\n get rest01Port() {\n return this.#rest01Port;\n }\n\n get rest01Host() {\n return this.#rest01Host;\n }\n\n get rest01Endpoint() {\n return this.#rest01Endpoint;\n }\n\n get fhirPort() {\n return this.#fhirPort;\n }\n\n get fhirHost() {\n return this.#fhirHost;\n }\n\n get fhirEndpoint() {\n return this.#fhirEndpoint;\n }\n\n get ioRedisMessageProcessorUrl() {\n return this.#ioRedisMessageProcessorUrl;\n }\n\n CreateRandomString = () => {\n const charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_~.'; // /[0-9A-Za-z\\-_~.]/\n let random = '';\n const randomValues: number[] = Array.from(crypto.getRandomValues(new Uint8Array(43)));\n randomValues.forEach(v => (random += charset[v % charset.length]));\n return random;\n }\n\n Login = async (username: string, password: string) => {\n const client_id = process.env.CLIENT_ID as string;\n const nonce = crypto.randomBytes(43).toString('base64'); //CreateRandomString();\n const response_type = 'code';\n const redirect_uri = process.env.REDIRECT_URI as string;\n const response_mode = 'query';\n const scope = process.env.SCOPE as string;\n const state = crypto.randomBytes(43).toString('base64'); // CreateRandomString();\n const code_verifier = this.CreateRandomString();\n const code_challenge = crypto.createHash('sha256').update(code_verifier).digest('base64');\n const code_challenge_method = 'S256';\n\n const authoriseOptions: any = {\n email: username,\n password,\n client_id,\n nonce,\n response_type,\n redirect_uri,\n response_mode,\n scope,\n state,\n code_challenge,\n code_challenge_method\n }\n\n const url = `${this.#authEndpoint}${goptions.asapiroot}/login`;\n\n console.log(`Login ---------------------------------------------------------------------------`)\n console.log(`url: [${url}]`);\n console.log(`authoriseOptions: [${JSON.stringify(authoriseOptions)}]`);\n\n const agentManager = createAgentManager({\n httpAgentFactory(options) {\n return new http.Agent(options);\n },\n httpsAgentFactory(options) {\n return new https.Agent(options);\n }\n });\n\n const retVal = await axios(new STSAxiosConfig(url, 'post')\n .withDefaultHeaders()\n .withData(authoriseOptions)\n .withAgentManager(agentManager).config);\n\n //const cookieString = retVal.headers['set-cookie'];\n\n /*\n const api = request(this.#endpoint);\n const retVal: any = await (api as any)\n .post(`${goptions.asapiroot}/login`)\n .send(authoriseOptions)\n //.expect('set-cookie', /consent_cookie=.*; Max-Age=86; Path=\\/; Expires=.*; HttpOnly; Secure; SameSite=Strict/);\n\n const cookieString = retVal.header['set-cookie'];\n\n if (cookieString) {\n retVal.cookie = new Cookie(cookieString[0]);\n }\n */\n\n return retVal;\n }\n\n /*\n GetAuthServerAPITokenFromServer = async (): Promise<string> => {\n return await this.#authUtilsNode.GetAPITokenFromAuthServer(STSClientID.STSTestingService, \n \"eN9u0mHZLGWZrdnE1zit2vL6xwUFW466sTZcbkXDml5KWxlvKaZ1uiOZmA==\", \n goptions.asapiidentifier, this.#authEndpoint)\n }\n */\n\n StartDatabase = async () => {\n this.#databaseContainer = await new GenericContainer(\"postgres\")\n .withExposedPorts(5432)\n .withEnvironment({\n POSTGRES_PASSWORD: \"postgres\",\n //UV_THREADPOOL_SIZE: \"64\"\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"database\")\n .start();\n\n const httpPort = this.#databaseContainer.getMappedPort(5432);\n const host = this.#databaseContainer.getHost();\n const networkIpAddress = this.#databaseContainer.getIpAddress(this.#network.getName());\n \n process.env.DB_HOST = `${host}:${httpPort}`;\n\n $ResetOptions();\n\n this.LogDebugMessage(chalk.green(`httpPort: [${httpPort}]`));\n this.LogDebugMessage(chalk.green(`host: [${host}]`));\n this.LogDebugMessage(chalk.green(`networkIpAddress: [${networkIpAddress}]`));\n this.LogDebugMessage(chalk.green(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.green(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n\n StopDatabase = async () => {\n if (this.#databaseContainer) {\n await this.#databaseContainer.stop();\n\n this.LogDebugMessage(chalk.yellow(`Used the following parameters for the database during testing:`));\n this.LogDebugMessage(chalk.yellow(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.yellow(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n }\n\n // Note: .withCopyFilesToContainer and .withCopyContentToContainer have a defect in that Jest will not close. A file handle/stream is left open\n // within the underlying code.\n InitializeDatabase = async () => {\n const stsAuthContainerInit = await new GenericContainer(\"serza/stsauth:latest\")\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\",\n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: 'https://stsauthrunnerinit' // \"https://stscore.stsmda.org\"\n })\n .withCommand([\"node\", \"dist/app\", \"create\"])\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunnerinit\")\n .withWaitStrategy(Wait.forLogMessage(`User registered: {\"status\":200,\"detail\":{\"id\":\"USR_STSGlobalAdminUser@stsmda.com\",\"name\":\"STSGlobalAdminUser@stsmda.com\",\"email\":\"STSGlobalAdminUser@stsmda.com\",\"roles\":[]}}`))\n .start();\n\n await Sleep(500);\n\n await stsAuthContainerInit.stop();\n }\n\n StartRedis = async () => {\n this.#ioRedisContainer = await new GenericContainer(\"redis/redis-stack-server\")\n .withEnvironment({\n REDIS_ARGS: \"--save \\\"\\\" --appendonly no\",\n })\n .withExposedPorts(6379)\n .withNetwork(this.#network)\n .withNetworkAliases(\"redisstackserver\")\n //.withWaitStrategy(Wait.forLogMessage(`Ready to accept connections tcp`))\n .start();\n\n this.#ioRedisMessageProcessorUrl = `redis://${this.#ioRedisContainer.getHost()}:${this.#ioRedisContainer.getMappedPort(6379)}`; \n\n await Sleep(2000);\n //expect(goptions.imRedisMessageProcessorUrl).toEqual('redis://localhost:6379');\n // IM_REDIS_MESSAGE_PROCESSOR_URL\n\n this.LogDebugMessage(chalk.green(`redis/redis-stack-server Started. Server Details: ioRedisMessageProcessorUrl: [${this.#ioRedisMessageProcessorUrl}]`));\n }\n\n StopRedis = async () => {\n if (this.#ioRedisContainer) {\n await this.#ioRedisContainer.stop();\n await Sleep(200);\n }\n }\n\n StartAuthService = async () => {\n this.#stsAuthContainer = await new GenericContainer(\"serza/stsauth:latest\")\n .withExposedPorts(3002)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: 'https://stsauthrunner', // \"https://stscore.stsmda.org\",\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunner\")\n .withWaitStrategy(Wait.forHttp(\"/stsauth/v1.0/latency\", 3002).usingTls().allowInsecure())\n .start();\n\n const httpAuthPort = this.#stsAuthContainer.getMappedPort(3002);\n\n await Sleep(200);\n this.#authHost = 'https://localhost'\n this.#authPort = httpAuthPort;\n this.#authEndpoint = `${this.#authHost}:${this.#authPort}`;\n this.LogDebugMessage(chalk.green(`STSAuth Started. Server Details: Host: [${this.#authHost}], Port: [${this.#authPort}]`));\n }\n\n StartFhirService = async () => {\n this.#stsFhirContainer = await new GenericContainer(\"serza/stsfhir:latest\")\n .withExposedPorts(3005)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: 'https://stsauthrunner',\n AS_HOST_PORT: \"3002\",\n AS_PORT: \"3002\",\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379',\n SOCKET_IO_REDIS_ADAPTOR_URL: 'redis://redisstackserver:6379',\n STSFHIR_PORT: \"3005\",\n STSFHIR_HOST_PORT: \"3005\",\n STSFHIR_ENDPOINT: \"https://stsfhirserver\", // \"https://<endpoint>\",\n UV_THREADPOOL_SIZE: \"64\",\n FORCE_COLOR: \"3\",\n //node dist/app usedb postgresResources\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsfhirserver\")\n //.withWaitStrategy(Wait.forHttp(\"/stsfhir/r5/latency\", 3005).usingTls().allowInsecure())\n .start();\n\n this.#stsFhirContainer.logs().then((stream: any) => {\n stream\n .on('data', (line: any) => process.stdout.write(line.toString()))\n .on('err', (line: any) => process.stderr.write(line.toString()))\n .on('end', () => console.log('Stream ended.'));\n });\n\n const httpFhirPort = this.#stsFhirContainer.getMappedPort(3005);\n\n await Sleep(200);\n this.#fhirHost = 'https://localhost'\n this.#fhirPort = httpFhirPort;\n this.#fhirEndpoint = `${this.#fhirHost}:${this.#fhirPort}`;\n this.LogDebugMessage(chalk.green(`STSFhir Started. Server Details: Host: [${this.#fhirHost}], Port: [${this.#fhirPort}]`));\n }\n\n StopAuthService = async () => {\n if (this.#stsAuthContainer) {\n await this.#stsAuthContainer.stop();\n await Sleep(200);\n }\n }\n\n StopRest01Service = async () => {\n if (this.#stsRest01Container) {\n await this.#stsRest01Container.stop();\n await Sleep(200);\n }\n }\n\n StopFhirService = async () => {\n if (this.#stsFhirContainer) {\n await this.#stsFhirContainer.stop();\n await Sleep(200);\n }\n }\n\n TestLoginAndVerify = async () => {\n expect.assertions(4);\n\n console.log(`TestLoginAndVerify:1`);\n\n const retVal = await this.Login('user01@stsmda.com.au', 'user01password');\n expect(retVal.status).toEqual(200);\n\n console.log(`TestLoginAndVerify:2`);\n\n this.LogDebugMessage(chalk.red(`${JSON.stringify(retVal.data)}`));\n this.LogDebugMessage(chalk.magenta(`${JSON.stringify(retVal.headers)}`));\n this.LogDebugMessage(chalk.yellow(`${JSON.stringify(retVal.headers['set-cookie'])}`));\n\n const cookies = retVal.headers['set-cookie'] as string[];\n this.LogDebugMessage(chalk.yellow(`${cookies[0]}`));\n this.LogDebugMessage(chalk.green(`${JSON.stringify(tough.Cookie.parse(cookies[0]))}`));\n\n console.log(`TestLoginAndVerify:3`);\n\n const cookie = tough.Cookie.parse(cookies[0]) as tough.Cookie;\n\n console.log(`TestLoginAndVerify:4`);\n\n const desiredCookieResultAxios = {\n key: 'consent_cookie',\n value: expect.stringMatching(this.#regexURLSafeStringComponent),\n path: '/',\n secure: true,\n httpOnly: true,\n sameSite: 'strict',\n }\n\n const cookieResult = JSON.parse(JSON.stringify(cookie));\n expect(cookieResult).toMatchObject(desiredCookieResultAxios);\n\n console.log(`TestLoginAndVerify:5`);\n\n const cookieExpireDate = new Date(cookie.expires as any);\n expect(cookieExpireDate.getTime()).toBeGreaterThan(new Date().getTime());\n\n const consentRequired = (process.env.CONSENT_REQUIRED as string).split(' ').sort();\n retVal.data.detail.consentRequired = retVal.data.detail.consentRequired.sort();\n\n console.log(`TestLoginAndVerify:6`);\n\n const desiredResult = {\n sessionId: expect.stringMatching(this.#regexSTSBase64),\n id_token: expect.stringMatching(this.#regexJWT),\n consentRequired\n }\n\n console.log(`TestLoginAndVerify:7`);\n\n expect(retVal.data.detail).toMatchObject(desiredResult);\n\n console.log(`TestLoginAndVerify:9`);\n }\n\n StartRest01Service = async () => {\n this.#stsRest01Container = await new GenericContainer(\"serza/stsrest01:latest\")\n .withExposedPorts(3003)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n //AS_ENDPOINT: \"https://<endpoint>\",\n AS_ENDPOINT: 'https://stsauthrunner', // this.authHost,\n //AS_ENDPOINT: 'https://localhost', // this.authHost,\n AS_HOST_PORT: '3002',\n AS_PORT: '3002',\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n //AS_HOST_PORT: this.authPort,\n //AS_PORT: this.authPort,\n\n //REST01_PORT: '3003',\n //REST01_HOST_PORT: '3003',\n //REST01_ENDPOINT: 'https://localhost' // 'https://<endpoint>'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"rest01\")\n .withWaitStrategy(Wait.forHttp(\"/stsrest01/v1/latency\", 3003).usingTls().allowInsecure())\n .start();\n\n const httpRest01Port = this.#stsRest01Container.getMappedPort(3003);\n\n await Sleep(200);\n\n this.#rest01Host = 'https://localhost'\n this.#rest01Port = httpRest01Port;\n this.#rest01Endpoint = `${this.#rest01Host}:${this.#rest01Port}`;\n\n this.LogDebugMessage(chalk.green(`STSRest01 Started. Server Details: Host: [${this.rest01Host}], Port: [${this.rest01Port}]`));\n }\n}\n"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -147,7 +147,7 @@ var TestHelper = class {
147
147
  DEBUG: "proc*",
148
148
  HTTPS_SERVER_KEY_PATH: "/var/lib/sts/stsglobalresources/keys-tmp/server.key",
149
149
  HTTPS_SERVER_CERT_PATH: "/var/lib/sts/stsglobalresources/keys-tmp/server.cert",
150
- AS_ENDPOINT: "https://stscore.stsmda.org"
150
+ AS_ENDPOINT: "https://stsauthrunnerinit"
151
151
  }).withCommand([
152
152
  "node",
153
153
  "dist/app",
@@ -178,7 +178,7 @@ var TestHelper = class {
178
178
  DEBUG: "proc*",
179
179
  HTTPS_SERVER_KEY_PATH: "/var/lib/sts/stsglobalresources/keys-tmp/server.key",
180
180
  HTTPS_SERVER_CERT_PATH: "/var/lib/sts/stsglobalresources/keys-tmp/server.cert",
181
- AS_ENDPOINT: "https://stscore.stsmda.org",
181
+ AS_ENDPOINT: "https://stsauthrunner",
182
182
  IM_REDIS_MESSAGE_PROCESSOR_URL: "redis://redisstackserver:6379"
183
183
  }).withNetwork(this.#network).withNetworkAliases("stsauthrunner").withWaitStrategy(Wait.forHttp("/stsauth/v1.0/latency", 3002).usingTls().allowInsecure()).start();
184
184
  const httpAuthPort = this.#stsAuthContainer.getMappedPort(3002);
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["#authEndpoint","#network","#authPort","#authHost","#rest01Port","#rest01Host","#rest01Endpoint","#fhirPort","#fhirHost","#fhirEndpoint","#ioRedisMessageProcessorUrl","#databaseContainer","#ioRedisContainer","#stsAuthContainer","#stsFhirContainer","#stsRest01Container","#regexURLSafeStringComponent","#regexSTSBase64","#regexJWT"],"sources":["../src/testHelpers.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\n// stsdevtools\nimport { expect } from 'vitest';\n\nimport chalk from 'chalk'\n\nimport * as tough from 'tough-cookie'\n\nimport crypto from 'node:crypto'\n\nimport axios from 'axios'\n\nimport { GenericContainer, Network, Wait } from \"testcontainers\"\n\nimport { goptions, $ResetOptions } from '@nsshunt/stsconfig'\n\nimport { Sleep, defaultLogger, STSAxiosConfig, createAgentManager } from '@nsshunt/stsutils'\n\nimport http from 'node:http'\nimport https from 'node:https'\n\nexport class TestHelper {\n //#regexBase64URL = /^[A-Za-z0-9_-]+$/ // Base64URL - https://base64.guru/standards/base64url\n #regexURLSafeStringComponent = /[-a-zA-Z0-9@:%._+~#=]{1,256}/ // URL safe string component\n //#regexBase64 = /(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?/ // Base64 - https://stackoverflow.com/questions/475074/regex-to-parse-or-validate-base64-data\n #regexSTSBase64 = /SES_(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?/ // Base64\n #regexJWT = /[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+/ // JWT (Base64URL.Base64URL.Base64URL)\n #network: any;\n\n #databaseContainer: any;\n #stsAuthContainer: any;\n #stsRest01Container: any;\n #ioRedisContainer: any;\n #stsFhirContainer: any;\n\n #ioRedisMessageProcessorUrl: string = '';\n\n #authEndpoint = '';\n #authPort = '';\n #authHost = '';\n\n #rest01Host = '';\n #rest01Port = '';\n #rest01Endpoint = '';\n\n #fhirHost = '';\n #fhirPort = '';\n #fhirEndpoint = '';\n\n constructor() {\n this.#authEndpoint = 'https://localhost:3002'; //@@\n }\n\n LogDebugMessage(message: any) {\n defaultLogger.debug(message);\n }\n\n StartNetwork = async () => {\n this.#network = await new Network().start();\n }\n\n StopNetwork = async () => {\n if (this.#network) {\n await this.#network.stop();\n }\n }\n\n get network() {\n return this.#network;\n }\n\n get authPort() {\n return this.#authPort;\n }\n\n get authHost() {\n return this.#authHost;\n }\n\n get authEndpoint() {\n return this.#authEndpoint;\n }\n\n get rest01Port() {\n return this.#rest01Port;\n }\n\n get rest01Host() {\n return this.#rest01Host;\n }\n\n get rest01Endpoint() {\n return this.#rest01Endpoint;\n }\n\n get fhirPort() {\n return this.#fhirPort;\n }\n\n get fhirHost() {\n return this.#fhirHost;\n }\n\n get fhirEndpoint() {\n return this.#fhirEndpoint;\n }\n\n get ioRedisMessageProcessorUrl() {\n return this.#ioRedisMessageProcessorUrl;\n }\n\n CreateRandomString = () => {\n const charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_~.'; // /[0-9A-Za-z\\-_~.]/\n let random = '';\n const randomValues: number[] = Array.from(crypto.getRandomValues(new Uint8Array(43)));\n randomValues.forEach(v => (random += charset[v % charset.length]));\n return random;\n }\n\n Login = async (username: string, password: string) => {\n const client_id = process.env.CLIENT_ID as string;\n const nonce = crypto.randomBytes(43).toString('base64'); //CreateRandomString();\n const response_type = 'code';\n const redirect_uri = process.env.REDIRECT_URI as string;\n const response_mode = 'query';\n const scope = process.env.SCOPE as string;\n const state = crypto.randomBytes(43).toString('base64'); // CreateRandomString();\n const code_verifier = this.CreateRandomString();\n const code_challenge = crypto.createHash('sha256').update(code_verifier).digest('base64');\n const code_challenge_method = 'S256';\n\n const authoriseOptions: any = {\n email: username,\n password,\n client_id,\n nonce,\n response_type,\n redirect_uri,\n response_mode,\n scope,\n state,\n code_challenge,\n code_challenge_method\n }\n\n const url = `${this.#authEndpoint}${goptions.asapiroot}/login`;\n\n console.log(`Login ---------------------------------------------------------------------------`)\n console.log(`url: [${url}]`);\n console.log(`authoriseOptions: [${JSON.stringify(authoriseOptions)}]`);\n\n const agentManager = createAgentManager({\n httpAgentFactory(options) {\n return new http.Agent(options);\n },\n httpsAgentFactory(options) {\n return new https.Agent(options);\n }\n });\n\n const retVal = await axios(new STSAxiosConfig(url, 'post')\n .withDefaultHeaders()\n .withData(authoriseOptions)\n .withAgentManager(agentManager).config);\n\n //const cookieString = retVal.headers['set-cookie'];\n\n /*\n const api = request(this.#endpoint);\n const retVal: any = await (api as any)\n .post(`${goptions.asapiroot}/login`)\n .send(authoriseOptions)\n //.expect('set-cookie', /consent_cookie=.*; Max-Age=86; Path=\\/; Expires=.*; HttpOnly; Secure; SameSite=Strict/);\n\n const cookieString = retVal.header['set-cookie'];\n\n if (cookieString) {\n retVal.cookie = new Cookie(cookieString[0]);\n }\n */\n\n return retVal;\n }\n\n /*\n GetAuthServerAPITokenFromServer = async (): Promise<string> => {\n return await this.#authUtilsNode.GetAPITokenFromAuthServer(STSClientID.STSTestingService, \n \"eN9u0mHZLGWZrdnE1zit2vL6xwUFW466sTZcbkXDml5KWxlvKaZ1uiOZmA==\", \n goptions.asapiidentifier, this.#authEndpoint)\n }\n */\n\n StartDatabase = async () => {\n this.#databaseContainer = await new GenericContainer(\"postgres\")\n .withExposedPorts(5432)\n .withEnvironment({\n POSTGRES_PASSWORD: \"postgres\",\n //UV_THREADPOOL_SIZE: \"64\"\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"database\")\n .start();\n\n const httpPort = this.#databaseContainer.getMappedPort(5432);\n const host = this.#databaseContainer.getHost();\n const networkIpAddress = this.#databaseContainer.getIpAddress(this.#network.getName());\n \n process.env.DB_HOST = `${host}:${httpPort}`;\n\n $ResetOptions();\n\n this.LogDebugMessage(chalk.green(`httpPort: [${httpPort}]`));\n this.LogDebugMessage(chalk.green(`host: [${host}]`));\n this.LogDebugMessage(chalk.green(`networkIpAddress: [${networkIpAddress}]`));\n this.LogDebugMessage(chalk.green(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.green(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n\n StopDatabase = async () => {\n if (this.#databaseContainer) {\n await this.#databaseContainer.stop();\n\n this.LogDebugMessage(chalk.yellow(`Used the following parameters for the database during testing:`));\n this.LogDebugMessage(chalk.yellow(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.yellow(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n }\n\n // Note: .withCopyFilesToContainer and .withCopyContentToContainer have a defect in that Jest will not close. A file handle/stream is left open\n // within the underlying code.\n InitializeDatabase = async () => {\n const stsAuthContainerInit = await new GenericContainer(\"serza/stsauth:latest\")\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", // \"192.168.14.101\",\n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\"\n })\n .withCommand([\"node\", \"dist/app\", \"create\"])\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunnerinit\")\n .withWaitStrategy(Wait.forLogMessage(`User registered: {\"status\":200,\"detail\":{\"id\":\"USR_STSGlobalAdminUser@stsmda.com\",\"name\":\"STSGlobalAdminUser@stsmda.com\",\"email\":\"STSGlobalAdminUser@stsmda.com\",\"roles\":[]}}`))\n .start();\n\n await Sleep(500);\n\n await stsAuthContainerInit.stop();\n }\n\n StartRedis = async () => {\n this.#ioRedisContainer = await new GenericContainer(\"redis/redis-stack-server\")\n .withEnvironment({\n REDIS_ARGS: \"--save \\\"\\\" --appendonly no\",\n })\n .withExposedPorts(6379)\n .withNetwork(this.#network)\n .withNetworkAliases(\"redisstackserver\")\n //.withWaitStrategy(Wait.forLogMessage(`Ready to accept connections tcp`))\n .start();\n\n this.#ioRedisMessageProcessorUrl = `redis://${this.#ioRedisContainer.getHost()}:${this.#ioRedisContainer.getMappedPort(6379)}`; \n\n await Sleep(2000);\n //expect(goptions.imRedisMessageProcessorUrl).toEqual('redis://localhost:6379');\n // IM_REDIS_MESSAGE_PROCESSOR_URL\n\n this.LogDebugMessage(chalk.green(`redis/redis-stack-server Started. Server Details: ioRedisMessageProcessorUrl: [${this.#ioRedisMessageProcessorUrl}]`));\n }\n\n StopRedis = async () => {\n if (this.#ioRedisContainer) {\n await this.#ioRedisContainer.stop();\n await Sleep(200);\n }\n }\n\n StartAuthService = async () => {\n this.#stsAuthContainer = await new GenericContainer(\"serza/stsauth:latest\")\n .withExposedPorts(3002)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: \"https://stscore.stsmda.org\",\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunner\")\n .withWaitStrategy(Wait.forHttp(\"/stsauth/v1.0/latency\", 3002).usingTls().allowInsecure())\n .start();\n\n const httpAuthPort = this.#stsAuthContainer.getMappedPort(3002);\n\n await Sleep(200);\n this.#authHost = 'https://localhost'\n this.#authPort = httpAuthPort;\n this.#authEndpoint = `${this.#authHost}:${this.#authPort}`;\n this.LogDebugMessage(chalk.green(`STSAuth Started. Server Details: Host: [${this.#authHost}], Port: [${this.#authPort}]`));\n }\n\n StartFhirService = async () => {\n this.#stsFhirContainer = await new GenericContainer(\"serza/stsfhir:latest\")\n .withExposedPorts(3005)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: 'https://stsauthrunner',\n AS_HOST_PORT: \"3002\",\n AS_PORT: \"3002\",\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379',\n SOCKET_IO_REDIS_ADAPTOR_URL: 'redis://redisstackserver:6379',\n STSFHIR_PORT: \"3005\",\n STSFHIR_HOST_PORT: \"3005\",\n STSFHIR_ENDPOINT: \"https://stsfhirserver\", // \"https://stscore.stsmda.org\",\n UV_THREADPOOL_SIZE: \"64\",\n FORCE_COLOR: \"3\",\n //node dist/app usedb postgresResources\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsfhirserver\")\n //.withWaitStrategy(Wait.forHttp(\"/stsfhir/r5/latency\", 3005).usingTls().allowInsecure())\n .start();\n\n this.#stsFhirContainer.logs().then((stream: any) => {\n stream\n .on('data', (line: any) => process.stdout.write(line.toString()))\n .on('err', (line: any) => process.stderr.write(line.toString()))\n .on('end', () => console.log('Stream ended.'));\n });\n\n const httpFhirPort = this.#stsFhirContainer.getMappedPort(3005);\n\n await Sleep(200);\n this.#fhirHost = 'https://localhost'\n this.#fhirPort = httpFhirPort;\n this.#fhirEndpoint = `${this.#fhirHost}:${this.#fhirPort}`;\n this.LogDebugMessage(chalk.green(`STSFhir Started. Server Details: Host: [${this.#fhirHost}], Port: [${this.#fhirPort}]`));\n }\n\n StopAuthService = async () => {\n if (this.#stsAuthContainer) {\n await this.#stsAuthContainer.stop();\n await Sleep(200);\n }\n }\n\n StopRest01Service = async () => {\n if (this.#stsRest01Container) {\n await this.#stsRest01Container.stop();\n await Sleep(200);\n }\n }\n\n StopFhirService = async () => {\n if (this.#stsFhirContainer) {\n await this.#stsFhirContainer.stop();\n await Sleep(200);\n }\n }\n\n TestLoginAndVerify = async () => {\n expect.assertions(4);\n\n console.log(`TestLoginAndVerify:1`);\n\n const retVal = await this.Login('user01@stsmda.com.au', 'user01password');\n expect(retVal.status).toEqual(200);\n\n console.log(`TestLoginAndVerify:2`);\n\n this.LogDebugMessage(chalk.red(`${JSON.stringify(retVal.data)}`));\n this.LogDebugMessage(chalk.magenta(`${JSON.stringify(retVal.headers)}`));\n this.LogDebugMessage(chalk.yellow(`${JSON.stringify(retVal.headers['set-cookie'])}`));\n\n const cookies = retVal.headers['set-cookie'] as string[];\n this.LogDebugMessage(chalk.yellow(`${cookies[0]}`));\n this.LogDebugMessage(chalk.green(`${JSON.stringify(tough.Cookie.parse(cookies[0]))}`));\n\n console.log(`TestLoginAndVerify:3`);\n\n const cookie = tough.Cookie.parse(cookies[0]) as tough.Cookie;\n\n console.log(`TestLoginAndVerify:4`);\n\n const desiredCookieResultAxios = {\n key: 'consent_cookie',\n value: expect.stringMatching(this.#regexURLSafeStringComponent),\n path: '/',\n secure: true,\n httpOnly: true,\n sameSite: 'strict',\n }\n\n const cookieResult = JSON.parse(JSON.stringify(cookie));\n expect(cookieResult).toMatchObject(desiredCookieResultAxios);\n\n console.log(`TestLoginAndVerify:5`);\n\n const cookieExpireDate = new Date(cookie.expires as any);\n expect(cookieExpireDate.getTime()).toBeGreaterThan(new Date().getTime());\n\n const consentRequired = (process.env.CONSENT_REQUIRED as string).split(' ').sort();\n retVal.data.detail.consentRequired = retVal.data.detail.consentRequired.sort();\n\n console.log(`TestLoginAndVerify:6`);\n\n const desiredResult = {\n sessionId: expect.stringMatching(this.#regexSTSBase64),\n id_token: expect.stringMatching(this.#regexJWT),\n consentRequired\n }\n\n console.log(`TestLoginAndVerify:7`);\n\n expect(retVal.data.detail).toMatchObject(desiredResult);\n\n console.log(`TestLoginAndVerify:9`);\n }\n\n StartRest01Service = async () => {\n this.#stsRest01Container = await new GenericContainer(\"serza/stsrest01:latest\")\n .withExposedPorts(3003)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n //AS_ENDPOINT: \"https://stscore.stsmda.org\",\n AS_ENDPOINT: 'https://stsauthrunner', // this.authHost,\n //AS_ENDPOINT: 'https://localhost', // this.authHost,\n AS_HOST_PORT: '3002',\n AS_PORT: '3002',\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n //AS_HOST_PORT: this.authPort,\n //AS_PORT: this.authPort,\n\n //REST01_PORT: '3003',\n //REST01_HOST_PORT: '3003',\n //REST01_ENDPOINT: 'https://localhost' // 'https://stscore.stsmda.org'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"rest01\")\n .withWaitStrategy(Wait.forHttp(\"/stsrest01/v1/latency\", 3003).usingTls().allowInsecure())\n .start();\n\n const httpRest01Port = this.#stsRest01Container.getMappedPort(3003);\n\n await Sleep(200);\n\n this.#rest01Host = 'https://localhost'\n this.#rest01Port = httpRest01Port;\n this.#rest01Endpoint = `${this.#rest01Host}:${this.#rest01Port}`;\n\n this.LogDebugMessage(chalk.green(`STSRest01 Started. Server Details: Host: [${this.rest01Host}], Port: [${this.rest01Port}]`));\n }\n}\n"],"mappings":";;;;;;;;;;;AAqBA,IAAa,aAAb,MAAwB;CAEpB,+BAA+B;CAE/B,kBAAkB;CAClB,YAAY;CACZ;CAEA;CACA;CACA;CACA;CACA;CAEA,8BAAsC;CAEtC,gBAAgB;CAChB,YAAY;CACZ,YAAY;CAEZ,cAAc;CACd,cAAc;CACd,kBAAkB;CAElB,YAAY;CACZ,YAAY;CACZ,gBAAgB;CAEhB,cAAc;EACV,KAAKA,gBAAgB;CACzB;CAEA,gBAAgB,SAAc;EAC1B,cAAc,MAAM,OAAO;CAC/B;CAEA,eAAe,YAAY;EACvB,KAAKC,WAAW,MAAM,IAAI,QAAQ,EAAE,MAAM;CAC9C;CAEA,cAAc,YAAY;EACtB,IAAI,KAAKA,UACL,MAAM,KAAKA,SAAS,KAAK;CAEjC;CAEA,IAAI,UAAU;EACV,OAAO,KAAKA;CAChB;CAEA,IAAI,WAAW;EACX,OAAO,KAAKC;CAChB;CAEA,IAAI,WAAW;EACX,OAAO,KAAKC;CAChB;CAEA,IAAI,eAAe;EACf,OAAO,KAAKH;CAChB;CAEA,IAAI,aAAa;EACb,OAAO,KAAKI;CAChB;CAEA,IAAI,aAAa;EACb,OAAO,KAAKC;CAChB;CAEA,IAAI,iBAAiB;EACjB,OAAO,KAAKC;CAChB;CAEA,IAAI,WAAW;EACX,OAAO,KAAKC;CAChB;CAEA,IAAI,WAAW;EACX,OAAO,KAAKC;CAChB;CAEA,IAAI,eAAe;EACf,OAAO,KAAKC;CAChB;CAEA,IAAI,6BAA6B;EAC7B,OAAO,KAAKC;CAChB;CAEA,2BAA2B;EACvB,MAAM,UAAU;EAChB,IAAI,SAAS;EAEb,MADqC,KAAK,OAAO,gBAAgB,IAAI,WAAW,EAAE,CAAC,CACnF,EAAa,SAAQ,MAAM,UAAU,QAAQ,IAAI,GAAgB;EACjE,OAAO;CACX;CAEA,QAAQ,OAAO,UAAkB,aAAqB;EAClD,MAAM,YAAY,QAAQ,IAAI;EAC9B,MAAM,QAAQ,OAAO,YAAY,EAAE,EAAE,SAAS,QAAQ;EACtD,MAAM,gBAAgB;EACtB,MAAM,eAAe,QAAQ,IAAI;EACjC,MAAM,gBAAgB;EACtB,MAAM,QAAQ,QAAQ,IAAI;EAC1B,MAAM,QAAQ,OAAO,YAAY,EAAE,EAAE,SAAS,QAAQ;EACtD,MAAM,gBAAgB,KAAK,mBAAmB;EAI9C,MAAM,mBAAwB;GAC1B,OAAO;GACP;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,gBAbmB,OAAO,WAAW,QAAQ,EAAE,OAAO,aAAa,EAAE,OAAO,QAa5E;GACA,uBAAA;EACJ;EAEA,MAAM,MAAM,GAAG,KAAKV,gBAAgB,SAAS,UAAU;EAEvD,QAAQ,IAAI,mFAAmF;EAC/F,QAAQ,IAAI,SAAS,IAAI,EAAE;EAC3B,QAAQ,IAAI,sBAAsB,KAAK,UAAU,gBAAgB,EAAE,EAAE;EAErE,MAAM,eAAe,mBAAmB;GACpC,iBAAiB,SAAS;IACtB,OAAO,IAAI,KAAK,MAAM,OAAO;GACjC;GACA,kBAAkB,SAAS;IACvB,OAAO,IAAI,MAAM,MAAM,OAAO;GAClC;EACJ,CAAC;EAuBD,OAAO,MArBc,MAAM,IAAI,eAAe,KAAK,MAAM,EACpD,mBAAmB,EACnB,SAAS,gBAAgB,EACzB,iBAAiB,YAAY,EAAE,MAAM;CAmB9C;CAUA,gBAAgB,YAAY;EACxB,KAAKW,qBAAqB,MAAM,IAAI,iBAAiB,UAAU,EAC1D,iBAAiB,IAAI,EACrB,gBAAgB,EACb,mBAAmB,WAEvB,CAAC,EACA,YAAY,KAAKV,QAAQ,EACzB,mBAAmB,UAAU,EAC7B,MAAM;EAEX,MAAM,WAAW,KAAKU,mBAAmB,cAAc,IAAI;EAC3D,MAAM,OAAO,KAAKA,mBAAmB,QAAQ;EAC7C,MAAM,mBAAmB,KAAKA,mBAAmB,aAAa,KAAKV,SAAS,QAAQ,CAAC;EAErF,QAAQ,IAAI,UAAU,GAAG,KAAK,GAAG;EAEjC,cAAc;EAEd,KAAK,gBAAgB,MAAM,MAAM,cAAc,SAAS,EAAE,CAAC;EAC3D,KAAK,gBAAgB,MAAM,MAAM,UAAU,KAAK,EAAE,CAAC;EACnD,KAAK,gBAAgB,MAAM,MAAM,sBAAsB,iBAAiB,EAAE,CAAC;EAC3E,KAAK,gBAAgB,MAAM,MAAM,sBAAsB,SAAS,iBAAiB,EAAE,CAAC;EACpF,KAAK,gBAAgB,MAAM,MAAM,qCAAqC,SAAS,gCAAiC,EAAE,CAAC;CACvH;CAEA,eAAe,YAAY;EACvB,IAAI,KAAKU,oBAAoB;GACzB,MAAM,KAAKA,mBAAmB,KAAK;GAEnC,KAAK,gBAAgB,MAAM,OAAO,gEAAgE,CAAC;GACnG,KAAK,gBAAgB,MAAM,OAAO,sBAAsB,SAAS,iBAAiB,EAAE,CAAC;GACrF,KAAK,gBAAgB,MAAM,OAAO,qCAAqC,SAAS,gCAAiC,EAAE,CAAC;EACxH;CACJ;CAIA,qBAAqB,YAAY;EAC7B,MAAM,uBAAuB,MAAM,IAAI,iBAAiB,sBAAsB,EACzE,gBAAgB;GACb,SAAS;GACT,aAAa;GACb,SAAS;GACT,WAAW;GACX,SAAS;GACT,OAAO;GACP,uBAAuB;GACvB,wBAAwB;GACxB,aAAa;EACjB,CAAC,EACA,YAAY;GAAC;GAAQ;GAAY;EAAQ,CAAC,EAC1C,YAAY,KAAKV,QAAQ,EACzB,mBAAmB,mBAAmB,EACtC,iBAAiB,KAAK,cAAc,+KAA+K,CAAC,EACpN,MAAM;EAEX,MAAM,MAAM,GAAG;EAEf,MAAM,qBAAqB,KAAK;CACpC;CAEA,aAAa,YAAY;EACrB,KAAKW,oBAAoB,MAAM,IAAI,iBAAiB,0BAA0B,EACzE,gBAAgB,EACb,YAAY,8BAChB,CAAC,EACA,iBAAiB,IAAI,EACrB,YAAY,KAAKX,QAAQ,EACzB,mBAAmB,kBAAkB,EAErC,MAAM;EAEX,KAAKS,8BAA8B,WAAW,KAAKE,kBAAkB,QAAQ,EAAE,GAAG,KAAKA,kBAAkB,cAAc,IAAI;EAE3H,MAAM,MAAM,GAAI;EAIhB,KAAK,gBAAgB,MAAM,MAAM,kFAAkF,KAAKF,4BAA4B,EAAE,CAAC;CAC3J;CAEA,YAAY,YAAY;EACpB,IAAI,KAAKE,mBAAmB;GACxB,MAAM,KAAKA,kBAAkB,KAAK;GAClC,MAAM,MAAM,GAAG;EACnB;CACJ;CAEA,mBAAmB,YAAY;EAC3B,KAAKC,oBAAoB,MAAM,IAAI,iBAAiB,sBAAsB,EACrE,iBAAiB,IAAI,EACrB,gBAAgB;GACb,SAAS;GACT,aAAa;GACb,SAAS;GACT,WAAW;GACX,SAAS;GACT,OAAO;GACP,uBAAuB;GACvB,wBAAwB;GACxB,aAAa;GACb,gCAAgC;EACpC,CAAC,EACA,YAAY,KAAKZ,QAAQ,EACzB,mBAAmB,eAAe,EAClC,iBAAiB,KAAK,QAAQ,yBAAyB,IAAI,EAAE,SAAS,EAAE,cAAc,CAAC,EACvF,MAAM;EAEX,MAAM,eAAe,KAAKY,kBAAkB,cAAc,IAAI;EAE9D,MAAM,MAAM,GAAG;EACf,KAAKV,YAAY;EACjB,KAAKD,YAAY;EACjB,KAAKF,gBAAgB,GAAG,KAAKG,UAAU,GAAG,KAAKD;EAC/C,KAAK,gBAAgB,MAAM,MAAM,2CAA2C,KAAKC,UAAU,YAAY,KAAKD,UAAU,EAAE,CAAC;CAC7H;CAEA,mBAAmB,YAAY;EAC3B,KAAKY,oBAAoB,MAAM,IAAI,iBAAiB,sBAAsB,EACrE,iBAAiB,IAAI,EACrB,gBAAgB;GACb,SAAS;GACT,aAAa;GACb,SAAS;GACT,WAAW;GACX,SAAS;GACT,OAAO;GACP,uBAAuB;GACvB,wBAAwB;GACxB,aAAa;GACb,cAAc;GACd,SAAS;GACT,gCAAgC;GAChC,6BAA6B;GAC7B,cAAc;GACd,mBAAmB;GACnB,kBAAkB;GAClB,oBAAoB;GACpB,aAAa;EAEjB,CAAC,EACA,YAAY,KAAKb,QAAQ,EACzB,mBAAmB,eAAe,EAElC,MAAM;EAEX,KAAKa,kBAAkB,KAAK,EAAE,MAAM,WAAgB;GAChD,OACK,GAAG,SAAS,SAAc,QAAQ,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,EAC/D,GAAG,QAAQ,SAAc,QAAQ,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,EAC9D,GAAG,aAAa,QAAQ,IAAI,eAAe,CAAC;EACrD,CAAC;EAED,MAAM,eAAe,KAAKA,kBAAkB,cAAc,IAAI;EAE9D,MAAM,MAAM,GAAG;EACf,KAAKN,YAAY;EACjB,KAAKD,YAAY;EACjB,KAAKE,gBAAgB,GAAG,KAAKD,UAAU,GAAG,KAAKD;EAC/C,KAAK,gBAAgB,MAAM,MAAM,2CAA2C,KAAKC,UAAU,YAAY,KAAKD,UAAU,EAAE,CAAC;CAC7H;CAEA,kBAAkB,YAAY;EAC1B,IAAI,KAAKM,mBAAmB;GACxB,MAAM,KAAKA,kBAAkB,KAAK;GAClC,MAAM,MAAM,GAAG;EACnB;CACJ;CAEA,oBAAoB,YAAY;EAC5B,IAAI,KAAKE,qBAAqB;GAC1B,MAAM,KAAKA,oBAAoB,KAAK;GACpC,MAAM,MAAM,GAAG;EACnB;CACJ;CAEA,kBAAkB,YAAY;EAC1B,IAAI,KAAKD,mBAAmB;GACxB,MAAM,KAAKA,kBAAkB,KAAK;GAClC,MAAM,MAAM,GAAG;EACnB;CACJ;CAEA,qBAAqB,YAAY;EAC7B,OAAO,WAAW,CAAC;EAEnB,QAAQ,IAAI,sBAAsB;EAElC,MAAM,SAAS,MAAM,KAAK,MAAM,wBAAwB,gBAAgB;EACxE,OAAO,OAAO,MAAM,EAAE,QAAQ,GAAG;EAEjC,QAAQ,IAAI,sBAAsB;EAElC,KAAK,gBAAgB,MAAM,IAAI,GAAG,KAAK,UAAU,OAAO,IAAI,GAAG,CAAC;EAChE,KAAK,gBAAgB,MAAM,QAAQ,GAAG,KAAK,UAAU,OAAO,OAAO,GAAG,CAAC;EACvE,KAAK,gBAAgB,MAAM,OAAO,GAAG,KAAK,UAAU,OAAO,QAAQ,aAAa,GAAG,CAAC;EAEpF,MAAM,UAAU,OAAO,QAAQ;EAC/B,KAAK,gBAAgB,MAAM,OAAO,GAAG,QAAQ,IAAI,CAAC;EAClD,KAAK,gBAAgB,MAAM,MAAM,GAAG,KAAK,UAAU,MAAM,OAAO,MAAM,QAAQ,EAAE,CAAC,GAAG,CAAC;EAErF,QAAQ,IAAI,sBAAsB;EAElC,MAAM,SAAS,MAAM,OAAO,MAAM,QAAQ,EAAE;EAE5C,QAAQ,IAAI,sBAAsB;EAElC,MAAM,2BAA2B;GAC7B,KAAK;GACL,OAAO,OAAO,eAAe,KAAKE,4BAA4B;GAC9D,MAAM;GACN,QAAQ;GACR,UAAU;GACV,UAAU;EACd;EAGA,OADqB,KAAK,MAAM,KAAK,UAAU,MAAM,CAC9C,CAAY,EAAE,cAAc,wBAAwB;EAE3D,QAAQ,IAAI,sBAAsB;EAGlC,OAAO,IADsB,KAAK,OAAO,OAClC,EAAiB,QAAQ,CAAC,EAAE,iCAAgB,IAAI,KAAK,GAAE,QAAQ,CAAC;EAEvE,MAAM,kBAAmB,QAAQ,IAAI,iBAA4B,MAAM,GAAG,EAAE,KAAK;EACjF,OAAO,KAAK,OAAO,kBAAkB,OAAO,KAAK,OAAO,gBAAgB,KAAK;EAE7E,QAAQ,IAAI,sBAAsB;EAElC,MAAM,gBAAgB;GAClB,WAAW,OAAO,eAAe,KAAKC,eAAe;GACrD,UAAU,OAAO,eAAe,KAAKC,SAAS;GAC9C;EACJ;EAEA,QAAQ,IAAI,sBAAsB;EAElC,OAAO,OAAO,KAAK,MAAM,EAAE,cAAc,aAAa;EAEtD,QAAQ,IAAI,sBAAsB;CACtC;CAEA,qBAAqB,YAAY;EAC7B,KAAKH,sBAAsB,MAAM,IAAI,iBAAiB,wBAAwB,EACzE,iBAAiB,IAAI,EACrB,gBAAgB;GACb,SAAS;GACT,aAAa;GACb,SAAS;GACT,WAAW;GACX,SAAS;GACT,OAAO;GACP,uBAAuB;GACvB,wBAAwB;GAExB,aAAa;GAEb,cAAc;GACd,SAAS;GACT,gCAAgC;EAOpC,CAAC,EACA,YAAY,KAAKd,QAAQ,EACzB,mBAAmB,QAAQ,EAC3B,iBAAiB,KAAK,QAAQ,yBAAyB,IAAI,EAAE,SAAS,EAAE,cAAc,CAAC,EACvF,MAAM;EAEX,MAAM,iBAAiB,KAAKc,oBAAoB,cAAc,IAAI;EAElE,MAAM,MAAM,GAAG;EAEf,KAAKV,cAAc;EACnB,KAAKD,cAAc;EACnB,KAAKE,kBAAkB,GAAG,KAAKD,YAAY,GAAG,KAAKD;EAEnD,KAAK,gBAAgB,MAAM,MAAM,6CAA6C,KAAK,WAAW,YAAY,KAAK,WAAW,EAAE,CAAC;CACjI;AACJ"}
1
+ {"version":3,"file":"index.mjs","names":["#authEndpoint","#network","#authPort","#authHost","#rest01Port","#rest01Host","#rest01Endpoint","#fhirPort","#fhirHost","#fhirEndpoint","#ioRedisMessageProcessorUrl","#databaseContainer","#ioRedisContainer","#stsAuthContainer","#stsFhirContainer","#stsRest01Container","#regexURLSafeStringComponent","#regexSTSBase64","#regexJWT"],"sources":["../src/testHelpers.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\n// stsdevtools\nimport { expect } from 'vitest';\n\nimport chalk from 'chalk'\n\nimport * as tough from 'tough-cookie'\n\nimport crypto from 'node:crypto'\n\nimport axios from 'axios'\n\nimport { GenericContainer, Network, Wait } from \"testcontainers\"\n\nimport { goptions, $ResetOptions } from '@nsshunt/stsconfig'\n\nimport { Sleep, defaultLogger, STSAxiosConfig, createAgentManager } from '@nsshunt/stsutils'\n\nimport http from 'node:http'\nimport https from 'node:https'\n\nexport class TestHelper {\n //#regexBase64URL = /^[A-Za-z0-9_-]+$/ // Base64URL - https://base64.guru/standards/base64url\n #regexURLSafeStringComponent = /[-a-zA-Z0-9@:%._+~#=]{1,256}/ // URL safe string component\n //#regexBase64 = /(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?/ // Base64 - https://stackoverflow.com/questions/475074/regex-to-parse-or-validate-base64-data\n #regexSTSBase64 = /SES_(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?/ // Base64\n #regexJWT = /[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+/ // JWT (Base64URL.Base64URL.Base64URL)\n #network: any;\n\n #databaseContainer: any;\n #stsAuthContainer: any;\n #stsRest01Container: any;\n #ioRedisContainer: any;\n #stsFhirContainer: any;\n\n #ioRedisMessageProcessorUrl: string = '';\n\n #authEndpoint = '';\n #authPort = '';\n #authHost = '';\n\n #rest01Host = '';\n #rest01Port = '';\n #rest01Endpoint = '';\n\n #fhirHost = '';\n #fhirPort = '';\n #fhirEndpoint = '';\n\n constructor() {\n this.#authEndpoint = 'https://localhost:3002'; //@@\n }\n\n LogDebugMessage(message: any) {\n defaultLogger.debug(message);\n }\n\n StartNetwork = async () => {\n this.#network = await new Network().start();\n }\n\n StopNetwork = async () => {\n if (this.#network) {\n await this.#network.stop();\n }\n }\n\n get network() {\n return this.#network;\n }\n\n get authPort() {\n return this.#authPort;\n }\n\n get authHost() {\n return this.#authHost;\n }\n\n get authEndpoint() {\n return this.#authEndpoint;\n }\n\n get rest01Port() {\n return this.#rest01Port;\n }\n\n get rest01Host() {\n return this.#rest01Host;\n }\n\n get rest01Endpoint() {\n return this.#rest01Endpoint;\n }\n\n get fhirPort() {\n return this.#fhirPort;\n }\n\n get fhirHost() {\n return this.#fhirHost;\n }\n\n get fhirEndpoint() {\n return this.#fhirEndpoint;\n }\n\n get ioRedisMessageProcessorUrl() {\n return this.#ioRedisMessageProcessorUrl;\n }\n\n CreateRandomString = () => {\n const charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_~.'; // /[0-9A-Za-z\\-_~.]/\n let random = '';\n const randomValues: number[] = Array.from(crypto.getRandomValues(new Uint8Array(43)));\n randomValues.forEach(v => (random += charset[v % charset.length]));\n return random;\n }\n\n Login = async (username: string, password: string) => {\n const client_id = process.env.CLIENT_ID as string;\n const nonce = crypto.randomBytes(43).toString('base64'); //CreateRandomString();\n const response_type = 'code';\n const redirect_uri = process.env.REDIRECT_URI as string;\n const response_mode = 'query';\n const scope = process.env.SCOPE as string;\n const state = crypto.randomBytes(43).toString('base64'); // CreateRandomString();\n const code_verifier = this.CreateRandomString();\n const code_challenge = crypto.createHash('sha256').update(code_verifier).digest('base64');\n const code_challenge_method = 'S256';\n\n const authoriseOptions: any = {\n email: username,\n password,\n client_id,\n nonce,\n response_type,\n redirect_uri,\n response_mode,\n scope,\n state,\n code_challenge,\n code_challenge_method\n }\n\n const url = `${this.#authEndpoint}${goptions.asapiroot}/login`;\n\n console.log(`Login ---------------------------------------------------------------------------`)\n console.log(`url: [${url}]`);\n console.log(`authoriseOptions: [${JSON.stringify(authoriseOptions)}]`);\n\n const agentManager = createAgentManager({\n httpAgentFactory(options) {\n return new http.Agent(options);\n },\n httpsAgentFactory(options) {\n return new https.Agent(options);\n }\n });\n\n const retVal = await axios(new STSAxiosConfig(url, 'post')\n .withDefaultHeaders()\n .withData(authoriseOptions)\n .withAgentManager(agentManager).config);\n\n //const cookieString = retVal.headers['set-cookie'];\n\n /*\n const api = request(this.#endpoint);\n const retVal: any = await (api as any)\n .post(`${goptions.asapiroot}/login`)\n .send(authoriseOptions)\n //.expect('set-cookie', /consent_cookie=.*; Max-Age=86; Path=\\/; Expires=.*; HttpOnly; Secure; SameSite=Strict/);\n\n const cookieString = retVal.header['set-cookie'];\n\n if (cookieString) {\n retVal.cookie = new Cookie(cookieString[0]);\n }\n */\n\n return retVal;\n }\n\n /*\n GetAuthServerAPITokenFromServer = async (): Promise<string> => {\n return await this.#authUtilsNode.GetAPITokenFromAuthServer(STSClientID.STSTestingService, \n \"eN9u0mHZLGWZrdnE1zit2vL6xwUFW466sTZcbkXDml5KWxlvKaZ1uiOZmA==\", \n goptions.asapiidentifier, this.#authEndpoint)\n }\n */\n\n StartDatabase = async () => {\n this.#databaseContainer = await new GenericContainer(\"postgres\")\n .withExposedPorts(5432)\n .withEnvironment({\n POSTGRES_PASSWORD: \"postgres\",\n //UV_THREADPOOL_SIZE: \"64\"\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"database\")\n .start();\n\n const httpPort = this.#databaseContainer.getMappedPort(5432);\n const host = this.#databaseContainer.getHost();\n const networkIpAddress = this.#databaseContainer.getIpAddress(this.#network.getName());\n \n process.env.DB_HOST = `${host}:${httpPort}`;\n\n $ResetOptions();\n\n this.LogDebugMessage(chalk.green(`httpPort: [${httpPort}]`));\n this.LogDebugMessage(chalk.green(`host: [${host}]`));\n this.LogDebugMessage(chalk.green(`networkIpAddress: [${networkIpAddress}]`));\n this.LogDebugMessage(chalk.green(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.green(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n\n StopDatabase = async () => {\n if (this.#databaseContainer) {\n await this.#databaseContainer.stop();\n\n this.LogDebugMessage(chalk.yellow(`Used the following parameters for the database during testing:`));\n this.LogDebugMessage(chalk.yellow(`connectionString: [${goptions.connectionString}]`));\n this.LogDebugMessage(chalk.yellow(`defaultDatabaseConnectionString: [${goptions.defaultDatabaseConnectionString }]`));\n }\n }\n\n // Note: .withCopyFilesToContainer and .withCopyContentToContainer have a defect in that Jest will not close. A file handle/stream is left open\n // within the underlying code.\n InitializeDatabase = async () => {\n const stsAuthContainerInit = await new GenericContainer(\"serza/stsauth:latest\")\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\",\n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: 'https://stsauthrunnerinit' // \"https://stscore.stsmda.org\"\n })\n .withCommand([\"node\", \"dist/app\", \"create\"])\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunnerinit\")\n .withWaitStrategy(Wait.forLogMessage(`User registered: {\"status\":200,\"detail\":{\"id\":\"USR_STSGlobalAdminUser@stsmda.com\",\"name\":\"STSGlobalAdminUser@stsmda.com\",\"email\":\"STSGlobalAdminUser@stsmda.com\",\"roles\":[]}}`))\n .start();\n\n await Sleep(500);\n\n await stsAuthContainerInit.stop();\n }\n\n StartRedis = async () => {\n this.#ioRedisContainer = await new GenericContainer(\"redis/redis-stack-server\")\n .withEnvironment({\n REDIS_ARGS: \"--save \\\"\\\" --appendonly no\",\n })\n .withExposedPorts(6379)\n .withNetwork(this.#network)\n .withNetworkAliases(\"redisstackserver\")\n //.withWaitStrategy(Wait.forLogMessage(`Ready to accept connections tcp`))\n .start();\n\n this.#ioRedisMessageProcessorUrl = `redis://${this.#ioRedisContainer.getHost()}:${this.#ioRedisContainer.getMappedPort(6379)}`; \n\n await Sleep(2000);\n //expect(goptions.imRedisMessageProcessorUrl).toEqual('redis://localhost:6379');\n // IM_REDIS_MESSAGE_PROCESSOR_URL\n\n this.LogDebugMessage(chalk.green(`redis/redis-stack-server Started. Server Details: ioRedisMessageProcessorUrl: [${this.#ioRedisMessageProcessorUrl}]`));\n }\n\n StopRedis = async () => {\n if (this.#ioRedisContainer) {\n await this.#ioRedisContainer.stop();\n await Sleep(200);\n }\n }\n\n StartAuthService = async () => {\n this.#stsAuthContainer = await new GenericContainer(\"serza/stsauth:latest\")\n .withExposedPorts(3002)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: 'https://stsauthrunner', // \"https://stscore.stsmda.org\",\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsauthrunner\")\n .withWaitStrategy(Wait.forHttp(\"/stsauth/v1.0/latency\", 3002).usingTls().allowInsecure())\n .start();\n\n const httpAuthPort = this.#stsAuthContainer.getMappedPort(3002);\n\n await Sleep(200);\n this.#authHost = 'https://localhost'\n this.#authPort = httpAuthPort;\n this.#authEndpoint = `${this.#authHost}:${this.#authPort}`;\n this.LogDebugMessage(chalk.green(`STSAuth Started. Server Details: Host: [${this.#authHost}], Port: [${this.#authPort}]`));\n }\n\n StartFhirService = async () => {\n this.#stsFhirContainer = await new GenericContainer(\"serza/stsfhir:latest\")\n .withExposedPorts(3005)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n AS_ENDPOINT: 'https://stsauthrunner',\n AS_HOST_PORT: \"3002\",\n AS_PORT: \"3002\",\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379',\n SOCKET_IO_REDIS_ADAPTOR_URL: 'redis://redisstackserver:6379',\n STSFHIR_PORT: \"3005\",\n STSFHIR_HOST_PORT: \"3005\",\n STSFHIR_ENDPOINT: \"https://stsfhirserver\", // \"https://<endpoint>\",\n UV_THREADPOOL_SIZE: \"64\",\n FORCE_COLOR: \"3\",\n //node dist/app usedb postgresResources\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"stsfhirserver\")\n //.withWaitStrategy(Wait.forHttp(\"/stsfhir/r5/latency\", 3005).usingTls().allowInsecure())\n .start();\n\n this.#stsFhirContainer.logs().then((stream: any) => {\n stream\n .on('data', (line: any) => process.stdout.write(line.toString()))\n .on('err', (line: any) => process.stderr.write(line.toString()))\n .on('end', () => console.log('Stream ended.'));\n });\n\n const httpFhirPort = this.#stsFhirContainer.getMappedPort(3005);\n\n await Sleep(200);\n this.#fhirHost = 'https://localhost'\n this.#fhirPort = httpFhirPort;\n this.#fhirEndpoint = `${this.#fhirHost}:${this.#fhirPort}`;\n this.LogDebugMessage(chalk.green(`STSFhir Started. Server Details: Host: [${this.#fhirHost}], Port: [${this.#fhirPort}]`));\n }\n\n StopAuthService = async () => {\n if (this.#stsAuthContainer) {\n await this.#stsAuthContainer.stop();\n await Sleep(200);\n }\n }\n\n StopRest01Service = async () => {\n if (this.#stsRest01Container) {\n await this.#stsRest01Container.stop();\n await Sleep(200);\n }\n }\n\n StopFhirService = async () => {\n if (this.#stsFhirContainer) {\n await this.#stsFhirContainer.stop();\n await Sleep(200);\n }\n }\n\n TestLoginAndVerify = async () => {\n expect.assertions(4);\n\n console.log(`TestLoginAndVerify:1`);\n\n const retVal = await this.Login('user01@stsmda.com.au', 'user01password');\n expect(retVal.status).toEqual(200);\n\n console.log(`TestLoginAndVerify:2`);\n\n this.LogDebugMessage(chalk.red(`${JSON.stringify(retVal.data)}`));\n this.LogDebugMessage(chalk.magenta(`${JSON.stringify(retVal.headers)}`));\n this.LogDebugMessage(chalk.yellow(`${JSON.stringify(retVal.headers['set-cookie'])}`));\n\n const cookies = retVal.headers['set-cookie'] as string[];\n this.LogDebugMessage(chalk.yellow(`${cookies[0]}`));\n this.LogDebugMessage(chalk.green(`${JSON.stringify(tough.Cookie.parse(cookies[0]))}`));\n\n console.log(`TestLoginAndVerify:3`);\n\n const cookie = tough.Cookie.parse(cookies[0]) as tough.Cookie;\n\n console.log(`TestLoginAndVerify:4`);\n\n const desiredCookieResultAxios = {\n key: 'consent_cookie',\n value: expect.stringMatching(this.#regexURLSafeStringComponent),\n path: '/',\n secure: true,\n httpOnly: true,\n sameSite: 'strict',\n }\n\n const cookieResult = JSON.parse(JSON.stringify(cookie));\n expect(cookieResult).toMatchObject(desiredCookieResultAxios);\n\n console.log(`TestLoginAndVerify:5`);\n\n const cookieExpireDate = new Date(cookie.expires as any);\n expect(cookieExpireDate.getTime()).toBeGreaterThan(new Date().getTime());\n\n const consentRequired = (process.env.CONSENT_REQUIRED as string).split(' ').sort();\n retVal.data.detail.consentRequired = retVal.data.detail.consentRequired.sort();\n\n console.log(`TestLoginAndVerify:6`);\n\n const desiredResult = {\n sessionId: expect.stringMatching(this.#regexSTSBase64),\n id_token: expect.stringMatching(this.#regexJWT),\n consentRequired\n }\n\n console.log(`TestLoginAndVerify:7`);\n\n expect(retVal.data.detail).toMatchObject(desiredResult);\n\n console.log(`TestLoginAndVerify:9`);\n }\n\n StartRest01Service = async () => {\n this.#stsRest01Container = await new GenericContainer(\"serza/stsrest01:latest\")\n .withExposedPorts(3003)\n .withEnvironment({\n DB_USER: \"postgres\",\n DB_PASSWORD: \"postgres\",\n DB_HOST: \"database:5432\", \n POOL_SIZE: \"50\",\n MAX_CPU: \"2\",\n DEBUG: \"proc*\",\n HTTPS_SERVER_KEY_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.key\",\n HTTPS_SERVER_CERT_PATH: \"/var/lib/sts/stsglobalresources/keys-tmp/server.cert\",\n //AS_ENDPOINT: \"https://<endpoint>\",\n AS_ENDPOINT: 'https://stsauthrunner', // this.authHost,\n //AS_ENDPOINT: 'https://localhost', // this.authHost,\n AS_HOST_PORT: '3002',\n AS_PORT: '3002',\n IM_REDIS_MESSAGE_PROCESSOR_URL: 'redis://redisstackserver:6379'\n //AS_HOST_PORT: this.authPort,\n //AS_PORT: this.authPort,\n\n //REST01_PORT: '3003',\n //REST01_HOST_PORT: '3003',\n //REST01_ENDPOINT: 'https://localhost' // 'https://<endpoint>'\n })\n .withNetwork(this.#network)\n .withNetworkAliases(\"rest01\")\n .withWaitStrategy(Wait.forHttp(\"/stsrest01/v1/latency\", 3003).usingTls().allowInsecure())\n .start();\n\n const httpRest01Port = this.#stsRest01Container.getMappedPort(3003);\n\n await Sleep(200);\n\n this.#rest01Host = 'https://localhost'\n this.#rest01Port = httpRest01Port;\n this.#rest01Endpoint = `${this.#rest01Host}:${this.#rest01Port}`;\n\n this.LogDebugMessage(chalk.green(`STSRest01 Started. Server Details: Host: [${this.rest01Host}], Port: [${this.rest01Port}]`));\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nsshunt/stsdevtools",
3
- "version": "1.0.97",
3
+ "version": "1.0.101",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -21,23 +21,23 @@
21
21
  "README.md"
22
22
  ],
23
23
  "dependencies": {
24
- "@nsshunt/stsconfig": "^1.27.67",
25
- "@nsshunt/stsutils": "^1.19.105",
24
+ "@nsshunt/stsconfig": "^1.27.68",
25
+ "@nsshunt/stsutils": "^1.19.106",
26
26
  "axios": "^1.16.1",
27
27
  "chalk": "^5.6.2",
28
28
  "testcontainers": "^11.14.0",
29
29
  "tough-cookie": "^6.0.1"
30
30
  },
31
31
  "devDependencies": {
32
- "@types/node": "^25.8.0",
32
+ "@types/node": "^25.9.1",
33
33
  "@types/tough-cookie": "^4.0.5",
34
- "@typescript-eslint/eslint-plugin": "^8.59.3",
35
- "@typescript-eslint/parser": "^8.59.3",
34
+ "@typescript-eslint/eslint-plugin": "^8.60.0",
35
+ "@typescript-eslint/parser": "^8.60.0",
36
36
  "eslint": "^10.4.0",
37
37
  "globals": "^17.6.0",
38
38
  "typescript": "^6.0.3",
39
- "vite": "^8.0.13",
40
- "vitest": "^4.1.6"
39
+ "vite": "^8.0.14",
40
+ "vitest": "^4.1.7"
41
41
  },
42
42
  "repository": {
43
43
  "type": "git",