@slicemachine/init 1.0.2-slicecanvas.0 → 1.1.1-alpha.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/utils/tracker.ts","../src/utils/index.ts","../src/steps/install-required-dependencies.ts","../src/steps/validate-pkg.ts","../src/steps/maybe-existing-repo.ts","../src/steps/create-repo.ts","../src/steps/detect-framework.ts","../src/utils/communication.ts","../src/steps/loginOrBypass.ts","../src/steps/configure-project.ts","../src/steps/display-final-message.ts","../src/utils/PackageManager.ts","../src/steps/install-lib.ts","../src/index.ts"],"sourcesContent":["/*\n * DUPLICATION\n * this file is a duplication of ServerTracker in sm-ui\n * this duplication has been done on purpose to simplify the merge if init becomes part of sm-ui\n * or if we decide to share the tracker implementation from a lib, but it'll need some refactoring\n * Duplication means no entanglement so don't merge this with the other implem and keep the structure.\n */\n\nimport ServerAnalytics from \"analytics-node\";\n\nexport enum EventType {\n DownloadLibrary = \"SliceMachine Download Library\",\n}\n\nexport class Tracker {\n constructor(\n readonly analytics: ServerAnalytics,\n readonly repo: string,\n readonly identifier: { userId: string } | { anonymousId: string },\n readonly tracking = true\n ) {}\n\n static build(\n writeKey: string,\n repo: string | undefined,\n identifier: { userId: string } | { anonymousId: string },\n tracking = true\n ): Tracker | undefined {\n try {\n if (!repo) return;\n const analytics = new ServerAnalytics(writeKey);\n return new Tracker(analytics, repo, identifier, tracking);\n } catch (error) {\n console.warn(error);\n return;\n }\n }\n\n private trackEvent(\n eventType: EventType,\n attributes: Record<string, unknown> = {}\n ): void {\n this.tracking &&\n this.analytics.track({\n event: eventType,\n ...this.identifier,\n properties: attributes,\n });\n }\n\n Track = {\n // not called, for demo only\n downloadLibrary: (library: string): void => {\n this.trackEvent(EventType.DownloadLibrary, { library });\n },\n };\n}\n","import util from \"util\";\nimport { exec } from \"child_process\";\n\nexport function findArgument(args: string[], name: string): string | undefined {\n const flagIndex: number = args.indexOf(`--${name}`);\n\n if (flagIndex === -1) return;\n if (args.length < flagIndex + 2) return;\n\n const flagValue = args[flagIndex + 1];\n\n if (flagValue.startsWith(\"--\")) return;\n return flagValue;\n}\n\nexport const execCommand: (\n command: string\n) => Promise<{ stderr: string; stdout: string }> = util.promisify(exec);\n","import path from \"path\";\nimport { execCommand } from \"../utils\";\nimport { Utils, FileSystem, Models } from \"@slicemachine/core\";\n\nconst {\n PRISMIC_CLIENT,\n PRISMIC_DOM_PACKAGE_NAME,\n PRISMIC_REACT_PACKAGE_NAME,\n NEXT_SLICEZONE,\n SM_PACKAGE_NAME,\n NUXT_PRISMIC,\n NUXT_SM,\n VUE_SLICEZONE,\n PRISMIC_VUE,\n SLICE_SIMULATOR_REACT,\n SLICE_SIMULATOR_VUE,\n} = Utils.CONSTS;\n\nfunction depsForFramework(framework: Models.Frameworks): string {\n switch (framework) {\n case Models.Frameworks.react:\n return `${PRISMIC_REACT_PACKAGE_NAME} ${PRISMIC_CLIENT}`;\n case Models.Frameworks.next:\n return `${PRISMIC_REACT_PACKAGE_NAME} ${PRISMIC_CLIENT}@v5.1.1 ${NEXT_SLICEZONE} ${SLICE_SIMULATOR_REACT}`;\n case Models.Frameworks.svelte:\n return `${PRISMIC_DOM_PACKAGE_NAME} ${PRISMIC_CLIENT}`;\n case Models.Frameworks.nuxt:\n return `${NUXT_PRISMIC} ${NUXT_SM} ${VUE_SLICEZONE} ${SLICE_SIMULATOR_VUE}`;\n case Models.Frameworks.vue:\n return `${PRISMIC_VUE} ${PRISMIC_CLIENT}@v5.1.1 ${PRISMIC_DOM_PACKAGE_NAME} ${VUE_SLICEZONE}`;\n default:\n return \"\";\n }\n}\n\nexport async function installRequiredDependencies(\n cwd: string,\n framework: Models.Frameworks\n): Promise<void> {\n const yarnLock = Utils.Files.exists(FileSystem.YarnLockPath(cwd));\n const installDevDependencyCommand = yarnLock\n ? \"yarn add -D\"\n : \"npm install --save-dev\";\n const installDependencyCommand = yarnLock ? \"yarn add\" : \"npm install --save\";\n\n const spinner = Utils.spinner(\"Downloading Prismic Visual Builder\");\n spinner.start();\n\n const { stderr } = await execCommand(\n `${installDevDependencyCommand} ${SM_PACKAGE_NAME}`\n );\n\n const deps = depsForFramework(framework);\n if (deps) await execCommand(`${installDependencyCommand} ${deps}`);\n\n const pathToPkg = path.join(\n FileSystem.PackagePaths(cwd).value(),\n SM_PACKAGE_NAME\n );\n const isPackageInstalled = Utils.Files.exists(pathToPkg);\n\n if (isPackageInstalled || !stderr.length) {\n spinner.succeed(\"The Prismic Visual Builder was installed successfully\");\n return;\n }\n\n spinner.fail();\n Utils.writeWarning(\n `could not install ${SM_PACKAGE_NAME}. Please do it manually!`\n );\n}\n","import { FileSystem, Utils } from \"@slicemachine/core\";\n\nexport function validatePkg(cwd: string): void {\n const jsonPackage = FileSystem.retrieveJsonPackage(cwd);\n if (!jsonPackage.exists) {\n Utils.writeError(`package.json not found. Are you in the right folder?`);\n return process.exit(-1);\n }\n if (!jsonPackage.content) {\n Utils.writeError(`could not parse package.json.`);\n return process.exit(-1);\n }\n}\n","import * as inquirer from \"inquirer\";\nimport Separator from \"inquirer/lib/objects/separator\";\nimport { Communication, Utils, FileSystem } from \"@slicemachine/core\";\nimport { Repositories } from \"@slicemachine/core/src/models/Repositories\";\nimport { Repository } from \"@slicemachine/core/src/models/Repository\";\nimport { parsePrismicAuthToken } from \"@slicemachine/core/build/src/utils/cookie\";\n\nexport const CREATE_REPO = \"$_CREATE_REPO\"; // not a valid domain name\nconst DEFAULT_BASE = Utils.CONSTS.DEFAULT_BASE;\n\nexport function prettyRepoName(address: URL, value?: string): string {\n const repoName = value ? Utils.cyan(value) : Utils.dim.cyan(\"repo-name\");\n return `${Utils.cyan.dim(`${address.protocol}//`)}${repoName}${Utils.cyan.dim(\n `.${address.hostname}`\n )}`;\n}\n\nexport async function promptForRepoName(base: string): Promise<string> {\n const address = new URL(base);\n\n Utils.writeInfo(\n \"The name acts as a domain/endpoint for your content repo and should be completely unique.\"\n );\n\n return inquirer\n .prompt<Record<string, string>>([\n {\n name: \"repoName\",\n message: \"Name your Prismic repository\",\n type: \"input\",\n required: true,\n transformer: (value) => prettyRepoName(address, String(value)),\n async validate(name: string) {\n const result = await Communication.validateRepositoryName(\n name,\n base,\n false\n );\n return result === name || result;\n },\n },\n ])\n .then((res) => res.repoName);\n}\n\nexport type RepoPrompt = { name: string; value: string; disabled?: string };\n\nexport type PromptOrSeparator = RepoPrompt | Separator;\n\nexport type RepoPrompts = Array<PromptOrSeparator>;\n\nexport function makeReposPretty(base: string) {\n return function ({ name, domain, role }: Repository): RepoPrompt {\n const address = new URL(base);\n address.hostname = `${domain}.${address.hostname}`;\n if (Utils.roles.canUpdateCustomTypes(role) === false) {\n return {\n name: `${Utils.purple.dim(\"Use\")} ${Utils.bold.dim(\n name\n )} ${Utils.purple.dim(`\"${address.hostname}\"`)}`,\n value: domain,\n disabled: \"Unauthorized\",\n };\n }\n\n return {\n name: `${Utils.purple(\"Use\")} ${Utils.bold(name)} ${Utils.purple(\n `\"${address.hostname}\"`\n )}`,\n value: name,\n };\n };\n}\n\nexport function orderPrompts(maybeName?: string | null) {\n return (a: PromptOrSeparator, b: PromptOrSeparator): number => {\n if (a instanceof Separator || b instanceof Separator) return 0;\n if (maybeName && (a.value === maybeName || b.value === maybeName)) return 0;\n if (a.value === CREATE_REPO || b.value === CREATE_REPO) return 0;\n if (a.disabled && !b.disabled) return 1;\n if (!a.disabled && b.disabled) return -1;\n return 0;\n };\n}\n\nexport function maybeStickTheRepoToTheTopOfTheList(repoName?: string | null) {\n return (acc: RepoPrompts, curr: RepoPrompt): RepoPrompts => {\n if (repoName && curr.value === repoName) {\n return [curr, ...acc];\n }\n return [...acc, curr];\n };\n}\n\nexport function sortReposForPrompt(\n repos: Repositories,\n base: string,\n cwd: string\n): RepoPrompts {\n const createNew = {\n name: `${Utils.purple(\"Create a\")} ${Utils.bold(\"new\")} ${Utils.purple(\n \"Repository\"\n )}`,\n value: CREATE_REPO,\n };\n\n const maybeConfiguredRepoName = FileSystem.maybeRepoNameFromSMFile(cwd, base);\n\n return repos\n .reverse()\n .map(makeReposPretty(base))\n .reduce(maybeStickTheRepoToTheTopOfTheList(maybeConfiguredRepoName), [\n createNew,\n ])\n .sort(orderPrompts(maybeConfiguredRepoName));\n}\n\nexport async function maybeExistingRepo(\n cookies: string,\n cwd: string,\n base = DEFAULT_BASE\n): Promise<{ name: string; existing: boolean }> {\n const token = parsePrismicAuthToken(cookies);\n const repos = await Communication.listRepositories(token);\n\n if (repos.length === 0) {\n const name = await promptForRepoName(base);\n return { existing: false, name };\n }\n\n const choices = sortReposForPrompt(repos, base, cwd);\n\n const numberOfDisabledRepos = choices.filter((repo) => {\n if (repo instanceof Separator) return false;\n return repo.disabled;\n }).length;\n\n const res = await inquirer.prompt<Record<string, string>>([\n {\n type: \"list\",\n name: \"repoName\",\n default: 0,\n required: true,\n message: \"Connect a Prismic Repository or create a new one\",\n choices,\n pageSize: numberOfDisabledRepos + 2 <= 7 ? 7 : numberOfDisabledRepos + 2,\n // loop: false\n },\n ]);\n\n if (res.repoName === CREATE_REPO) {\n const name = await promptForRepoName(base);\n return { existing: false, name };\n }\n return { existing: true, name: res.repoName };\n}\n","import { Communication, Utils } from \"@slicemachine/core\";\nimport type { Models } from \"@slicemachine/core\";\n\nexport function createRepository(\n domain: string,\n framework: Models.Frameworks,\n config: Models.PrismicSharedConfig\n): Promise<void> {\n const spinner = Utils.spinner(\"Creating Prismic Repository\");\n spinner.start();\n\n return Communication.createRepository(\n domain,\n config.cookies,\n framework,\n config.base\n )\n .then((res) => {\n const addressUrl = new URL(config.base);\n addressUrl.hostname = `${res.data.domain || domain}.${\n addressUrl.hostname\n }`;\n const address = addressUrl.toString();\n spinner.succeed(`We created your new repository ${address}`);\n })\n .catch((error: Error) => {\n spinner.fail(`Error creating repository ${domain}`);\n if (error.message) {\n Utils.writeError(error.message);\n }\n Utils.writeError(`We failed to create you new prismic repository`);\n console.log(`Run ${Utils.bold(\"npx slicemachine init\")} again!`);\n process.exit(-1);\n });\n}\n","import { Utils } from \"@slicemachine/core\";\nimport { Models } from \"@slicemachine/core\";\nimport * as inquirer from \"inquirer\";\n\nexport type FrameworkResult = {\n value: Models.Frameworks;\n manuallyAdded: boolean;\n};\n\nexport async function promptForFramework(): Promise<FrameworkResult> {\n const choices = Models.SupportedFrameworks.map((framework) => {\n return {\n name: Utils.Framework.fancyName(framework),\n value: framework,\n };\n });\n\n return inquirer\n .prompt<{ framework: Models.Frameworks }>([\n {\n name: \"framework\",\n type: \"list\",\n message: \"Select a framework to use\",\n required: true,\n choices,\n },\n ])\n .then((res) => {\n return {\n value: res.framework,\n manuallyAdded: true,\n };\n });\n}\n\nexport async function detectFramework(cwd: string): Promise<FrameworkResult> {\n const failMessage = `Please run ${Utils.bold(\n \"npx slicemachine init\"\n )} in a Nuxt or Next.js project`;\n\n const spinner = Utils.spinner(\n \"Detecting framework to install correct dependencies\"\n );\n\n spinner.start();\n\n try {\n const maybeFramework = Utils.Framework.defineFramework({\n cwd,\n supportedFrameworks: Object.values(Models.Frameworks),\n });\n\n spinner.stop();\n\n if (!maybeFramework || maybeFramework === Models.Frameworks.vanillajs) {\n Utils.writeError(\"Framework not detected\");\n return await promptForFramework();\n }\n\n const nameToPrint = Utils.Framework.fancyName(maybeFramework);\n\n if (!Utils.Framework.isFrameworkSupported(maybeFramework)) {\n Utils.writeError(`${nameToPrint} is currently not supported`);\n console.log(failMessage);\n process.exit(1);\n }\n\n Utils.writeCheck(`${nameToPrint} detected`);\n\n return {\n value: maybeFramework,\n manuallyAdded: false,\n };\n } catch (error) {\n spinner.fail(\"package.json not found\");\n\n if (error instanceof Error && error.message) {\n Utils.writeError(error.message);\n } else {\n console.log(failMessage);\n }\n\n process.exit(1);\n }\n}\n","import axios from \"axios\";\nimport * as t from \"io-ts\";\nimport { pipe } from \"fp-ts/function\";\nimport { fold } from \"fp-ts/Either\";\nimport { Utils, Communication, FileSystem } from \"@slicemachine/core\";\n\nconst UserProfile = t.exact(\n t.type({\n userId: t.string,\n shortId: t.string,\n email: t.string,\n firstName: t.string,\n lastName: t.string,\n })\n);\n\nexport type UserProfile = t.TypeOf<typeof UserProfile>;\n\nexport async function getUserProfile(\n cookies: string,\n base = Utils.CONSTS.DEFAULT_BASE\n): Promise<UserProfile> {\n // note the auth server also provides a userId\n\n const url = new URL(base);\n url.hostname = `user.${url.hostname}`;\n url.pathname = \"profile\";\n\n const endpoint = url.toString();\n const token = Utils.Cookie.parsePrismicAuthToken(cookies);\n\n return axios\n .get<UserProfile>(endpoint, {\n headers: {\n Authorization: `Bearer Token ${token}`,\n },\n })\n .then((res) =>\n pipe(\n UserProfile.decode(res.data),\n fold<t.Errors, UserProfile, UserProfile>(\n () => {\n throw new Error(\"Can't parse user profile\");\n },\n (data: UserProfile) => data\n )\n )\n );\n}\n\nexport async function validateSessionAndGetProfile(\n base = Utils.CONSTS.DEFAULT_BASE\n): Promise<{\n info: Communication.UserInfo;\n profile: UserProfile | null;\n} | null> {\n const config = FileSystem.PrismicSharedConfigManager.get();\n\n if (!config.cookies.length) return Promise.resolve(null); // default config, logged out.\n if (base != config.base) return Promise.resolve(null); // not the same base so it doesn't\n\n try {\n const info = await Communication.validateSession(config.cookies, base);\n const profile = await getUserProfile(config.cookies, base).catch(\n () => null\n );\n if (profile?.shortId) {\n FileSystem.PrismicSharedConfigManager.setProperties({\n shortId: profile.shortId,\n });\n }\n return { info, profile };\n } catch {\n return null;\n }\n}\n","import { Utils, Communication, Auth } from \"@slicemachine/core\";\nimport {\n validateSessionAndGetProfile,\n UserProfile,\n} from \"../utils/communication\";\n\nexport async function loginOrBypass(base: string): Promise<{\n info: Communication.UserInfo;\n profile: UserProfile | null;\n} | null> {\n const user = await validateSessionAndGetProfile(base).catch((err) =>\n console.log(err)\n );\n if (user) {\n const email = user.info.email;\n Utils.writeCheck(`Logged in as ${Utils.bold(email)}`);\n return user;\n } else {\n await Auth.login(base);\n const user = await validateSessionAndGetProfile(base);\n return user;\n }\n}\n","import { FileSystem, Utils } from \"@slicemachine/core\";\nimport type { Models } from \"@slicemachine/core\";\nimport { FrameworkResult } from \"./detect-framework\";\n\ntype Base = Utils.Endpoints.Base;\n\nexport function configureProject(\n cwd: string,\n base: Base,\n repository: string,\n framework: FrameworkResult,\n sliceLibPath: string[] = [],\n tracking = true\n): void {\n const spinner = Utils.spinner(\n `Configuring your ${framework.value} & Prismic project...`\n );\n spinner.start();\n\n try {\n const manifest = FileSystem.retrieveManifest(cwd);\n\n const manifestUpdated: Models.Manifest = {\n ...(manifest.exists && manifest.content ? manifest.content : {}),\n apiEndpoint: Utils.Endpoints.buildRepositoryEndpoint(base, repository),\n libraries: [\"@/slices\", ...sliceLibPath],\n ...(framework.manuallyAdded ? { framework: framework.value } : {}),\n ...(!tracking ? { tracking } : {}),\n };\n\n if (!manifest.exists) FileSystem.createManifest(cwd, manifestUpdated);\n else FileSystem.patchManifest(cwd, manifestUpdated);\n\n // create the default slices folder if it doesn't exist.\n const pathToSlicesFolder = FileSystem.CustomPaths(cwd)\n .library(\"slices\")\n .value();\n if (!Utils.Files.exists(pathToSlicesFolder))\n Utils.Files.mkdir(pathToSlicesFolder, { recursive: true });\n\n // add slicemachine script to package.json.\n FileSystem.addJsonPackageSmScript(cwd);\n\n spinner.succeed(\"Project configured! Ready to start\");\n } catch {\n spinner.fail(\"Failed to configure your Prismic Local Builder\");\n process.exit(-1);\n }\n}\n","import { Utils, FileSystem } from \"@slicemachine/core\";\n\nexport function displayFinalMessage(cwd: string): void {\n const yarnLock = Utils.Files.exists(FileSystem.YarnLockPath(cwd));\n const command = `${yarnLock ? \"yarn\" : \"npm\"} run ${\n Utils.CONSTS.SCRIPT_NAME\n }`;\n\n console.log(\n `${Utils.white(\"■\")} Run ${Utils.purple(\n command\n )} to now launch your Local Builder`\n );\n}\n","import { Utils, FileSystem } from \"@slicemachine/core\";\nimport { execCommand } from \"../utils\";\n\nexport type Dependency = string | { name: string; version: string };\nexport const Dependencies = {\n fromPkgFormat(\n pkgDeps: Record<string, string> | undefined\n ): ReadonlyArray<Dependency> | undefined {\n if (!pkgDeps) return;\n\n return Object.entries(pkgDeps).map(([name, version]) => ({\n name,\n version,\n }));\n },\n};\nfunction formatDeps(dependencies: ReadonlyArray<Dependency>): string {\n return dependencies\n .map((dep) => {\n if (typeof dep === \"string\") return dep;\n return `${dep.name}@${dep.version}`;\n })\n .join(\" \");\n}\n\nexport interface PackageManager {\n install(dependencies: ReadonlyArray<Dependency>): Promise<{ stderr: string }>;\n installDev(\n dependencies: ReadonlyArray<Dependency>\n ): Promise<{ stderr: string }>;\n}\n\nexport const PackageManager = {\n get(cwd: string): PackageManager {\n if (Utils.Files.exists(FileSystem.YarnLockPath(cwd))) {\n return Yarn;\n }\n return Npm;\n },\n};\n\nexport const Yarn: PackageManager = {\n install(\n dependencies: ReadonlyArray<Dependency>\n ): Promise<{ stderr: string }> {\n return execCommand(`yarn add ${formatDeps(dependencies)}`);\n },\n installDev(\n dependencies: ReadonlyArray<Dependency>\n ): Promise<{ stderr: string }> {\n return execCommand(`yarn add --dev ${formatDeps(dependencies)}`);\n },\n};\n\nexport const Npm: PackageManager = {\n install(\n dependencies: ReadonlyArray<Dependency>\n ): Promise<{ stderr: string }> {\n return execCommand(`npm i --save ${formatDeps(dependencies)}`);\n },\n installDev(\n dependencies: ReadonlyArray<Dependency>\n ): Promise<{ stderr: string }> {\n return execCommand(`npm i --save-dev ${formatDeps(dependencies)}`);\n },\n};\n","import { Utils } from \"@slicemachine/core\";\nimport tmp from \"tmp\";\nimport AdmZip from \"adm-zip\";\nimport fsExtra from \"fs-extra\";\nimport axios from \"axios\";\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport { getOrElseW } from \"fp-ts/Either\";\nimport { PackageManager, Dependencies } from \"../utils/PackageManager\";\nimport { PackageJsonHelper } from \"@slicemachine/core/build/src/utils/PackageJson\";\nimport {\n Manifest,\n ManifestHelper,\n} from \"@slicemachine/core/build/src/models/Manifest\";\nimport Files from \"@slicemachine/core/build/src/utils/files\";\nimport { Tracker } from \"../utils/tracker\";\n\nconst downloadFile = async (reqUrl: string): Promise<string> => {\n const res = await axios.get<Buffer>(reqUrl, { responseType: \"arraybuffer\" });\n\n return new Promise((resolve, reject) => {\n if (res.status == 200) {\n const tmpZipFile = tmp.tmpNameSync();\n const zip = new AdmZip(res.data);\n zip.extractAllTo(tmpZipFile);\n resolve(tmpZipFile);\n } else {\n reject();\n }\n });\n};\n\nfunction toGithubSource(githubPath: string, branch: string): string {\n return `https://codeload.github.com/${githubPath}/zip/${branch}`;\n}\n\nexport async function installLib(\n tracker: Tracker | undefined,\n cwd: string,\n libGithubPath: string,\n branch = \"HEAD\"\n): Promise<string[] | undefined> {\n const spinner = Utils.spinner(\n `Installing the ${libGithubPath} lib in your project...`\n );\n\n try {\n spinner.start();\n\n const [githubUserName, githubProjectName] = libGithubPath.split(\"/\");\n const source = toGithubSource(libGithubPath, branch);\n\n const zipFilePath = await downloadFile(source);\n const outputFolder = `${githubProjectName}-${branch}`;\n const projectPath = path.join(zipFilePath, outputFolder);\n\n const name = `${githubUserName}-${githubProjectName}`;\n const libDestinationFolder = path.join(cwd, name);\n\n // We should be able to offer the ability to override or not an existing library\n if (fs.existsSync(libDestinationFolder)) {\n spinner.succeed(`Lib \"${libGithubPath}\" was already installed (skipped)`);\n return;\n }\n\n // We copy all the slices into the the user project minus the src folder\n fsExtra.moveSync(path.join(projectPath, \"src\"), libDestinationFolder);\n\n // handle dependencies\n const pkgManager = PackageManager.get(cwd);\n const pkgJson = PackageJsonHelper.fromPath(\n path.join(projectPath, \"package.json\")\n );\n if (pkgJson instanceof Error) throw pkgJson;\n\n const dependencies = Dependencies.fromPkgFormat(pkgJson.dependencies);\n if (dependencies) await pkgManager.install(dependencies);\n\n // generate meta file\n Files.write(path.join(libDestinationFolder, \"meta.json\"), {\n name: pkgJson.name,\n });\n\n // retrieve all slices lib paths\n const manifest = Files.readEntity<Error | Manifest>(\n path.join(projectPath, \"sm.json\"),\n (payload: unknown) => {\n return getOrElseW(\n () => new Error(`Unable to parse sm.json from lib ${libGithubPath}`)\n )(Manifest.decode(payload));\n }\n );\n if (manifest instanceof Error) throw manifest;\n\n const localLibs = ManifestHelper.localLibraries(manifest).map(\n ({ path }) => {\n return `~/${name}/${path.replace(\"src/\", \"\")}`;\n }\n );\n\n spinner.succeed(\n `Slice library \"${libGithubPath}\" was installed successfully`\n );\n\n tracker?.Track.downloadLibrary(libGithubPath);\n return localLibs;\n } catch (error) {\n spinner.fail(`Error installing ${libGithubPath} lib!`);\n if (error instanceof Error) {\n console.error(error.message);\n }\n process.exit(-1);\n }\n}\n","import { Utils, FileSystem } from \"@slicemachine/core\";\nimport { Tracker } from \"./utils/tracker\";\nimport {\n installRequiredDependencies,\n validatePkg,\n maybeExistingRepo,\n createRepository,\n loginOrBypass,\n configureProject,\n displayFinalMessage,\n detectFramework,\n installLib,\n} from \"./steps\";\nimport { findArgument } from \"./utils\";\n\nasync function init() {\n const cwd = findArgument(process.argv, \"cwd\") || process.cwd();\n const base = findArgument(process.argv, \"base\") || Utils.CONSTS.DEFAULT_BASE;\n const lib: string | undefined = findArgument(process.argv, \"library\");\n const branch: string | undefined = findArgument(process.argv, \"branch\");\n const isTrackingAvailable =\n findArgument(process.argv, \"tracking\") === \"false\" ? false : true;\n\n console.log(\n Utils.purple(\n \"You're about to configure Slicemachine... Press ctrl + C to cancel\"\n )\n );\n\n // verify package.json file exist\n validatePkg(cwd);\n\n // login\n const user = await loginOrBypass(base);\n if (!user) throw new Error(\"The user should be logged in!\");\n\n // retrieve tokens for api calls\n const config = FileSystem.PrismicSharedConfigManager.get();\n\n // detect the framework used by the project\n const frameworkResult = await detectFramework(cwd);\n\n // select the repository used with the project.\n const { existing, name } = await maybeExistingRepo(\n config.cookies,\n cwd,\n config.base\n );\n\n if (!existing) {\n await createRepository(name, frameworkResult.value, config);\n }\n\n const tracker = user.profile?.shortId\n ? Tracker.build(\n process.env.NEXT_PUBLIC_SEGMENT_KEY ||\n \"JfTfmHaATChc4xueS7RcCBsixI71dJIJ\",\n name,\n {\n userId: user.profile.shortId,\n },\n isTrackingAvailable\n )\n : undefined;\n\n // install the required dependencies in the project.\n await installRequiredDependencies(cwd, frameworkResult.value);\n\n const sliceLibPath = lib\n ? await installLib(tracker, cwd, lib, branch)\n : undefined;\n\n // configure the SM.json file and the json package file of the project..\n configureProject(\n cwd,\n base,\n name,\n frameworkResult,\n sliceLibPath,\n isTrackingAvailable\n );\n\n // ask the user to run slice-machine.\n displayFinalMessage(cwd);\n}\n\ntry {\n void init();\n} catch (error) {\n if (error instanceof Error) Utils.writeError(error.message);\n else console.error(error);\n}\n"],"names":["ServerAnalytics","util","exec","Utils","Models","FileSystem","path","inquirer","Communication","Separator","parsePrismicAuthToken","t","axios","pipe","fold","Auth","tmp","AdmZip","fs","PackageJsonHelper","Files","getOrElseW","Manifest","ManifestHelper"],"mappings":"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"}
package/jest.config.js CHANGED
@@ -13,4 +13,5 @@ module.exports = {
13
13
  "^.+\\.(ts|tsx)$": "ts-jest",
14
14
  "^.+\\.js$": "babel-jest",
15
15
  },
