{"version":3,"sources":["../src/index.ts","../src/lib/docker.ts","../src/lib/dockerNetwork.ts","../src/lib/startPlatypusProject.ts","../src/lib/nodeProcess.ts","../src/lib/stopPlatypusProject.ts"],"sourcesContent":["import { isDockerRunning } from './lib/docker.js';\nimport { getDockerNetworkContainers, getDockerNetworkGatewayIP, isDockerNetworkExisting } from './lib/dockerNetwork.js';\nimport { default as startPlatypusProject } from './lib/startPlatypusProject.js';\nimport { default as stopPlatypusProject } from './lib/stopPlatypusProject.js';\n\nexport {\n    startPlatypusProject,\n    stopPlatypusProject,\n    isDockerRunning,\n    isDockerNetworkExisting,\n    getDockerNetworkGatewayIP,\n    getDockerNetworkContainers,\n};\n","// eslint-disable-next-line import/default\nimport shell from 'shelljs';\n\nexport const isDockerRunning = (): boolean => {\n    const dockerRunning = shell.exec('docker info', { silent: true });\n    return !(dockerRunning.code === 0);\n};\n","// eslint-disable-next-line import/default\nimport shell from 'shelljs';\n\n/** solves problem with internal https routing\n * https://github.com/flexguse/traefik-inter-container-routing\n * https://stackoverflow.com/questions/68022116/how-to-request-to-api-server-from-frontend-app-between-docker-containers\n * https://stackoverflow.com/questions/46446541/traefik-https-access-between-applications-does-not-work\n */\nexport async function getDockerNetworkGatewayIP(dockerNetwork: string): Promise<string> {\n    return new Promise((resolve) => {\n        shell.exec(\n            `docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' \"${dockerNetwork}\"`,\n            { silent: true },\n            function (code: number, stdout: string, stderr: string) {\n                if (stderr) {\n                    throw new Error('docker network inspect error: ' + stderr);\n                }\n                resolve(stdout);\n            }\n        );\n    });\n}\n\n/**\n * Gets array of docker container attached to docker network\n */\nexport async function getDockerNetworkContainers(dockerNetwork: string): Promise<string[]> {\n    return new Promise((resolve) => {\n        shell.exec(\n            `docker network inspect --format '{{range .Containers}}{{.EndpointID}}|{{end}}' \"${dockerNetwork}\"`,\n            { silent: true },\n            function (code: number, stdout: string, stderr: string) {\n                if (stderr) {\n                    throw new Error('docker network inspect error: ' + stderr);\n                }\n                resolve(stdout.split('|').slice(0, -1));\n            }\n        );\n    });\n}\n\n/**\n * checks if docker network with given name exists\n */\nexport async function isDockerNetworkExisting(dockerNetwork: string): Promise<boolean> {\n    return new Promise((resolve) => {\n        shell.exec(\n            `docker network ls | grep -w \"${dockerNetwork}\"`,\n            { silent: true },\n            function (code: number, stdout: string, stderr: string) {\n                if (stderr) {\n                    throw new Error('docker network inspect error: ' + stderr);\n                }\n                if (!stdout) {\n                    resolve(false);\n                }\n                resolve(true);\n            }\n        );\n    });\n}\n","import { existsSync } from 'fs';\nimport { errorLog, getErrorMessage, infoLog } from '@platypus-stack/platypus-app-tools'; // TODO: fix missing dependency before dev task\n\n// eslint-disable-next-line import/default\nimport shell from 'shelljs';\nimport { getDockerNetworkGatewayIP, isDockerNetworkExisting, isDockerRunning } from '../index.js';\nimport { getGID, getUID } from './nodeProcess.js';\n\ninterface IStartPlatypusProject {\n    /** name of the docker network to create */\n    dockerNetworkName: string;\n    /** absolute path to the docker-compose file */\n    dockerComposePath: string;\n    /** whether to pull the images before starting the containers */\n    pull?: boolean;\n    /** path to the project directory */\n    projectDirectory?: string; // path to the project directory\n    /** additional args to docker compose command like --env-file */\n    additionalArgs?: string;\n}\n\nasync function startPlatypusProject({\n    dockerNetworkName,\n    dockerComposePath,\n    pull = false,\n    projectDirectory,\n    additionalArgs,\n}: IStartPlatypusProject): Promise<void> {\n    console.log('--- Starting platypus project  ---');\n    if (pull) {\n        infoLog('Pulling images before starting containers.');\n    }\n\n    if (!existsSync(dockerComposePath)) {\n        errorLog('docker-compose file not found');\n        errorLog(`File ${dockerComposePath} not found.`);\n        return;\n    }\n\n    if (isDockerRunning()) {\n        errorLog('Docker not running. Start Docker first');\n        return;\n    }\n\n    if (!(await isDockerNetworkExisting(dockerNetworkName))) {\n        infoLog(`Docker network ${dockerNetworkName} not found. Creating new docker network.`);\n        try {\n            const creatingNewDockerNetwork = shell.exec(`docker network create ${dockerNetworkName}`);\n            if (creatingNewDockerNetwork.code !== 0) {\n                throw Error(creatingNewDockerNetwork.stderr);\n            }\n        } catch (e) {\n            errorLog(`Error while creating docker network ${dockerNetworkName}.`);\n            errorLog(getErrorMessage(e));\n            return;\n        }\n    }\n\n    try {\n        shell.env['CURRENT_UID'] = `${getUID()}:${getGID()}`; // backwards compatibility\n        shell.env['MY_UID'] = `${getUID()}`;\n        shell.env['MY_GID'] = `${getGID()}`;\n    } catch (e) {\n        errorLog(getErrorMessage(e));\n    }\n\n    try {\n        const gatewayIP = await getDockerNetworkGatewayIP(dockerNetworkName);\n        infoLog('exporting gatewayIP as DOCKER_NETWORK_GATEWAY');\n        infoLog(gatewayIP);\n        shell.env['DOCKER_NETWORK_GATEWAY'] = String(gatewayIP).trim();\n    } catch (e) {\n        errorLog(`Error while getting docker network gateway IP && exporting it for shelljs process.`);\n        errorLog(getErrorMessage(e));\n        return;\n    }\n\n    const composeCMD = `docker compose ${projectDirectory ? `--project-directory ${projectDirectory}` : ''} ${\n        additionalArgs ? additionalArgs : ''\n    } -f ${dockerComposePath}`;\n\n    console.log('Docker compose args:');\n    console.log(composeCMD);\n\n    try {\n        if (pull) {\n            const pullCMD = shell.exec(`${composeCMD} pull`, { silent: true });\n            if (pullCMD.code !== 0) {\n                throw Error(pullCMD.stderr);\n            }\n        }\n        const creating = shell.exec(`${composeCMD} up -d`, { silent: true });\n        if (creating.code !== 0) {\n            throw Error(creating.stderr);\n        }\n    } catch (e) {\n        errorLog(`Error while starting docker containers`);\n        errorLog(getErrorMessage(e));\n    }\n}\n\nexport default startPlatypusProject;\n","export const getUID = (): string => {\n    if (!process.getuid) {\n        throw Error('process.getuid is not defined');\n    }\n    return process.getuid().toString();\n};\n\nexport const getGID = (): string => {\n    if (!process.getgid) {\n        throw Error('process.getgid is not defined');\n    }\n    return process.getgid().toString();\n};\n","import { existsSync } from 'fs';\nimport { errorLog, getErrorMessage, infoLog } from '@platypus-stack/platypus-app-tools';\n// eslint-disable-next-line import/default\nimport shell from 'shelljs';\nimport { getDockerNetworkContainers, getDockerNetworkGatewayIP, isDockerNetworkExisting } from '../index.js';\nimport { getGID, getUID } from './nodeProcess';\n\ninterface IStopPlatypusProject {\n    /** name of the docker network to create */\n    dockerNetworkName: string;\n    /** absolute path to the docker-compose file */\n    dockerComposePath: string;\n    /** path to the project directory */\n    projectDirectory?: string; // path to the project directory\n    /** additional args to docker compose command like --env-file */\n    additionalArgs?: string;\n    /** whether to remove orphan containers */\n    removeOrphans?: boolean;\n}\n\nconst stopPlatypusProject = async ({\n    dockerComposePath,\n    dockerNetworkName,\n    projectDirectory,\n    additionalArgs,\n    removeOrphans,\n}: IStopPlatypusProject) => {\n    if (!existsSync(dockerComposePath)) {\n        errorLog('docker-compose file not found');\n        errorLog(`File ${dockerComposePath} not found.`);\n        return;\n    }\n\n    if (!(await isDockerNetworkExisting(dockerNetworkName))) {\n        errorLog(`Docker network ${dockerNetworkName} not found.`);\n        return;\n    }\n\n    try {\n        shell.env['CURRENT_UID'] = `${getUID()}:${getGID()}`;\n    } catch (e) {\n        errorLog(getErrorMessage(e));\n    }\n\n    try {\n        const gatewayIP = await getDockerNetworkGatewayIP(dockerNetworkName);\n        infoLog('exporting gatewayIP as DOCKER_NETWORK_GATEWAY');\n        infoLog(gatewayIP);\n        shell.env['DOCKER_NETWORK_GATEWAY'] = String(gatewayIP).trim();\n    } catch (e) {\n        errorLog(`Error while getting docker network gateway IP && exporting it for shelljs process.`);\n        errorLog(getErrorMessage(e));\n        return;\n    }\n\n    const composeCMD = `docker compose ${projectDirectory ? `--project-directory ${projectDirectory}` : ''} ${\n        additionalArgs ? additionalArgs : ''\n    } -f ${dockerComposePath} down ${removeOrphans ? '--remove-orphans' : ''}`;\n\n    console.log('Docker compose args:');\n    console.log(composeCMD);\n\n    try {\n        infoLog(`Stopping docker containers`);\n        const stopping = shell.exec(composeCMD);\n        if (stopping.code !== 0) {\n            throw Error(stopping.stderr);\n        }\n    } catch (e) {\n        errorLog(`Error while stopping docker containers.`);\n        errorLog(getErrorMessage(e));\n        return;\n    }\n\n    try {\n        if (await isDockerNetworkExisting(dockerNetworkName)) {\n            if ((await getDockerNetworkContainers(dockerNetworkName)).length === 0) {\n                infoLog(`Removing docker network ${dockerNetworkName}`);\n                const networkRemoving = shell.exec(`docker network rm ${dockerNetworkName}`, { silent: true });\n                if (networkRemoving.code !== 0) {\n                    throw Error(networkRemoving.stderr);\n                }\n                infoLog(`Docker network ${dockerNetworkName} removed`);\n            } else {\n                infoLog(`Docker network ${dockerNetworkName} not empty.`);\n            }\n        }\n    } catch (e) {\n        errorLog(`Error while removing docker network ${dockerNetworkName}.`);\n        errorLog(getErrorMessage(e));\n        return;\n    }\n};\n\nexport default stopPlatypusProject;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,qBAAkB;AAEX,IAAM,kBAAkB,MAAe;AAC1C,QAAM,gBAAgB,eAAAA,QAAM,KAAK,eAAe,EAAE,QAAQ,KAAK,CAAC;AAChE,SAAO,EAAE,cAAc,SAAS;AACpC;;;ACLA,IAAAC,kBAAkB;AAOlB,eAAsB,0BAA0B,eAAwC;AACpF,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC5B,oBAAAC,QAAM;AAAA,MACF,gFAAgF;AAAA,MAChF,EAAE,QAAQ,KAAK;AAAA,MACf,SAAU,MAAc,QAAgB,QAAgB;AACpD,YAAI,QAAQ;AACR,gBAAM,IAAI,MAAM,mCAAmC,MAAM;AAAA,QAC7D;AACA,gBAAQ,MAAM;AAAA,MAClB;AAAA,IACJ;AAAA,EACJ,CAAC;AACL;AAKA,eAAsB,2BAA2B,eAA0C;AACvF,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC5B,oBAAAA,QAAM;AAAA,MACF,mFAAmF;AAAA,MACnF,EAAE,QAAQ,KAAK;AAAA,MACf,SAAU,MAAc,QAAgB,QAAgB;AACpD,YAAI,QAAQ;AACR,gBAAM,IAAI,MAAM,mCAAmC,MAAM;AAAA,QAC7D;AACA,gBAAQ,OAAO,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,MAC1C;AAAA,IACJ;AAAA,EACJ,CAAC;AACL;AAKA,eAAsB,wBAAwB,eAAyC;AACnF,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC5B,oBAAAA,QAAM;AAAA,MACF,gCAAgC;AAAA,MAChC,EAAE,QAAQ,KAAK;AAAA,MACf,SAAU,MAAc,QAAgB,QAAgB;AACpD,YAAI,QAAQ;AACR,gBAAM,IAAI,MAAM,mCAAmC,MAAM;AAAA,QAC7D;AACA,YAAI,CAAC,QAAQ;AACT,kBAAQ,KAAK;AAAA,QACjB;AACA,gBAAQ,IAAI;AAAA,MAChB;AAAA,IACJ;AAAA,EACJ,CAAC;AACL;;;AC5DA,gBAA2B;AAC3B,gCAAmD;AAGnD,IAAAC,kBAAkB;;;ACJX,IAAM,SAAS,MAAc;AAChC,MAAI,CAAC,QAAQ,QAAQ;AACjB,UAAM,MAAM,+BAA+B;AAAA,EAC/C;AACA,SAAO,QAAQ,OAAO,EAAE,SAAS;AACrC;AAEO,IAAM,SAAS,MAAc;AAChC,MAAI,CAAC,QAAQ,QAAQ;AACjB,UAAM,MAAM,+BAA+B;AAAA,EAC/C;AACA,SAAO,QAAQ,OAAO,EAAE,SAAS;AACrC;;;ADSA,eAAe,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AACJ,GAAyC;AACrC,UAAQ,IAAI,oCAAoC;AAChD,MAAI,MAAM;AACN,2CAAQ,4CAA4C;AAAA,EACxD;AAEA,MAAI,KAAC,sBAAW,iBAAiB,GAAG;AAChC,4CAAS,+BAA+B;AACxC,4CAAS,QAAQ,8BAA8B;AAC/C;AAAA,EACJ;AAEA,MAAI,gBAAgB,GAAG;AACnB,4CAAS,wCAAwC;AACjD;AAAA,EACJ;AAEA,MAAI,CAAE,MAAM,wBAAwB,iBAAiB,GAAI;AACrD,2CAAQ,kBAAkB,2DAA2D;AACrF,QAAI;AACA,YAAM,2BAA2B,gBAAAC,QAAM,KAAK,yBAAyB,mBAAmB;AACxF,UAAI,yBAAyB,SAAS,GAAG;AACrC,cAAM,MAAM,yBAAyB,MAAM;AAAA,MAC/C;AAAA,IACJ,SAAS,GAAP;AACE,8CAAS,uCAAuC,oBAAoB;AACpE,kDAAS,2CAAgB,CAAC,CAAC;AAC3B;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI;AACA,oBAAAA,QAAM,IAAI,aAAa,IAAI,GAAG,OAAO,KAAK,OAAO;AACjD,oBAAAA,QAAM,IAAI,QAAQ,IAAI,GAAG,OAAO;AAChC,oBAAAA,QAAM,IAAI,QAAQ,IAAI,GAAG,OAAO;AAAA,EACpC,SAAS,GAAP;AACE,gDAAS,2CAAgB,CAAC,CAAC;AAAA,EAC/B;AAEA,MAAI;AACA,UAAM,YAAY,MAAM,0BAA0B,iBAAiB;AACnE,2CAAQ,+CAA+C;AACvD,2CAAQ,SAAS;AACjB,oBAAAA,QAAM,IAAI,wBAAwB,IAAI,OAAO,SAAS,EAAE,KAAK;AAAA,EACjE,SAAS,GAAP;AACE,4CAAS,oFAAoF;AAC7F,gDAAS,2CAAgB,CAAC,CAAC;AAC3B;AAAA,EACJ;AAEA,QAAM,aAAa,kBAAkB,mBAAmB,uBAAuB,qBAAqB,MAChG,iBAAiB,iBAAiB,SAC/B;AAEP,UAAQ,IAAI,sBAAsB;AAClC,UAAQ,IAAI,UAAU;AAEtB,MAAI;AACA,QAAI,MAAM;AACN,YAAM,UAAU,gBAAAA,QAAM,KAAK,GAAG,mBAAmB,EAAE,QAAQ,KAAK,CAAC;AACjE,UAAI,QAAQ,SAAS,GAAG;AACpB,cAAM,MAAM,QAAQ,MAAM;AAAA,MAC9B;AAAA,IACJ;AACA,UAAM,WAAW,gBAAAA,QAAM,KAAK,GAAG,oBAAoB,EAAE,QAAQ,KAAK,CAAC;AACnE,QAAI,SAAS,SAAS,GAAG;AACrB,YAAM,MAAM,SAAS,MAAM;AAAA,IAC/B;AAAA,EACJ,SAAS,GAAP;AACE,4CAAS,wCAAwC;AACjD,gDAAS,2CAAgB,CAAC,CAAC;AAAA,EAC/B;AACJ;AAEA,IAAO,+BAAQ;;;AErGf,IAAAC,aAA2B;AAC3B,IAAAC,6BAAmD;AAEnD,IAAAC,kBAAkB;AAiBlB,IAAM,sBAAsB,OAAO;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAA4B;AACxB,MAAI,KAAC,uBAAW,iBAAiB,GAAG;AAChC,6CAAS,+BAA+B;AACxC,6CAAS,QAAQ,8BAA8B;AAC/C;AAAA,EACJ;AAEA,MAAI,CAAE,MAAM,wBAAwB,iBAAiB,GAAI;AACrD,6CAAS,kBAAkB,8BAA8B;AACzD;AAAA,EACJ;AAEA,MAAI;AACA,oBAAAC,QAAM,IAAI,aAAa,IAAI,GAAG,OAAO,KAAK,OAAO;AAAA,EACrD,SAAS,GAAP;AACE,iDAAS,4CAAgB,CAAC,CAAC;AAAA,EAC/B;AAEA,MAAI;AACA,UAAM,YAAY,MAAM,0BAA0B,iBAAiB;AACnE,4CAAQ,+CAA+C;AACvD,4CAAQ,SAAS;AACjB,oBAAAA,QAAM,IAAI,wBAAwB,IAAI,OAAO,SAAS,EAAE,KAAK;AAAA,EACjE,SAAS,GAAP;AACE,6CAAS,oFAAoF;AAC7F,iDAAS,4CAAgB,CAAC,CAAC;AAC3B;AAAA,EACJ;AAEA,QAAM,aAAa,kBAAkB,mBAAmB,uBAAuB,qBAAqB,MAChG,iBAAiB,iBAAiB,SAC/B,0BAA0B,gBAAgB,qBAAqB;AAEtE,UAAQ,IAAI,sBAAsB;AAClC,UAAQ,IAAI,UAAU;AAEtB,MAAI;AACA,4CAAQ,4BAA4B;AACpC,UAAM,WAAW,gBAAAA,QAAM,KAAK,UAAU;AACtC,QAAI,SAAS,SAAS,GAAG;AACrB,YAAM,MAAM,SAAS,MAAM;AAAA,IAC/B;AAAA,EACJ,SAAS,GAAP;AACE,6CAAS,yCAAyC;AAClD,iDAAS,4CAAgB,CAAC,CAAC;AAC3B;AAAA,EACJ;AAEA,MAAI;AACA,QAAI,MAAM,wBAAwB,iBAAiB,GAAG;AAClD,WAAK,MAAM,2BAA2B,iBAAiB,GAAG,WAAW,GAAG;AACpE,gDAAQ,2BAA2B,mBAAmB;AACtD,cAAM,kBAAkB,gBAAAA,QAAM,KAAK,qBAAqB,qBAAqB,EAAE,QAAQ,KAAK,CAAC;AAC7F,YAAI,gBAAgB,SAAS,GAAG;AAC5B,gBAAM,MAAM,gBAAgB,MAAM;AAAA,QACtC;AACA,gDAAQ,kBAAkB,2BAA2B;AAAA,MACzD,OAAO;AACH,gDAAQ,kBAAkB,8BAA8B;AAAA,MAC5D;AAAA,IACJ;AAAA,EACJ,SAAS,GAAP;AACE,6CAAS,uCAAuC,oBAAoB;AACpE,iDAAS,4CAAgB,CAAC,CAAC;AAC3B;AAAA,EACJ;AACJ;AAEA,IAAO,8BAAQ;","names":["shell","import_shelljs","shell","import_shelljs","shell","import_fs","import_platypus_app_tools","import_shelljs","shell"]}