@slicemachine/init 1.1.8 → 1.1.9-alpha.3

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
@@ -80,13 +80,14 @@ var __privateSet = (obj, member, value, setter) => {
80
80
  setter ? setter.call(obj, value) : member.set(obj, value);
81
81
  return value;
82
82
  };
83
- var _client, _isTrackingActive, _anonymousId, _userId;
83
+ var _client, _isTrackingActive, _anonymousId, _userId, _repository;
84
84
  class InitTracker {
85
85
  constructor() {
86
86
  __privateAdd(this, _client, null);
87
87
  __privateAdd(this, _isTrackingActive, true);
88
88
  __privateAdd(this, _anonymousId, "");
89
89
  __privateAdd(this, _userId, null);
90
+ __privateAdd(this, _repository, null);
90
91
  }
91
92
  initialize(segmentKey, isTrackingActive = true) {
92
93
  try {
@@ -99,18 +100,21 @@ class InitTracker {
99
100
  }
100
101
  }
101
102
  _trackEvent(eventType, attributes = {}) {
102
- if (!this._isTrackingPossible(__privateGet(this, _client))) {
103
- return;
104
- }
105
- const identifier = this._createSegmentIdentifier();
106
- try {
107
- __privateGet(this, _client).track({
103
+ return new Promise((resolve) => {
104
+ if (!this._isTrackingPossible(__privateGet(this, _client))) {
105
+ return resolve();
106
+ }
107
+ const identifier = this._createSegmentIdentifier();
108
+ const payload = {
108
109
  event: eventType,
109
110
  ...identifier,
110
- properties: attributes
111
+ properties: attributes,
112
+ ...__privateGet(this, _repository) ? { context: { groupId: { Repository: __privateGet(this, _repository) } } } : {}
113
+ };
114
+ return __privateGet(this, _client).track(payload, () => {
115
+ return resolve();
111
116
  });
112
- } catch (e) {
113
- }
117
+ });
114
118
  }
115
119
  _identifyEvent(userId, intercomHash) {
116
120
  if (!this._isTrackingPossible(__privateGet(this, _client))) {
@@ -135,27 +139,31 @@ class InitTracker {
135
139
  _createSegmentIdentifier() {
136
140
  return !!__privateGet(this, _userId) ? { userId: __privateGet(this, _userId) } : { anonymousId: __privateGet(this, _anonymousId) };
137
141
  }
142
+ setRepository(repository) {
143
+ __privateSet(this, _repository, repository);
144
+ }
138
145
  identifyUser(userId, intercomHash) {
139
146
  __privateSet(this, _userId, userId);
140
- this._identifyEvent(userId, intercomHash);
147
+ return this._identifyEvent(userId, intercomHash);
141
148
  }
142
149
  trackDownloadLibrary(library) {
143
- this._trackEvent("SliceMachine Download Library" /* DownloadLibrary */, { library });
150
+ return this._trackEvent("SliceMachine Download Library" /* DownloadLibrary */, { library });
144
151
  }
145
- trackInitIdentify(repoDomain) {
146
- this._trackEvent("SliceMachine Init Identify" /* InitIdentify */, { repo: repoDomain });
152
+ trackInitIdentify() {
153
+ return this._trackEvent("SliceMachine Init Identify" /* InitIdentify */);
147
154
  }
148
155
  trackInitStart(repoDomain) {
149
- this._trackEvent("SliceMachine Init Start" /* InitStart */, { repo: repoDomain });
156
+ return this._trackEvent("SliceMachine Init Start" /* InitStart */, { repo: repoDomain });
150
157
  }
151
- trackInitDone(framework, repoDomain) {
152
- this._trackEvent("SliceMachine Init Done" /* InitDone */, { framework, repo: repoDomain });
158
+ trackInitDone(framework) {
159
+ return this._trackEvent("SliceMachine Init Done" /* InitDone */, { framework });
153
160
  }
154
161
  }
155
162
  _client = new WeakMap();
156
163
  _isTrackingActive = new WeakMap();
157
164
  _anonymousId = new WeakMap();
158
165
  _userId = new WeakMap();
166
+ _repository = new WeakMap();
159
167
  const Tracker = (() => {
160
168
  let smTrackerInstance;
161
169
  const init = () => new InitTracker();
@@ -663,7 +671,7 @@ async function loginOrBypass(base) {
663
671
  }
664
672
 
665
673
  const defaultSliceMachineVersion = "0.0.41";
666
- function configureProject(cwd, base, repositoryDomainName, framework, sliceLibPath = [], tracking = true) {
674
+ async function configureProject(cwd, base, repositoryDomainName, framework, sliceLibPath = [], tracking = true) {
667
675
  const spinner = spinner$1(`Configuring your ${framework.value} & Prismic project...`);
668
676
  spinner.start();
669
677
  try {
@@ -687,6 +695,7 @@ function configureProject(cwd, base, repositoryDomainName, framework, sliceLibPa
687
695
  NodeUtils__namespace.Files.mkdir(pathToSlicesFolder, { recursive: true });
688
696
  }
689
697
  NodeUtils__namespace.addJsonPackageSmScript(cwd);
698
+ await Tracker.get().trackInitDone(framework.value);
690
699
  spinner.succeed("Project configured! Ready to start");
691
700
  } catch (e) {
692
701
  spinner.fail("Failed to configure Slice Machine");
@@ -817,7 +826,7 @@ async function installLib(cwd, libGithubPath, branch = "HEAD") {
817
826
  return `~/${name}/${path2.replace("src/", "")}`;
818
827
  });
819
828
  spinner.succeed(`Slice library "${libGithubPath}" was installed successfully`);
820
- Tracker.get().trackDownloadLibrary(libGithubPath);
829
+ void Tracker.get().trackDownloadLibrary(libGithubPath);
821
830
  return localLibs;
822
831
  } catch (error) {
823
832
  spinner.fail(`Error installing ${libGithubPath} lib!`);
@@ -835,8 +844,8 @@ async function init() {
835
844
  const branch = findArgument(process.argv, "branch");
836
845
  const isTrackingAvailable = findArgument(process.argv, "tracking") !== "false";
837
846
  const maybeRepositorySubdomain = findArgument(process.argv, "repository");
838
- Tracker.get().initialize("ED3O1FVsa8DteNyRmAuDyMcPoftJ6VdP" , isTrackingAvailable);
839
- Tracker.get().trackInitStart(maybeRepositorySubdomain);
847
+ Tracker.get().initialize("JfTfmHaATChc4xueS7RcCBsixI71dJIJ" , isTrackingAvailable);
848
+ void Tracker.get().trackInitStart(maybeRepositorySubdomain);
840
849
  console.log(purple("You're about to configure Slicemachine... Press ctrl + C to cancel"));
841
850
  validatePkg(cwd);
842
851
  const user = await loginOrBypass(base);
@@ -845,22 +854,22 @@ async function init() {
845
854
  if (user.profile) {
846
855
  Tracker.get().identifyUser(user.profile.shortId, user.profile.intercomHash);
847
856
  }
848
- Tracker.get().trackInitIdentify(maybeRepositorySubdomain);
857
+ void Tracker.get().trackInitIdentify();
849
858
  const config = Prismic__default["default"].PrismicSharedConfigManager.get();
850
859
  const frameworkResult = await detectFramework(cwd);
851
860
  const repositoryDomainName = await chooseOrCreateARepository(cwd, frameworkResult.value, config.cookies, config.base, maybeRepositorySubdomain);
861
+ Tracker.get().setRepository(repositoryDomainName);
852
862
  await installRequiredDependencies(cwd, frameworkResult.value);
853
863
  const sliceLibPath = lib ? await installLib(cwd, lib, branch) : void 0;
854
- configureProject(cwd, base, repositoryDomainName, frameworkResult, sliceLibPath, isTrackingAvailable);
855
- Tracker.get().trackInitDone(frameworkResult.value, repositoryDomainName);
864
+ await configureProject(cwd, base, repositoryDomainName, frameworkResult, sliceLibPath, isTrackingAvailable);
856
865
  displayFinalMessage(cwd);
857
866
  }
858
- try {
859
- void init();
860
- } catch (error) {
867
+ init().then(() => {
868
+ process.exit(0);
869
+ }).catch((error) => {
861
870
  if (error instanceof Error)
862
871
  writeError$1(error.message);
863
872
  else
864
873
  console.error(error);
865
- }
874
+ });
866
875
  //# sourceMappingURL=index.js.map
@@ -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/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\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 ): void {\n if (!this._isTrackingPossible(this.#client)) {\n return;\n }\n\n const identifier = this._createSegmentIdentifier();\n\n try {\n this.#client.track({\n event: eventType,\n ...identifier,\n properties: attributes,\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 _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 identifyUser(userId: string, intercomHash: string): void {\n this.#userId = userId;\n this._identifyEvent(userId, intercomHash);\n }\n\n trackDownloadLibrary(library: string): void {\n this._trackEvent(EventType.DownloadLibrary, { library });\n }\n\n trackInitIdentify(repoDomain: string | undefined): void {\n this._trackEvent(EventType.InitIdentify, { repo: repoDomain });\n }\n\n trackInitStart(repoDomain: string | undefined): void {\n this._trackEvent(EventType.InitStart, { repo: repoDomain });\n }\n\n trackInitDone(framework: Models.Frameworks, repoDomain: string): void {\n this._trackEvent(EventType.InitDone, { framework, repo: repoDomain });\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\nexport async function installRequiredDependencies(\n cwd: string,\n framework: Models.Frameworks\n): Promise<void> {\n const yarnLock = NodeUtils.Files.exists(NodeUtils.YarnLockPath(cwd));\n const installDevDependencyCommand = yarnLock\n ? \"yarn add -D\"\n : \"npm install --save-dev\";\n const installDependencyCommand = yarnLock ? \"yarn add\" : \"npm install --save\";\n\n const spinner = logs.spinner(\"Downloading Slice Machine\");\n spinner.start();\n\n const { stderr } = await execCommand(\n `${installDevDependencyCommand} ${SM_PACKAGE_NAME}`\n );\n\n const deps = depsForFramework(framework);\n if (deps) await execCommand(`${installDependencyCommand} ${deps}`);\n\n const pathToPkg = path.join(\n 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\";\n\ntype Base = Prismic.Endpoints.Base;\n\nconst defaultSliceMachineVersion = \"0.0.41\";\n\nexport function configureProject(\n cwd: string,\n base: Base,\n repositoryDomainName: string,\n framework: FrameworkResult,\n sliceLibPath: string[] = [],\n tracking = true\n): void {\n const spinner = logs.spinner(\n `Configuring your ${framework.value} & 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 manifestUpdated: Models.Manifest = {\n ...(manifestAlreadyExistWithContent\n ? manifest.content\n : { _latest: sliceMachineVersionInstalled }),\n apiEndpoint: Prismic.Endpoints.buildRepositoryEndpoint(\n base,\n repositoryDomainName\n ),\n libraries: [\"@/slices\", ...sliceLibPath],\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 (!NodeUtils.Files.exists(pathToSlicesFolder)) {\n NodeUtils.Files.mkdir(pathToSlicesFolder, { recursive: true });\n }\n\n // add slicemachine script to package.json.\n NodeUtils.addJsonPackageSmScript(cwd);\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 `${logs.white(\"■\")} Run ${logs.purple(command)} to now launch 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 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 { 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} 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 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 Tracker.get().trackInitIdentify(maybeRepositorySubdomain);\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 // Install the required dependencies in the project.\n await installRequiredDependencies(cwd, frameworkResult.value);\n\n const sliceLibPath = lib ? await installLib(cwd, lib, branch) : undefined;\n\n // configure the SM.json file and the json package file of the project..\n configureProject(\n cwd,\n base,\n repositoryDomainName,\n frameworkResult,\n sliceLibPath,\n isTrackingAvailable\n );\n\n Tracker.get().trackInitDone(frameworkResult.value, repositoryDomainName);\n\n // Ask the user to run slice-machine.\n displayFinalMessage(cwd);\n}\n\ntry {\n void init();\n} catch (error) {\n if (error instanceof Error) 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"],"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/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\nexport async function installRequiredDependencies(\n cwd: string,\n framework: Models.Frameworks\n): Promise<void> {\n const yarnLock = NodeUtils.Files.exists(NodeUtils.YarnLockPath(cwd));\n const installDevDependencyCommand = yarnLock\n ? \"yarn add -D\"\n : \"npm install --save-dev\";\n const installDependencyCommand = yarnLock ? \"yarn add\" : \"npm install --save\";\n\n const spinner = logs.spinner(\"Downloading Slice Machine\");\n spinner.start();\n\n const { stderr } = await execCommand(\n `${installDevDependencyCommand} ${SM_PACKAGE_NAME}`\n );\n\n const deps = depsForFramework(framework);\n if (deps) await execCommand(`${installDependencyCommand} ${deps}`);\n\n const pathToPkg = path.join(\n 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 spinner = logs.spinner(\n `Configuring your ${framework.value} & 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 manifestUpdated: Models.Manifest = {\n ...(manifestAlreadyExistWithContent\n ? manifest.content\n : { _latest: sliceMachineVersionInstalled }),\n apiEndpoint: Prismic.Endpoints.buildRepositoryEndpoint(\n base,\n repositoryDomainName\n ),\n libraries: [\"@/slices\", ...sliceLibPath],\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 (!NodeUtils.Files.exists(pathToSlicesFolder)) {\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 `${logs.white(\"■\")} Run ${logs.purple(command)} to now launch 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 { 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} 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 // Install the required dependencies in the project.\n await installRequiredDependencies(cwd, frameworkResult.value);\n\n const sliceLibPath = lib ? await installLib(cwd, lib, branch) : undefined;\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 // 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"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slicemachine/init",
3
- "version": "1.1.8",
3
+ "version": "1.1.9-alpha.3",
4
4
  "description": "The easiest way to add Slice Machine to your project",
5
5
  "license": "MIT",
6
6
  "bin": {
@@ -19,7 +19,7 @@
19
19
  },
20
20
  "dependencies": {
21
21
  "@hapi/hapi": "^20.2.0",
22
- "@slicemachine/core": "1.1.8",
22
+ "@slicemachine/core": "1.1.9-alpha.1",
23
23
  "adm-zip": "^0.5.9",
24
24
  "analytics-node": "^6.0.0",
25
25
  "axios": "^0.24.0",
@@ -66,5 +66,5 @@
66
66
  "engines": {
67
67
  "node": ">=12"
68
68
  },
69
- "gitHead": "633464eda15b9cebb08b81feba199e104b73e17a"
69
+ "gitHead": "c9f2ffb7ade9589558cd0538c43278187a3934ce"
70
70
  }
package/src/index.ts CHANGED
@@ -28,7 +28,7 @@ async function init() {
28
28
  isTrackingAvailable
29
29
  );
30
30
 
31
- Tracker.get().trackInitStart(maybeRepositorySubdomain);
31
+ void Tracker.get().trackInitStart(maybeRepositorySubdomain);
32
32
 
33
33
  console.log(
34
34
  logs.purple(
@@ -48,7 +48,7 @@ async function init() {
48
48
  Tracker.get().identifyUser(user.profile.shortId, user.profile.intercomHash);
49
49
  }
50
50
 
51
- Tracker.get().trackInitIdentify(maybeRepositorySubdomain);
51
+ void Tracker.get().trackInitIdentify();
52
52
 
53
53
  // retrieve tokens for api calls
54
54
  const config = Prismic.PrismicSharedConfigManager.get();
@@ -65,13 +65,15 @@ async function init() {
65
65
  maybeRepositorySubdomain
66
66
  );
67
67
 
68
+ Tracker.get().setRepository(repositoryDomainName);
69
+
68
70
  // Install the required dependencies in the project.
69
71
  await installRequiredDependencies(cwd, frameworkResult.value);
70
72
 
71
73
  const sliceLibPath = lib ? await installLib(cwd, lib, branch) : undefined;
72
74
 
73
75
  // configure the SM.json file and the json package file of the project..
74
- configureProject(
76
+ await configureProject(
75
77
  cwd,
76
78
  base,
77
79
  repositoryDomainName,
@@ -80,15 +82,15 @@ async function init() {
80
82
  isTrackingAvailable
81
83
  );
82
84
 
83
- Tracker.get().trackInitDone(frameworkResult.value, repositoryDomainName);
84
-
85
85
  // Ask the user to run slice-machine.
86
86
  displayFinalMessage(cwd);
87
87
  }
88
88
 
89
- try {
90
- void init();
91
- } catch (error) {
92
- if (error instanceof Error) logs.writeError(error.message);
93
- else console.error(error);
94
- }
89
+ init()
90
+ .then(() => {
91
+ process.exit(0);
92
+ })
93
+ .catch((error) => {
94
+ if (error instanceof Error) logs.writeError(error.message);
95
+ else console.error(error);
96
+ });
@@ -4,19 +4,20 @@ import * as Prismic from "@slicemachine/core/build/prismic";
4
4
  import * as NodeUtils from "@slicemachine/core/build/node-utils";
5
5
  import { FrameworkResult } from "./detect-framework";
6
6
  import { logs } from "../utils";
7
+ import Tracker from "../utils/tracker";
7
8
 
8
9
  type Base = Prismic.Endpoints.Base;
9
10
 
10
11
  const defaultSliceMachineVersion = "0.0.41";
11
12
 
12
- export function configureProject(
13
+ export async function configureProject(
13
14
  cwd: string,
14
15
  base: Base,
15
16
  repositoryDomainName: string,
16
17
  framework: FrameworkResult,
17
18
  sliceLibPath: string[] = [],
18
19
  tracking = true
19
- ): void {
20
+ ): Promise<void> {
20
21
  const spinner = logs.spinner(
21
22
  `Configuring your ${framework.value} & Prismic project...`
22
23
  );
@@ -58,6 +59,8 @@ export function configureProject(
58
59
  // add slicemachine script to package.json.
59
60
  NodeUtils.addJsonPackageSmScript(cwd);
60
61
 
62
+ await Tracker.get().trackInitDone(framework.value);
63
+
61
64
  spinner.succeed("Project configured! Ready to start");
62
65
  } catch {
63
66
  spinner.fail("Failed to configure Slice Machine");
@@ -100,7 +100,7 @@ export async function installLib(
100
100
  `Slice library "${libGithubPath}" was installed successfully`
101
101
  );
102
102
 
103
- Tracker.get().trackDownloadLibrary(libGithubPath);
103
+ void Tracker.get().trackDownloadLibrary(libGithubPath);
104
104
  return localLibs;
105
105
  } catch (error) {
106
106
  spinner.fail(`Error installing ${libGithubPath} lib!`);
@@ -16,6 +16,7 @@ export class InitTracker {
16
16
  #isTrackingActive = true;
17
17
  #anonymousId = "";
18
18
  #userId: string | null = null;
19
+ #repository: string | null = null;
19
20
 
20
21
  initialize(segmentKey: string, isTrackingActive = true): void {
21
22
  try {
@@ -35,22 +36,27 @@ export class InitTracker {
35
36
  _trackEvent(
36
37
  eventType: EventType,
37
38
  attributes: Record<string, unknown> = {}
38
- ): void {
39
- if (!this._isTrackingPossible(this.#client)) {
40
- return;
41
- }
42
-
43
- const identifier = this._createSegmentIdentifier();
44
-
45
- try {
46
- this.#client.track({
39
+ ): Promise<void> {
40
+ return new Promise((resolve) => {
41
+ if (!this._isTrackingPossible(this.#client)) {
42
+ return resolve();
43
+ }
44
+
45
+ const identifier = this._createSegmentIdentifier();
46
+ const payload = {
47
47
  event: eventType,
48
48
  ...identifier,
49
49
  properties: attributes,
50
+ ...(this.#repository
51
+ ? { context: { groupId: { Repository: this.#repository } } }
52
+ : {}),
53
+ };
54
+
55
+ return this.#client.track(payload, () => {
56
+ // if(_) return reject(_)
57
+ return resolve();
50
58
  });
51
- } catch {
52
- // If the client is not correctly setup we are silently failing as the tracker is not a critical feature
53
- }
59
+ });
54
60
  }
55
61
 
56
62
  _identifyEvent(userId: string, intercomHash: string): void {
@@ -87,25 +93,29 @@ export class InitTracker {
87
93
 
88
94
  /** Public methods **/
89
95
 
96
+ setRepository(repository: string) {
97
+ this.#repository = repository;
98
+ }
99
+
90
100
  identifyUser(userId: string, intercomHash: string): void {
91
101
  this.#userId = userId;
92
- this._identifyEvent(userId, intercomHash);
102
+ return this._identifyEvent(userId, intercomHash);
93
103
  }
94
104
 
95
- trackDownloadLibrary(library: string): void {
96
- this._trackEvent(EventType.DownloadLibrary, { library });
105
+ trackDownloadLibrary(library: string): Promise<void> {
106
+ return this._trackEvent(EventType.DownloadLibrary, { library });
97
107
  }
98
108
 
99
- trackInitIdentify(repoDomain: string | undefined): void {
100
- this._trackEvent(EventType.InitIdentify, { repo: repoDomain });
109
+ trackInitIdentify(): Promise<void> {
110
+ return this._trackEvent(EventType.InitIdentify);
101
111
  }
102
112
 
103
- trackInitStart(repoDomain: string | undefined): void {
104
- this._trackEvent(EventType.InitStart, { repo: repoDomain });
113
+ trackInitStart(repoDomain: string | undefined): Promise<void> {
114
+ return this._trackEvent(EventType.InitStart, { repo: repoDomain });
105
115
  }
106
116
 
107
- trackInitDone(framework: Models.Frameworks, repoDomain: string): void {
108
- this._trackEvent(EventType.InitDone, { framework, repo: repoDomain });
117
+ trackInitDone(framework: Models.Frameworks): Promise<void> {
118
+ return this._trackEvent(EventType.InitDone, { framework });
109
119
  }
110
120
  }
111
121
 
package/.caches/eslint DELETED
@@ -1 +0,0 @@
1
- [{"/Volumes/Dev/slice-machine/packages/init/__tests__/check.test.ts":"1","/Volumes/Dev/slice-machine/packages/init/__tests__/choose-or-create-repo.test.ts":"2","/Volumes/Dev/slice-machine/packages/init/__tests__/configure-project.test.ts":"3","/Volumes/Dev/slice-machine/packages/init/__tests__/create-repo-sm-core.test.ts":"4","/Volumes/Dev/slice-machine/packages/init/__tests__/detect-framework.test.ts":"5","/Volumes/Dev/slice-machine/packages/init/__tests__/install-lib.test.ts":"6","/Volumes/Dev/slice-machine/packages/init/__tests__/install-required-dependencies.test.ts":"7","/Volumes/Dev/slice-machine/packages/init/__tests__/logInOrBypass.test.ts":"8","/Volumes/Dev/slice-machine/packages/init/__tests__/utils/auth.test.ts":"9","/Volumes/Dev/slice-machine/packages/init/__tests__/utils/communication.test.ts":"10","/Volumes/Dev/slice-machine/packages/init/__tests__/utils/create-repo.test.ts":"11","/Volumes/Dev/slice-machine/packages/init/__tests__/utils/index.test.ts":"12","/Volumes/Dev/slice-machine/packages/init/__tests__/utils/tracker.test.ts":"13","/Volumes/Dev/slice-machine/packages/init/src/index.ts":"14","/Volumes/Dev/slice-machine/packages/init/src/steps/choose-or-create-a-repository.ts":"15","/Volumes/Dev/slice-machine/packages/init/src/steps/configure-project.ts":"16","/Volumes/Dev/slice-machine/packages/init/src/steps/detect-framework.ts":"17","/Volumes/Dev/slice-machine/packages/init/src/steps/display-final-message.ts":"18","/Volumes/Dev/slice-machine/packages/init/src/steps/index.ts":"19","/Volumes/Dev/slice-machine/packages/init/src/steps/install-lib.ts":"20","/Volumes/Dev/slice-machine/packages/init/src/steps/install-required-dependencies.ts":"21","/Volumes/Dev/slice-machine/packages/init/src/steps/loginOrBypass.ts":"22","/Volumes/Dev/slice-machine/packages/init/src/steps/validate-pkg.ts":"23","/Volumes/Dev/slice-machine/packages/init/src/utils/PackageManager.ts":"24","/Volumes/Dev/slice-machine/packages/init/src/utils/auth/helpers.ts":"25","/Volumes/Dev/slice-machine/packages/init/src/utils/auth/index.ts":"26","/Volumes/Dev/slice-machine/packages/init/src/utils/communication.ts":"27","/Volumes/Dev/slice-machine/packages/init/src/utils/create-repo.ts":"28","/Volumes/Dev/slice-machine/packages/init/src/utils/index.ts":"29","/Volumes/Dev/slice-machine/packages/init/src/utils/logs.ts":"30","/Volumes/Dev/slice-machine/packages/init/src/utils/tracker.ts":"31"},{"hash":"32","results":"33","hashOfConfig":"34"},{"hash":"35","results":"36","hashOfConfig":"34"},{"hash":"37","results":"38","hashOfConfig":"34"},{"hash":"39","results":"40","hashOfConfig":"34"},{"hash":"41","results":"42","hashOfConfig":"34"},{"hash":"43","results":"44","hashOfConfig":"34"},{"hash":"45","results":"46","hashOfConfig":"34"},{"hash":"47","results":"48","hashOfConfig":"34"},{"hash":"49","results":"50","hashOfConfig":"34"},{"hash":"51","results":"52","hashOfConfig":"34"},{"hash":"53","results":"54","hashOfConfig":"34"},{"hash":"55","results":"56","hashOfConfig":"34"},{"hash":"57","results":"58","hashOfConfig":"34"},{"hash":"59","results":"60","hashOfConfig":"34"},{"hash":"61","results":"62","hashOfConfig":"34"},{"hash":"63","results":"64","hashOfConfig":"34"},{"hash":"65","results":"66","hashOfConfig":"34"},{"hash":"67","results":"68","hashOfConfig":"34"},{"hash":"69","results":"70","hashOfConfig":"34"},{"hash":"71","results":"72","hashOfConfig":"34"},{"hash":"73","results":"74","hashOfConfig":"34"},{"hash":"75","results":"76","hashOfConfig":"34"},{"hash":"77","results":"78","hashOfConfig":"34"},{"hash":"79","results":"80","hashOfConfig":"34"},{"hash":"81","results":"82","hashOfConfig":"34"},{"hash":"83","results":"84","hashOfConfig":"34"},{"hash":"85","results":"86","hashOfConfig":"34"},{"hash":"87","results":"88","hashOfConfig":"34"},{"hash":"89","results":"90","hashOfConfig":"34"},{"hash":"91","results":"92","hashOfConfig":"34"},{"hash":"93","results":"94","hashOfConfig":"34"},"77d8e3cce94d2db592b4a96c6d6cde76",{"filePath":"95","messages":"96","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"11pld64","406b8d20d914ccee0c50cf66fc2e5983",{"filePath":"97","messages":"98","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"3c6f3213543329c536babaf3ea135d29",{"filePath":"99","messages":"100","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"95f2472186d8811318d0b9aacdb04bfd",{"filePath":"101","messages":"102","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"e8ba1dde300d0f874c7dd1f60967080d",{"filePath":"103","messages":"104","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"66455b7da51f68df8e1d4306625fff64",{"filePath":"105","messages":"106","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"d198806102439bff4802153a74d3129b",{"filePath":"107","messages":"108","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"009f5b6f93afcff0eacf322721996ad1",{"filePath":"109","messages":"110","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"715c60b8f5adf74923dbaceeeca7f7a1",{"filePath":"111","messages":"112","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"7aa0acfe12595fc7349a28eb9f17829e",{"filePath":"113","messages":"114","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"22a606271ed98ca3addcf414e9a63c4d",{"filePath":"115","messages":"116","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"a2c73ddeaeac2340d84a65c635b7f6a4",{"filePath":"117","messages":"118","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"034b2b43266238b94351b295e658617b",{"filePath":"119","messages":"120","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"f95fb039d81bf0b887fdb24d05668d74",{"filePath":"121","messages":"122","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"b4a15d6a2d6516368a5c8f17cb9d28a9",{"filePath":"123","messages":"124","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"1b466aa4493b59bd88e0ad2ff440f447",{"filePath":"125","messages":"126","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"9828c95696fee562dd2f44015a8719aa",{"filePath":"127","messages":"128","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"42b59dab9067a0761f37385b5d18bcb9",{"filePath":"129","messages":"130","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"05531ba7533214a64ce92ab2430b5f96",{"filePath":"131","messages":"132","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"1c25b80c324c0b608c47abaa86564334",{"filePath":"133","messages":"134","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"7525cb9408294b05290d26abe1c95150",{"filePath":"135","messages":"136","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"31a96d957c9a5ac6173c699b41665933",{"filePath":"137","messages":"138","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"372e43153e227c33eaa7c6a9dc7b3827",{"filePath":"139","messages":"140","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"b8ac4c7fbde61fc55938af62b0bfa022",{"filePath":"141","messages":"142","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"f29fbe3d7e82c9539d1e1fb574315015",{"filePath":"143","messages":"144","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"0c3566a914d83fc46cb3ffb8f8e88ea6",{"filePath":"145","messages":"146","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"72f221ecedd9e518c1d14689f01a64cc",{"filePath":"147","messages":"148","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"cac6e2abb9b0e4d3ee0a7d8df12af250",{"filePath":"149","messages":"150","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"17f371201bc5b9b38b58f342d75f4f56",{"filePath":"151","messages":"152","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"3c1b68b0f61533d4a36176930478849b",{"filePath":"153","messages":"154","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"bad325d37fbb6380499626c7653adf28",{"filePath":"155","messages":"156","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"/Volumes/Dev/slice-machine/packages/init/__tests__/check.test.ts",[],"/Volumes/Dev/slice-machine/packages/init/__tests__/choose-or-create-repo.test.ts",[],"/Volumes/Dev/slice-machine/packages/init/__tests__/configure-project.test.ts",[],"/Volumes/Dev/slice-machine/packages/init/__tests__/create-repo-sm-core.test.ts",[],"/Volumes/Dev/slice-machine/packages/init/__tests__/detect-framework.test.ts",[],"/Volumes/Dev/slice-machine/packages/init/__tests__/install-lib.test.ts",[],"/Volumes/Dev/slice-machine/packages/init/__tests__/install-required-dependencies.test.ts",[],"/Volumes/Dev/slice-machine/packages/init/__tests__/logInOrBypass.test.ts",[],"/Volumes/Dev/slice-machine/packages/init/__tests__/utils/auth.test.ts",[],"/Volumes/Dev/slice-machine/packages/init/__tests__/utils/communication.test.ts",[],"/Volumes/Dev/slice-machine/packages/init/__tests__/utils/create-repo.test.ts",[],"/Volumes/Dev/slice-machine/packages/init/__tests__/utils/index.test.ts",[],"/Volumes/Dev/slice-machine/packages/init/__tests__/utils/tracker.test.ts",[],"/Volumes/Dev/slice-machine/packages/init/src/index.ts",[],"/Volumes/Dev/slice-machine/packages/init/src/steps/choose-or-create-a-repository.ts",[],"/Volumes/Dev/slice-machine/packages/init/src/steps/configure-project.ts",[],"/Volumes/Dev/slice-machine/packages/init/src/steps/detect-framework.ts",[],"/Volumes/Dev/slice-machine/packages/init/src/steps/display-final-message.ts",[],"/Volumes/Dev/slice-machine/packages/init/src/steps/index.ts",[],"/Volumes/Dev/slice-machine/packages/init/src/steps/install-lib.ts",[],"/Volumes/Dev/slice-machine/packages/init/src/steps/install-required-dependencies.ts",[],"/Volumes/Dev/slice-machine/packages/init/src/steps/loginOrBypass.ts",[],"/Volumes/Dev/slice-machine/packages/init/src/steps/validate-pkg.ts",[],"/Volumes/Dev/slice-machine/packages/init/src/utils/PackageManager.ts",[],"/Volumes/Dev/slice-machine/packages/init/src/utils/auth/helpers.ts",[],"/Volumes/Dev/slice-machine/packages/init/src/utils/auth/index.ts",[],"/Volumes/Dev/slice-machine/packages/init/src/utils/communication.ts",[],"/Volumes/Dev/slice-machine/packages/init/src/utils/create-repo.ts",[],"/Volumes/Dev/slice-machine/packages/init/src/utils/index.ts",[],"/Volumes/Dev/slice-machine/packages/init/src/utils/logs.ts",[],"/Volumes/Dev/slice-machine/packages/init/src/utils/tracker.ts",[]]