16
+ testTimeout: 15000,
16
17
  };
package/package.json CHANGED
@@ -1,32 +1,46 @@
1
1
  {
2
2
  "name": "@slicemachine/init",
3
- "version": "1.0.2-slicecanvas.0",
4
- "license": "MIT",
3
+ "version": "1.1.1-alpha.2",
5
4
  "description": "The easiest way to add Slice Machine to your project",
5
+ "license": "MIT",
6
6
  "bin": {
7
7
  "init": "./build/index.js"
8
8
  },
9
- "engines": {
10
- "node": ">=12"
11
- },
12
9
  "scripts": {
13
- "build": "tsc --project tsconfig.json",
14
- "watch": "tsc --project tsconfig.json --watch",
15
- "prepublishOnly": "npm run test && npm run build",
16
- "lint": "eslint --ext .ts .",
17
- "lint:precommit": "eslint",
18
10
  "audit": "better-npm-audit audit -l high -p",
19
11
  "audit-fix": "npm audit fix",
20
- "test": "jest"
12
+ "build": "npm run tsc && siroc build",
13
+ "lint": "eslint --ext .ts .",
14
+ "lint:precommit": "eslint",
15
+ "prepublishOnly": "npm run test && npm run build",
16
+ "test": "jest",
17
+ "tsc": "tsc --project tsconfig.json --noEmit",
18
+ "watch": "tsc --project tsconfig.json --noEmit --watch"
19
+ },
20
+ "dependencies": {
21
+ "@slicemachine/core": "1.1.1-alpha.2",
22
+ "adm-zip": "^0.5.9",
23
+ "analytics-node": "^6.0.0",
24
+ "axios": "^0.24.0",
25
+ "fp-ts": "^2.11.5",
26
+ "fs-extra": "^10.0.0",
27
+ "inquirer": "^8.2.0",
28
+ "io-ts": "^2.2.16",
29
+ "tmp": "^0.2.1"
21
30
  },
22
31
  "devDependencies": {
23
32
  "@babel/core": "^7.15.8",
24
33
  "@babel/preset-env": "^7.15.8",
25
34
  "@babel/preset-typescript": "^7.15.0",
35
+ "@rollup/plugin-replace": "^3.0.1",
36
+ "@types/adm-zip": "^0.4.34",
37
+ "@types/analytics-node": "^3.1.7",
38
+ "@types/fs-extra": "^9.0.13",
26
39
  "@types/inquirer": "^8.1.3",
27
40
  "@types/jest": "^27.0.2",
28
- "@typescript-eslint/eslint-plugin": "^4.29.1",
29
- "@typescript-eslint/parser": "^4.29.1",
41
+ "@types/tmp": "^0.2.2",
42
+ "@typescript-eslint/eslint-plugin": "^5.10.0",
43
+ "@typescript-eslint/parser": "^5.10.0",
30
44
  "babel-jest": "^27.0.2",
31
45
  "better-npm-audit": "^3.4.0",
32
46
  "eslint": "^7.32.0",
@@ -34,17 +48,16 @@
34
48
  "eslint-import-resolver-typescript": "^2.4.0",
35
49
  "eslint-plugin-import": "^2.24.0",
36
50
  "eslint-plugin-jest": "^24.4.0",
37
- "jest": "^27.2.4",
51
+ "jest": "^27.4.7",
38
52
  "mock-stdin": "^1.0.0",
39
53
  "nock": "^13.1.3",
54
+ "siroc": "^0.16.0",
40
55
  "stdout-stderr": "^0.1.13",
41
56
  "ts-jest": "^27.0.5",
42
57
  "typescript": "^4.4.3"
43
58
  },
44
- "dependencies": {
45
- "@slicemachine/core": "1.0.3-slicecanvas.0",
46
- "fp-ts": "^2.11.5",
47
- "inquirer": "^8.2.0",
48
- "io-ts": "^2.2.16"
49
- }
59
+ "engines": {
60
+ "node": ">=12"
61
+ },
62
+ "gitHead": "44982775c09a3918e73c3f6513cda8a17573f07b"
50
63
  }
