@slicemachine/init 1.1.10-alpha.1 → 1.1.10-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.
package/build/index.js CHANGED
@@ -32,6 +32,7 @@ const FormData = require('form-data');
32
32
  const uniqid = require('uniqid');
33
33
  const customtypes = require('@prismicio/types-internal/lib/customtypes');
34
34
  const Either$1 = require('fp-ts/lib/Either');
35
+ const t = require('io-ts');
35
36
 
36
37
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
37
38
 
@@ -76,6 +77,7 @@ const mime__default = /*#__PURE__*/_interopDefaultLegacy(mime);
76
77
  const snakeCase__default = /*#__PURE__*/_interopDefaultLegacy(snakeCase);
77
78
  const FormData__default = /*#__PURE__*/_interopDefaultLegacy(FormData);
78
79
  const uniqid__default = /*#__PURE__*/_interopDefaultLegacy(uniqid);
80
+ const t__namespace = /*#__PURE__*/_interopNamespace(t);
79
81
 
80
82
  var __accessCheck = (obj, member, msg) => {
81
83
  if (!member.has(obj))
@@ -864,7 +866,7 @@ async function installLib(cwd, libGithubPath, branch = "HEAD") {
864
866
  }
865
867
  }
866
868
 
867
- function handelErrors(prefix, err) {
869
+ function handleErrors(prefix, err) {
868
870
  if (axios__default["default"].isAxiosError(err) && err.response) {
869
871
  writeError$1(`${prefix} | [${err.response.status}]: ${err.response.statusText}`);
870
872
  } else if (err instanceof Error) {
@@ -895,7 +897,7 @@ async function sendModelToPrismic(repository, authorization, customTypesApiEndpo
895
897
  }).then(() => {
896
898
  return;
897
899
  }).catch((err) => {
898
- handelErrors(`sending slice ${model.id}, please try again. If the problem persists, contact us.`, err);
900
+ handleErrors(`sending slice ${model.id}, please try again. If the problem persists, contact us.`, err);
899
901
  throw err;
900
902
  });
901
903
  }
@@ -931,7 +933,7 @@ async function sendCustomTypeToPrismic(repository, authorization, customTypeApiE
931
933
  }).then(() => {
932
934
  return;
933
935
  }).catch((err) => {
934
- handelErrors(`sending custom type ${customType.id}, please try again. If the problem persists, contact us.`, err);
936
+ handleErrors(`sending custom type ${customType.id}, please try again. If the problem persists, contact us.`, err);
935
937
  throw err;
936
938
  });
937
939
  }
@@ -1136,6 +1138,79 @@ async function sendCustomTypesFromStarter(repository, authorization, base, cwd)
1136
1138
  return Promise.resolve(true);
1137
1139
  }
1138
1140
 
