import { execSync } from "child_process"; import { join as pathJoin, relative as pathRelative } from "path"; import { exclude } from "tsafe/exclude"; import * as fs from "fs"; const keycloakifyDirPath = pathJoin(__dirname, "..", ".."); fs.writeFileSync( pathJoin(keycloakifyDirPath, "dist", "package.json"), Buffer.from( JSON.stringify( (() => { const packageJsonParsed = JSON.parse(fs.readFileSync(pathJoin(keycloakifyDirPath, "package.json")).toString("utf8")); return { ...packageJsonParsed, "main": packageJsonParsed["main"].replace(/^dist\//, ""), "types": packageJsonParsed["types"].replace(/^dist\//, "") }; })(), null, 2 ), "utf8" ) ); const commonThirdPartyDeps = (() => { const namespaceModuleNames = ["@emotion"]; const standaloneModuleNames = ["react", "@types/react", "powerhooks", "tss-react", "evt"]; return [ ...namespaceModuleNames .map(namespaceModuleName => fs .readdirSync(pathJoin(keycloakifyDirPath, "node_modules", namespaceModuleName)) .map(submoduleName => `${namespaceModuleName}/${submoduleName}`) ) .reduce((prev, curr) => [...prev, ...curr], []), ...standaloneModuleNames ]; })(); const yarnHomeDirPath = pathJoin(keycloakifyDirPath, ".yarn_home"); execSync(["rm -rf", "mkdir"].map(cmd => `${cmd} ${yarnHomeDirPath}`).join(" && ")); const execYarnLink = (params: { targetModuleName?: string; cwd: string }) => { const { targetModuleName, cwd } = params; const cmd = ["yarn", "link", ...(targetModuleName !== undefined ? [targetModuleName] : [])].join(" "); console.log(`$ cd ${pathRelative(keycloakifyDirPath, cwd) || "."} && ${cmd}`); execSync(cmd, { cwd, "env": { ...process.env, "HOME": yarnHomeDirPath } }); }; const testAppPaths = (() => { const arg = process.argv[2]; const testAppNames = arg !== undefined ? [arg] : ["keycloakify-starter", "keycloakify-advanced-starter"]; return testAppNames .map(testAppName => { const testAppPath = pathJoin(keycloakifyDirPath, "..", testAppName); if (fs.existsSync(testAppPath)) { return testAppPath; } console.warn(`Skipping ${testAppName} since it cant be found here: ${testAppPath}`); return undefined; }) .filter(exclude(undefined)); })(); console.log(testAppPaths); if (testAppPaths.length === 0) { console.error("No test app to link into!"); process.exit(-1); } testAppPaths.forEach(testAppPath => execSync("yarn install", { "cwd": testAppPath })); console.log("=== Linking common dependencies ==="); const total = commonThirdPartyDeps.length; let current = 0; commonThirdPartyDeps.forEach(commonThirdPartyDep => { current++; console.log(`${current}/${total} ${commonThirdPartyDep}`); const localInstallPath = pathJoin( ...[keycloakifyDirPath, "node_modules", ...(commonThirdPartyDep.startsWith("@") ? commonThirdPartyDep.split("/") : [commonThirdPartyDep])] ); execYarnLink({ "cwd": localInstallPath }); }); commonThirdPartyDeps.forEach(commonThirdPartyDep => testAppPaths.forEach(testAppPath => execYarnLink({ "cwd": testAppPath, "targetModuleName": commonThirdPartyDep }) ) ); console.log("=== Linking in house dependencies ==="); execYarnLink({ "cwd": pathJoin(keycloakifyDirPath, "dist") }); testAppPaths.forEach(testAppPath => execYarnLink({ "cwd": testAppPath, "targetModuleName": "keycloakify" }) );