@@ -0,0 +1,19 @@
1
+ import { defineSirocConfig } from "siroc";
2
+ import replace from "@rollup/plugin-replace";
3
+
4
+ export default defineSirocConfig({
5
+ rollup: {
6
+ output: {
7
+ sourcemap: true,
8
+ },
9
+ plugins: [
10
+ replace({
11
+ "process.env.NEXT_PUBLIC_SEGMENT_KEY": `"${
12
+ process.env.NEXT_PUBLIC_SEGMENT_KEY ||
13
+ "JfTfmHaATChc4xueS7RcCBsixI71dJIJ"
14
+ }"`,
15
+ preventAssignment: true,
16
+ }),
17
+ ],
18
+ },
19
+ });
package/src/index.ts CHANGED
@@ -1,6 +1,5 @@
1
- #!/usr/bin/env node
2
-
3
1
  import { Utils, FileSystem } from "@slicemachine/core";
2
+ import { Tracker } from "./utils/tracker";
4
3
  import {
5
4
  installRequiredDependencies,
6
5
  validatePkg,
@@ -10,12 +9,17 @@ import {
10
9
  configureProject,
11
10
  displayFinalMessage,
12
11
  detectFramework,
12
+ installLib,
13
13
  } from "./steps";
14
14
  import { findArgument } from "./utils";
15
15
 
16
16
  async function init() {
17
17
  const cwd = findArgument(process.argv, "cwd") || process.cwd();
18
18
  const base = findArgument(process.argv, "base") || Utils.CONSTS.DEFAULT_BASE;
19
+ const lib: string | undefined = findArgument(process.argv, "library");
20
+ const branch: string | undefined = findArgument(process.argv, "branch");
21
+ const isTrackingAvailable =
22
+ findArgument(process.argv, "tracking") === "false" ? false : true;
19
23
 
20
24
  console.log(
21
25
  Utils.purple(
@@ -27,7 +31,8 @@ async function init() {
27
31
  validatePkg(cwd);
28
32
 
29
33
  // login
30
- await loginOrBypass(base);
34
+ const user = await loginOrBypass(base);
35
+ if (!user) throw new Error("The user should be logged in!");
31
36
 
32
37
  // retrieve tokens for api calls
33
38
  const config = FileSystem.PrismicSharedConfigManager.get();
@@ -46,11 +51,34 @@ async function init() {
46
51
  await createRepository(name, frameworkResult.value, config);
47
52
  }
48
53
 
54
+ const tracker = user.profile?.shortId
55
+ ? Tracker.build(
56
+ process.env.NEXT_PUBLIC_SEGMENT_KEY ||
57
+ "JfTfmHaATChc4xueS7RcCBsixI71dJIJ",
58
+ name,
59
+ {
60
+ userId: user.profile.shortId,
61
+ },
62
+ isTrackingAvailable
63
+ )
64
+ : undefined;
65
+
49
66
  // install the required dependencies in the project.
50
67
  await installRequiredDependencies(cwd, frameworkResult.value);
51
68
 
69
+ const sliceLibPath = lib
70
+ ? await installLib(tracker, cwd, lib, branch)
71
+ : undefined;
72
+
52
73
  // configure the SM.json file and the json package file of the project..
53
- configureProject(cwd, base, name, frameworkResult);
74
+ configureProject(
75
+ cwd,
76
+ base,
77
+ name,
78
+ frameworkResult,
79
+ sliceLibPath,
80
+ isTrackingAvailable
81
+ );
54
82
 
55
83
  // ask the user to run slice-machine.
56
84
  displayFinalMessage(cwd);
@@ -1,4 +1,5 @@
1
1
  import { FileSystem, Utils } from "@slicemachine/core";
2
+ import type { Models } from "@slicemachine/core";
2
3
  import { FrameworkResult } from "./detect-framework";
3
4
 
4
5
  type Base = Utils.Endpoints.Base;
@@ -7,7 +8,9 @@ export function configureProject(
7
8
  cwd: string,
8
9
  base: Base,
9
10
  repository: string,
10
- framework: FrameworkResult
11
+ framework: FrameworkResult,
12
+ sliceLibPath: string[] = [],
13
+ tracking = true
11
14
  ): void {
12
15
  const spinner = Utils.spinner(
13
16
  `Configuring your ${framework.value} & Prismic project...`
@@ -17,16 +20,25 @@ export function configureProject(
17
20
  try {
18
21
  const manifest = FileSystem.retrieveManifest(cwd);
19
22
 
20
- const manifestUpdated: FileSystem.Manifest = {
23
+ const manifestUpdated: Models.Manifest = {
21
24
  ...(manifest.exists && manifest.content ? manifest.content : {}),
22
25
  apiEndpoint: Utils.Endpoints.buildRepositoryEndpoint(base, repository),
23
- libraries: ["@/slices"],
26
+ libraries: ["@/slices", ...sliceLibPath],
24
27
  ...(framework.manuallyAdded ? { framework: framework.value } : {}),
28
+ ...(!tracking ? { tracking } : {}),
25
29
  };
26
30
 
27
31
  if (!manifest.exists) FileSystem.createManifest(cwd, manifestUpdated);
28
32
  else FileSystem.patchManifest(cwd, manifestUpdated);
29
33
 
34
+ // create the default slices folder if it doesn't exist.
35
+ const pathToSlicesFolder = FileSystem.CustomPaths(cwd)
36
+ .library("slices")
37
+ .value();
38
+ if (!Utils.Files.exists(pathToSlicesFolder))
39
+ Utils.Files.mkdir(pathToSlicesFolder, { recursive: true });
40
+
41
+ // add slicemachine script to package.json.
30
42
  FileSystem.addJsonPackageSmScript(cwd);
31
43
 
32
44
  spinner.succeed("Project configured! Ready to start");
@@ -1,9 +1,10 @@
1
- import { Communication, Utils, FileSystem } from "@slicemachine/core";
1
+ import { Communication, Utils } from "@slicemachine/core";
2
+ import type { Models } from "@slicemachine/core";
2
3
 
3
4
  export function createRepository(
4
5
  domain: string,
5
- framework: Utils.Framework.FrameworkEnum,
6
- config: FileSystem.PrismicSharedConfig
6
+ framework: Models.Frameworks,
7
+ config: Models.PrismicSharedConfig
7
8
  ): Promise<void> {
8
9
  const spinner = Utils.spinner("Creating Prismic Repository");
9
10
  spinner.start();
@@ -1,13 +1,14 @@
1
1
  import { Utils } from "@slicemachine/core";
2
+ import { Models } from "@slicemachine/core";
2
3
  import * as inquirer from "inquirer";
3
4
 
4
5
  export type FrameworkResult = {
5
- value: Utils.Framework.FrameworkEnum;
6
+ value: Models.Frameworks;
6
7
  manuallyAdded: boolean;
7
8
  };
8
9
 
9
10
  export async function promptForFramework(): Promise<FrameworkResult> {
10
- const choices = Utils.Framework.SupportedFrameworks.map((framework) => {
11
+ const choices = Models.SupportedFrameworks.map((framework) => {
11
12
  return {
12
13
  name: Utils.Framework.fancyName(framework),
13
14
  value: framework,
@@ -15,7 +16,7 @@ export async function promptForFramework(): Promise<FrameworkResult> {
15
16
  });
16
17
 
17
18
  return inquirer
18
- .prompt<{ framework: Utils.Framework.FrameworkEnum }>([
19
+ .prompt<{ framework: Models.Frameworks }>([
19
20
  {
20
21
  name: "framework",
21
22
  type: "list",
@@ -44,20 +45,21 @@ export async function detectFramework(cwd: string): Promise<FrameworkResult> {
44
45
  spinner.start();
45
46
 
46
47
  try {
47
- const maybeFramework = Utils.Framework.detectFramework(cwd);
48
+ const maybeFramework = Utils.Framework.defineFramework({
49
+ cwd,
50
+ supportedFrameworks: Object.values(Models.Frameworks),
51
+ });
52
+
48
53
  spinner.stop();
49
54
 
50
- if (
51
- !maybeFramework ||
52
- maybeFramework === Utils.Framework.FrameworkEnum.vanillajs
53
- ) {
55
+ if (!maybeFramework || maybeFramework === Models.Frameworks.vanillajs) {
54
56
  Utils.writeError("Framework not detected");
55
57
  return await promptForFramework();
56
58
  }
57
59
 
58
60
  const nameToPrint = Utils.Framework.fancyName(maybeFramework);
59
61
 
60
- if (Utils.Framework.isUnsupported(maybeFramework)) {
62
+ if (!Utils.Framework.isFrameworkSupported(maybeFramework)) {
61
63
  Utils.writeError(`${nameToPrint} is currently not supported`);
62
64
  console.log(failMessage);
63
65
  process.exit(1);
@@ -6,3 +6,4 @@ export { detectFramework } from "./detect-framework";
6
6
  export { loginOrBypass } from "./loginOrBypass";
7
7
  export { configureProject } from "./configure-project";
8
8
  export { displayFinalMessage } from "./display-final-message";
9
+ export { installLib } from "./install-lib";
@@ -0,0 +1,115 @@
1
+ import { Utils } from "@slicemachine/core";
2
+ import tmp from "tmp";
3
+ import AdmZip from "adm-zip";
4
+ import fsExtra from "fs-extra";
5
+ import axios from "axios";
6
+
7
+ import fs from "fs";
8
+ import path from "path";
9
+ import { getOrElseW } from "fp-ts/Either";
10
+ import { PackageManager, Dependencies } from "../utils/PackageManager";
11
+ import { PackageJsonHelper } from "@slicemachine/core/build/src/utils/PackageJson";
12
+ import {
13
+ Manifest,
14
+ ManifestHelper,
15
+ } from "@slicemachine/core/build/src/models/Manifest";
16
+ import Files from "@slicemachine/core/build/src/utils/files";
17
+ import { Tracker } from "../utils/tracker";
18
+
19
+ const downloadFile = async (reqUrl: string): Promise<string> => {
20
+ const res = await axios.get<Buffer>(reqUrl, { responseType: "arraybuffer" });
21
+
22
+ return new Promise((resolve, reject) => {
23
+ if (res.status == 200) {
24
+ const tmpZipFile = tmp.tmpNameSync();
25
+ const zip = new AdmZip(res.data);
26
+ zip.extractAllTo(tmpZipFile);
27
+ resolve(tmpZipFile);
28
+ } else {
29
+ reject();
30
+ }
31
+ });
32
+ };
33
+
34
+ function toGithubSource(githubPath: string, branch: string): string {
35
+ return `https://codeload.github.com/${githubPath}/zip/${branch}`;
36
+ }
37
+
38
+ export async function installLib(
39
+ tracker: Tracker | undefined,
40
+ cwd: string,
41
+ libGithubPath: string,
42
+ branch = "HEAD"
43
+ ): Promise<string[] | undefined> {
44
+ const spinner = Utils.spinner(
45
+ `Installing the ${libGithubPath} lib in your project...`
46
+ );
47
+
48
+ try {
49
+ spinner.start();
50
+
51
+ const [githubUserName, githubProjectName] = libGithubPath.split("/");
52
+ const source = toGithubSource(libGithubPath, branch);
53
+
54
+ const zipFilePath = await downloadFile(source);
55
+ const outputFolder = `${githubProjectName}-${branch}`;
56
+ const projectPath = path.join(zipFilePath, outputFolder);
57
+
58
+ const name = `${githubUserName}-${githubProjectName}`;
59
+ const libDestinationFolder = path.join(cwd, name);
60
+
61
+ // We should be able to offer the ability to override or not an existing library
62
+ if (fs.existsSync(libDestinationFolder)) {
63
+ spinner.succeed(`Lib "${libGithubPath}" was already installed (skipped)`);
64
+ return;
65
+ }
66
+
67
+ // We copy all the slices into the the user project minus the src folder
68
+ fsExtra.moveSync(path.join(projectPath, "src"), libDestinationFolder);
69
+
70
+ // handle dependencies
71
+ const pkgManager = PackageManager.get(cwd);
72
+ const pkgJson = PackageJsonHelper.fromPath(
73
+ path.join(projectPath, "package.json")
74
+ );
75
+ if (pkgJson instanceof Error) throw pkgJson;
76
+
77
+ const dependencies = Dependencies.fromPkgFormat(pkgJson.dependencies);
78
+ if (dependencies) await pkgManager.install(dependencies);
79
+
80
+ // generate meta file
81
+ Files.write(path.join(libDestinationFolder, "meta.json"), {
82
+ name: pkgJson.name,
83
+ });
84
+
85
+ // retrieve all slices lib paths
86
+ const manifest = Files.readEntity<Error | Manifest>(
87
+ path.join(projectPath, "sm.json"),
88
+ (payload: unknown) => {
89
+ return getOrElseW(
90
+ () => new Error(`Unable to parse sm.json from lib ${libGithubPath}`)
91
+ )(Manifest.decode(payload));
92
+ }
93
+ );
94
+ if (manifest instanceof Error) throw manifest;
95
+
96
+ const localLibs = ManifestHelper.localLibraries(manifest).map(
97
+ ({ path }) => {
98
+ return `~/${name}/${path.replace("src/", "")}`;
99
+ }
100
+ );
101
+
102
+ spinner.succeed(
103
+ `Slice library "${libGithubPath}" was installed successfully`
104
+ );
105
+
106
+ tracker?.Track.downloadLibrary(libGithubPath);
107
+ return localLibs;
108
+ } catch (error) {
109
+ spinner.fail(`Error installing ${libGithubPath} lib!`);
110
+ if (error instanceof Error) {
111
+ console.error(error.message);
112
+ }
113
+ process.exit(-1);
114
+ }
115
+ }
@@ -1,6 +1,6 @@
1
1
  import path from "path";
2
2
  import { execCommand } from "../utils";
3
- import { Utils, FileSystem } from "@slicemachine/core";
3
+ import { Utils, FileSystem, Models } from "@slicemachine/core";
4
4
 
5
5
  const {
6
6
  PRISMIC_CLIENT,
@@ -12,20 +12,22 @@ const {
12
12
  NUXT_SM,
13
13
  VUE_SLICEZONE,
14
14
  PRISMIC_VUE,
15
+ SLICE_SIMULATOR_REACT,
16
+ SLICE_SIMULATOR_VUE,
15
17
  } = Utils.CONSTS;
16
18
 
17
- function depsForFramework(framework: Utils.Framework.FrameworkEnum): string {
19
+ function depsForFramework(framework: Models.Frameworks): string {
18
20
  switch (framework) {
19
- case Utils.Framework.FrameworkEnum.react:
21
+ case Models.Frameworks.react:
20
22
  return `${PRISMIC_REACT_PACKAGE_NAME} ${PRISMIC_CLIENT}`;
21
- case Utils.Framework.FrameworkEnum.next:
22
- return `${PRISMIC_REACT_PACKAGE_NAME} ${PRISMIC_CLIENT} ${NEXT_SLICEZONE}`;
23
- case Utils.Framework.FrameworkEnum.svelte:
23
+ case Models.Frameworks.next:
24
+ return `${PRISMIC_REACT_PACKAGE_NAME} ${PRISMIC_CLIENT}@v5.1.1 ${NEXT_SLICEZONE} ${SLICE_SIMULATOR_REACT}`;
25
+ case Models.Frameworks.svelte:
24
26
  return `${PRISMIC_DOM_PACKAGE_NAME} ${PRISMIC_CLIENT}`;
25
- case Utils.Framework.FrameworkEnum.nuxt:
26
- return `${NUXT_PRISMIC} ${NUXT_SM} ${VUE_SLICEZONE}`;
27
- case Utils.Framework.FrameworkEnum.vue:
28
- return `${PRISMIC_VUE} ${PRISMIC_CLIENT} ${PRISMIC_DOM_PACKAGE_NAME} ${VUE_SLICEZONE}`;
27
+ case Models.Frameworks.nuxt:
28
+ return `${NUXT_PRISMIC} ${NUXT_SM} ${VUE_SLICEZONE} ${SLICE_SIMULATOR_VUE}`;
29
+ case Models.Frameworks.vue:
30
+ return `${PRISMIC_VUE} ${PRISMIC_CLIENT}@v5.1.1 ${PRISMIC_DOM_PACKAGE_NAME} ${VUE_SLICEZONE}`;
29
31
  default:
30
32
  return "";
31
33
  }
@@ -33,7 +35,7 @@ function depsForFramework(framework: Utils.Framework.FrameworkEnum): string {
33
35
 
34
36
  export async function installRequiredDependencies(
35
37
  cwd: string,
36
- framework: Utils.Framework.FrameworkEnum
38
+ framework: Models.Frameworks
37
39
  ): Promise<void> {
38
40
  const yarnLock = Utils.Files.exists(FileSystem.YarnLockPath(cwd));
39
41
  const installDevDependencyCommand = yarnLock
@@ -1,7 +1,23 @@
1
- import { Utils, Auth } from "@slicemachine/core";
1
+ import { Utils, Communication, Auth } from "@slicemachine/core";
2
+ import {
3
+ validateSessionAndGetProfile,
4
+ UserProfile,
5
+ } from "../utils/communication";
2
6
 
3
- export async function loginOrBypass(base: string): Promise<void> {
4
- const user = await Auth.validateSession(base);
5
- if (user) return Utils.writeCheck(`Logged in as ${Utils.bold(user.email)}`);
6
- else await Auth.login(base);
7
+ export async function loginOrBypass(base: string): Promise<{
8
+ info: Communication.UserInfo;
9
+ profile: UserProfile | null;
10
+ } | null> {
11
+ const user = await validateSessionAndGetProfile(base).catch((err) =>
12
+ console.log(err)
13
+ );
14
+ if (user) {
15
+ const email = user.info.email;
16
+ Utils.writeCheck(`Logged in as ${Utils.bold(email)}`);
17
+ return user;
18
+ } else {
19
+ await Auth.login(base);
20
+ const user = await validateSessionAndGetProfile(base);
21
+ return user;
22
+ }
7
23
  }