1141
+ const SignatureFileReader = t__namespace.type({
1142
+ signature: t__namespace.string
1143
+ });
1144
+ async function readSignatureFile(cwd) {
1145
+ const pathToFile = path__default["default"].join(cwd, "documents", "index.json");
1146
+ return fs__default["default"].promises.readFile(pathToFile, "utf-8").then((res) => {
1147
+ const data = JSON.parse(res);
1148
+ return Either.getOrElseW(() => {
1149
+ throw new Error("Unable to read document signature file");
1150
+ })(SignatureFileReader.decode(data));
1151
+ });
1152
+ }
1153
+ async function lsdir(dir) {
1154
+ return fs__default["default"].promises.readdir(dir).then((dirs) => {
1155
+ return dirs.filter((name) => fs__default["default"].statSync(path__default["default"].join(dir, name)).isDirectory()).map((subdirectory) => path__default["default"].join(dir, subdirectory));
1156
+ });
1157
+ }
1158
+ async function lsfiles(dir) {
1159
+ return fs__default["default"].promises.readdir(dir).then((dirs) => {
1160
+ return dirs.filter((name) => fs__default["default"].statSync(path__default["default"].join(dir, name)).isFile()).map((file) => path__default["default"].join(dir, file));
1161
+ });
1162
+ }
1163
+ async function readDocuments(cwd) {
1164
+ const documentDir = path__default["default"].join(cwd, "documents");
1165
+ const dirs = await lsdir(documentDir);
1166
+ const files = (await Promise.all(dirs.map((dir) => lsfiles(dir)))).flat();
1167
+ const documentObj = files.reduce((acc, file) => {
1168
+ const fileContent = fs__default["default"].readFileSync(file, "utf-8");
1169
+ const filename = path__default["default"].parse(file).name;
1170
+ acc[filename] = JSON.parse(fileContent);
1171
+ return acc;
1172
+ }, {});
1173
+ return JSON.stringify(documentObj);
1174
+ }
1175
+ const sendDocumentsFromStarter = async (repository, cookies, base, cwd) => {
1176
+ const pathToDocuments = path__default["default"].join(cwd, "documents");
1177
+ const pathToSignatureFile = path__default["default"].join(pathToDocuments, "index.json");
1178
+ if (!fs__default["default"].existsSync(pathToSignatureFile)) {
1179
+ return Promise.resolve(false);
1180
+ }
1181
+ const signatureObj = await readSignatureFile(cwd);
1182
+ const documentsStr = await readDocuments(cwd);
1183
+ const payload = {
1184
+ signature: signatureObj.signature,
1185
+ documents: documentsStr
1186
+ };
1187
+ const prismicUrl = new URL(base);
1188
+ prismicUrl.hostname = `${repository}.${prismicUrl.hostname}`;
1189
+ prismicUrl.pathname = "starter/documents";
1190
+ const endpointURL = prismicUrl.toString();
1191
+ const spinner = spinner$1("Pushing existing documents to your repository");
1192
+ spinner.start();
1193
+ return axios__default["default"].post(endpointURL, payload, {
1194
+ headers: {
1195
+ "User-Agent": "prismic-cli/0",
1196
+ Cookie: cookies
1197
+ }
1198
+ }).then(() => {
1199
+ spinner.succeed();
1200
+ fs__default["default"].rmSync(pathToDocuments, { recursive: true, force: true });
1201
+ return true;
1202
+ }).catch((e) => {
1203
+ var _a;
1204
+ spinner.fail();
1205
+ if (((_a = e.response) == null ? void 0 : _a.data) === "Repository should not contain documents") {
1206
+ writeError$1("The selected repository is not empty, documents cannot be uploaded. Please choose an empty repository or delete the documents contained in your repository.");
1207
+ } else {
1208
+ handleErrors("sending documents, please try again. If the problem persists, contact us.", e);
1209
+ }
1210
+ process.exit(1);
1211
+ });
1212
+ };
1213
+
1139
1214
  async function sendStarterData(repository, base, cookies, cwd) {
1140
1215
  const smJson = NodeUtils.retrieveManifest(cwd);
1141
1216
  const hasDocuments = NodeUtils.Files.exists(path__default["default"].join(cwd, "documents"));
@@ -1145,7 +1220,8 @@ async function sendStarterData(repository, base, cookies, cwd) {
1145
1220
  if (smJson.content && smJson.content.libraries) {
1146
1221
  await sendSlicesFromStarter(base, repository, authTokenFromCookie, smJson.content.libraries, cwd);
1147
1222
  }
1148
- return sendCustomTypesFromStarter(repository, authTokenFromCookie, base, cwd);
1223
+ await sendCustomTypesFromStarter(repository, authTokenFromCookie, base, cwd);
1224
+ return sendDocumentsFromStarter(repository, cookies, base, cwd);
1149
1225
  }
1150
1226
 
1151
1227
  async function init() {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/utils/tracker.ts","../src/utils/logs.ts","../src/utils/auth/helpers.ts","../src/utils/auth/index.ts","../src/utils/index.ts","../src/steps/install-required-dependencies.ts","../src/steps/validate-pkg.ts","../src/utils/create-repo.ts","../src/steps/choose-or-create-a-repository.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/steps/starters/communication.ts","../src/steps/starters/endpoints.ts","../src/steps/starters/prompts.ts","../src/steps/starters/s3.ts","../src/steps/starters/slices.ts","../src/steps/starters/custom-types.ts","../src/steps/sendStarterData.ts","../src/index.ts"],"sourcesContent":["import ServerAnalytics from \"analytics-node\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { Models } from \"@slicemachine/core\";\n\nexport enum EventType {\n DownloadLibrary = \"SliceMachine Download Library\",\n InitStart = \"SliceMachine Init Start\",\n InitIdentify = \"SliceMachine Init Identify\",\n InitDone = \"SliceMachine Init Done\",\n}\n\ntype SegmentIdentifier = { userId: string } | { anonymousId: string };\n\nexport class InitTracker {\n #client: ServerAnalytics | null = null;\n #isTrackingActive = true;\n #anonymousId = \"\";\n #userId: string | null = null;\n #repository: string | null = null;\n\n initialize(segmentKey: string, isTrackingActive = true): void {\n try {\n // The initialize method cannot be used for changing some class properties\n if (!!this.#client) return;\n\n this.#isTrackingActive = isTrackingActive;\n this.#anonymousId = uuidv4();\n this.#client = new ServerAnalytics(segmentKey);\n } catch (error) {\n // If the client is not correctly setup we are silently failing as the tracker is not a critical feature\n }\n }\n\n /** Private methods **/\n\n _trackEvent(\n eventType: EventType,\n attributes: Record<string, unknown> = {}\n ): Promise<void> {\n return new Promise((resolve) => {\n if (!this._isTrackingPossible(this.#client)) {\n return resolve();\n }\n\n const identifier = this._createSegmentIdentifier();\n const payload = {\n event: eventType,\n ...identifier,\n properties: attributes,\n ...(this.#repository\n ? { context: { groupId: { Repository: this.#repository } } }\n : {}),\n };\n\n return this.#client.track(payload, () => {\n // if(_) return reject(_)\n return resolve();\n });\n });\n }\n\n _identifyEvent(userId: string, intercomHash: string): void {\n if (!this._isTrackingPossible(this.#client)) {\n return;\n }\n\n try {\n this.#client.identify({\n userId,\n anonymousId: this.#anonymousId,\n integrations: {\n Intercom: {\n user_hash: intercomHash,\n },\n },\n });\n } catch {\n // If the client is not correctly setup we are silently failing as the tracker is not a critical feature\n }\n }\n\n _isTrackingPossible(\n client: ServerAnalytics | null\n ): client is ServerAnalytics {\n return !!client && this.#isTrackingActive;\n }\n\n _createSegmentIdentifier(): SegmentIdentifier {\n return !!this.#userId\n ? { userId: this.#userId }\n : { anonymousId: this.#anonymousId };\n }\n\n /** Public methods **/\n\n setRepository(repository: string) {\n this.#repository = repository;\n }\n\n identifyUser(userId: string, intercomHash: string): void {\n this.#userId = userId;\n return this._identifyEvent(userId, intercomHash);\n }\n\n trackDownloadLibrary(library: string): Promise<void> {\n return this._trackEvent(EventType.DownloadLibrary, { library });\n }\n\n trackInitIdentify(): Promise<void> {\n return this._trackEvent(EventType.InitIdentify);\n }\n\n trackInitStart(repoDomain: string | undefined): Promise<void> {\n return this._trackEvent(EventType.InitStart, { repo: repoDomain });\n }\n\n trackInitDone(framework: Models.Frameworks): Promise<void> {\n return this._trackEvent(EventType.InitDone, { framework });\n }\n}\n\nconst Tracker = (() => {\n let smTrackerInstance: InitTracker;\n\n const init = () => new InitTracker();\n\n return {\n get() {\n if (!smTrackerInstance) smTrackerInstance = init();\n return smTrackerInstance;\n },\n };\n})();\n\nexport default Tracker;\n","import chalk from \"chalk\";\nimport ora from \"ora\";\n\nexport const purple = chalk.hex(\"8c76fc\");\nexport const error = chalk.hex(\"FF6868\");\nexport const warning = chalk.hex(\"F3AD38\");\nexport const underline = chalk.underline;\nexport const bold = chalk.bold;\nexport const dim = chalk.dim;\nexport const cyan = chalk.cyan;\nexport const yellow = chalk.yellow;\nexport const white = chalk.white;\n\nexport const spinner = ora;\n\nexport const writeError = (msg: string, prefix = \"Error!\"): void =>\n console.error(`${error(prefix)} ${msg}`);\n\nexport const writeWarning = (msg: string, prefix = \"Warning!\"): void =>\n console.warn(`${warning(prefix)} ${msg}`);\n\nexport const writeCheck = (msg: string): void => {\n ora().succeed(msg); // using the same check as Ora for coherence\n};\n\nexport const writeInfo = (msg: string): void => {\n console.log(`${yellow(\"ℹ\")} ${dim(msg)}`);\n};\n","import * as hapi from \"@hapi/hapi\";\nimport open from \"open\";\nimport * as logs from \"../logs\";\nimport { Utils, CONSTS } from \"@slicemachine/core\";\nimport { PrismicSharedConfigManager } from \"@slicemachine/core/build/prismic\";\n\nconst { Cookie } = Utils;\nconst { DEFAULT_BASE, DEFAULT_SERVER_PORT } = CONSTS;\n\nconst { bold, underline, spinner, writeError } = logs;\n\nexport type HandlerData = { email: string; cookies: ReadonlyArray<string> };\n\nexport const isHandlerData = (\n data: string | Record<string, unknown>\n): data is HandlerData => {\n if (typeof data != \"object\") return false;\n\n const { email, cookies } = data as Partial<HandlerData>;\n return (\n Boolean(email && cookies) &&\n Array.isArray(cookies) &&\n !cookies.some((c: unknown) => typeof c !== \"string\")\n );\n};\n\nconst Routes = {\n authentication:\n (server: hapi.Server) =>\n (\n onSuccess: (data: HandlerData) => void,\n onFail: () => void\n ): hapi.ServerRoute => ({\n method: \"POST\",\n path: \"/\",\n handler: authenticationHandler(server)(onSuccess, onFail),\n }),\n\n notFound: {\n method: [\"GET\", \"POST\"],\n path: \"/{any*}\",\n handler: (\n request: hapi.Request,\n h: hapi.ResponseToolkit\n ): hapi.ResponseObject => {\n return h\n .response(`not found: [${request.method}]: ${request.url.toString()}`)\n .code(404);\n },\n },\n};\n\nexport function validatePayload(\n payload: Buffer | string | Record<string, unknown>\n): HandlerData | null {\n if (Buffer.isBuffer(payload)) return null;\n return isHandlerData(payload) ? payload : null;\n}\n\nconst authenticationHandler =\n (server: hapi.Server) =>\n (onSuccess: (data: HandlerData) => void, onFail: () => void) => {\n return (request: hapi.Request, h: hapi.ResponseToolkit) => {\n try {\n const data: HandlerData | null = validatePayload(\n request.payload as Buffer | string | Record<string, unknown>\n ); // type coming from the lib\n\n if (!data) {\n onFail();\n h.response(\"Error with cookies\").code(400);\n throw new Error(\n \"It seems the server didn't respond properly, please contact us.\"\n );\n }\n onSuccess(data);\n return h.response(data).code(200);\n } finally {\n void server.stop({ timeout: 10000 });\n }\n };\n };\n\nfunction buildServer(base: string, port: number, host: string): hapi.Server {\n const server = hapi.server({\n port,\n host,\n routes: {\n cors: {\n origin: [base],\n headers: [\"Origin\", \"X-Requested-With\", \"Content-Type\", \"Accept\"],\n },\n },\n });\n return server;\n}\n\nexport function askSingleChar(title: string): Promise<string> {\n return new Promise((resolve) => {\n process.stdout.write(title);\n const rawMode: boolean = process.stdin.isRaw;\n if (process.stdin.setRawMode) process.stdin.setRawMode(true);\n\n function handler(key: Buffer) {\n const response: string = key.toString(\"utf-8\");\n if (process.stdin.setRawMode) process.stdin.setRawMode(Boolean(rawMode));\n process.stdin.removeListener(\"data\", handler);\n resolve(response);\n }\n\n process.stdin.on(\"data\", handler);\n });\n}\n\nexport async function startServerAndOpenBrowser(\n url: string,\n action: \"login\" | \"signup\",\n base: string = DEFAULT_BASE,\n port: number = DEFAULT_SERVER_PORT\n): Promise<{\n onLoginFail: () => void;\n}> {\n const confirmation = await askSingleChar(\n `>> Press any key to open the browser to ${action} or q to exit:`\n );\n if (confirmation === \"q\" || confirmation === \"\\u0003\")\n return process.exit(-1);\n\n const s = spinner(\"Waiting for the browser response\");\n\n const onLoginFail = () => {\n s.stop();\n writeError(`We failed to log you into your Prismic account`);\n console.log(`Run ${bold(\"npx slicemachine init\")} again!`);\n process.exit(-1);\n };\n\n function onSuccess(data: HandlerData) {\n s.succeed(`Logged in as ${bold(data.email)}`).stop();\n PrismicSharedConfigManager.setProperties({\n cookies: Cookie.serializeCookies(data.cookies),\n base,\n });\n }\n\n function onFail(): void {\n onLoginFail();\n }\n\n const server = buildServer(base, port, \"localhost\");\n server.route([\n Routes.authentication(server)(onSuccess, onFail),\n Routes.notFound,\n ]);\n\n return server.start().then(() => {\n console.log(\"\\nOpening browser to \" + underline(url));\n s.start();\n void open(url);\n return {\n onLoginFail,\n };\n });\n}\n","import { Utils, Models } from \"@slicemachine/core\";\nimport { startServerAndOpenBrowser } from \"./helpers\";\nimport {\n Communication,\n Endpoints,\n PrismicSharedConfigManager,\n} from \"@slicemachine/core/build/prismic\";\n\nasync function startAuth({\n base,\n url,\n action,\n}: {\n base: string;\n url: string;\n action: \"signup\" | \"login\";\n}): Promise<void> {\n const { onLoginFail } = await startServerAndOpenBrowser(url, action, base);\n try {\n // We wait 3 minutes before timeout\n await Utils.Poll.startPolling<Models.UserInfo | null, Models.UserInfo>(\n () => Auth.validateSession(base),\n (user): user is Models.UserInfo => !!user,\n 3000,\n 60\n );\n return;\n } catch (e) {\n onLoginFail();\n }\n}\n\nexport const Auth = {\n login: async (base: string): Promise<void> => {\n const endpoints = Endpoints.buildEndpoints(base);\n return startAuth({\n base,\n url: endpoints.Dashboard.cliLogin,\n action: \"login\",\n });\n },\n signup: async (base: string): Promise<void> => {\n const endpoints = Endpoints.buildEndpoints(base);\n return startAuth({\n base,\n url: endpoints.Dashboard.cliSignup,\n action: \"signup\",\n });\n },\n logout: (): void => PrismicSharedConfigManager.remove(),\n validateSession: async (\n requiredBase: string\n ): Promise<Models.UserInfo | null> => {\n const config = PrismicSharedConfigManager.get();\n\n if (!config.cookies.length) return Promise.resolve(null); // default config, logged out.\n if (requiredBase != config.base) return Promise.resolve(null); // not the same base so it doesn't count.\n\n return Communication.validateSession(config.cookies, requiredBase).catch(\n () => null\n );\n },\n};\n","import util from \"util\";\nimport { exec } from \"child_process\";\nexport * as logs from \"./logs\";\nexport { Auth } from \"./auth\";\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, logs } from \"../utils\";\nimport { CONSTS, Models } from \"@slicemachine/core\";\nimport * as NodeUtils from \"@slicemachine/core/build/node-utils\";\n\nconst {\n PRISMIC_CLIENT,\n PRISMIC_DOM_PACKAGE_NAME,\n PRISMIC_REACT_PACKAGE_NAME,\n SM_PACKAGE_NAME,\n NUXT_PRISMIC,\n PRISMIC_VUE,\n SLICE_SIMULATOR_REACT,\n SLICE_SIMULATOR_VUE,\n PRISMIC_HELPERS,\n} = CONSTS;\n\nfunction depsForFramework(framework: Models.Frameworks): string {\n switch (framework) {\n case Models.Frameworks.react:\n return `${PRISMIC_REACT_PACKAGE_NAME} ${PRISMIC_CLIENT} ${PRISMIC_HELPERS}`;\n case Models.Frameworks.next:\n return `${PRISMIC_REACT_PACKAGE_NAME} ${PRISMIC_CLIENT} ${SLICE_SIMULATOR_REACT} ${PRISMIC_HELPERS}`;\n case Models.Frameworks.svelte:\n return `${PRISMIC_DOM_PACKAGE_NAME} ${PRISMIC_CLIENT}`;\n case Models.Frameworks.nuxt:\n return `${NUXT_PRISMIC} ${SLICE_SIMULATOR_VUE}`;\n case Models.Frameworks.vue:\n return `${PRISMIC_VUE} ${PRISMIC_CLIENT} ${PRISMIC_DOM_PACKAGE_NAME}`;\n default:\n return \"\";\n }\n}\n\nasync function addAndInstallDeps(\n framework: Models.Frameworks,\n useYarn = false\n): Promise<string> {\n const installDevDependencyCommand = useYarn\n ? \"yarn add -D\"\n : \"npm install --save-dev\";\n const installDependencyCommand = useYarn ? \"yarn add\" : \"npm install --save\";\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 return stderr;\n}\n\nasync function installDeps(useYarn = false): Promise<string> {\n const installCommand = useYarn ? \"yarn\" : \"npm install\";\n const { stderr } = await execCommand(installCommand);\n return stderr;\n}\n\nexport async function installRequiredDependencies(\n cwd: string,\n framework: Models.Frameworks,\n skipDependencies: boolean\n): Promise<void> {\n const yarnLock = NodeUtils.Files.exists(NodeUtils.YarnLockPath(cwd));\n\n const spinner = logs.spinner(\"Installing Slice Machine\");\n spinner.start();\n\n const stderr = await (skipDependencies\n ? installDeps(yarnLock)\n : addAndInstallDeps(framework, yarnLock));\n\n const pathToPkg = path.join(\n NodeUtils.PackagePaths(cwd).value(),\n SM_PACKAGE_NAME\n );\n const isPackageInstalled = NodeUtils.Files.exists(pathToPkg);\n\n if (isPackageInstalled || !stderr.length) {\n spinner.succeed(\"Slice Machine was installed successfully\");\n return;\n }\n\n spinner.fail();\n logs.writeWarning(\n `could not install ${SM_PACKAGE_NAME}. Please do it manually!`\n );\n}\n","import * as NodeUtils from \"@slicemachine/core/build/node-utils\";\nimport { logs } from \"../utils\";\n\nexport function validatePkg(cwd: string): void {\n const jsonPackage = NodeUtils.retrieveJsonPackage(cwd);\n if (!jsonPackage.exists) {\n logs.writeError(`package.json not found. Are you in the right folder?`);\n return process.exit(-1);\n }\n if (!jsonPackage.content) {\n logs.writeError(`could not parse package.json.`);\n return process.exit(-1);\n }\n}\n","import type { Models } from \"@slicemachine/core\";\nimport * as logs from \"./logs\";\nimport * as Prismic from \"@slicemachine/core/build/prismic\";\n\nexport function createRepository(\n domain: string,\n framework: Models.Frameworks,\n cookies: string,\n base: string\n): Promise<string> {\n const spinner = logs.spinner(\"Creating Prismic Repository\");\n spinner.start();\n\n return Prismic.Communication.createRepository(\n domain,\n cookies,\n framework,\n base\n )\n .then((res) => {\n const addressUrl = new URL(base);\n const repoDomainName = res.data.domain || domain;\n addressUrl.hostname = `${repoDomainName}.${addressUrl.hostname}`;\n const address = addressUrl.toString();\n spinner.succeed(`We created your new repository ${address}`);\n\n return repoDomainName;\n })\n .catch((error: Error) => {\n spinner.fail(`Error creating repository ${domain}`);\n if (error.message) {\n logs.writeError(error.message);\n }\n logs.writeError(`We failed to create you new prismic repository`);\n console.log(`Run ${logs.bold(\"npx @slicemachine/init\")} again!`);\n process.exit(-1);\n });\n}\n","import * as inquirer from \"inquirer\";\nimport Separator from \"inquirer/lib/objects/separator\";\nimport { Utils, Models, CONSTS } from \"@slicemachine/core\";\nimport * as Prismic from \"@slicemachine/core/build/prismic\";\nimport * as NodeUtils from \"@slicemachine/core/build/node-utils\";\nimport { createRepository } from \"../utils/create-repo\";\nimport { logs } from \"../utils\";\n\nexport const CREATE_REPO = \"$_CREATE_REPO\"; // not a valid domain name\nconst DEFAULT_BASE = CONSTS.DEFAULT_BASE;\n\nexport function prettyRepoName(address: URL, value?: string): string {\n const repoName = value ? logs.cyan(value) : logs.dim.cyan(\"repo-name\");\n return `${logs.cyan.dim(`${address.protocol}//`)}${repoName}${logs.cyan.dim(\n `.${address.hostname}`\n )}`;\n}\n\nexport async function promptForRepoDomain(\n base: string,\n defaultValue?: string\n): Promise<string> {\n const address = new URL(base);\n\n logs.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: \"repoDomain\",\n message: \"Name your Prismic repository\",\n type: \"input\",\n required: true,\n default: defaultValue,\n transformer: (value: string) =>\n prettyRepoName(address, value || defaultValue),\n async validate(name: string) {\n const result = await Prismic.Communication.validateRepositoryName(\n name,\n base,\n false\n );\n return result === name || result;\n },\n },\n ])\n .then((res) => res.repoDomain);\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 }: Models.Repository): RepoPrompt {\n const address = new URL(base);\n address.hostname = `${domain}.${address.hostname}`;\n if (Models.canUpdateCustomTypes(role) === false) {\n return {\n name: `${logs.purple.dim(\"Use\")} ${logs.bold.dim(\n name\n )} ${logs.purple.dim(`\"${address.hostname}\"`)}`,\n value: domain,\n disabled: \"Unauthorized\",\n };\n }\n\n return {\n name: `${logs.purple(\"Use\")} ${logs.bold(name)} ${logs.purple(\n `\"${address.hostname}\"`\n )}`,\n value: domain,\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: Models.Repositories,\n base: string,\n cwd: string\n): RepoPrompts {\n const createNew = {\n name: `${logs.purple(\"Create a\")} ${logs.bold(\"new\")} ${logs.purple(\n \"Repository\"\n )}`,\n value: CREATE_REPO,\n };\n\n const maybeConfiguredRepoName = NodeUtils.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 chooseOrCreateARepository(\n cwd: string,\n framework: Models.Frameworks,\n cookies: string,\n base = DEFAULT_BASE,\n domain?: string\n): Promise<string> {\n const token = Utils.Cookie.parsePrismicAuthToken(cookies);\n const repos = await Prismic.Communication.listRepositories(token, base);\n\n const hasRepo = domain && repos.find((d) => d.domain === domain);\n if (hasRepo) return domain;\n\n if (repos.length === 0) {\n const domainName = await promptForRepoDomain(base, domain);\n return await createRepository(domainName, framework, cookies, base);\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<{ chosenRepo: string }>([\n {\n type: \"list\",\n name: \"chosenRepo\",\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.chosenRepo === CREATE_REPO) {\n const domainName = await promptForRepoDomain(base, domain);\n return await createRepository(domainName, framework, cookies, base);\n }\n\n return res.chosenRepo;\n}\n","import { Models } from \"@slicemachine/core\";\nimport * as NodeUtils from \"@slicemachine/core/build/node-utils\";\nimport * as inquirer from \"inquirer\";\nimport { logs } from \"../utils\";\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: NodeUtils.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 ${logs.bold(\n \"npx @slicemachine/init\"\n )} in a Nuxt or Next.js project`;\n\n const spinner = logs.spinner(\n \"Detecting framework to install correct dependencies\"\n );\n\n spinner.start();\n\n try {\n const maybeFramework = NodeUtils.Framework.defineFramework({\n cwd,\n supportedFrameworks: Object.values(Models.Frameworks),\n });\n\n spinner.stop();\n\n if (!maybeFramework || maybeFramework === Models.Frameworks.vanillajs) {\n logs.writeError(\"Framework not detected\");\n return await promptForFramework();\n }\n\n const nameToPrint = NodeUtils.Framework.fancyName(maybeFramework);\n\n if (!NodeUtils.Framework.isFrameworkSupported(maybeFramework)) {\n logs.writeError(`${nameToPrint} is currently not supported`);\n console.log(failMessage);\n process.exit(1);\n }\n\n logs.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 logs.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, Models, CONSTS } from \"@slicemachine/core\";\nimport * as Prismic from \"@slicemachine/core/build/prismic\";\n\nexport async function getUserProfile(\n cookies: string,\n base = CONSTS.DEFAULT_BASE\n): Promise<Models.UserProfile> {\n const userServiceBase =\n CONSTS.DEFAULT_BASE === base\n ? CONSTS.USER_SERVICE_BASE\n : CONSTS.USER_SERVICE_STAGING_BASE;\n\n // note the auth server also provides a userId\n const url = new URL(userServiceBase);\n url.pathname = \"profile\";\n\n const endpoint = url.toString();\n const token = Utils.Cookie.parsePrismicAuthToken(cookies);\n\n return axios\n .get<Models.UserProfile>(endpoint, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n })\n .then((res) =>\n pipe(\n Models.UserProfile.decode(res.data),\n fold<t.Errors, Models.UserProfile, Models.UserProfile>(\n () => {\n throw new Error(\"Can't parse user profile\");\n },\n (data: Models.UserProfile) => data\n )\n )\n );\n}\n\nexport async function validateSessionAndGetProfile(\n base = CONSTS.DEFAULT_BASE\n): Promise<{\n info: Models.UserInfo;\n profile: Models.UserProfile | null;\n} | null> {\n const config = Prismic.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 Prismic.Communication.validateSession(\n config.cookies,\n base\n );\n const profile = await getUserProfile(config.cookies, base).catch(\n () => null\n );\n if (profile?.shortId) {\n Prismic.PrismicSharedConfigManager.setProperties({\n shortId: profile.shortId,\n intercomHash: profile.intercomHash,\n });\n }\n return { info, profile };\n } catch {\n return null;\n }\n}\n","import { Models } from \"@slicemachine/core\";\nimport { validateSessionAndGetProfile } from \"../utils/communication\";\nimport { logs, Auth } from \"../utils\";\n\nexport async function loginOrBypass(base: string): Promise<{\n info: Models.UserInfo;\n profile: Models.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 logs.writeCheck(`Logged in as ${logs.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 { CONSTS } from \"@slicemachine/core\";\nimport type { Models } from \"@slicemachine/core\";\nimport * as Prismic from \"@slicemachine/core/build/prismic\";\nimport * as NodeUtils from \"@slicemachine/core/build/node-utils\";\nimport { FrameworkResult } from \"./detect-framework\";\nimport { logs } from \"../utils\";\nimport Tracker from \"../utils/tracker\";\n\ntype Base = Prismic.Endpoints.Base;\n\nconst defaultSliceMachineVersion = \"0.0.41\";\n\nexport async function configureProject(\n cwd: string,\n base: Base,\n repositoryDomainName: string,\n framework: FrameworkResult,\n sliceLibPath: string[] = [],\n tracking = true\n): Promise<void> {\n const frameworkName = NodeUtils.Framework.fancyName(framework.value);\n const spinner = logs.spinner(\n `Configuring your ${frameworkName} and Prismic project...`\n );\n spinner.start();\n\n try {\n const manifest = NodeUtils.retrieveManifest(cwd);\n const packageJson = NodeUtils.retrieveJsonPackage(cwd);\n\n const sliceMachineVersionInstalled =\n getTheSliceMachineVersionInstalled(packageJson);\n\n const manifestAlreadyExistWithContent = manifest.exists && manifest.content;\n\n const libs =\n manifest.content &&\n manifest.content.libraries &&\n manifest.content.libraries.length > 0\n ? manifest.content.libraries\n : [\"@/slices\"];\n\n const manifestUpdated: Models.Manifest = {\n ...(manifestAlreadyExistWithContent\n ? manifest.content\n : { _latest: sliceMachineVersionInstalled }),\n apiEndpoint: Prismic.Endpoints.buildRepositoryEndpoint(\n base,\n repositoryDomainName\n ),\n libraries: [...libs, ...sliceLibPath], // odd case here for staters\n ...(framework.manuallyAdded ? { framework: framework.value } : {}),\n ...(!tracking ? { tracking } : {}),\n };\n\n if (!manifest.exists) NodeUtils.createManifest(cwd, manifestUpdated);\n else NodeUtils.patchManifest(cwd, manifestUpdated);\n\n // create the default slices folder if it doesn't exist.\n const pathToSlicesFolder = NodeUtils.CustomPaths(cwd)\n .library(\"slices\")\n .value();\n if (\n !NodeUtils.Files.exists(pathToSlicesFolder) &&\n libs.includes(\"@/slices\")\n ) {\n NodeUtils.Files.mkdir(pathToSlicesFolder, { recursive: true });\n }\n\n // add slicemachine script to package.json.\n NodeUtils.addJsonPackageSmScript(cwd);\n\n await Tracker.get().trackInitDone(framework.value);\n\n spinner.succeed(\"Project configured! Ready to start\");\n } catch {\n spinner.fail(\"Failed to configure Slice Machine\");\n process.exit(-1);\n }\n}\n\nconst getTheSliceMachineVersionInstalled = (\n packageJson: NodeUtils.FileContent<NodeUtils.JsonPackage>\n) => {\n const sliceMachinePackageInstalled = Object.entries(\n packageJson.content?.devDependencies || {}\n ).find((devDependency) => {\n if (devDependency[0] === CONSTS.SM_PACKAGE_NAME) {\n return devDependency;\n }\n });\n\n if (!sliceMachinePackageInstalled) {\n return defaultSliceMachineVersion;\n }\n\n const extractedVersion = extractVersionNumberFromSemver(\n sliceMachinePackageInstalled[1]\n );\n\n if (!extractedVersion) {\n return defaultSliceMachineVersion;\n }\n\n return extractedVersion;\n};\n\nconst extractVersionNumberFromSemver = (semver: string) => {\n const versionFound = semver.match(/\\d+\\.\\d+\\.\\d+/);\n\n if (versionFound && versionFound.length > 0) {\n return versionFound[0];\n }\n\n return null;\n};\n","import { CONSTS } from \"@slicemachine/core\";\nimport * as NodeUtils from \"@slicemachine/core/build/node-utils\";\nimport { logs } from \"../utils\";\n\nexport function displayFinalMessage(cwd: string): void {\n const yarnLock = NodeUtils.Files.exists(NodeUtils.YarnLockPath(cwd));\n const command = `${yarnLock ? \"yarn\" : \"npm\"} run ${CONSTS.SCRIPT_NAME}`;\n\n console.log();\n console.log(\n `${logs.white(\"■\")} Run ${logs.purple(command)} to start Slice Machine`\n );\n}\n","import * as NodeUtils from \"@slicemachine/core/build/node-utils\";\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 (NodeUtils.Files.exists(NodeUtils.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 { Models } from \"@slicemachine/core\";\nimport * as NodeUtils from \"@slicemachine/core/build/node-utils\";\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 Tracker from \"../utils/tracker\";\nimport { logs } from \"../utils\";\n\nconst { PackageJsonHelper } = NodeUtils;\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 cwd: string,\n libGithubPath: string,\n branch = \"HEAD\"\n): Promise<string[] | undefined> {\n const spinner = logs.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 NodeUtils.Files.write(path.join(libDestinationFolder, \"meta.json\"), {\n name: pkgJson.name,\n });\n\n // retrieve all slices lib paths\n const manifest = NodeUtils.Files.readEntity<Error | Models.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 )(Models.Manifest.decode(payload));\n }\n );\n if (manifest instanceof Error) throw manifest;\n\n const localLibs = Models.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 void Tracker.get().trackDownloadLibrary(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 { CustomType } from \"@prismicio/types-internal/lib/customtypes\";\nimport { Slices, SliceSM } from \"@slicemachine/core/build/models\";\nimport axios from \"axios\";\nimport { logs } from \"../../utils\";\nimport type { ApiEndpoints } from \"./endpoints\";\n\nfunction handelErrors(prefix: string, err: unknown) {\n if (axios.isAxiosError(err) && err.response) {\n logs.writeError(\n `${prefix} | [${err.response.status}]: ${err.response.statusText}`\n );\n } else if (err instanceof Error) {\n logs.writeError(`${prefix} ${err.message}`);\n } else {\n logs.writeError(`${prefix} ${String(err)}`);\n }\n}\n\nexport async function getRemoteSliceIds(\n customTypeApiEndpoint: ApiEndpoints[\"Models\"],\n repository: string,\n authorization: string\n): Promise<Array<string>> {\n const addr = `${stripLastSlash(customTypeApiEndpoint)}/slices`;\n return axios\n .get<Array<{ id: string }>>(addr, {\n headers: {\n Authorization: `Bearer ${authorization}`,\n repository,\n },\n })\n .then((res) => {\n return Array.isArray(res.data) ? res.data.map((model) => model.id) : [];\n });\n}\n\nasync function sendModelToPrismic(\n repository: string,\n authorization: string,\n customTypesApiEndpoint: string,\n remoteSliceIds: Array<string>,\n model: SliceSM\n): Promise<void> {\n const data = Slices.fromSM(model);\n const updateOrInsertUrl = `${customTypesApiEndpoint}slices/${\n remoteSliceIds.includes(model.id) ? \"update\" : \"insert\"\n }`;\n\n return axios\n .post(updateOrInsertUrl, data, {\n headers: {\n Authorization: `Bearer ${authorization}`,\n repository,\n },\n })\n .then(() => {\n return;\n })\n .catch((err) => {\n handelErrors(\n `sending slice ${model.id}, please try again. If the problem persists, contact us.`,\n err\n );\n throw err;\n });\n}\n\nexport async function sendManyModelsToPrismic(\n repository: string,\n authorization: string,\n customTypesApiEndpoint: string,\n remoteSliceIds: Array<string>,\n models: Array<SliceSM>\n): Promise<void> {\n return Promise.all(\n models.map((model) =>\n sendModelToPrismic(\n repository,\n authorization,\n customTypesApiEndpoint,\n remoteSliceIds,\n model\n )\n )\n )\n .then(() => {\n return;\n })\n .catch(() => {\n process.exit(1);\n });\n}\n\nfunction stripLastSlash(str: string) {\n return str.replace(/\\/*$/g, \"\");\n}\n\nexport function getRemoteCustomTypeIds(\n customTypeApiEndpoint: ApiEndpoints[\"Models\"],\n repository: string,\n authorization: string\n): Promise<Array<string>> {\n const addr = `${stripLastSlash(customTypeApiEndpoint)}/customtypes`;\n return axios\n .get<CustomType[]>(addr, {\n headers: {\n Authorization: `Bearer ${authorization}`,\n repository,\n },\n })\n .then((res) => {\n return Array.isArray(res.data) ? res.data.map((ct) => ct.id) : [];\n });\n}\n\nasync function sendCustomTypeToPrismic(\n repository: string,\n authorization: string,\n customTypeApiEndpoint: string,\n remoteCustomTypeIds: Array<string>,\n customType: CustomType\n): Promise<void> {\n const shouldUpdate = remoteCustomTypeIds.includes(customType.id);\n const addr = `${stripLastSlash(customTypeApiEndpoint)}/customtypes/${\n shouldUpdate ? \"update\" : \"insert\"\n }`;\n\n return axios\n .post(addr, customType, {\n headers: {\n repository,\n Authorization: `Bearer ${authorization}`,\n },\n })\n .then(() => {\n return;\n })\n .catch((err) => {\n handelErrors(\n `sending custom type ${customType.id}, please try again. If the problem persists, contact us.`,\n err\n );\n throw err;\n });\n}\n\nexport async function sendManyCustomTypesToPrismic(\n repository: string,\n authorization: string,\n customTypeApiEndpoint: string,\n remoteCustomTypeIds: Array<string>,\n customTypes: Array<CustomType>\n): Promise<void> {\n return Promise.all(\n customTypes.map((customType) =>\n sendCustomTypeToPrismic(\n repository,\n authorization,\n customTypeApiEndpoint,\n remoteCustomTypeIds,\n customType\n )\n )\n )\n .then(() => {\n return;\n })\n .catch(() => {\n process.exit(1);\n });\n}\n","export type ApiEndpoints = {\n Models: string;\n AclProvider: string;\n};\n\nconst ProductionApisEndpoints: ApiEndpoints = {\n Models: \"https://customtypes.prismic.io/\",\n AclProvider: \"https://0yyeb2g040.execute-api.us-east-1.amazonaws.com/prod/\",\n};\n\nconst StageApisEndpoints: ApiEndpoints = {\n Models: \"https://customtypes.wroom.io/\",\n AclProvider: \"https://2iamcvnxf4.execute-api.us-east-1.amazonaws.com/stage/\",\n};\n\nexport const getEndpointsFromBase = (base: string): ApiEndpoints => {\n const url = new URL(base);\n if (url.hostname === \"wroom.io\") return StageApisEndpoints;\n return ProductionApisEndpoints;\n};\n","import inquirer from \"inquirer\";\n\nexport async function promptToPushSlices(): Promise<boolean> {\n return inquirer\n .prompt<{ pushSlices: boolean }>([\n {\n type: \"confirm\",\n name: \"pushSlices\",\n default: false,\n message:\n \"Your repository already contains Slices. Do you want to continue pushing your local Slices?\",\n },\n ])\n .then((res) => res.pushSlices);\n}\n\nexport async function promptToPushCustomTypes(): Promise<boolean> {\n return inquirer\n .prompt<{ pushCustomTypes: boolean }>([\n {\n type: \"confirm\",\n name: \"pushCustomTypes\",\n default: false,\n message:\n \"Your repository already contains Custom Types. Do you want to continue pushing your local Slices?\",\n },\n ])\n .then((res) => res.pushCustomTypes);\n}\n","import fs from \"fs\";\nimport axios from \"axios\";\nimport mime from \"mime\";\nimport snakeCase from \"lodash.snakecase\";\nimport path from \"path\";\nimport FormData from \"form-data\";\nimport uniqid from \"uniqid\";\nimport { logs } from \"../../utils\";\nimport {\n Component,\n ComponentInfo,\n VariationSM,\n SliceSM,\n} from \"@slicemachine/core/build/models\";\n\nexport type ALC = {\n values: {\n url: string;\n fields: Record<string, string>;\n };\n imgixEndpoint: string;\n err: null | string;\n};\n\nexport async function createAcl(\n address: string,\n repository: string,\n authorization: string\n): Promise<ALC> {\n return axios\n .get<ALC>(address + \"create\", {\n headers: {\n repository,\n Authorization: `Bearer ${authorization}`,\n \"User-Agent\": \"slice-machine\",\n },\n })\n .then((res) => res.data);\n}\n\nasync function createFormForS3(\n key: string,\n filename: string,\n filePath: string,\n acl: ALC\n): Promise<FormData | null> {\n const form = new FormData();\n Object.entries(acl.values.fields).forEach(([k, value]) => {\n form.append(k, value);\n });\n form.append(\"key\", key);\n const contentType = mime.getType(filePath);\n contentType && form.append(\"Content-Type\", contentType);\n\n return fs.promises\n .readFile(filePath)\n .then((file) => {\n form.append(\"file\", file, { filename });\n return form;\n })\n .catch(() => {\n logs.writeError(`Error reading preview image: ${filename}`);\n return null;\n });\n}\n\nfunction createS3Key(\n repository: string,\n sliceName: string,\n variationId: string,\n filename: string\n): string {\n return `${repository}/shared-slices/${snakeCase(sliceName)}/${snakeCase(\n variationId\n )}-${uniqid()}/${filename}`;\n}\n\nasync function sendVariationPreviewToS3(\n acl: ALC,\n repository: string,\n sliceName: string,\n variationId: string,\n filePath: string\n): Promise<string | null> {\n const filename = path.basename(filePath);\n const key = createS3Key(repository, sliceName, variationId, filename);\n const form = await createFormForS3(key, filename, filePath, acl);\n if (form === null) return null;\n if (form.hasKnownLength() === false) {\n logs.writeError(\n `[slice/push] An error occurred while uploading preview image ${filePath} as length in unknown`\n );\n }\n\n const errorMessage = `[slice/push] An error occurred while uploading preview images for ${sliceName}-${variationId} - please contact support`;\n\n return axios\n .post(acl.values.url, form, {\n headers: {\n ...form.getHeaders(),\n \"Content-Length\": String(form.getLengthSync()),\n },\n })\n .then((res) => {\n if (res.status !== 204) {\n logs.writeError(errorMessage);\n logs.writeError(`${res.status}: ${res.statusText}`);\n return null;\n } else {\n return `${acl.imgixEndpoint}/${key}`;\n }\n })\n .catch((err) => {\n logs.writeError(errorMessage);\n if (axios.isAxiosError(err) && err.response) {\n logs.writeError(`${err.response.status}: ${err.response.statusText}`);\n } else if (err instanceof Error) {\n logs.writeError(err.message);\n } else {\n logs.writeError(String(err));\n }\n return null;\n });\n}\n\nasync function maybeAddImageUrlToVariation(\n acl: ALC,\n repository: string,\n modelId: string,\n pathToScreenShot: string,\n variation: VariationSM\n): Promise<VariationSM> {\n const imageUrl = await sendVariationPreviewToS3(\n acl,\n repository,\n modelId,\n variation.id,\n pathToScreenShot\n );\n if (!imageUrl) return variation;\n\n return {\n ...variation,\n imageUrl,\n };\n}\n\nasync function addImageUrlsToVariations(\n acl: ALC,\n repository: string,\n modelId: string,\n screenshotPaths: ComponentInfo[\"screenshotPaths\"],\n variations: Array<VariationSM>\n): Promise<Array<VariationSM>> {\n return Promise.all(\n variations.map(async (variation) => {\n const screenshot = screenshotPaths[variation.id];\n if (!screenshot || !screenshot.path) return variation;\n\n return maybeAddImageUrlToVariation(\n acl,\n repository,\n modelId,\n screenshot.path,\n variation\n );\n })\n );\n}\n\nasync function maybeUpdateModelVariationsWithImageUrl(\n acl: ALC,\n repository: string,\n component: Component\n): Promise<SliceSM> {\n const { screenshotPaths, model } = component;\n const variations = await addImageUrlsToVariations(\n acl,\n repository,\n model.id,\n screenshotPaths,\n model.variations\n );\n\n return {\n ...model,\n variations,\n };\n}\n\nexport async function addImageUrlsToModelVariations(\n acl: ALC,\n repository: string,\n components: Array<Component>\n): Promise<Array<SliceSM>> {\n return Promise.all(\n components.map(async (component) =>\n maybeUpdateModelVariationsWithImageUrl(acl, repository, component)\n )\n );\n}\n","import { Component } from \"@slicemachine/core/build/models\";\nimport * as Libraries from \"@slicemachine/core/build/libraries\";\nimport { logs } from \"../../utils\";\nimport { getRemoteSliceIds, sendManyModelsToPrismic } from \"./communication\";\nimport { getEndpointsFromBase } from \"./endpoints\";\nimport { promptToPushSlices } from \"./prompts\";\nimport { addImageUrlsToModelVariations, createAcl } from \"./s3\";\n\nexport async function sendSlicesFromStarter(\n base: string,\n repository: string,\n authorization: string,\n libraryPaths: Array<string>,\n cwd: string\n) {\n const endpoints = getEndpointsFromBase(base);\n const libraries = Libraries.libraries(cwd, libraryPaths);\n\n if (libraries.length === 0) return Promise.resolve(false);\n\n const remoteSlices = await getRemoteSliceIds(\n endpoints.Models,\n repository,\n authorization\n );\n\n if (remoteSlices.length) {\n // do prompt about slices\n\n const pushAnyway = await promptToPushSlices();\n\n if (pushAnyway === false) return Promise.resolve(true);\n }\n\n const spinner = logs.spinner(\n \"Pushing existing Slice models to your repository\"\n );\n spinner.start();\n\n const acl = await createAcl(endpoints.AclProvider, repository, authorization);\n\n const components = libraries.reduce<Array<Component>>((acc, lib) => {\n return [...acc, ...lib.components];\n }, []);\n\n const models = await addImageUrlsToModelVariations(\n acl,\n repository,\n components\n );\n\n await sendManyModelsToPrismic(\n repository,\n authorization,\n endpoints.Models,\n remoteSlices,\n models\n );\n\n spinner.succeed();\n return Promise.resolve(true);\n}\n","import { CustomType } from \"@prismicio/types-internal/lib/customtypes\";\nimport { Files, CustomTypesPaths } from \"@slicemachine/core/build/node-utils\";\nimport { isLeft } from \"fp-ts/lib/Either\";\nimport {\n getRemoteCustomTypeIds,\n sendManyCustomTypesToPrismic,\n} from \"./communication\";\nimport { promptToPushCustomTypes } from \"./prompts\";\nimport { getEndpointsFromBase } from \"./endpoints\";\nimport { logs } from \"../../utils\";\n\nexport function readCustomTypes(cwd: string): Array<CustomType> {\n const customTypePaths = CustomTypesPaths(cwd);\n const dir = customTypePaths.value();\n\n if (Files.isDirectory(dir) === false) return [];\n\n const fileNames = Files.readDirectory(dir);\n\n const files = fileNames.reduce<Array<CustomType>>((acc, fileName) => {\n const filePath = customTypePaths.customType(fileName).model();\n const json = Files.safeReadJson(filePath);\n\n if (!json) return acc;\n\n const file = CustomType.decode(json);\n\n if (file instanceof Error) {\n logs.writeError(`reading ${filePath}: ${file.message}`);\n return acc;\n }\n if (isLeft(file)) {\n logs.writeError(`validating ${filePath}: ${JSON.stringify(file.left)}`);\n return acc;\n }\n\n return [...acc, file.right];\n }, []);\n\n return files;\n}\n\nexport async function sendCustomTypesFromStarter(\n repository: string,\n authorization: string,\n base: string,\n cwd: string\n) {\n const customTypeApiEndpoint = getEndpointsFromBase(base).Models;\n\n const customTypes = readCustomTypes(cwd);\n\n if (customTypes.length === 0) return Promise.resolve(false);\n\n const remoteCustomTypeIds = await getRemoteCustomTypeIds(\n customTypeApiEndpoint,\n repository,\n authorization\n );\n\n if (remoteCustomTypeIds.length) {\n const shouldPush = await promptToPushCustomTypes();\n if (shouldPush === false) return Promise.resolve(false);\n }\n\n const spinner = logs.spinner(\n \"Pushing existing custom types to your repository\"\n );\n spinner.start();\n\n await sendManyCustomTypesToPrismic(\n repository,\n authorization,\n customTypeApiEndpoint,\n remoteCustomTypeIds,\n customTypes\n );\n\n spinner.succeed();\n\n return Promise.resolve(true);\n}\n","import { parsePrismicAuthToken } from \"@slicemachine/core/build/utils/cookie\";\nimport { retrieveManifest, Files } from \"@slicemachine/core/build/node-utils\";\nimport path from \"path\";\nimport { sendSlicesFromStarter } from \"./starters/slices\";\nimport { sendCustomTypesFromStarter } from \"./starters/custom-types\";\n\nexport async function sendStarterData(\n repository: string,\n base: string,\n cookies: string,\n cwd: string\n) {\n const smJson = retrieveManifest(cwd);\n const hasDocuments = Files.exists(path.join(cwd, \"documents\"));\n\n if (smJson.exists === false || hasDocuments === false)\n return Promise.resolve(false);\n\n const authTokenFromCookie = parsePrismicAuthToken(cookies);\n\n if (smJson.content && smJson.content.libraries) {\n await sendSlicesFromStarter(\n base,\n repository,\n authTokenFromCookie,\n smJson.content.libraries,\n cwd\n );\n }\n\n return sendCustomTypesFromStarter(repository, authTokenFromCookie, base, cwd);\n}\n","import { CONSTS } from \"@slicemachine/core\";\nimport Prismic from \"@slicemachine/core/build/prismic\";\nimport Tracker from \"./utils/tracker\";\nimport {\n installRequiredDependencies,\n validatePkg,\n chooseOrCreateARepository,\n loginOrBypass,\n configureProject,\n displayFinalMessage,\n detectFramework,\n installLib,\n sendStarterData,\n} from \"./steps\";\nimport { findArgument, logs } from \"./utils\";\n\nasync function init() {\n const cwd = findArgument(process.argv, \"cwd\") || process.cwd();\n const base = findArgument(process.argv, \"base\") || 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\";\n const maybeRepositorySubdomain = findArgument(process.argv, \"repository\");\n\n Tracker.get().initialize(\n process.env.PUBLIC_SM_INIT_SEGMENT_KEY ||\n \"JfTfmHaATChc4xueS7RcCBsixI71dJIJ\",\n isTrackingAvailable\n );\n\n void Tracker.get().trackInitStart(maybeRepositorySubdomain);\n\n console.log(\n logs.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 // If we get the info from the profile we want to identify all the previous events sent or continue in anonymous mode\n if (user.profile) {\n Tracker.get().identifyUser(user.profile.shortId, user.profile.intercomHash);\n }\n\n void Tracker.get().trackInitIdentify();\n\n // retrieve tokens for api calls\n const config = Prismic.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 repositoryDomainName = await chooseOrCreateARepository(\n cwd,\n frameworkResult.value,\n config.cookies,\n config.base,\n maybeRepositorySubdomain\n );\n\n Tracker.get().setRepository(repositoryDomainName);\n\n const sliceLibPath = lib ? await installLib(cwd, lib, branch) : undefined;\n\n const wasStarter = await sendStarterData(\n repositoryDomainName,\n config.base,\n config.cookies,\n cwd\n ); // will be false if no sm.json is found\n\n // configure the SM.json file and the json package file of the project..\n await configureProject(\n cwd,\n base,\n repositoryDomainName,\n frameworkResult,\n sliceLibPath,\n isTrackingAvailable\n );\n\n // Install the required dependencies in the project.\n await installRequiredDependencies(cwd, frameworkResult.value, wasStarter);\n\n // Ask the user to run slice-machine.\n displayFinalMessage(cwd);\n}\n\ninit()\n .then(() => {\n process.exit(0);\n })\n .catch((error) => {\n if (error instanceof Error) logs.writeError(error.message);\n else console.error(error);\n });\n"],"names":["uuidv4","ServerAnalytics","chalk","underline","bold","spinner","ora","writeError","Utils","DEFAULT_BASE","CONSTS","hapi","open","Endpoints","PrismicSharedConfigManager","Communication","util","exec","Models","NodeUtils","logs.spinner","path","Prismic","logs.bold","logs.cyan","logs.dim","inquirer","logs.purple","Separator","axios","pipe","fold","logs.white","tmp","AdmZip","fs","getOrElseW","Slices","FormData","mime","snakeCase","uniqid","Libraries","CustomTypesPaths","Files","CustomType","isLeft","retrieveManifest","parsePrismicAuthToken"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/utils/tracker.ts","../src/utils/logs.ts","../src/utils/auth/helpers.ts","../src/utils/auth/index.ts","../src/utils/index.ts","../src/steps/install-required-dependencies.ts","../src/steps/validate-pkg.ts","../src/utils/create-repo.ts","../src/steps/choose-or-create-a-repository.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/steps/starters/communication.ts","../src/steps/starters/endpoints.ts","../src/steps/starters/prompts.ts","../src/steps/starters/s3.ts","../src/steps/starters/slices.ts","../src/steps/starters/custom-types.ts","../src/steps/starters/documents.ts","../src/steps/sendStarterData.ts","../src/index.ts"],"sourcesContent":["import ServerAnalytics from \"analytics-node\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { Models } from \"@slicemachine/core\";\n\nexport enum EventType {\n DownloadLibrary = \"SliceMachine Download Library\",\n InitStart = \"SliceMachine Init Start\",\n InitIdentify = \"SliceMachine Init Identify\",\n InitDone = \"SliceMachine Init Done\",\n}\n\ntype SegmentIdentifier = { userId: string } | { anonymousId: string };\n\nexport class InitTracker {\n #client: ServerAnalytics | null = null;\n #isTrackingActive = true;\n #anonymousId = \"\";\n #userId: string | null = null;\n #repository: string | null = null;\n\n initialize(segmentKey: string, isTrackingActive = true): void {\n try {\n // The initialize method cannot be used for changing some class properties\n if (!!this.#client) return;\n\n this.#isTrackingActive = isTrackingActive;\n this.#anonymousId = uuidv4();\n this.#client = new ServerAnalytics(segmentKey);\n } catch (error) {\n // If the client is not correctly setup we are silently failing as the tracker is not a critical feature\n }\n }\n\n /** Private methods **/\n\n _trackEvent(\n eventType: EventType,\n attributes: Record<string, unknown> = {}\n ): Promise<void> {\n return new Promise((resolve) => {\n if (!this._isTrackingPossible(this.#client)) {\n return resolve();\n }\n\n const identifier = this._createSegmentIdentifier();\n const payload = {\n event: eventType,\n ...identifier,\n properties: attributes,\n ...(this.#repository\n ? { context: { groupId: { Repository: this.#repository } } }\n : {}),\n };\n\n return this.#client.track(payload, () => {\n // if(_) return reject(_)\n return resolve();\n });\n });\n }\n\n _identifyEvent(userId: string, intercomHash: string): void {\n if (!this._isTrackingPossible(this.#client)) {\n return;\n }\n\n try {\n this.#client.identify({\n userId,\n anonymousId: this.#anonymousId,\n integrations: {\n Intercom: {\n user_hash: intercomHash,\n },\n },\n });\n } catch {\n // If the client is not correctly setup we are silently failing as the tracker is not a critical feature\n }\n }\n\n _isTrackingPossible(\n client: ServerAnalytics | null\n ): client is ServerAnalytics {\n return !!client && this.#isTrackingActive;\n }\n\n _createSegmentIdentifier(): SegmentIdentifier {\n return !!this.#userId\n ? { userId: this.#userId }\n : { anonymousId: this.#anonymousId };\n }\n\n /** Public methods **/\n\n setRepository(repository: string) {\n this.#repository = repository;\n }\n\n identifyUser(userId: string, intercomHash: string): void {\n this.#userId = userId;\n return this._identifyEvent(userId, intercomHash);\n }\n\n trackDownloadLibrary(library: string): Promise<void> {\n return this._trackEvent(EventType.DownloadLibrary, { library });\n }\n\n trackInitIdentify(): Promise<void> {\n return this._trackEvent(EventType.InitIdentify);\n }\n\n trackInitStart(repoDomain: string | undefined): Promise<void> {\n return this._trackEvent(EventType.InitStart, { repo: repoDomain });\n }\n\n trackInitDone(framework: Models.Frameworks): Promise<void> {\n return this._trackEvent(EventType.InitDone, { framework });\n }\n}\n\nconst Tracker = (() => {\n let smTrackerInstance: InitTracker;\n\n const init = () => new InitTracker();\n\n return {\n get() {\n if (!smTrackerInstance) smTrackerInstance = init();\n return smTrackerInstance;\n },\n };\n})();\n\nexport default Tracker;\n","import chalk from \"chalk\";\nimport ora from \"ora\";\n\nexport const purple = chalk.hex(\"8c76fc\");\nexport const error = chalk.hex(\"FF6868\");\nexport const warning = chalk.hex(\"F3AD38\");\nexport const underline = chalk.underline;\nexport const bold = chalk.bold;\nexport const dim = chalk.dim;\nexport const cyan = chalk.cyan;\nexport const yellow = chalk.yellow;\nexport const white = chalk.white;\n\nexport const spinner = ora;\n\nexport const writeError = (msg: string, prefix = \"Error!\"): void =>\n console.error(`${error(prefix)} ${msg}`);\n\nexport const writeWarning = (msg: string, prefix = \"Warning!\"): void =>\n console.warn(`${warning(prefix)} ${msg}`);\n\nexport const writeCheck = (msg: string): void => {\n ora().succeed(msg); // using the same check as Ora for coherence\n};\n\nexport const writeInfo = (msg: string): void => {\n console.log(`${yellow(\"ℹ\")} ${dim(msg)}`);\n};\n","import * as hapi from \"@hapi/hapi\";\nimport open from \"open\";\nimport * as logs from \"../logs\";\nimport { Utils, CONSTS } from \"@slicemachine/core\";\nimport { PrismicSharedConfigManager } from \"@slicemachine/core/build/prismic\";\n\nconst { Cookie } = Utils;\nconst { DEFAULT_BASE, DEFAULT_SERVER_PORT } = CONSTS;\n\nconst { bold, underline, spinner, writeError } = logs;\n\nexport type HandlerData = { email: string; cookies: ReadonlyArray<string> };\n\nexport const isHandlerData = (\n data: string | Record<string, unknown>\n): data is HandlerData => {\n if (typeof data != \"object\") return false;\n\n const { email, cookies } = data as Partial<HandlerData>;\n return (\n Boolean(email && cookies) &&\n Array.isArray(cookies) &&\n !cookies.some((c: unknown) => typeof c !== \"string\")\n );\n};\n\nconst Routes = {\n authentication:\n (server: hapi.Server) =>\n (\n onSuccess: (data: HandlerData) => void,\n onFail: () => void\n ): hapi.ServerRoute => ({\n method: \"POST\",\n path: \"/\",\n handler: authenticationHandler(server)(onSuccess, onFail),\n }),\n\n notFound: {\n method: [\"GET\", \"POST\"],\n path: \"/{any*}\",\n handler: (\n request: hapi.Request,\n h: hapi.ResponseToolkit\n ): hapi.ResponseObject => {\n return h\n .response(`not found: [${request.method}]: ${request.url.toString()}`)\n .code(404);\n },\n },\n};\n\nexport function validatePayload(\n payload: Buffer | string | Record<string, unknown>\n): HandlerData | null {\n if (Buffer.isBuffer(payload)) return null;\n return isHandlerData(payload) ? payload : null;\n}\n\nconst authenticationHandler =\n (server: hapi.Server) =>\n (onSuccess: (data: HandlerData) => void, onFail: () => void) => {\n return (request: hapi.Request, h: hapi.ResponseToolkit) => {\n try {\n const data: HandlerData | null = validatePayload(\n request.payload as Buffer | string | Record<string, unknown>\n ); // type coming from the lib\n\n if (!data) {\n onFail();\n h.response(\"Error with cookies\").code(400);\n throw new Error(\n \"It seems the server didn't respond properly, please contact us.\"\n );\n }\n onSuccess(data);\n return h.response(data).code(200);\n } finally {\n void server.stop({ timeout: 10000 });\n }\n };\n };\n\nfunction buildServer(base: string, port: number, host: string): hapi.Server {\n const server = hapi.server({\n port,\n host,\n routes: {\n cors: {\n origin: [base],\n headers: [\"Origin\", \"X-Requested-With\", \"Content-Type\", \"Accept\"],\n },\n },\n });\n return server;\n}\n\nexport function askSingleChar(title: string): Promise<string> {\n return new Promise((resolve) => {\n process.stdout.write(title);\n const rawMode: boolean = process.stdin.isRaw;\n if (process.stdin.setRawMode) process.stdin.setRawMode(true);\n\n function handler(key: Buffer) {\n const response: string = key.toString(\"utf-8\");\n if (process.stdin.setRawMode) process.stdin.setRawMode(Boolean(rawMode));\n process.stdin.removeListener(\"data\", handler);\n resolve(response);\n }\n\n process.stdin.on(\"data\", handler);\n });\n}\n\nexport async function startServerAndOpenBrowser(\n url: string,\n action: \"login\" | \"signup\",\n base: string = DEFAULT_BASE,\n port: number = DEFAULT_SERVER_PORT\n): Promise<{\n onLoginFail: () => void;\n}> {\n const confirmation = await askSingleChar(\n `>> Press any key to open the browser to ${action} or q to exit:`\n );\n if (confirmation === \"q\" || confirmation === \"\\u0003\")\n return process.exit(-1);\n\n const s = spinner(\"Waiting for the browser response\");\n\n const onLoginFail = () => {\n s.stop();\n writeError(`We failed to log you into your Prismic account`);\n console.log(`Run ${bold(\"npx slicemachine init\")} again!`);\n process.exit(-1);\n };\n\n function onSuccess(data: HandlerData) {\n s.succeed(`Logged in as ${bold(data.email)}`).stop();\n PrismicSharedConfigManager.setProperties({\n cookies: Cookie.serializeCookies(data.cookies),\n base,\n });\n }\n\n function onFail(): void {\n onLoginFail();\n }\n\n const server = buildServer(base, port, \"localhost\");\n server.route([\n Routes.authentication(server)(onSuccess, onFail),\n Routes.notFound,\n ]);\n\n return server.start().then(() => {\n console.log(\"\\nOpening browser to \" + underline(url));\n s.start();\n void open(url);\n return {\n onLoginFail,\n };\n });\n}\n","import { Utils, Models } from \"@slicemachine/core\";\nimport { startServerAndOpenBrowser } from \"./helpers\";\nimport {\n Communication,\n Endpoints,\n PrismicSharedConfigManager,\n} from \"@slicemachine/core/build/prismic\";\n\nasync function startAuth({\n base,\n url,\n action,\n}: {\n base: string;\n url: string;\n action: \"signup\" | \"login\";\n}): Promise<void> {\n const { onLoginFail } = await startServerAndOpenBrowser(url, action, base);\n try {\n // We wait 3 minutes before timeout\n await Utils.Poll.startPolling<Models.UserInfo | null, Models.UserInfo>(\n () => Auth.validateSession(base),\n (user): user is Models.UserInfo => !!user,\n 3000,\n 60\n );\n return;\n } catch (e) {\n onLoginFail();\n }\n}\n\nexport const Auth = {\n login: async (base: string): Promise<void> => {\n const endpoints = Endpoints.buildEndpoints(base);\n return startAuth({\n base,\n url: endpoints.Dashboard.cliLogin,\n action: \"login\",\n });\n },\n signup: async (base: string): Promise<void> => {\n const endpoints = Endpoints.buildEndpoints(base);\n return startAuth({\n base,\n url: endpoints.Dashboard.cliSignup,\n action: \"signup\",\n });\n },\n logout: (): void => PrismicSharedConfigManager.remove(),\n validateSession: async (\n requiredBase: string\n ): Promise<Models.UserInfo | null> => {\n const config = PrismicSharedConfigManager.get();\n\n if (!config.cookies.length) return Promise.resolve(null); // default config, logged out.\n if (requiredBase != config.base) return Promise.resolve(null); // not the same base so it doesn't count.\n\n return Communication.validateSession(config.cookies, requiredBase).catch(\n () => null\n );\n },\n};\n","import util from \"util\";\nimport { exec } from \"child_process\";\nexport * as logs from \"./logs\";\nexport { Auth } from \"./auth\";\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, logs } from \"../utils\";\nimport { CONSTS, Models } from \"@slicemachine/core\";\nimport * as NodeUtils from \"@slicemachine/core/build/node-utils\";\n\nconst {\n PRISMIC_CLIENT,\n PRISMIC_DOM_PACKAGE_NAME,\n PRISMIC_REACT_PACKAGE_NAME,\n SM_PACKAGE_NAME,\n NUXT_PRISMIC,\n PRISMIC_VUE,\n SLICE_SIMULATOR_REACT,\n SLICE_SIMULATOR_VUE,\n PRISMIC_HELPERS,\n} = CONSTS;\n\nfunction depsForFramework(framework: Models.Frameworks): string {\n switch (framework) {\n case Models.Frameworks.react:\n return `${PRISMIC_REACT_PACKAGE_NAME} ${PRISMIC_CLIENT} ${PRISMIC_HELPERS}`;\n case Models.Frameworks.next:\n return `${PRISMIC_REACT_PACKAGE_NAME} ${PRISMIC_CLIENT} ${SLICE_SIMULATOR_REACT} ${PRISMIC_HELPERS}`;\n case Models.Frameworks.svelte:\n return `${PRISMIC_DOM_PACKAGE_NAME} ${PRISMIC_CLIENT}`;\n case Models.Frameworks.nuxt:\n return `${NUXT_PRISMIC} ${SLICE_SIMULATOR_VUE}`;\n case Models.Frameworks.vue:\n return `${PRISMIC_VUE} ${PRISMIC_CLIENT} ${PRISMIC_DOM_PACKAGE_NAME}`;\n default:\n return \"\";\n }\n}\n\nasync function addAndInstallDeps(\n framework: Models.Frameworks,\n useYarn = false\n): Promise<string> {\n const installDevDependencyCommand = useYarn\n ? \"yarn add -D\"\n : \"npm install --save-dev\";\n const installDependencyCommand = useYarn ? \"yarn add\" : \"npm install --save\";\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 return stderr;\n}\n\nasync function installDeps(useYarn = false): Promise<string> {\n const installCommand = useYarn ? \"yarn\" : \"npm install\";\n const { stderr } = await execCommand(installCommand);\n return stderr;\n}\n\nexport async function installRequiredDependencies(\n cwd: string,\n framework: Models.Frameworks,\n skipDependencies: boolean\n): Promise<void> {\n const yarnLock = NodeUtils.Files.exists(NodeUtils.YarnLockPath(cwd));\n\n const spinner = logs.spinner(\"Installing Slice Machine\");\n spinner.start();\n\n const stderr = await (skipDependencies\n ? installDeps(yarnLock)\n : addAndInstallDeps(framework, yarnLock));\n\n const pathToPkg = path.join(\n NodeUtils.PackagePaths(cwd).value(),\n SM_PACKAGE_NAME\n );\n const isPackageInstalled = NodeUtils.Files.exists(pathToPkg);\n\n if (isPackageInstalled || !stderr.length) {\n spinner.succeed(\"Slice Machine was installed successfully\");\n return;\n }\n\n spinner.fail();\n logs.writeWarning(\n `could not install ${SM_PACKAGE_NAME}. Please do it manually!`\n );\n}\n","import * as NodeUtils from \"@slicemachine/core/build/node-utils\";\nimport { logs } from \"../utils\";\n\nexport function validatePkg(cwd: string): void {\n const jsonPackage = NodeUtils.retrieveJsonPackage(cwd);\n if (!jsonPackage.exists) {\n logs.writeError(`package.json not found. Are you in the right folder?`);\n return process.exit(-1);\n }\n if (!jsonPackage.content) {\n logs.writeError(`could not parse package.json.`);\n return process.exit(-1);\n }\n}\n","import type { Models } from \"@slicemachine/core\";\nimport * as logs from \"./logs\";\nimport * as Prismic from \"@slicemachine/core/build/prismic\";\n\nexport function createRepository(\n domain: string,\n framework: Models.Frameworks,\n cookies: string,\n base: string\n): Promise<string> {\n const spinner = logs.spinner(\"Creating Prismic Repository\");\n spinner.start();\n\n return Prismic.Communication.createRepository(\n domain,\n cookies,\n framework,\n base\n )\n .then((res) => {\n const addressUrl = new URL(base);\n const repoDomainName = res.data.domain || domain;\n addressUrl.hostname = `${repoDomainName}.${addressUrl.hostname}`;\n const address = addressUrl.toString();\n spinner.succeed(`We created your new repository ${address}`);\n\n return repoDomainName;\n })\n .catch((error: Error) => {\n spinner.fail(`Error creating repository ${domain}`);\n if (error.message) {\n logs.writeError(error.message);\n }\n logs.writeError(`We failed to create you new prismic repository`);\n console.log(`Run ${logs.bold(\"npx @slicemachine/init\")} again!`);\n process.exit(-1);\n });\n}\n","import * as inquirer from \"inquirer\";\nimport Separator from \"inquirer/lib/objects/separator\";\nimport { Utils, Models, CONSTS } from \"@slicemachine/core\";\nimport * as Prismic from \"@slicemachine/core/build/prismic\";\nimport * as NodeUtils from \"@slicemachine/core/build/node-utils\";\nimport { createRepository } from \"../utils/create-repo\";\nimport { logs } from \"../utils\";\n\nexport const CREATE_REPO = \"$_CREATE_REPO\"; // not a valid domain name\nconst DEFAULT_BASE = CONSTS.DEFAULT_BASE;\n\nexport function prettyRepoName(address: URL, value?: string): string {\n const repoName = value ? logs.cyan(value) : logs.dim.cyan(\"repo-name\");\n return `${logs.cyan.dim(`${address.protocol}//`)}${repoName}${logs.cyan.dim(\n `.${address.hostname}`\n )}`;\n}\n\nexport async function promptForRepoDomain(\n base: string,\n defaultValue?: string\n): Promise<string> {\n const address = new URL(base);\n\n logs.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: \"repoDomain\",\n message: \"Name your Prismic repository\",\n type: \"input\",\n required: true,\n default: defaultValue,\n transformer: (value: string) =>\n prettyRepoName(address, value || defaultValue),\n async validate(name: string) {\n const result = await Prismic.Communication.validateRepositoryName(\n name,\n base,\n false\n );\n return result === name || result;\n },\n },\n ])\n .then((res) => res.repoDomain);\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 }: Models.Repository): RepoPrompt {\n const address = new URL(base);\n address.hostname = `${domain}.${address.hostname}`;\n if (Models.canUpdateCustomTypes(role) === false) {\n return {\n name: `${logs.purple.dim(\"Use\")} ${logs.bold.dim(\n name\n )} ${logs.purple.dim(`\"${address.hostname}\"`)}`,\n value: domain,\n disabled: \"Unauthorized\",\n };\n }\n\n return {\n name: `${logs.purple(\"Use\")} ${logs.bold(name)} ${logs.purple(\n `\"${address.hostname}\"`\n )}`,\n value: domain,\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: Models.Repositories,\n base: string,\n cwd: string\n): RepoPrompts {\n const createNew = {\n name: `${logs.purple(\"Create a\")} ${logs.bold(\"new\")} ${logs.purple(\n \"Repository\"\n )}`,\n value: CREATE_REPO,\n };\n\n const maybeConfiguredRepoName = NodeUtils.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 chooseOrCreateARepository(\n cwd: string,\n framework: Models.Frameworks,\n cookies: string,\n base = DEFAULT_BASE,\n domain?: string\n): Promise<string> {\n const token = Utils.Cookie.parsePrismicAuthToken(cookies);\n const repos = await Prismic.Communication.listRepositories(token, base);\n\n const hasRepo = domain && repos.find((d) => d.domain === domain);\n if (hasRepo) return domain;\n\n if (repos.length === 0) {\n const domainName = await promptForRepoDomain(base, domain);\n return await createRepository(domainName, framework, cookies, base);\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<{ chosenRepo: string }>([\n {\n type: \"list\",\n name: \"chosenRepo\",\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.chosenRepo === CREATE_REPO) {\n const domainName = await promptForRepoDomain(base, domain);\n return await createRepository(domainName, framework, cookies, base);\n }\n\n return res.chosenRepo;\n}\n","import { Models } from \"@slicemachine/core\";\nimport * as NodeUtils from \"@slicemachine/core/build/node-utils\";\nimport * as inquirer from \"inquirer\";\nimport { logs } from \"../utils\";\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: NodeUtils.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 ${logs.bold(\n \"npx @slicemachine/init\"\n )} in a Nuxt or Next.js project`;\n\n const spinner = logs.spinner(\n \"Detecting framework to install correct dependencies\"\n );\n\n spinner.start();\n\n try {\n const maybeFramework = NodeUtils.Framework.defineFramework({\n cwd,\n supportedFrameworks: Object.values(Models.Frameworks),\n });\n\n spinner.stop();\n\n if (!maybeFramework || maybeFramework === Models.Frameworks.vanillajs) {\n logs.writeError(\"Framework not detected\");\n return await promptForFramework();\n }\n\n const nameToPrint = NodeUtils.Framework.fancyName(maybeFramework);\n\n if (!NodeUtils.Framework.isFrameworkSupported(maybeFramework)) {\n logs.writeError(`${nameToPrint} is currently not supported`);\n console.log(failMessage);\n process.exit(1);\n }\n\n logs.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 logs.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, Models, CONSTS } from \"@slicemachine/core\";\nimport * as Prismic from \"@slicemachine/core/build/prismic\";\n\nexport async function getUserProfile(\n cookies: string,\n base = CONSTS.DEFAULT_BASE\n): Promise<Models.UserProfile> {\n const userServiceBase =\n CONSTS.DEFAULT_BASE === base\n ? CONSTS.USER_SERVICE_BASE\n : CONSTS.USER_SERVICE_STAGING_BASE;\n\n // note the auth server also provides a userId\n const url = new URL(userServiceBase);\n url.pathname = \"profile\";\n\n const endpoint = url.toString();\n const token = Utils.Cookie.parsePrismicAuthToken(cookies);\n\n return axios\n .get<Models.UserProfile>(endpoint, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n })\n .then((res) =>\n pipe(\n Models.UserProfile.decode(res.data),\n fold<t.Errors, Models.UserProfile, Models.UserProfile>(\n () => {\n throw new Error(\"Can't parse user profile\");\n },\n (data: Models.UserProfile) => data\n )\n )\n );\n}\n\nexport async function validateSessionAndGetProfile(\n base = CONSTS.DEFAULT_BASE\n): Promise<{\n info: Models.UserInfo;\n profile: Models.UserProfile | null;\n} | null> {\n const config = Prismic.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 Prismic.Communication.validateSession(\n config.cookies,\n base\n );\n const profile = await getUserProfile(config.cookies, base).catch(\n () => null\n );\n if (profile?.shortId) {\n Prismic.PrismicSharedConfigManager.setProperties({\n shortId: profile.shortId,\n intercomHash: profile.intercomHash,\n });\n }\n return { info, profile };\n } catch {\n return null;\n }\n}\n","import { Models } from \"@slicemachine/core\";\nimport { validateSessionAndGetProfile } from \"../utils/communication\";\nimport { logs, Auth } from \"../utils\";\n\nexport async function loginOrBypass(base: string): Promise<{\n info: Models.UserInfo;\n profile: Models.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 logs.writeCheck(`Logged in as ${logs.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 { CONSTS } from \"@slicemachine/core\";\nimport type { Models } from \"@slicemachine/core\";\nimport * as Prismic from \"@slicemachine/core/build/prismic\";\nimport * as NodeUtils from \"@slicemachine/core/build/node-utils\";\nimport { FrameworkResult } from \"./detect-framework\";\nimport { logs } from \"../utils\";\nimport Tracker from \"../utils/tracker\";\n\ntype Base = Prismic.Endpoints.Base;\n\nconst defaultSliceMachineVersion = \"0.0.41\";\n\nexport async function configureProject(\n cwd: string,\n base: Base,\n repositoryDomainName: string,\n framework: FrameworkResult,\n sliceLibPath: string[] = [],\n tracking = true\n): Promise<void> {\n const frameworkName = NodeUtils.Framework.fancyName(framework.value);\n const spinner = logs.spinner(\n `Configuring your ${frameworkName} and Prismic project...`\n );\n spinner.start();\n\n try {\n const manifest = NodeUtils.retrieveManifest(cwd);\n const packageJson = NodeUtils.retrieveJsonPackage(cwd);\n\n const sliceMachineVersionInstalled =\n getTheSliceMachineVersionInstalled(packageJson);\n\n const manifestAlreadyExistWithContent = manifest.exists && manifest.content;\n\n const libs =\n manifest.content &&\n manifest.content.libraries &&\n manifest.content.libraries.length > 0\n ? manifest.content.libraries\n : [\"@/slices\"];\n\n const manifestUpdated: Models.Manifest = {\n ...(manifestAlreadyExistWithContent\n ? manifest.content\n : { _latest: sliceMachineVersionInstalled }),\n apiEndpoint: Prismic.Endpoints.buildRepositoryEndpoint(\n base,\n repositoryDomainName\n ),\n libraries: [...libs, ...sliceLibPath], // odd case here for staters\n ...(framework.manuallyAdded ? { framework: framework.value } : {}),\n ...(!tracking ? { tracking } : {}),\n };\n\n if (!manifest.exists) NodeUtils.createManifest(cwd, manifestUpdated);\n else NodeUtils.patchManifest(cwd, manifestUpdated);\n\n // create the default slices folder if it doesn't exist.\n const pathToSlicesFolder = NodeUtils.CustomPaths(cwd)\n .library(\"slices\")\n .value();\n if (\n !NodeUtils.Files.exists(pathToSlicesFolder) &&\n libs.includes(\"@/slices\")\n ) {\n NodeUtils.Files.mkdir(pathToSlicesFolder, { recursive: true });\n }\n\n // add slicemachine script to package.json.\n NodeUtils.addJsonPackageSmScript(cwd);\n\n await Tracker.get().trackInitDone(framework.value);\n\n spinner.succeed(\"Project configured! Ready to start\");\n } catch {\n spinner.fail(\"Failed to configure Slice Machine\");\n process.exit(-1);\n }\n}\n\nconst getTheSliceMachineVersionInstalled = (\n packageJson: NodeUtils.FileContent<NodeUtils.JsonPackage>\n) => {\n const sliceMachinePackageInstalled = Object.entries(\n packageJson.content?.devDependencies || {}\n ).find((devDependency) => {\n if (devDependency[0] === CONSTS.SM_PACKAGE_NAME) {\n return devDependency;\n }\n });\n\n if (!sliceMachinePackageInstalled) {\n return defaultSliceMachineVersion;\n }\n\n const extractedVersion = extractVersionNumberFromSemver(\n sliceMachinePackageInstalled[1]\n );\n\n if (!extractedVersion) {\n return defaultSliceMachineVersion;\n }\n\n return extractedVersion;\n};\n\nconst extractVersionNumberFromSemver = (semver: string) => {\n const versionFound = semver.match(/\\d+\\.\\d+\\.\\d+/);\n\n if (versionFound && versionFound.length > 0) {\n return versionFound[0];\n }\n\n return null;\n};\n","import { CONSTS } from \"@slicemachine/core\";\nimport * as NodeUtils from \"@slicemachine/core/build/node-utils\";\nimport { logs } from \"../utils\";\n\nexport function displayFinalMessage(cwd: string): void {\n const yarnLock = NodeUtils.Files.exists(NodeUtils.YarnLockPath(cwd));\n const command = `${yarnLock ? \"yarn\" : \"npm\"} run ${CONSTS.SCRIPT_NAME}`;\n\n console.log();\n console.log(\n `${logs.white(\"■\")} Run ${logs.purple(command)} to start Slice Machine`\n );\n}\n","import * as NodeUtils from \"@slicemachine/core/build/node-utils\";\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 (NodeUtils.Files.exists(NodeUtils.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 { Models } from \"@slicemachine/core\";\nimport * as NodeUtils from \"@slicemachine/core/build/node-utils\";\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 Tracker from \"../utils/tracker\";\nimport { logs } from \"../utils\";\n\nconst { PackageJsonHelper } = NodeUtils;\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 cwd: string,\n libGithubPath: string,\n branch = \"HEAD\"\n): Promise<string[] | undefined> {\n const spinner = logs.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 NodeUtils.Files.write(path.join(libDestinationFolder, \"meta.json\"), {\n name: pkgJson.name,\n });\n\n // retrieve all slices lib paths\n const manifest = NodeUtils.Files.readEntity<Error | Models.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 )(Models.Manifest.decode(payload));\n }\n );\n if (manifest instanceof Error) throw manifest;\n\n const localLibs = Models.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 void Tracker.get().trackDownloadLibrary(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 { CustomType } from \"@prismicio/types-internal/lib/customtypes\";\nimport { Slices, SliceSM } from \"@slicemachine/core/build/models\";\nimport axios from \"axios\";\nimport { logs } from \"../../utils\";\nimport type { ApiEndpoints } from \"./endpoints\";\n\nexport function handleErrors(prefix: string, err: unknown) {\n if (axios.isAxiosError(err) && err.response) {\n logs.writeError(\n `${prefix} | [${err.response.status}]: ${err.response.statusText}`\n );\n } else if (err instanceof Error) {\n logs.writeError(`${prefix} ${err.message}`);\n } else {\n logs.writeError(`${prefix} ${String(err)}`);\n }\n}\n\nexport async function getRemoteSliceIds(\n customTypeApiEndpoint: ApiEndpoints[\"Models\"],\n repository: string,\n authorization: string\n): Promise<Array<string>> {\n const addr = `${stripLastSlash(customTypeApiEndpoint)}/slices`;\n return axios\n .get<Array<{ id: string }>>(addr, {\n headers: {\n Authorization: `Bearer ${authorization}`,\n repository,\n },\n })\n .then((res) => {\n return Array.isArray(res.data) ? res.data.map((model) => model.id) : [];\n });\n}\n\nasync function sendModelToPrismic(\n repository: string,\n authorization: string,\n customTypesApiEndpoint: string,\n remoteSliceIds: Array<string>,\n model: SliceSM\n): Promise<void> {\n const data = Slices.fromSM(model);\n const updateOrInsertUrl = `${customTypesApiEndpoint}slices/${\n remoteSliceIds.includes(model.id) ? \"update\" : \"insert\"\n }`;\n\n return axios\n .post(updateOrInsertUrl, data, {\n headers: {\n Authorization: `Bearer ${authorization}`,\n repository,\n },\n })\n .then(() => {\n return;\n })\n .catch((err) => {\n handleErrors(\n `sending slice ${model.id}, please try again. If the problem persists, contact us.`,\n err\n );\n throw err;\n });\n}\n\nexport async function sendManyModelsToPrismic(\n repository: string,\n authorization: string,\n customTypesApiEndpoint: string,\n remoteSliceIds: Array<string>,\n models: Array<SliceSM>\n): Promise<void> {\n return Promise.all(\n models.map((model) =>\n sendModelToPrismic(\n repository,\n authorization,\n customTypesApiEndpoint,\n remoteSliceIds,\n model\n )\n )\n )\n .then(() => {\n return;\n })\n .catch(() => {\n process.exit(1);\n });\n}\n\nfunction stripLastSlash(str: string) {\n return str.replace(/\\/*$/g, \"\");\n}\n\nexport function getRemoteCustomTypeIds(\n customTypeApiEndpoint: ApiEndpoints[\"Models\"],\n repository: string,\n authorization: string\n): Promise<Array<string>> {\n const addr = `${stripLastSlash(customTypeApiEndpoint)}/customtypes`;\n return axios\n .get<CustomType[]>(addr, {\n headers: {\n Authorization: `Bearer ${authorization}`,\n repository,\n },\n })\n .then((res) => {\n return Array.isArray(res.data) ? res.data.map((ct) => ct.id) : [];\n });\n}\n\nasync function sendCustomTypeToPrismic(\n repository: string,\n authorization: string,\n customTypeApiEndpoint: string,\n remoteCustomTypeIds: Array<string>,\n customType: CustomType\n): Promise<void> {\n const shouldUpdate = remoteCustomTypeIds.includes(customType.id);\n const addr = `${stripLastSlash(customTypeApiEndpoint)}/customtypes/${\n shouldUpdate ? \"update\" : \"insert\"\n }`;\n\n return axios\n .post(addr, customType, {\n headers: {\n repository,\n Authorization: `Bearer ${authorization}`,\n },\n })\n .then(() => {\n return;\n })\n .catch((err) => {\n handleErrors(\n `sending custom type ${customType.id}, please try again. If the problem persists, contact us.`,\n err\n );\n throw err;\n });\n}\n\nexport async function sendManyCustomTypesToPrismic(\n repository: string,\n authorization: string,\n customTypeApiEndpoint: string,\n remoteCustomTypeIds: Array<string>,\n customTypes: Array<CustomType>\n): Promise<void> {\n return Promise.all(\n customTypes.map((customType) =>\n sendCustomTypeToPrismic(\n repository,\n authorization,\n customTypeApiEndpoint,\n remoteCustomTypeIds,\n customType\n )\n )\n )\n .then(() => {\n return;\n })\n .catch(() => {\n process.exit(1);\n });\n}\n","export type ApiEndpoints = {\n Models: string;\n AclProvider: string;\n};\n\nconst ProductionApisEndpoints: ApiEndpoints = {\n Models: \"https://customtypes.prismic.io/\",\n AclProvider: \"https://0yyeb2g040.execute-api.us-east-1.amazonaws.com/prod/\",\n};\n\nconst StageApisEndpoints: ApiEndpoints = {\n Models: \"https://customtypes.wroom.io/\",\n AclProvider: \"https://2iamcvnxf4.execute-api.us-east-1.amazonaws.com/stage/\",\n};\n\nexport const getEndpointsFromBase = (base: string): ApiEndpoints => {\n const url = new URL(base);\n if (url.hostname === \"wroom.io\") return StageApisEndpoints;\n return ProductionApisEndpoints;\n};\n","import inquirer from \"inquirer\";\n\nexport async function promptToPushSlices(): Promise<boolean> {\n return inquirer\n .prompt<{ pushSlices: boolean }>([\n {\n type: \"confirm\",\n name: \"pushSlices\",\n default: false,\n message:\n \"Your repository already contains Slices. Do you want to continue pushing your local Slices?\",\n },\n ])\n .then((res) => res.pushSlices);\n}\n\nexport async function promptToPushCustomTypes(): Promise<boolean> {\n return inquirer\n .prompt<{ pushCustomTypes: boolean }>([\n {\n type: \"confirm\",\n name: \"pushCustomTypes\",\n default: false,\n message:\n \"Your repository already contains Custom Types. Do you want to continue pushing your local Slices?\",\n },\n ])\n .then((res) => res.pushCustomTypes);\n}\n","import fs from \"fs\";\nimport axios from \"axios\";\nimport mime from \"mime\";\nimport snakeCase from \"lodash.snakecase\";\nimport path from \"path\";\nimport FormData from \"form-data\";\nimport uniqid from \"uniqid\";\nimport { logs } from \"../../utils\";\nimport {\n Component,\n ComponentInfo,\n VariationSM,\n SliceSM,\n} from \"@slicemachine/core/build/models\";\n\nexport type ALC = {\n values: {\n url: string;\n fields: Record<string, string>;\n };\n imgixEndpoint: string;\n err: null | string;\n};\n\nexport async function createAcl(\n address: string,\n repository: string,\n authorization: string\n): Promise<ALC> {\n return axios\n .get<ALC>(address + \"create\", {\n headers: {\n repository,\n Authorization: `Bearer ${authorization}`,\n \"User-Agent\": \"slice-machine\",\n },\n })\n .then((res) => res.data);\n}\n\nasync function createFormForS3(\n key: string,\n filename: string,\n filePath: string,\n acl: ALC\n): Promise<FormData | null> {\n const form = new FormData();\n Object.entries(acl.values.fields).forEach(([k, value]) => {\n form.append(k, value);\n });\n form.append(\"key\", key);\n const contentType = mime.getType(filePath);\n contentType && form.append(\"Content-Type\", contentType);\n\n return fs.promises\n .readFile(filePath)\n .then((file) => {\n form.append(\"file\", file, { filename });\n return form;\n })\n .catch(() => {\n logs.writeError(`Error reading preview image: ${filename}`);\n return null;\n });\n}\n\nfunction createS3Key(\n repository: string,\n sliceName: string,\n variationId: string,\n filename: string\n): string {\n return `${repository}/shared-slices/${snakeCase(sliceName)}/${snakeCase(\n variationId\n )}-${uniqid()}/${filename}`;\n}\n\nasync function sendVariationPreviewToS3(\n acl: ALC,\n repository: string,\n sliceName: string,\n variationId: string,\n filePath: string\n): Promise<string | null> {\n const filename = path.basename(filePath);\n const key = createS3Key(repository, sliceName, variationId, filename);\n const form = await createFormForS3(key, filename, filePath, acl);\n if (form === null) return null;\n if (form.hasKnownLength() === false) {\n logs.writeError(\n `[slice/push] An error occurred while uploading preview image ${filePath} as length in unknown`\n );\n }\n\n const errorMessage = `[slice/push] An error occurred while uploading preview images for ${sliceName}-${variationId} - please contact support`;\n\n return axios\n .post(acl.values.url, form, {\n headers: {\n ...form.getHeaders(),\n \"Content-Length\": String(form.getLengthSync()),\n },\n })\n .then((res) => {\n if (res.status !== 204) {\n logs.writeError(errorMessage);\n logs.writeError(`${res.status}: ${res.statusText}`);\n return null;\n } else {\n return `${acl.imgixEndpoint}/${key}`;\n }\n })\n .catch((err) => {\n logs.writeError(errorMessage);\n if (axios.isAxiosError(err) && err.response) {\n logs.writeError(`${err.response.status}: ${err.response.statusText}`);\n } else if (err instanceof Error) {\n logs.writeError(err.message);\n } else {\n logs.writeError(String(err));\n }\n return null;\n });\n}\n\nasync function maybeAddImageUrlToVariation(\n acl: ALC,\n repository: string,\n modelId: string,\n pathToScreenShot: string,\n variation: VariationSM\n): Promise<VariationSM> {\n const imageUrl = await sendVariationPreviewToS3(\n acl,\n repository,\n modelId,\n variation.id,\n pathToScreenShot\n );\n if (!imageUrl) return variation;\n\n return {\n ...variation,\n imageUrl,\n };\n}\n\nasync function addImageUrlsToVariations(\n acl: ALC,\n repository: string,\n modelId: string,\n screenshotPaths: ComponentInfo[\"screenshotPaths\"],\n variations: Array<VariationSM>\n): Promise<Array<VariationSM>> {\n return Promise.all(\n variations.map(async (variation) => {\n const screenshot = screenshotPaths[variation.id];\n if (!screenshot || !screenshot.path) return variation;\n\n return maybeAddImageUrlToVariation(\n acl,\n repository,\n modelId,\n screenshot.path,\n variation\n );\n })\n );\n}\n\nasync function maybeUpdateModelVariationsWithImageUrl(\n acl: ALC,\n repository: string,\n component: Component\n): Promise<SliceSM> {\n const { screenshotPaths, model } = component;\n const variations = await addImageUrlsToVariations(\n acl,\n repository,\n model.id,\n screenshotPaths,\n model.variations\n );\n\n return {\n ...model,\n variations,\n };\n}\n\nexport async function addImageUrlsToModelVariations(\n acl: ALC,\n repository: string,\n components: Array<Component>\n): Promise<Array<SliceSM>> {\n return Promise.all(\n components.map(async (component) =>\n maybeUpdateModelVariationsWithImageUrl(acl, repository, component)\n )\n );\n}\n","import { Component } from \"@slicemachine/core/build/models\";\nimport * as Libraries from \"@slicemachine/core/build/libraries\";\nimport { logs } from \"../../utils\";\nimport { getRemoteSliceIds, sendManyModelsToPrismic } from \"./communication\";\nimport { getEndpointsFromBase } from \"./endpoints\";\nimport { promptToPushSlices } from \"./prompts\";\nimport { addImageUrlsToModelVariations, createAcl } from \"./s3\";\n\nexport async function sendSlicesFromStarter(\n base: string,\n repository: string,\n authorization: string,\n libraryPaths: Array<string>,\n cwd: string\n) {\n const endpoints = getEndpointsFromBase(base);\n const libraries = Libraries.libraries(cwd, libraryPaths);\n\n if (libraries.length === 0) return Promise.resolve(false);\n\n const remoteSlices = await getRemoteSliceIds(\n endpoints.Models,\n repository,\n authorization\n );\n\n if (remoteSlices.length) {\n // do prompt about slices\n\n const pushAnyway = await promptToPushSlices();\n\n if (pushAnyway === false) return Promise.resolve(true);\n }\n\n const spinner = logs.spinner(\n \"Pushing existing Slice models to your repository\"\n );\n spinner.start();\n\n const acl = await createAcl(endpoints.AclProvider, repository, authorization);\n\n const components = libraries.reduce<Array<Component>>((acc, lib) => {\n return [...acc, ...lib.components];\n }, []);\n\n const models = await addImageUrlsToModelVariations(\n acl,\n repository,\n components\n );\n\n await sendManyModelsToPrismic(\n repository,\n authorization,\n endpoints.Models,\n remoteSlices,\n models\n );\n\n spinner.succeed();\n return Promise.resolve(true);\n}\n","import { CustomType } from \"@prismicio/types-internal/lib/customtypes\";\nimport { Files, CustomTypesPaths } from \"@slicemachine/core/build/node-utils\";\nimport { isLeft } from \"fp-ts/lib/Either\";\nimport {\n getRemoteCustomTypeIds,\n sendManyCustomTypesToPrismic,\n} from \"./communication\";\nimport { promptToPushCustomTypes } from \"./prompts\";\nimport { getEndpointsFromBase } from \"./endpoints\";\nimport { logs } from \"../../utils\";\n\nexport function readCustomTypes(cwd: string): Array<CustomType> {\n const customTypePaths = CustomTypesPaths(cwd);\n const dir = customTypePaths.value();\n\n if (Files.isDirectory(dir) === false) return [];\n\n const fileNames = Files.readDirectory(dir);\n\n const files = fileNames.reduce<Array<CustomType>>((acc, fileName) => {\n const filePath = customTypePaths.customType(fileName).model();\n const json = Files.safeReadJson(filePath);\n\n if (!json) return acc;\n\n const file = CustomType.decode(json);\n\n if (file instanceof Error) {\n logs.writeError(`reading ${filePath}: ${file.message}`);\n return acc;\n }\n if (isLeft(file)) {\n logs.writeError(`validating ${filePath}: ${JSON.stringify(file.left)}`);\n return acc;\n }\n\n return [...acc, file.right];\n }, []);\n\n return files;\n}\n\nexport async function sendCustomTypesFromStarter(\n repository: string,\n authorization: string,\n base: string,\n cwd: string\n) {\n const customTypeApiEndpoint = getEndpointsFromBase(base).Models;\n\n const customTypes = readCustomTypes(cwd);\n\n if (customTypes.length === 0) return Promise.resolve(false);\n\n const remoteCustomTypeIds = await getRemoteCustomTypeIds(\n customTypeApiEndpoint,\n repository,\n authorization\n );\n\n if (remoteCustomTypeIds.length) {\n const shouldPush = await promptToPushCustomTypes();\n if (shouldPush === false) return Promise.resolve(false);\n }\n\n const spinner = logs.spinner(\n \"Pushing existing custom types to your repository\"\n );\n spinner.start();\n\n await sendManyCustomTypesToPrismic(\n repository,\n authorization,\n customTypeApiEndpoint,\n remoteCustomTypeIds,\n customTypes\n );\n\n spinner.succeed();\n\n return Promise.resolve(true);\n}\n","import path from \"path\";\nimport fs from \"fs\";\nimport axios, { AxiosError } from \"axios\";\n\nimport * as t from \"io-ts\";\nimport { getOrElseW } from \"fp-ts/Either\";\nimport { handleErrors } from \"./communication\";\nimport { logs } from \"../../utils\";\n\nconst SignatureFileReader = t.type({\n signature: t.string,\n});\n\ntype SignatureFile = t.TypeOf<typeof SignatureFileReader>;\n\nexport async function readSignatureFile(cwd: string): Promise<SignatureFile> {\n const pathToFile = path.join(cwd, \"documents\", \"index.json\");\n return fs.promises.readFile(pathToFile, \"utf-8\").then((res) => {\n const data = JSON.parse(res) as unknown;\n return getOrElseW(() => {\n throw new Error(\"Unable to read document signature file\");\n })(SignatureFileReader.decode(data));\n });\n}\n\nasync function lsdir(dir: string): Promise<Array<string>> {\n return fs.promises.readdir(dir).then((dirs) => {\n return dirs\n .filter((name) => fs.statSync(path.join(dir, name)).isDirectory())\n .map((subdirectory) => path.join(dir, subdirectory));\n });\n}\n\nasync function lsfiles(dir: string): Promise<Array<string>> {\n return fs.promises.readdir(dir).then((dirs) => {\n return dirs\n .filter((name) => fs.statSync(path.join(dir, name)).isFile())\n .map((file) => path.join(dir, file));\n });\n}\n\nexport async function readDocuments(cwd: string) {\n const documentDir = path.join(cwd, \"documents\");\n const dirs = await lsdir(documentDir);\n\n const files = (await Promise.all(dirs.map((dir) => lsfiles(dir)))).flat();\n\n const documentObj = files.reduce<Record<string, unknown>>((acc, file) => {\n const fileContent = fs.readFileSync(file, \"utf-8\");\n const filename = path.parse(file).name;\n acc[filename] = JSON.parse(fileContent);\n return acc;\n }, {});\n\n return JSON.stringify(documentObj);\n}\n\nexport const sendDocumentsFromStarter = async (\n repository: string,\n cookies: string,\n base: string,\n cwd: string\n): Promise<boolean> => {\n const pathToDocuments = path.join(cwd, \"documents\");\n const pathToSignatureFile = path.join(pathToDocuments, \"index.json\");\n\n if (!fs.existsSync(pathToSignatureFile)) {\n return Promise.resolve(false);\n }\n\n const signatureObj = await readSignatureFile(cwd);\n const documentsStr = await readDocuments(cwd);\n\n const payload = {\n signature: signatureObj.signature,\n documents: documentsStr,\n };\n\n const prismicUrl = new URL(base);\n prismicUrl.hostname = `${repository}.${prismicUrl.hostname}`;\n prismicUrl.pathname = \"starter/documents\";\n const endpointURL = prismicUrl.toString();\n\n const spinner = logs.spinner(\"Pushing existing documents to your repository\");\n spinner.start();\n\n return axios\n .post(endpointURL, payload, {\n headers: {\n \"User-Agent\": \"prismic-cli/0\",\n Cookie: cookies,\n },\n })\n .then(() => {\n spinner.succeed();\n fs.rmSync(pathToDocuments, { recursive: true, force: true });\n return true;\n })\n .catch((e: AxiosError) => {\n spinner.fail();\n if (e.response?.data === \"Repository should not contain documents\") {\n logs.writeError(\n \"The selected repository is not empty, documents cannot be uploaded. Please choose an empty repository or delete the documents contained in your repository.\"\n );\n } else {\n handleErrors(\n \"sending documents, please try again. If the problem persists, contact us.\",\n e\n );\n }\n\n process.exit(1);\n });\n};\n","import { parsePrismicAuthToken } from \"@slicemachine/core/build/utils/cookie\";\nimport { retrieveManifest, Files } from \"@slicemachine/core/build/node-utils\";\nimport path from \"path\";\nimport { sendSlicesFromStarter } from \"./starters/slices\";\nimport { sendCustomTypesFromStarter } from \"./starters/custom-types\";\nimport { sendDocumentsFromStarter } from \"./starters/documents\";\n\nexport async function sendStarterData(\n repository: string,\n base: string,\n cookies: string,\n cwd: string\n): Promise<boolean> {\n const smJson = retrieveManifest(cwd);\n const hasDocuments = Files.exists(path.join(cwd, \"documents\"));\n\n if (smJson.exists === false || hasDocuments === false)\n return Promise.resolve(false);\n\n const authTokenFromCookie = parsePrismicAuthToken(cookies);\n\n if (smJson.content && smJson.content.libraries) {\n await sendSlicesFromStarter(\n base,\n repository,\n authTokenFromCookie,\n smJson.content.libraries,\n cwd\n );\n }\n\n await sendCustomTypesFromStarter(repository, authTokenFromCookie, base, cwd);\n\n return sendDocumentsFromStarter(repository, cookies, base, cwd);\n}\n","import { CONSTS } from \"@slicemachine/core\";\nimport Prismic from \"@slicemachine/core/build/prismic\";\nimport Tracker from \"./utils/tracker\";\nimport {\n installRequiredDependencies,\n validatePkg,\n chooseOrCreateARepository,\n loginOrBypass,\n configureProject,\n displayFinalMessage,\n detectFramework,\n installLib,\n sendStarterData,\n} from \"./steps\";\nimport { findArgument, logs } from \"./utils\";\n\nasync function init() {\n const cwd = findArgument(process.argv, \"cwd\") || process.cwd();\n const base = findArgument(process.argv, \"base\") || 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\";\n const maybeRepositorySubdomain = findArgument(process.argv, \"repository\");\n\n Tracker.get().initialize(\n process.env.PUBLIC_SM_INIT_SEGMENT_KEY ||\n \"JfTfmHaATChc4xueS7RcCBsixI71dJIJ\",\n isTrackingAvailable\n );\n\n void Tracker.get().trackInitStart(maybeRepositorySubdomain);\n\n console.log(\n logs.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 // If we get the info from the profile we want to identify all the previous events sent or continue in anonymous mode\n if (user.profile) {\n Tracker.get().identifyUser(user.profile.shortId, user.profile.intercomHash);\n }\n\n void Tracker.get().trackInitIdentify();\n\n // retrieve tokens for api calls\n const config = Prismic.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 repositoryDomainName = await chooseOrCreateARepository(\n cwd,\n frameworkResult.value,\n config.cookies,\n config.base,\n maybeRepositorySubdomain\n );\n\n Tracker.get().setRepository(repositoryDomainName);\n\n const sliceLibPath = lib ? await installLib(cwd, lib, branch) : undefined;\n\n const wasStarter = await sendStarterData(\n repositoryDomainName,\n config.base,\n config.cookies,\n cwd\n ); // will be false if no sm.json is found\n\n // configure the SM.json file and the json package file of the project..\n await configureProject(\n cwd,\n base,\n repositoryDomainName,\n frameworkResult,\n sliceLibPath,\n isTrackingAvailable\n );\n\n // Install the required dependencies in the project.\n await installRequiredDependencies(cwd, frameworkResult.value, wasStarter);\n\n // Ask the user to run slice-machine.\n displayFinalMessage(cwd);\n}\n\ninit()\n .then(() => {\n process.exit(0);\n })\n .catch((error) => {\n if (error instanceof Error) logs.writeError(error.message);\n else console.error(error);\n });\n"],"names":["uuidv4","ServerAnalytics","chalk","underline","bold","spinner","ora","writeError","Utils","DEFAULT_BASE","CONSTS","hapi","open","Endpoints","PrismicSharedConfigManager","Communication","util","exec","Models","NodeUtils","logs.spinner","path","Prismic","logs.bold","logs.cyan","logs.dim","inquirer","logs.purple","Separator","axios","pipe","fold","logs.white","tmp","AdmZip","fs","getOrElseW","Slices","FormData","mime","snakeCase","uniqid","Libraries","CustomTypesPaths","Files","CustomType","isLeft","t","retrieveManifest","parsePrismicAuthToken"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slicemachine/init",
3
- "version": "1.1.10-alpha.1",
3
+ "version": "1.1.10-alpha.2",
4
4
  "description": "The easiest way to add Slice Machine to your project",
5
5
  "license": "MIT",
6
6
  "bin": {
@@ -76,5 +76,5 @@
76
76
  "engines": {
77
77
  "node": ">=12"
78
78
  },
79
- "gitHead": "fe455abee50e134556bd23702082f3c276366f6f"
79
+ "gitHead": "e4e9a9504353eea06f60be7c288a91f6e70e6303"
80
80
  }
@@ -3,13 +3,14 @@ import { retrieveManifest, Files } from "@slicemachine/core/build/node-utils";
3
3
  import path from "path";
4
4
  import { sendSlicesFromStarter } from "./starters/slices";
5
5
  import { sendCustomTypesFromStarter } from "./starters/custom-types";
6
+ import { sendDocumentsFromStarter } from "./starters/documents";
6
7
 
7
8
  export async function sendStarterData(
8
9
  repository: string,
9
10
  base: string,
10
11
  cookies: string,
11
12
  cwd: string
12
- ) {
13
+ ): Promise<boolean> {
13
14
  const smJson = retrieveManifest(cwd);
14
15
  const hasDocuments = Files.exists(path.join(cwd, "documents"));
15
16
 
@@ -28,5 +29,7 @@ export async function sendStarterData(
28
29
  );
29
30
  }
30
31
 
31
- return sendCustomTypesFromStarter(repository, authTokenFromCookie, base, cwd);
32
+ await sendCustomTypesFromStarter(repository, authTokenFromCookie, base, cwd);
33
+
34
+ return sendDocumentsFromStarter(repository, cookies, base, cwd);
32
35
  }
@@ -4,7 +4,7 @@ import axios from "axios";
4
4
  import { logs } from "../../utils";
5
5
  import type { ApiEndpoints } from "./endpoints";
6
6
 
7
- function handelErrors(prefix: string, err: unknown) {
7
+ export function handleErrors(prefix: string, err: unknown) {
8
8
  if (axios.isAxiosError(err) && err.response) {
9
9
  logs.writeError(
10
10
  `${prefix} | [${err.response.status}]: ${err.response.statusText}`
@@ -57,7 +57,7 @@ async function sendModelToPrismic(
57
57
  return;
58
58
  })
59
59
  .catch((err) => {
60
- handelErrors(
60
+ handleErrors(
61
61
  `sending slice ${model.id}, please try again. If the problem persists, contact us.`,
62
62
  err
63
63
  );
@@ -136,7 +136,7 @@ async function sendCustomTypeToPrismic(
136
136
  return;
137
137
  })
138
138
  .catch((err) => {
139
- handelErrors(
139
+ handleErrors(
140
140
  `sending custom type ${customType.id}, please try again. If the problem persists, contact us.`,
141
141
  err
142
142
  );
@@ -0,0 +1,114 @@
1
+ import path from "path";
2
+ import fs from "fs";
3
+ import axios, { AxiosError } from "axios";
4
+
5
+ import * as t from "io-ts";
6
+ import { getOrElseW } from "fp-ts/Either";
7
+ import { handleErrors } from "./communication";
8
+ import { logs } from "../../utils";
9
+
10
+ const SignatureFileReader = t.type({
11
+ signature: t.string,
12
+ });
13
+
14
+ type SignatureFile = t.TypeOf<typeof SignatureFileReader>;
15
+
16
+ export async function readSignatureFile(cwd: string): Promise<SignatureFile> {
17
+ const pathToFile = path.join(cwd, "documents", "index.json");
18
+ return fs.promises.readFile(pathToFile, "utf-8").then((res) => {
19
+ const data = JSON.parse(res) as unknown;
20
+ return getOrElseW(() => {
21
+ throw new Error("Unable to read document signature file");
22
+ })(SignatureFileReader.decode(data));
23
+ });
24
+ }
25
+
26
+ async function lsdir(dir: string): Promise<Array<string>> {
27
+ return fs.promises.readdir(dir).then((dirs) => {
28
+ return dirs
29
+ .filter((name) => fs.statSync(path.join(dir, name)).isDirectory())
30
+ .map((subdirectory) => path.join(dir, subdirectory));
31
+ });
32
+ }
33
+
34
+ async function lsfiles(dir: string): Promise<Array<string>> {
35
+ return fs.promises.readdir(dir).then((dirs) => {
36
+ return dirs
37
+ .filter((name) => fs.statSync(path.join(dir, name)).isFile())
38
+ .map((file) => path.join(dir, file));
39
+ });
40
+ }
41
+
42
+ export async function readDocuments(cwd: string) {
43
+ const documentDir = path.join(cwd, "documents");
44
+ const dirs = await lsdir(documentDir);
45
+
46
+ const files = (await Promise.all(dirs.map((dir) => lsfiles(dir)))).flat();
47
+
48
+ const documentObj = files.reduce<Record<string, unknown>>((acc, file) => {
49
+ const fileContent = fs.readFileSync(file, "utf-8");
50
+ const filename = path.parse(file).name;
51
+ acc[filename] = JSON.parse(fileContent);
52
+ return acc;
53
+ }, {});
54
+
55
+ return JSON.stringify(documentObj);
56
+ }
57
+
58
+ export const sendDocumentsFromStarter = async (
59
+ repository: string,
60
+ cookies: string,
61
+ base: string,
62
+ cwd: string
63
+ ): Promise<boolean> => {
64
+ const pathToDocuments = path.join(cwd, "documents");
65
+ const pathToSignatureFile = path.join(pathToDocuments, "index.json");
66
+
67
+ if (!fs.existsSync(pathToSignatureFile)) {
68
+ return Promise.resolve(false);
69
+ }
70
+
71
+ const signatureObj = await readSignatureFile(cwd);
72
+ const documentsStr = await readDocuments(cwd);
73
+
74
+ const payload = {
75
+ signature: signatureObj.signature,
76
+ documents: documentsStr,
77
+ };
78
+
79
+ const prismicUrl = new URL(base);
80
+ prismicUrl.hostname = `${repository}.${prismicUrl.hostname}`;
81
+ prismicUrl.pathname = "starter/documents";
82
+ const endpointURL = prismicUrl.toString();
83
+
84
+ const spinner = logs.spinner("Pushing existing documents to your repository");
85
+ spinner.start();
86
+
87
+ return axios
88
+ .post(endpointURL, payload, {
89
+ headers: {
90
+ "User-Agent": "prismic-cli/0",
91
+ Cookie: cookies,
92
+ },
93
+ })
94
+ .then(() => {
95
+ spinner.succeed();
96
+ fs.rmSync(pathToDocuments, { recursive: true, force: true });
97
+ return true;
98
+ })
99
+ .catch((e: AxiosError) => {
100
+ spinner.fail();
101
+ if (e.response?.data === "Repository should not contain documents") {
102
+ logs.writeError(
103
+ "The selected repository is not empty, documents cannot be uploaded. Please choose an empty repository or delete the documents contained in your repository."
104
+ );
105
+ } else {
106
+ handleErrors(
107
+ "sending documents, please try again. If the problem persists, contact us.",
108
+ e
109
+ );
110
+ }
111
+
112
+ process.exit(1);
113
+ });
114
+ };