@slicemachine/init 1.1.0 → 1.1.1-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 +113 -41
- package/build/index.js.map +1 -1
- package/package.json +10 -7
- package/src/index.ts +23 -22
- package/src/steps/detect-framework.ts +5 -4
- package/src/steps/install-lib.ts +2 -3
- package/src/steps/maybe-existing-repo.ts +4 -4
- package/src/utils/communication.ts +7 -4
- package/src/utils/tracker.ts +94 -36
package/build/index.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
const core = require('@slicemachine/core');
|
|
6
6
|
const ServerAnalytics = require('analytics-node');
|
|
7
|
+
const uuid = require('uuid');
|
|
7
8
|
const path = require('path');
|
|
8
9
|
const util = require('util');
|
|
9
10
|
const child_process = require('child_process');
|
|
@@ -55,37 +56,103 @@ const fsExtra__default = /*#__PURE__*/_interopDefaultLegacy(fsExtra);
|
|
|
55
56
|
const fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
|
|
56
57
|
const Files__default = /*#__PURE__*/_interopDefaultLegacy(Files);
|
|
57
58
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
59
|
+
var __accessCheck = (obj, member, msg) => {
|
|
60
|
+
if (!member.has(obj))
|
|
61
|
+
throw TypeError("Cannot " + msg);
|
|
62
|
+
};
|
|
63
|
+
var __privateGet = (obj, member, getter) => {
|
|
64
|
+
__accessCheck(obj, member, "read from private field");
|
|
65
|
+
return getter ? getter.call(obj) : member.get(obj);
|
|
66
|
+
};
|
|
67
|
+
var __privateAdd = (obj, member, value) => {
|
|
68
|
+
if (member.has(obj))
|
|
69
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
70
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
71
|
+
};
|
|
72
|
+
var __privateSet = (obj, member, value, setter) => {
|
|
73
|
+
__accessCheck(obj, member, "write to private field");
|
|
74
|
+
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
75
|
+
return value;
|
|
76
|
+
};
|
|
77
|
+
var _client, _isTrackingActive, _anonymousId, _userId;
|
|
78
|
+
class InitTracker {
|
|
79
|
+
constructor() {
|
|
80
|
+
__privateAdd(this, _client, null);
|
|
81
|
+
__privateAdd(this, _isTrackingActive, true);
|
|
82
|
+
__privateAdd(this, _anonymousId, "");
|
|
83
|
+
__privateAdd(this, _userId, null);
|
|
69
84
|
}
|
|
70
|
-
|
|
85
|
+
initialize(segmentKey, isTrackingActive = true) {
|
|
71
86
|
try {
|
|
72
|
-
if (
|
|
87
|
+
if (!!__privateGet(this, _client))
|
|
73
88
|
return;
|
|
74
|
-
|
|
75
|
-
|
|
89
|
+
__privateSet(this, _isTrackingActive, isTrackingActive);
|
|
90
|
+
__privateSet(this, _anonymousId, uuid.v4());
|
|
91
|
+
__privateSet(this, _client, new ServerAnalytics__default["default"](segmentKey));
|
|
76
92
|
} catch (error) {
|
|
77
|
-
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
_trackEvent(eventType, attributes = {}) {
|
|
96
|
+
if (!this._isTrackingPossible(__privateGet(this, _client))) {
|
|
78
97
|
return;
|
|
79
98
|
}
|
|
99
|
+
const identifier = this._createSegmentIdentifier();
|
|
100
|
+
try {
|
|
101
|
+
__privateGet(this, _client).track({
|
|
102
|
+
event: eventType,
|
|
103
|
+
...identifier,
|
|
104
|
+
properties: attributes
|
|
105
|
+
});
|
|
106
|
+
} catch (e) {
|
|
107
|
+
}
|
|
80
108
|
}
|
|
81
|
-
|
|
82
|
-
this.
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
109
|
+
_identifyEvent(userId) {
|
|
110
|
+
if (!this._isTrackingPossible(__privateGet(this, _client))) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
__privateGet(this, _client).identify({
|
|
115
|
+
userId,
|
|
116
|
+
anonymousId: __privateGet(this, _anonymousId)
|
|
117
|
+
});
|
|
118
|
+
} catch (e) {
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
_isTrackingPossible(client) {
|
|
122
|
+
return !!client && __privateGet(this, _isTrackingActive);
|
|
123
|
+
}
|
|
124
|
+
_createSegmentIdentifier() {
|
|
125
|
+
return !!__privateGet(this, _userId) ? { userId: __privateGet(this, _userId) } : { anonymousId: __privateGet(this, _anonymousId) };
|
|
126
|
+
}
|
|
127
|
+
identifyUser(userId) {
|
|
128
|
+
__privateSet(this, _userId, userId);
|
|
129
|
+
this._identifyEvent(userId);
|
|
130
|
+
}
|
|
131
|
+
trackDownloadLibrary(library) {
|
|
132
|
+
this._trackEvent("SliceMachine Download Library" /* DownloadLibrary */, { library });
|
|
133
|
+
}
|
|
134
|
+
trackInitStart() {
|
|
135
|
+
this._trackEvent("SliceMachine Init Start" /* InitStart */);
|
|
136
|
+
}
|
|
137
|
+
trackInitDone(framework, repo) {
|
|
138
|
+
this._trackEvent("SliceMachine Init Done" /* InitDone */, { framework, repo });
|
|
87
139
|
}
|
|
88
140
|
}
|
|
141
|
+
_client = new WeakMap();
|
|
142
|
+
_isTrackingActive = new WeakMap();
|
|
143
|
+
_anonymousId = new WeakMap();
|
|
144
|
+
_userId = new WeakMap();
|
|
145
|
+
const Tracker = (() => {
|
|
146
|
+
let smTrackerInstance;
|
|
147
|
+
const init = () => new InitTracker();
|
|
148
|
+
return {
|
|
149
|
+
get() {
|
|
150
|
+
if (!smTrackerInstance)
|
|
151
|
+
smTrackerInstance = init();
|
|
152
|
+
return smTrackerInstance;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
})();
|
|
89
156
|
|
|
90
157
|
function findArgument(args, name) {
|
|
91
158
|
const flagIndex = args.indexOf(`--${name}`);
|
|
@@ -239,7 +306,7 @@ async function maybeExistingRepo(cookies, cwd, base = DEFAULT_BASE) {
|
|
|
239
306
|
const repos = await core.Communication.listRepositories(token);
|
|
240
307
|
if (repos.length === 0) {
|
|
241
308
|
const name = await promptForRepoName(base);
|
|
242
|
-
return { existing: false, name };
|
|
309
|
+
return { existing: false, repository: name };
|
|
243
310
|
}
|
|
244
311
|
const choices = sortReposForPrompt(repos, base, cwd);
|
|
245
312
|
const numberOfDisabledRepos = choices.filter((repo) => {
|
|
@@ -260,9 +327,9 @@ async function maybeExistingRepo(cookies, cwd, base = DEFAULT_BASE) {
|
|
|
260
327
|
]);
|
|
261
328
|
if (res.repoName === CREATE_REPO) {
|
|
262
329
|
const name = await promptForRepoName(base);
|
|
263
|
-
return { existing: false, name };
|
|
330
|
+
return { existing: false, repository: name };
|
|
264
331
|
}
|
|
265
|
-
return { existing: true,
|
|
332
|
+
return { existing: true, repository: res.repoName };
|
|
266
333
|
}
|
|
267
334
|
|
|
268
335
|
function createRepository(domain, framework, config) {
|
|
@@ -311,14 +378,17 @@ async function detectFramework(cwd) {
|
|
|
311
378
|
const spinner = core.Utils.spinner("Detecting framework to install correct dependencies");
|
|
312
379
|
spinner.start();
|
|
313
380
|
try {
|
|
314
|
-
const maybeFramework = core.Utils.Framework.
|
|
381
|
+
const maybeFramework = core.Utils.Framework.defineFramework({
|
|
382
|
+
cwd,
|
|
383
|
+
supportedFrameworks: Object.values(core.Models.Frameworks)
|
|
384
|
+
});
|
|
315
385
|
spinner.stop();
|
|
316
386
|
if (!maybeFramework || maybeFramework === core.Models.Frameworks.vanillajs) {
|
|
317
387
|
core.Utils.writeError("Framework not detected");
|
|
318
388
|
return await promptForFramework();
|
|
319
389
|
}
|
|
320
390
|
const nameToPrint = core.Utils.Framework.fancyName(maybeFramework);
|
|
321
|
-
if (core.Utils.Framework.
|
|
391
|
+
if (!core.Utils.Framework.isFrameworkSupported(maybeFramework)) {
|
|
322
392
|
core.Utils.writeError(`${nameToPrint} is currently not supported`);
|
|
323
393
|
console.log(failMessage);
|
|
324
394
|
process.exit(1);
|
|
@@ -347,14 +417,14 @@ const UserProfile = t__namespace.exact(t__namespace.type({
|
|
|
347
417
|
lastName: t__namespace.string
|
|
348
418
|
}));
|
|
349
419
|
async function getUserProfile(cookies, base = core.Utils.CONSTS.DEFAULT_BASE) {
|
|
350
|
-
const
|
|
351
|
-
url
|
|
420
|
+
const userServiceBase = core.Utils.CONSTS.DEFAULT_BASE === base ? core.Utils.CONSTS.USER_SERVICE_BASE : "https://user.wroom.io/";
|
|
421
|
+
const url = new URL(userServiceBase);
|
|
352
422
|
url.pathname = "profile";
|
|
353
423
|
const endpoint = url.toString();
|
|
354
424
|
const token = core.Utils.Cookie.parsePrismicAuthToken(cookies);
|
|
355
425
|
return axios__default["default"].get(endpoint, {
|
|
356
426
|
headers: {
|
|
357
|
-
Authorization: `Bearer
|
|
427
|
+
Authorization: `Bearer ${token}`
|
|
358
428
|
}
|
|
359
429
|
}).then((res) => _function.pipe(UserProfile.decode(res.data), Either.fold(() => {
|
|
360
430
|
throw new Error("Can't parse user profile");
|
|
@@ -484,7 +554,7 @@ const downloadFile = async (reqUrl) => {
|
|
|
484
554
|
function toGithubSource(githubPath, branch) {
|
|
485
555
|
return `https://codeload.github.com/${githubPath}/zip/${branch}`;
|
|
486
556
|
}
|
|
487
|
-
async function installLib(
|
|
557
|
+
async function installLib(cwd, libGithubPath, branch = "HEAD") {
|
|
488
558
|
const spinner = core.Utils.spinner(`Installing the ${libGithubPath} lib in your project...`);
|
|
489
559
|
try {
|
|
490
560
|
spinner.start();
|
|
@@ -519,7 +589,7 @@ async function installLib(tracker, cwd, libGithubPath, branch = "HEAD") {
|
|
|
519
589
|
return `~/${name}/${path2.replace("src/", "")}`;
|
|
520
590
|
});
|
|
521
591
|
spinner.succeed(`Slice library "${libGithubPath}" was installed successfully`);
|
|
522
|
-
|
|
592
|
+
Tracker.get().trackDownloadLibrary(libGithubPath);
|
|
523
593
|
return localLibs;
|
|
524
594
|
} catch (error) {
|
|
525
595
|
spinner.fail(`Error installing ${libGithubPath} lib!`);
|
|
@@ -531,29 +601,31 @@ async function installLib(tracker, cwd, libGithubPath, branch = "HEAD") {
|
|
|
531
601
|
}
|
|
532
602
|
|
|
533
603
|
async function init() {
|
|
534
|
-
var _a;
|
|
535
604
|
const cwd = findArgument(process.argv, "cwd") || process.cwd();
|
|
536
605
|
const base = findArgument(process.argv, "base") || core.Utils.CONSTS.DEFAULT_BASE;
|
|
537
606
|
const lib = findArgument(process.argv, "library");
|
|
538
607
|
const branch = findArgument(process.argv, "branch");
|
|
539
|
-
const isTrackingAvailable = findArgument(process.argv, "tracking")
|
|
608
|
+
const isTrackingAvailable = findArgument(process.argv, "tracking") !== "false";
|
|
609
|
+
Tracker.get().initialize("JfTfmHaATChc4xueS7RcCBsixI71dJIJ" , isTrackingAvailable);
|
|
610
|
+
Tracker.get().trackInitStart();
|
|
540
611
|
console.log(core.Utils.purple("You're about to configure Slicemachine... Press ctrl + C to cancel"));
|
|
541
612
|
validatePkg(cwd);
|
|
542
613
|
const user = await loginOrBypass(base);
|
|
543
614
|
if (!user)
|
|
544
615
|
throw new Error("The user should be logged in!");
|
|
616
|
+
if (user.profile) {
|
|
617
|
+
Tracker.get().identifyUser(user.profile.shortId);
|
|
618
|
+
}
|
|
545
619
|
const config = core.FileSystem.PrismicSharedConfigManager.get();
|
|
546
620
|
const frameworkResult = await detectFramework(cwd);
|
|
547
|
-
const { existing,
|
|
621
|
+
const { existing, repository } = await maybeExistingRepo(config.cookies, cwd, config.base);
|
|
548
622
|
if (!existing) {
|
|
549
|
-
await createRepository(
|
|
623
|
+
await createRepository(repository, frameworkResult.value, config);
|
|
550
624
|
}
|
|
551
|
-
const tracker = ((_a = user.profile) == null ? void 0 : _a.shortId) ? Tracker.build("ED3O1FVsa8DteNyRmAuDyMcPoftJ6VdP" , name, {
|
|
552
|
-
userId: user.profile.shortId
|
|
553
|
-
}, isTrackingAvailable) : void 0;
|
|
554
625
|
await installRequiredDependencies(cwd, frameworkResult.value);
|
|
555
|
-
const sliceLibPath = lib ? await installLib(
|
|
556
|
-
configureProject(cwd, base,
|
|
626
|
+
const sliceLibPath = lib ? await installLib(cwd, lib, branch) : void 0;
|
|
627
|
+
configureProject(cwd, base, repository, frameworkResult, sliceLibPath, isTrackingAvailable);
|
|
628
|
+
Tracker.get().trackInitDone(frameworkResult.value, repository);
|
|
557
629
|
displayFinalMessage(cwd);
|
|
558
630
|
}
|
|
559
631
|
try {
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/utils/tracker.ts","../src/utils/index.ts","../src/steps/install-required-dependencies.ts","../src/steps/validate-pkg.ts","../src/steps/maybe-existing-repo.ts","../src/steps/create-repo.ts","../src/steps/detect-framework.ts","../src/utils/communication.ts","../src/steps/loginOrBypass.ts","../src/steps/configure-project.ts","../src/steps/display-final-message.ts","../src/utils/PackageManager.ts","../src/steps/install-lib.ts","../src/index.ts"],"sourcesContent":["/*\n * DUPLICATION\n * this file is a duplication of ServerTracker in sm-ui\n * this duplication has been done on purpose to simplify the merge if init becomes part of sm-ui\n * or if we decide to share the tracker implementation from a lib, but it'll need some refactoring\n * Duplication means no entanglement so don't merge this with the other implem and keep the structure.\n */\n\nimport ServerAnalytics from \"analytics-node\";\n\nexport enum EventType {\n DownloadLibrary = \"SliceMachine Download Library\",\n}\n\nexport class Tracker {\n constructor(\n readonly analytics: ServerAnalytics,\n readonly repo: string,\n readonly identifier: { userId: string } | { anonymousId: string },\n readonly tracking = true\n ) {}\n\n static build(\n writeKey: string,\n repo: string | undefined,\n identifier: { userId: string } | { anonymousId: string },\n tracking = true\n ): Tracker | undefined {\n try {\n if (!repo) return;\n const analytics = new ServerAnalytics(writeKey);\n return new Tracker(analytics, repo, identifier, tracking);\n } catch (error) {\n console.warn(error);\n return;\n }\n }\n\n private trackEvent(\n eventType: EventType,\n attributes: Record<string, unknown> = {}\n ): void {\n this.tracking &&\n this.analytics.track({\n event: eventType,\n ...this.identifier,\n properties: attributes,\n });\n }\n\n Track = {\n // not called, for demo only\n downloadLibrary: (library: string): void => {\n this.trackEvent(EventType.DownloadLibrary, { library });\n },\n };\n}\n","import util from \"util\";\nimport { exec } from \"child_process\";\n\nexport function findArgument(args: string[], name: string): string | undefined {\n const flagIndex: number = args.indexOf(`--${name}`);\n\n if (flagIndex === -1) return;\n if (args.length < flagIndex + 2) return;\n\n const flagValue = args[flagIndex + 1];\n\n if (flagValue.startsWith(\"--\")) return;\n return flagValue;\n}\n\nexport const execCommand: (\n command: string\n) => Promise<{ stderr: string; stdout: string }> = util.promisify(exec);\n","import path from \"path\";\nimport { execCommand } from \"../utils\";\nimport { Utils, FileSystem, Models } from \"@slicemachine/core\";\n\nconst {\n PRISMIC_CLIENT,\n PRISMIC_DOM_PACKAGE_NAME,\n PRISMIC_REACT_PACKAGE_NAME,\n NEXT_SLICEZONE,\n SM_PACKAGE_NAME,\n NUXT_PRISMIC,\n NUXT_SM,\n VUE_SLICEZONE,\n PRISMIC_VUE,\n SLICE_SIMULATOR_REACT,\n SLICE_SIMULATOR_VUE,\n} = Utils.CONSTS;\n\nfunction depsForFramework(framework: Models.Frameworks): string {\n switch (framework) {\n case Models.Frameworks.react:\n return `${PRISMIC_REACT_PACKAGE_NAME} ${PRISMIC_CLIENT}`;\n case Models.Frameworks.next:\n return `${PRISMIC_REACT_PACKAGE_NAME} ${PRISMIC_CLIENT}@v5.1.1 ${NEXT_SLICEZONE} ${SLICE_SIMULATOR_REACT}`;\n case Models.Frameworks.svelte:\n return `${PRISMIC_DOM_PACKAGE_NAME} ${PRISMIC_CLIENT}`;\n case Models.Frameworks.nuxt:\n return `${NUXT_PRISMIC} ${NUXT_SM} ${VUE_SLICEZONE} ${SLICE_SIMULATOR_VUE}`;\n case Models.Frameworks.vue:\n return `${PRISMIC_VUE} ${PRISMIC_CLIENT}@v5.1.1 ${PRISMIC_DOM_PACKAGE_NAME} ${VUE_SLICEZONE}`;\n default:\n return \"\";\n }\n}\n\nexport async function installRequiredDependencies(\n cwd: string,\n framework: Models.Frameworks\n): Promise<void> {\n const yarnLock = Utils.Files.exists(FileSystem.YarnLockPath(cwd));\n const installDevDependencyCommand = yarnLock\n ? \"yarn add -D\"\n : \"npm install --save-dev\";\n const installDependencyCommand = yarnLock ? \"yarn add\" : \"npm install --save\";\n\n const spinner = Utils.spinner(\"Downloading Prismic Visual Builder\");\n spinner.start();\n\n const { stderr } = await execCommand(\n `${installDevDependencyCommand} ${SM_PACKAGE_NAME}`\n );\n\n const deps = depsForFramework(framework);\n if (deps) await execCommand(`${installDependencyCommand} ${deps}`);\n\n const pathToPkg = path.join(\n FileSystem.PackagePaths(cwd).value(),\n SM_PACKAGE_NAME\n );\n const isPackageInstalled = Utils.Files.exists(pathToPkg);\n\n if (isPackageInstalled || !stderr.length) {\n spinner.succeed(\"The Prismic Visual Builder was installed successfully\");\n return;\n }\n\n spinner.fail();\n Utils.writeWarning(\n `could not install ${SM_PACKAGE_NAME}. Please do it manually!`\n );\n}\n","import { FileSystem, Utils } from \"@slicemachine/core\";\n\nexport function validatePkg(cwd: string): void {\n const jsonPackage = FileSystem.retrieveJsonPackage(cwd);\n if (!jsonPackage.exists) {\n Utils.writeError(`package.json not found. Are you in the right folder?`);\n return process.exit(-1);\n }\n if (!jsonPackage.content) {\n Utils.writeError(`could not parse package.json.`);\n return process.exit(-1);\n }\n}\n","import * as inquirer from \"inquirer\";\nimport Separator from \"inquirer/lib/objects/separator\";\nimport { Communication, Utils, FileSystem } from \"@slicemachine/core\";\nimport { Repositories } from \"@slicemachine/core/src/models/Repositories\";\nimport { Repository } from \"@slicemachine/core/src/models/Repository\";\nimport { parsePrismicAuthToken } from \"@slicemachine/core/build/src/utils/cookie\";\n\nexport const CREATE_REPO = \"$_CREATE_REPO\"; // not a valid domain name\nconst DEFAULT_BASE = Utils.CONSTS.DEFAULT_BASE;\n\nexport function prettyRepoName(address: URL, value?: string): string {\n const repoName = value ? Utils.cyan(value) : Utils.dim.cyan(\"repo-name\");\n return `${Utils.cyan.dim(`${address.protocol}//`)}${repoName}${Utils.cyan.dim(\n `.${address.hostname}`\n )}`;\n}\n\nexport async function promptForRepoName(base: string): Promise<string> {\n const address = new URL(base);\n\n Utils.writeInfo(\n \"The name acts as a domain/endpoint for your content repo and should be completely unique.\"\n );\n\n return inquirer\n .prompt<Record<string, string>>([\n {\n name: \"repoName\",\n message: \"Name your Prismic repository\",\n type: \"input\",\n required: true,\n transformer: (value) => prettyRepoName(address, String(value)),\n async validate(name: string) {\n const result = await Communication.validateRepositoryName(\n name,\n base,\n false\n );\n return result === name || result;\n },\n },\n ])\n .then((res) => res.repoName);\n}\n\nexport type RepoPrompt = { name: string; value: string; disabled?: string };\n\nexport type PromptOrSeparator = RepoPrompt | Separator;\n\nexport type RepoPrompts = Array<PromptOrSeparator>;\n\nexport function makeReposPretty(base: string) {\n return function ({ name, domain, role }: Repository): RepoPrompt {\n const address = new URL(base);\n address.hostname = `${domain}.${address.hostname}`;\n if (Utils.roles.canUpdateCustomTypes(role) === false) {\n return {\n name: `${Utils.purple.dim(\"Use\")} ${Utils.bold.dim(\n name\n )} ${Utils.purple.dim(`\"${address.hostname}\"`)}`,\n value: domain,\n disabled: \"Unauthorized\",\n };\n }\n\n return {\n name: `${Utils.purple(\"Use\")} ${Utils.bold(name)} ${Utils.purple(\n `\"${address.hostname}\"`\n )}`,\n value: name,\n };\n };\n}\n\nexport function orderPrompts(maybeName?: string | null) {\n return (a: PromptOrSeparator, b: PromptOrSeparator): number => {\n if (a instanceof Separator || b instanceof Separator) return 0;\n if (maybeName && (a.value === maybeName || b.value === maybeName)) return 0;\n if (a.value === CREATE_REPO || b.value === CREATE_REPO) return 0;\n if (a.disabled && !b.disabled) return 1;\n if (!a.disabled && b.disabled) return -1;\n return 0;\n };\n}\n\nexport function maybeStickTheRepoToTheTopOfTheList(repoName?: string | null) {\n return (acc: RepoPrompts, curr: RepoPrompt): RepoPrompts => {\n if (repoName && curr.value === repoName) {\n return [curr, ...acc];\n }\n return [...acc, curr];\n };\n}\n\nexport function sortReposForPrompt(\n repos: Repositories,\n base: string,\n cwd: string\n): RepoPrompts {\n const createNew = {\n name: `${Utils.purple(\"Create a\")} ${Utils.bold(\"new\")} ${Utils.purple(\n \"Repository\"\n )}`,\n value: CREATE_REPO,\n };\n\n const maybeConfiguredRepoName = FileSystem.maybeRepoNameFromSMFile(cwd, base);\n\n return repos\n .reverse()\n .map(makeReposPretty(base))\n .reduce(maybeStickTheRepoToTheTopOfTheList(maybeConfiguredRepoName), [\n createNew,\n ])\n .sort(orderPrompts(maybeConfiguredRepoName));\n}\n\nexport async function maybeExistingRepo(\n cookies: string,\n cwd: string,\n base = DEFAULT_BASE\n): Promise<{ name: string; existing: boolean }> {\n const token = parsePrismicAuthToken(cookies);\n const repos = await Communication.listRepositories(token);\n\n if (repos.length === 0) {\n const name = await promptForRepoName(base);\n return { existing: false, name };\n }\n\n const choices = sortReposForPrompt(repos, base, cwd);\n\n const numberOfDisabledRepos = choices.filter((repo) => {\n if (repo instanceof Separator) return false;\n return repo.disabled;\n }).length;\n\n const res = await inquirer.prompt<Record<string, string>>([\n {\n type: \"list\",\n name: \"repoName\",\n default: 0,\n required: true,\n message: \"Connect a Prismic Repository or create a new one\",\n choices,\n pageSize: numberOfDisabledRepos + 2 <= 7 ? 7 : numberOfDisabledRepos + 2,\n // loop: false\n },\n ]);\n\n if (res.repoName === CREATE_REPO) {\n const name = await promptForRepoName(base);\n return { existing: false, name };\n }\n return { existing: true, name: res.repoName };\n}\n","import { Communication, Utils } from \"@slicemachine/core\";\nimport type { Models } from \"@slicemachine/core\";\n\nexport function createRepository(\n domain: string,\n framework: Models.Frameworks,\n config: Models.PrismicSharedConfig\n): Promise<void> {\n const spinner = Utils.spinner(\"Creating Prismic Repository\");\n spinner.start();\n\n return Communication.createRepository(\n domain,\n config.cookies,\n framework,\n config.base\n )\n .then((res) => {\n const addressUrl = new URL(config.base);\n addressUrl.hostname = `${res.data.domain || domain}.${\n addressUrl.hostname\n }`;\n const address = addressUrl.toString();\n spinner.succeed(`We created your new repository ${address}`);\n })\n .catch((error: Error) => {\n spinner.fail(`Error creating repository ${domain}`);\n if (error.message) {\n Utils.writeError(error.message);\n }\n Utils.writeError(`We failed to create you new prismic repository`);\n console.log(`Run ${Utils.bold(\"npx slicemachine init\")} again!`);\n process.exit(-1);\n });\n}\n","import { Utils } from \"@slicemachine/core\";\nimport { Models } from \"@slicemachine/core\";\nimport * as inquirer from \"inquirer\";\n\nexport type FrameworkResult = {\n value: Models.Frameworks;\n manuallyAdded: boolean;\n};\n\nexport async function promptForFramework(): Promise<FrameworkResult> {\n const choices = Models.SupportedFrameworks.map((framework) => {\n return {\n name: Utils.Framework.fancyName(framework),\n value: framework,\n };\n });\n\n return inquirer\n .prompt<{ framework: Models.Frameworks }>([\n {\n name: \"framework\",\n type: \"list\",\n message: \"Select a framework to use\",\n required: true,\n choices,\n },\n ])\n .then((res) => {\n return {\n value: res.framework,\n manuallyAdded: true,\n };\n });\n}\n\nexport async function detectFramework(cwd: string): Promise<FrameworkResult> {\n const failMessage = `Please run ${Utils.bold(\n \"npx slicemachine init\"\n )} in a Nuxt or Next.js project`;\n\n const spinner = Utils.spinner(\n \"Detecting framework to install correct dependencies\"\n );\n\n spinner.start();\n\n try {\n const maybeFramework = Utils.Framework.detectFramework(\n cwd,\n Object.values(Models.Frameworks)\n );\n spinner.stop();\n\n if (!maybeFramework || maybeFramework === Models.Frameworks.vanillajs) {\n Utils.writeError(\"Framework not detected\");\n return await promptForFramework();\n }\n\n const nameToPrint = Utils.Framework.fancyName(maybeFramework);\n\n if (Utils.Framework.isUnsupported(maybeFramework)) {\n Utils.writeError(`${nameToPrint} is currently not supported`);\n console.log(failMessage);\n process.exit(1);\n }\n\n Utils.writeCheck(`${nameToPrint} detected`);\n\n return {\n value: maybeFramework,\n manuallyAdded: false,\n };\n } catch (error) {\n spinner.fail(\"package.json not found\");\n\n if (error instanceof Error && error.message) {\n Utils.writeError(error.message);\n } else {\n console.log(failMessage);\n }\n\n process.exit(1);\n }\n}\n","import axios from \"axios\";\nimport * as t from \"io-ts\";\nimport { pipe } from \"fp-ts/function\";\nimport { fold } from \"fp-ts/Either\";\nimport { Utils, Communication, FileSystem } from \"@slicemachine/core\";\n\nconst UserProfile = t.exact(\n t.type({\n userId: t.string,\n shortId: t.string,\n email: t.string,\n firstName: t.string,\n lastName: t.string,\n })\n);\n\nexport type UserProfile = t.TypeOf<typeof UserProfile>;\n\nexport async function getUserProfile(\n cookies: string,\n base = Utils.CONSTS.DEFAULT_BASE\n): Promise<UserProfile> {\n // note the auth server also provides a userId\n\n const url = new URL(base);\n url.hostname = `user.${url.hostname}`;\n url.pathname = \"profile\";\n\n const endpoint = url.toString();\n const token = Utils.Cookie.parsePrismicAuthToken(cookies);\n\n return axios\n .get<UserProfile>(endpoint, {\n headers: {\n Authorization: `Bearer Token ${token}`,\n },\n })\n .then((res) =>\n pipe(\n UserProfile.decode(res.data),\n fold<t.Errors, UserProfile, UserProfile>(\n () => {\n throw new Error(\"Can't parse user profile\");\n },\n (data: UserProfile) => data\n )\n )\n );\n}\n\nexport async function validateSessionAndGetProfile(\n base = Utils.CONSTS.DEFAULT_BASE\n): Promise<{\n info: Communication.UserInfo;\n profile: UserProfile | null;\n} | null> {\n const config = FileSystem.PrismicSharedConfigManager.get();\n\n if (!config.cookies.length) return Promise.resolve(null); // default config, logged out.\n if (base != config.base) return Promise.resolve(null); // not the same base so it doesn't\n\n try {\n const info = await Communication.validateSession(config.cookies, base);\n const profile = await getUserProfile(config.cookies, base).catch(\n () => null\n );\n if (profile?.shortId) {\n FileSystem.PrismicSharedConfigManager.setProperties({\n shortId: profile.shortId,\n });\n }\n return { info, profile };\n } catch {\n return null;\n }\n}\n","import { Utils, Communication, Auth } from \"@slicemachine/core\";\nimport {\n validateSessionAndGetProfile,\n UserProfile,\n} from \"../utils/communication\";\n\nexport async function loginOrBypass(base: string): Promise<{\n info: Communication.UserInfo;\n profile: UserProfile | null;\n} | null> {\n const user = await validateSessionAndGetProfile(base).catch((err) =>\n console.log(err)\n );\n if (user) {\n const email = user.info.email;\n Utils.writeCheck(`Logged in as ${Utils.bold(email)}`);\n return user;\n } else {\n await Auth.login(base);\n const user = await validateSessionAndGetProfile(base);\n return user;\n }\n}\n","import { FileSystem, Utils } from \"@slicemachine/core\";\nimport type { Models } from \"@slicemachine/core\";\nimport { FrameworkResult } from \"./detect-framework\";\n\ntype Base = Utils.Endpoints.Base;\n\nexport function configureProject(\n cwd: string,\n base: Base,\n repository: string,\n framework: FrameworkResult,\n sliceLibPath: string[] = [],\n tracking = true\n): void {\n const spinner = Utils.spinner(\n `Configuring your ${framework.value} & Prismic project...`\n );\n spinner.start();\n\n try {\n const manifest = FileSystem.retrieveManifest(cwd);\n\n const manifestUpdated: Models.Manifest = {\n ...(manifest.exists && manifest.content ? manifest.content : {}),\n apiEndpoint: Utils.Endpoints.buildRepositoryEndpoint(base, repository),\n libraries: [\"@/slices\", ...sliceLibPath],\n ...(framework.manuallyAdded ? { framework: framework.value } : {}),\n ...(!tracking ? { tracking } : {}),\n };\n\n if (!manifest.exists) FileSystem.createManifest(cwd, manifestUpdated);\n else FileSystem.patchManifest(cwd, manifestUpdated);\n\n // create the default slices folder if it doesn't exist.\n const pathToSlicesFolder = FileSystem.CustomPaths(cwd)\n .library(\"slices\")\n .value();\n if (!Utils.Files.exists(pathToSlicesFolder))\n Utils.Files.mkdir(pathToSlicesFolder, { recursive: true });\n\n // add slicemachine script to package.json.\n FileSystem.addJsonPackageSmScript(cwd);\n\n spinner.succeed(\"Project configured! Ready to start\");\n } catch {\n spinner.fail(\"Failed to configure your Prismic Local Builder\");\n process.exit(-1);\n }\n}\n","import { Utils, FileSystem } from \"@slicemachine/core\";\n\nexport function displayFinalMessage(cwd: string): void {\n const yarnLock = Utils.Files.exists(FileSystem.YarnLockPath(cwd));\n const command = `${yarnLock ? \"yarn\" : \"npm\"} run ${\n Utils.CONSTS.SCRIPT_NAME\n }`;\n\n console.log(\n `${Utils.white(\"■\")} Run ${Utils.purple(\n command\n )} to now launch your Local Builder`\n );\n}\n","import { Utils, FileSystem } from \"@slicemachine/core\";\nimport { execCommand } from \"../utils\";\n\nexport type Dependency = string | { name: string; version: string };\nexport const Dependencies = {\n fromPkgFormat(\n pkgDeps: Record<string, string> | undefined\n ): ReadonlyArray<Dependency> | undefined {\n if (!pkgDeps) return;\n\n return Object.entries(pkgDeps).map(([name, version]) => ({\n name,\n version,\n }));\n },\n};\nfunction formatDeps(dependencies: ReadonlyArray<Dependency>): string {\n return dependencies\n .map((dep) => {\n if (typeof dep === \"string\") return dep;\n return `${dep.name}@${dep.version}`;\n })\n .join(\" \");\n}\n\nexport interface PackageManager {\n install(dependencies: ReadonlyArray<Dependency>): Promise<{ stderr: string }>;\n installDev(\n dependencies: ReadonlyArray<Dependency>\n ): Promise<{ stderr: string }>;\n}\n\nexport const PackageManager = {\n get(cwd: string): PackageManager {\n if (Utils.Files.exists(FileSystem.YarnLockPath(cwd))) {\n return Yarn;\n }\n return Npm;\n },\n};\n\nexport const Yarn: PackageManager = {\n install(\n dependencies: ReadonlyArray<Dependency>\n ): Promise<{ stderr: string }> {\n return execCommand(`yarn add ${formatDeps(dependencies)}`);\n },\n installDev(\n dependencies: ReadonlyArray<Dependency>\n ): Promise<{ stderr: string }> {\n return execCommand(`yarn add --dev ${formatDeps(dependencies)}`);\n },\n};\n\nexport const Npm: PackageManager = {\n install(\n dependencies: ReadonlyArray<Dependency>\n ): Promise<{ stderr: string }> {\n return execCommand(`npm i --save ${formatDeps(dependencies)}`);\n },\n installDev(\n dependencies: ReadonlyArray<Dependency>\n ): Promise<{ stderr: string }> {\n return execCommand(`npm i --save-dev ${formatDeps(dependencies)}`);\n },\n};\n","import { Utils } from \"@slicemachine/core\";\nimport tmp from \"tmp\";\nimport AdmZip from \"adm-zip\";\nimport fsExtra from \"fs-extra\";\nimport axios from \"axios\";\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport { getOrElseW } from \"fp-ts/Either\";\nimport { PackageManager, Dependencies } from \"../utils/PackageManager\";\nimport { PackageJsonHelper } from \"@slicemachine/core/build/src/utils/PackageJson\";\nimport {\n Manifest,\n ManifestHelper,\n} from \"@slicemachine/core/build/src/models/Manifest\";\nimport Files from \"@slicemachine/core/build/src/utils/files\";\nimport { Tracker } from \"../utils/tracker\";\n\nconst downloadFile = async (reqUrl: string): Promise<string> => {\n const res = await axios.get<Buffer>(reqUrl, { responseType: \"arraybuffer\" });\n\n return new Promise((resolve, reject) => {\n if (res.status == 200) {\n const tmpZipFile = tmp.tmpNameSync();\n const zip = new AdmZip(res.data);\n zip.extractAllTo(tmpZipFile);\n resolve(tmpZipFile);\n } else {\n reject();\n }\n });\n};\n\nfunction toGithubSource(githubPath: string, branch: string): string {\n return `https://codeload.github.com/${githubPath}/zip/${branch}`;\n}\n\nexport async function installLib(\n tracker: Tracker | undefined,\n cwd: string,\n libGithubPath: string,\n branch = \"HEAD\"\n): Promise<string[] | undefined> {\n const spinner = Utils.spinner(\n `Installing the ${libGithubPath} lib in your project...`\n );\n\n try {\n spinner.start();\n\n const [githubUserName, githubProjectName] = libGithubPath.split(\"/\");\n const source = toGithubSource(libGithubPath, branch);\n\n const zipFilePath = await downloadFile(source);\n const outputFolder = `${githubProjectName}-${branch}`;\n const projectPath = path.join(zipFilePath, outputFolder);\n\n const name = `${githubUserName}-${githubProjectName}`;\n const libDestinationFolder = path.join(cwd, name);\n\n // We should be able to offer the ability to override or not an existing library\n if (fs.existsSync(libDestinationFolder)) {\n spinner.succeed(`Lib \"${libGithubPath}\" was already installed (skipped)`);\n return;\n }\n\n // We copy all the slices into the the user project minus the src folder\n fsExtra.moveSync(path.join(projectPath, \"src\"), libDestinationFolder);\n\n // handle dependencies\n const pkgManager = PackageManager.get(cwd);\n const pkgJson = PackageJsonHelper.fromPath(\n path.join(projectPath, \"package.json\")\n );\n if (pkgJson instanceof Error) throw pkgJson;\n\n const dependencies = Dependencies.fromPkgFormat(pkgJson.dependencies);\n if (dependencies) await pkgManager.install(dependencies);\n\n // generate meta file\n Files.write(path.join(libDestinationFolder, \"meta.json\"), {\n name: pkgJson.name,\n });\n\n // retrieve all slices lib paths\n const manifest = Files.readEntity<Error | Manifest>(\n path.join(projectPath, \"sm.json\"),\n (payload: unknown) => {\n return getOrElseW(\n () => new Error(`Unable to parse sm.json from lib ${libGithubPath}`)\n )(Manifest.decode(payload));\n }\n );\n if (manifest instanceof Error) throw manifest;\n\n const localLibs = ManifestHelper.localLibraries(manifest).map(\n ({ path }) => {\n return `~/${name}/${path.replace(\"src/\", \"\")}`;\n }\n );\n\n spinner.succeed(\n `Slice library \"${libGithubPath}\" was installed successfully`\n );\n\n tracker?.Track.downloadLibrary(libGithubPath);\n return localLibs;\n } catch (error) {\n spinner.fail(`Error installing ${libGithubPath} lib!`);\n if (error instanceof Error) {\n console.error(error.message);\n }\n process.exit(-1);\n }\n}\n","import { Utils, FileSystem } from \"@slicemachine/core\";\nimport { Tracker } from \"./utils/tracker\";\nimport {\n installRequiredDependencies,\n validatePkg,\n maybeExistingRepo,\n createRepository,\n loginOrBypass,\n configureProject,\n displayFinalMessage,\n detectFramework,\n installLib,\n} from \"./steps\";\nimport { findArgument } from \"./utils\";\n\nasync function init() {\n const cwd = findArgument(process.argv, \"cwd\") || process.cwd();\n const base = findArgument(process.argv, \"base\") || Utils.CONSTS.DEFAULT_BASE;\n const lib: string | undefined = findArgument(process.argv, \"library\");\n const branch: string | undefined = findArgument(process.argv, \"branch\");\n const isTrackingAvailable =\n findArgument(process.argv, \"tracking\") === \"false\" ? false : true;\n\n console.log(\n Utils.purple(\n \"You're about to configure Slicemachine... Press ctrl + C to cancel\"\n )\n );\n\n // verify package.json file exist\n validatePkg(cwd);\n\n // login\n const user = await loginOrBypass(base);\n if (!user) throw new Error(\"The user should be logged in!\");\n\n // retrieve tokens for api calls\n const config = FileSystem.PrismicSharedConfigManager.get();\n\n // detect the framework used by the project\n const frameworkResult = await detectFramework(cwd);\n\n // select the repository used with the project.\n const { existing, name } = await maybeExistingRepo(\n config.cookies,\n cwd,\n config.base\n );\n\n if (!existing) {\n await createRepository(name, frameworkResult.value, config);\n }\n\n const tracker = user.profile?.shortId\n ? Tracker.build(\n process.env.NEXT_PUBLIC_SEGMENT_KEY ||\n \"JfTfmHaATChc4xueS7RcCBsixI71dJIJ\",\n name,\n {\n userId: user.profile.shortId,\n },\n isTrackingAvailable\n )\n : undefined;\n\n // install the required dependencies in the project.\n await installRequiredDependencies(cwd, frameworkResult.value);\n\n const sliceLibPath = lib\n ? await installLib(tracker, cwd, lib, branch)\n : undefined;\n\n // configure the SM.json file and the json package file of the project..\n configureProject(\n cwd,\n base,\n name,\n frameworkResult,\n sliceLibPath,\n isTrackingAvailable\n );\n\n // ask the user to run slice-machine.\n displayFinalMessage(cwd);\n}\n\ntry {\n void init();\n} catch (error) {\n if (error instanceof Error) Utils.writeError(error.message);\n else console.error(error);\n}\n"],"names":["ServerAnalytics","util","exec","Utils","Models","FileSystem","path","inquirer","Communication","Separator","parsePrismicAuthToken","t","axios","pipe","fold","Auth","tmp","AdmZip","fs","PackageJsonHelper","Files","getOrElseW","Manifest","ManifestHelper"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAcqB;AAAA,EACnB,YACW,WACA,MACA,YACA,WAAW,MACpB;AAJS;AACA;AACA;AACA;AA+BX,iBAAQ;AAAA,MAEN,iBAAiB,CAAC,YAA0B;AAC1C,aAAK,WAAW,uDAA2B,EAAE;AAAA;AAAA;AAAA;AAAA,SA/B1C,MACL,UACA,MACA,YACA,WAAW,MACU;AACrB,QAAI;AACF,UAAI,CAAC;AAAM;AACX,YAAM,YAAY,IAAIA,oCAAgB;AACtC,aAAO,IAAI,QAAQ,WAAW,MAAM,YAAY;AAAA,aACzC,OAAP;AACA,cAAQ,KAAK;AACb;AAAA;AAAA;AAAA,EAII,WACN,WACA,aAAsC,IAChC;AACN,SAAK,YACH,KAAK,UAAU,MAAM;AAAA,MACnB,OAAO;AAAA,SACJ,KAAK;AAAA,MACR,YAAY;AAAA;AAAA;AAAA;;sBC3CS,MAAgB,MAAkC;AAC7E,QAAM,YAAoB,KAAK,QAAQ,KAAK;AAE5C,MAAI,cAAc;AAAI;AACtB,MAAI,KAAK,SAAS,YAAY;AAAG;AAEjC,QAAM,YAAY,KAAK,YAAY;AAEnC,MAAI,UAAU,WAAW;AAAO;AAChC,SAAO;AAAA;MAGI,cAEsCC,yBAAK,UAAUC;;ACblE,MAAM;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,IACEC,WAAM;AAEV,0BAA0B,WAAsC;AAC9D,UAAQ;AAAA,SACDC,YAAO,WAAW;AACrB,aAAO,GAAG,8BAA8B;AAAA,SACrCA,YAAO,WAAW;AACrB,aAAO,GAAG,8BAA8B,yBAAyB,kBAAkB;AAAA,SAChFA,YAAO,WAAW;AACrB,aAAO,GAAG,4BAA4B;AAAA,SACnCA,YAAO,WAAW;AACrB,aAAO,GAAG,gBAAgB,WAAW,iBAAiB;AAAA,SACnDA,YAAO,WAAW;AACrB,aAAO,GAAG,eAAe,yBAAyB,4BAA4B;AAAA;AAE9E,aAAO;AAAA;AAAA;2CAKX,KACA,WACe;AACf,QAAM,WAAWD,WAAM,MAAM,OAAOE,gBAAW,aAAa;AAC5D,QAAM,8BAA8B,WAChC,gBACA;AACJ,QAAM,2BAA2B,WAAW,aAAa;AAEzD,QAAM,UAAUF,WAAM,QAAQ;AAC9B,UAAQ;AAER,QAAM,EAAE,WAAW,MAAM,YACvB,GAAG,+BAA+B;AAGpC,QAAM,OAAO,iBAAiB;AAC9B,MAAI;AAAM,UAAM,YAAY,GAAG,4BAA4B;AAE3D,QAAM,YAAYG,yBAAK,KACrBD,gBAAW,aAAa,KAAK,SAC7B;AAEF,QAAM,qBAAqBF,WAAM,MAAM,OAAO;AAE9C,MAAI,sBAAsB,CAAC,OAAO,QAAQ;AACxC,YAAQ,QAAQ;AAChB;AAAA;AAGF,UAAQ;AACR,aAAM,aACJ,qBAAqB;AAAA;;qBClEG,KAAmB;AAC7C,QAAM,cAAcE,gBAAW,oBAAoB;AACnD,MAAI,CAAC,YAAY,QAAQ;AACvB,eAAM,WAAW;AACjB,WAAO,QAAQ,KAAK;AAAA;AAEtB,MAAI,CAAC,YAAY,SAAS;AACxB,eAAM,WAAW;AACjB,WAAO,QAAQ,KAAK;AAAA;AAAA;;MCHX,cAAc;AAC3B,MAAM,eAAeF,WAAM,OAAO;wBAEH,SAAc,OAAwB;AACnE,QAAM,WAAW,QAAQA,WAAM,KAAK,SAASA,WAAM,IAAI,KAAK;AAC5D,SAAO,GAAGA,WAAM,KAAK,IAAI,GAAG,QAAQ,gBAAgB,WAAWA,WAAM,KAAK,IACxE,IAAI,QAAQ;AAAA;iCAIwB,MAA+B;AACrE,QAAM,UAAU,IAAI,IAAI;AAExB,aAAM,UACJ;AAGF,SAAOI,oBACJ,OAA+B;AAAA,IAC9B;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,MACV,aAAa,CAAC,UAAU,eAAe,SAAS,OAAO;AAAA,YACjD,SAAS,MAAc;AAC3B,cAAM,SAAS,MAAMC,mBAAc,uBACjC,MACA,MACA;AAEF,eAAO,WAAW,QAAQ;AAAA;AAAA;AAAA,KAI/B,KAAK,CAAC,QAAQ,IAAI;AAAA;yBASS,MAAc;AAC5C,SAAO,SAAU,EAAE,MAAM,QAAQ,QAAgC;AAC/D,UAAM,UAAU,IAAI,IAAI;AACxB,YAAQ,WAAW,GAAG,UAAU,QAAQ;AACxC,QAAIL,WAAM,MAAM,qBAAqB,UAAU,OAAO;AACpD,aAAO;AAAA,QACL,MAAM,GAAGA,WAAM,OAAO,IAAI,UAAUA,WAAM,KAAK,IAC7C,SACGA,WAAM,OAAO,IAAI,IAAI,QAAQ;AAAA,QAClC,OAAO;AAAA,QACP,UAAU;AAAA;AAAA;AAId,WAAO;AAAA,MACL,MAAM,GAAGA,WAAM,OAAO,UAAUA,WAAM,KAAK,SAASA,WAAM,OACxD,IAAI,QAAQ;AAAA,MAEd,OAAO;AAAA;AAAA;AAAA;sBAKgB,WAA2B;AACtD,SAAO,CAAC,GAAsB,MAAiC;AAC7D,QAAI,aAAaM,iCAAa,aAAaA;AAAW,aAAO;AAC7D,QAAI,gBAAgB,UAAU,aAAa,EAAE,UAAU;AAAY,aAAO;AAC1E,QAAI,EAAE,UAAU,eAAe,EAAE,UAAU;AAAa,aAAO;AAC/D,QAAI,EAAE,YAAY,CAAC,EAAE;AAAU,aAAO;AACtC,QAAI,CAAC,EAAE,YAAY,EAAE;AAAU,aAAO;AACtC,WAAO;AAAA;AAAA;4CAIwC,UAA0B;AAC3E,SAAO,CAAC,KAAkB,SAAkC;AAC1D,QAAI,YAAY,KAAK,UAAU,UAAU;AACvC,aAAO,CAAC,MAAM,GAAG;AAAA;AAEnB,WAAO,CAAC,GAAG,KAAK;AAAA;AAAA;4BAKlB,OACA,MACA,KACa;AACb,QAAM,YAAY;AAAA,IAChB,MAAM,GAAGN,WAAM,OAAO,eAAeA,WAAM,KAAK,UAAUA,WAAM,OAC9D;AAAA,IAEF,OAAO;AAAA;AAGT,QAAM,0BAA0BE,gBAAW,wBAAwB,KAAK;AAExE,SAAO,MACJ,UACA,IAAI,gBAAgB,OACpB,OAAO,mCAAmC,0BAA0B;AAAA,IACnE;AAAA,KAED,KAAK,aAAa;AAAA;iCAIrB,SACA,KACA,OAAO,cACuC;AAC9C,QAAM,QAAQK,6BAAsB;AACpC,QAAM,QAAQ,MAAMF,mBAAc,iBAAiB;AAEnD,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,OAAO,MAAM,kBAAkB;AACrC,WAAO,EAAE,UAAU,OAAO;AAAA;AAG5B,QAAM,UAAU,mBAAmB,OAAO,MAAM;AAEhD,QAAM,wBAAwB,QAAQ,OAAO,CAAC,SAAS;AACrD,QAAI,gBAAgBC;AAAW,aAAO;AACtC,WAAO,KAAK;AAAA,KACX;AAEH,QAAM,MAAM,MAAMF,oBAAS,OAA+B;AAAA,IACxD;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,MACV,SAAS;AAAA,MACT;AAAA,MACA,UAAU,wBAAwB,KAAK,IAAI,IAAI,wBAAwB;AAAA;AAAA;AAK3E,MAAI,IAAI,aAAa,aAAa;AAChC,UAAM,OAAO,MAAM,kBAAkB;AACrC,WAAO,EAAE,UAAU,OAAO;AAAA;AAE5B,SAAO,EAAE,UAAU,MAAM,MAAM,IAAI;AAAA;;0BCtJnC,QACA,WACA,QACe;AACf,QAAM,UAAUJ,WAAM,QAAQ;AAC9B,UAAQ;AAER,SAAOK,mBAAc,iBACnB,QACA,OAAO,SACP,WACA,OAAO,MAEN,KAAK,CAAC,QAAQ;AACb,UAAM,aAAa,IAAI,IAAI,OAAO;AAClC,eAAW,WAAW,GAAG,IAAI,KAAK,UAAU,UAC1C,WAAW;AAEb,UAAM,UAAU,WAAW;AAC3B,YAAQ,QAAQ,kCAAkC;AAAA,KAEnD,MAAM,CAAC,UAAiB;AACvB,YAAQ,KAAK,6BAA6B;AAC1C,QAAI,MAAM,SAAS;AACjB,iBAAM,WAAW,MAAM;AAAA;AAEzB,eAAM,WAAW;AACjB,YAAQ,IAAI,OAAOL,WAAM,KAAK;AAC9B,YAAQ,KAAK;AAAA;AAAA;;oCCvBkD;AACnE,QAAM,UAAUC,YAAO,oBAAoB,IAAI,CAAC,cAAc;AAC5D,WAAO;AAAA,MACL,MAAMD,WAAM,UAAU,UAAU;AAAA,MAChC,OAAO;AAAA;AAAA;AAIX,SAAOI,oBACJ,OAAyC;AAAA,IACxC;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,MACV;AAAA;AAAA,KAGH,KAAK,CAAC,QAAQ;AACb,WAAO;AAAA,MACL,OAAO,IAAI;AAAA,MACX,eAAe;AAAA;AAAA;AAAA;+BAKe,KAAuC;AAC3E,QAAM,cAAc,cAAcJ,WAAM,KACtC;AAGF,QAAM,UAAUA,WAAM,QACpB;AAGF,UAAQ;AAER,MAAI;AACF,UAAM,iBAAiBA,WAAM,UAAU,gBACrC,KACA,OAAO,OAAOC,YAAO;AAEvB,YAAQ;AAER,QAAI,CAAC,kBAAkB,mBAAmBA,YAAO,WAAW,WAAW;AACrE,iBAAM,WAAW;AACjB,aAAO,MAAM;AAAA;AAGf,UAAM,cAAcD,WAAM,UAAU,UAAU;AAE9C,QAAIA,WAAM,UAAU,cAAc,iBAAiB;AACjD,iBAAM,WAAW,GAAG;AACpB,cAAQ,IAAI;AACZ,cAAQ,KAAK;AAAA;AAGf,eAAM,WAAW,GAAG;AAEpB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,eAAe;AAAA;AAAA,WAEV,OAAP;AACA,YAAQ,KAAK;AAEb,QAAI,iBAAiB,SAAS,MAAM,SAAS;AAC3C,iBAAM,WAAW,MAAM;AAAA,WAClB;AACL,cAAQ,IAAI;AAAA;AAGd,YAAQ,KAAK;AAAA;AAAA;;AC3EjB,MAAM,cAAcQ,aAAE,MACpBA,aAAE,KAAK;AAAA,EACL,QAAQA,aAAE;AAAA,EACV,SAASA,aAAE;AAAA,EACX,OAAOA,aAAE;AAAA,EACT,WAAWA,aAAE;AAAA,EACb,UAAUA,aAAE;AAAA;8BAOd,SACA,OAAOR,WAAM,OAAO,cACE;AAGtB,QAAM,MAAM,IAAI,IAAI;AACpB,MAAI,WAAW,QAAQ,IAAI;AAC3B,MAAI,WAAW;AAEf,QAAM,WAAW,IAAI;AACrB,QAAM,QAAQA,WAAM,OAAO,sBAAsB;AAEjD,SAAOS,0BACJ,IAAiB,UAAU;AAAA,IAC1B,SAAS;AAAA,MACP,eAAe,gBAAgB;AAAA;AAAA,KAGlC,KAAK,CAAC,QACLC,eACE,YAAY,OAAO,IAAI,OACvBC,YACE,MAAM;AACJ,UAAM,IAAI,MAAM;AAAA,KAElB,CAAC,SAAsB;AAAA;4CAO/B,OAAOX,WAAM,OAAO,cAIZ;AACR,QAAM,SAASE,gBAAW,2BAA2B;AAErD,MAAI,CAAC,OAAO,QAAQ;AAAQ,WAAO,QAAQ,QAAQ;AACnD,MAAI,QAAQ,OAAO;AAAM,WAAO,QAAQ,QAAQ;AAEhD,MAAI;AACF,UAAM,OAAO,MAAMG,mBAAc,gBAAgB,OAAO,SAAS;AACjE,UAAM,UAAU,MAAM,eAAe,OAAO,SAAS,MAAM,MACzD,MAAM;AAER,QAAI,mCAAS,SAAS;AACpB,sBAAW,2BAA2B,cAAc;AAAA,QAClD,SAAS,QAAQ;AAAA;AAAA;AAGrB,WAAO,EAAE,MAAM;AAAA,WACT,GAAN;AACA,WAAO;AAAA;AAAA;;6BCnEyB,MAG1B;AACR,QAAM,OAAO,MAAM,6BAA6B,MAAM,MAAM,CAAC,QAC3D,QAAQ,IAAI;AAEd,MAAI,MAAM;AACR,UAAM,QAAQ,KAAK,KAAK;AACxB,eAAM,WAAW,gBAAgBL,WAAM,KAAK;AAC5C,WAAO;AAAA,SACF;AACL,UAAMY,UAAK,MAAM;AACjB,UAAM,QAAO,MAAM,6BAA6B;AAChD,WAAO;AAAA;AAAA;;0BCbT,KACA,MACA,YACA,WACA,eAAyB,IACzB,WAAW,MACL;AACN,QAAM,UAAUZ,WAAM,QACpB,oBAAoB,UAAU;AAEhC,UAAQ;AAER,MAAI;AACF,UAAM,WAAWE,gBAAW,iBAAiB;AAE7C,UAAM,kBAAmC;AAAA,SACnC,SAAS,UAAU,SAAS,UAAU,SAAS,UAAU;AAAA,MAC7D,aAAaF,WAAM,UAAU,wBAAwB,MAAM;AAAA,MAC3D,WAAW,CAAC,YAAY,GAAG;AAAA,SACvB,UAAU,gBAAgB,EAAE,WAAW,UAAU,UAAU;AAAA,SAC3D,CAAC,WAAW,EAAE,aAAa;AAAA;AAGjC,QAAI,CAAC,SAAS;AAAQ,sBAAW,eAAe,KAAK;AAAA;AAChD,sBAAW,cAAc,KAAK;AAGnC,UAAM,qBAAqBE,gBAAW,YAAY,KAC/C,QAAQ,UACR;AACH,QAAI,CAACF,WAAM,MAAM,OAAO;AACtB,iBAAM,MAAM,MAAM,oBAAoB,EAAE,WAAW;AAGrD,oBAAW,uBAAuB;AAElC,YAAQ,QAAQ;AAAA,WACV,GAAN;AACA,YAAQ,KAAK;AACb,YAAQ,KAAK;AAAA;AAAA;;6BC5CmB,KAAmB;AACrD,QAAM,WAAWA,WAAM,MAAM,OAAOE,gBAAW,aAAa;AAC5D,QAAM,UAAU,GAAG,WAAW,SAAS,aACrCF,WAAM,OAAO;AAGf,UAAQ,IACN,GAAGA,WAAM,MAAM,iBAAYA,WAAM,OAC/B;AAAA;;MCNO,eAAe;AAAA,EAC1B,cACE,SACuC;AACvC,QAAI,CAAC;AAAS;AAEd,WAAO,OAAO,QAAQ,SAAS,IAAI,CAAC,CAAC,MAAM;AAAc,MACvD;AAAA,MACA;AAAA;AAAA;AAAA;AAIN,oBAAoB,cAAiD;AACnE,SAAO,aACJ,IAAI,CAAC,QAAQ;AACZ,QAAI,OAAO,QAAQ;AAAU,aAAO;AACpC,WAAO,GAAG,IAAI,QAAQ,IAAI;AAAA,KAE3B,KAAK;AAAA;MAUG,iBAAiB;AAAA,EAC5B,IAAI,KAA6B;AAC/B,QAAIA,WAAM,MAAM,OAAOE,gBAAW,aAAa,OAAO;AACpD,aAAO;AAAA;AAET,WAAO;AAAA;AAAA;MAIE,OAAuB;AAAA,EAClC,QACE,cAC6B;AAC7B,WAAO,YAAY,YAAY,WAAW;AAAA;AAAA,EAE5C,WACE,cAC6B;AAC7B,WAAO,YAAY,kBAAkB,WAAW;AAAA;AAAA;MAIvC,MAAsB;AAAA,EACjC,QACE,cAC6B;AAC7B,WAAO,YAAY,gBAAgB,WAAW;AAAA;AAAA,EAEhD,WACE,cAC6B;AAC7B,WAAO,YAAY,oBAAoB,WAAW;AAAA;AAAA;;AC7CtD,MAAM,eAAe,OAAO,WAAoC;AAC9D,QAAM,MAAM,MAAMO,0BAAM,IAAY,QAAQ,EAAE,cAAc;AAE5D,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,IAAI,UAAU,KAAK;AACrB,YAAM,aAAaI,wBAAI;AACvB,YAAM,MAAM,IAAIC,2BAAO,IAAI;AAC3B,UAAI,aAAa;AACjB,cAAQ;AAAA,WACH;AACL;AAAA;AAAA;AAAA;AAKN,wBAAwB,YAAoB,QAAwB;AAClE,SAAO,+BAA+B,kBAAkB;AAAA;0BAIxD,SACA,KACA,eACA,SAAS,QACsB;AAC/B,QAAM,UAAUd,WAAM,QACpB,kBAAkB;AAGpB,MAAI;AACF,YAAQ;AAER,UAAM,CAAC,gBAAgB,qBAAqB,cAAc,MAAM;AAChE,UAAM,SAAS,eAAe,eAAe;AAE7C,UAAM,cAAc,MAAM,aAAa;AACvC,UAAM,eAAe,GAAG,qBAAqB;AAC7C,UAAM,cAAcG,yBAAK,KAAK,aAAa;AAE3C,UAAM,OAAO,GAAG,kBAAkB;AAClC,UAAM,uBAAuBA,yBAAK,KAAK,KAAK;AAG5C,QAAIY,uBAAG,WAAW,uBAAuB;AACvC,cAAQ,QAAQ,QAAQ;AACxB;AAAA;AAIF,gCAAQ,SAASZ,yBAAK,KAAK,aAAa,QAAQ;AAGhD,UAAM,aAAa,eAAe,IAAI;AACtC,UAAM,UAAUa,8BAAkB,SAChCb,yBAAK,KAAK,aAAa;AAEzB,QAAI,mBAAmB;AAAO,YAAM;AAEpC,UAAM,eAAe,aAAa,cAAc,QAAQ;AACxD,QAAI;AAAc,YAAM,WAAW,QAAQ;AAG3C,8BAAM,MAAMA,yBAAK,KAAK,sBAAsB,cAAc;AAAA,MACxD,MAAM,QAAQ;AAAA;AAIhB,UAAM,WAAWc,0BAAM,WACrBd,yBAAK,KAAK,aAAa,YACvB,CAAC,YAAqB;AACpB,aAAOe,kBACL,MAAM,IAAI,MAAM,oCAAoC,kBACpDC,kBAAS,OAAO;AAAA;AAGtB,QAAI,oBAAoB;AAAO,YAAM;AAErC,UAAM,YAAYC,wBAAe,eAAe,UAAU,IACxD,CAAC,EAAE,kBAAW;AACZ,aAAO,KAAK,QAAQ,MAAK,QAAQ,QAAQ;AAAA;AAI7C,YAAQ,QACN,kBAAkB;AAGpB,uCAAS,MAAM,gBAAgB;AAC/B,WAAO;AAAA,WACA,OAAP;AACA,YAAQ,KAAK,oBAAoB;AACjC,QAAI,iBAAiB,OAAO;AAC1B,cAAQ,MAAM,MAAM;AAAA;AAEtB,YAAQ,KAAK;AAAA;AAAA;;ACjGjB,sBAAsB;AAftB;AAgBE,QAAM,MAAM,aAAa,QAAQ,MAAM,UAAU,QAAQ;AACzD,QAAM,OAAO,aAAa,QAAQ,MAAM,WAAWpB,WAAM,OAAO;AAChE,QAAM,MAA0B,aAAa,QAAQ,MAAM;AAC3D,QAAM,SAA6B,aAAa,QAAQ,MAAM;AAC9D,QAAM,sBACJ,aAAa,QAAQ,MAAM,gBAAgB,UAAU,QAAQ;AAE/D,UAAQ,IACNA,WAAM,OACJ;AAKJ,cAAY;AAGZ,QAAM,OAAO,MAAM,cAAc;AACjC,MAAI,CAAC;AAAM,UAAM,IAAI,MAAM;AAG3B,QAAM,SAASE,gBAAW,2BAA2B;AAGrD,QAAM,kBAAkB,MAAM,gBAAgB;AAG9C,QAAM,EAAE,UAAU,SAAS,MAAM,kBAC/B,OAAO,SACP,KACA,OAAO;AAGT,MAAI,CAAC,UAAU;AACb,UAAM,iBAAiB,MAAM,gBAAgB,OAAO;AAAA;AAGtD,QAAM,UAAU,YAAK,YAAL,mBAAc,WAC1B,QAAQ,MACN,qCAEA,MACA;AAAA,IACE,QAAQ,KAAK,QAAQ;AAAA,KAEvB,uBAEF;AAGJ,QAAM,4BAA4B,KAAK,gBAAgB;AAEvD,QAAM,eAAe,MACjB,MAAM,WAAW,SAAS,KAAK,KAAK,UACpC;AAGJ,mBACE,KACA,MACA,MACA,iBACA,cACA;AAIF,sBAAoB;AAAA;AAGtB,IAAI;AACF,OAAK;AAAA,SACE,OAAP;AACA,MAAI,iBAAiB;AAAO,eAAM,WAAW,MAAM;AAAA;AAC9C,YAAQ,MAAM;AAAA;;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/utils/tracker.ts","../src/utils/index.ts","../src/steps/install-required-dependencies.ts","../src/steps/validate-pkg.ts","../src/steps/maybe-existing-repo.ts","../src/steps/create-repo.ts","../src/steps/detect-framework.ts","../src/utils/communication.ts","../src/steps/loginOrBypass.ts","../src/steps/configure-project.ts","../src/steps/display-final-message.ts","../src/utils/PackageManager.ts","../src/steps/install-lib.ts","../src/index.ts"],"sourcesContent":["import ServerAnalytics from \"analytics-node\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { Frameworks } from \"@slicemachine/core/build/src/models\";\n\nexport enum EventType {\n DownloadLibrary = \"SliceMachine Download Library\",\n InitStart = \"SliceMachine Init Start\",\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): void {\n if (!this._isTrackingPossible(this.#client)) {\n return;\n }\n\n try {\n this.#client.identify({\n userId,\n anonymousId: this.#anonymousId,\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): void {\n this.#userId = userId;\n this._identifyEvent(userId);\n }\n\n trackDownloadLibrary(library: string): void {\n this._trackEvent(EventType.DownloadLibrary, { library });\n }\n\n trackInitStart(): void {\n this._trackEvent(EventType.InitStart);\n }\n\n trackInitDone(framework: Frameworks, repo: string): void {\n this._trackEvent(EventType.InitDone, { framework, repo });\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 util from \"util\";\nimport { exec } from \"child_process\";\n\nexport function findArgument(args: string[], name: string): string | undefined {\n const flagIndex: number = args.indexOf(`--${name}`);\n\n if (flagIndex === -1) return;\n if (args.length < flagIndex + 2) return;\n\n const flagValue = args[flagIndex + 1];\n\n if (flagValue.startsWith(\"--\")) return;\n return flagValue;\n}\n\nexport const execCommand: (\n command: string\n) => Promise<{ stderr: string; stdout: string }> = util.promisify(exec);\n","import path from \"path\";\nimport { execCommand } from \"../utils\";\nimport { Utils, FileSystem, Models } from \"@slicemachine/core\";\n\nconst {\n PRISMIC_CLIENT,\n PRISMIC_DOM_PACKAGE_NAME,\n PRISMIC_REACT_PACKAGE_NAME,\n NEXT_SLICEZONE,\n SM_PACKAGE_NAME,\n NUXT_PRISMIC,\n NUXT_SM,\n VUE_SLICEZONE,\n PRISMIC_VUE,\n SLICE_SIMULATOR_REACT,\n SLICE_SIMULATOR_VUE,\n} = Utils.CONSTS;\n\nfunction depsForFramework(framework: Models.Frameworks): string {\n switch (framework) {\n case Models.Frameworks.react:\n return `${PRISMIC_REACT_PACKAGE_NAME} ${PRISMIC_CLIENT}`;\n case Models.Frameworks.next:\n return `${PRISMIC_REACT_PACKAGE_NAME} ${PRISMIC_CLIENT}@v5.1.1 ${NEXT_SLICEZONE} ${SLICE_SIMULATOR_REACT}`;\n case Models.Frameworks.svelte:\n return `${PRISMIC_DOM_PACKAGE_NAME} ${PRISMIC_CLIENT}`;\n case Models.Frameworks.nuxt:\n return `${NUXT_PRISMIC} ${NUXT_SM} ${VUE_SLICEZONE} ${SLICE_SIMULATOR_VUE}`;\n case Models.Frameworks.vue:\n return `${PRISMIC_VUE} ${PRISMIC_CLIENT}@v5.1.1 ${PRISMIC_DOM_PACKAGE_NAME} ${VUE_SLICEZONE}`;\n default:\n return \"\";\n }\n}\n\nexport async function installRequiredDependencies(\n cwd: string,\n framework: Models.Frameworks\n): Promise<void> {\n const yarnLock = Utils.Files.exists(FileSystem.YarnLockPath(cwd));\n const installDevDependencyCommand = yarnLock\n ? \"yarn add -D\"\n : \"npm install --save-dev\";\n const installDependencyCommand = yarnLock ? \"yarn add\" : \"npm install --save\";\n\n const spinner = Utils.spinner(\"Downloading Prismic Visual Builder\");\n spinner.start();\n\n const { stderr } = await execCommand(\n `${installDevDependencyCommand} ${SM_PACKAGE_NAME}`\n );\n\n const deps = depsForFramework(framework);\n if (deps) await execCommand(`${installDependencyCommand} ${deps}`);\n\n const pathToPkg = path.join(\n FileSystem.PackagePaths(cwd).value(),\n SM_PACKAGE_NAME\n );\n const isPackageInstalled = Utils.Files.exists(pathToPkg);\n\n if (isPackageInstalled || !stderr.length) {\n spinner.succeed(\"The Prismic Visual Builder was installed successfully\");\n return;\n }\n\n spinner.fail();\n Utils.writeWarning(\n `could not install ${SM_PACKAGE_NAME}. Please do it manually!`\n );\n}\n","import { FileSystem, Utils } from \"@slicemachine/core\";\n\nexport function validatePkg(cwd: string): void {\n const jsonPackage = FileSystem.retrieveJsonPackage(cwd);\n if (!jsonPackage.exists) {\n Utils.writeError(`package.json not found. Are you in the right folder?`);\n return process.exit(-1);\n }\n if (!jsonPackage.content) {\n Utils.writeError(`could not parse package.json.`);\n return process.exit(-1);\n }\n}\n","import * as inquirer from \"inquirer\";\nimport Separator from \"inquirer/lib/objects/separator\";\nimport { Communication, Utils, FileSystem } from \"@slicemachine/core\";\nimport { Repositories } from \"@slicemachine/core/src/models/Repositories\";\nimport { Repository } from \"@slicemachine/core/src/models/Repository\";\nimport { parsePrismicAuthToken } from \"@slicemachine/core/build/src/utils/cookie\";\n\nexport const CREATE_REPO = \"$_CREATE_REPO\"; // not a valid domain name\nconst DEFAULT_BASE = Utils.CONSTS.DEFAULT_BASE;\n\nexport function prettyRepoName(address: URL, value?: string): string {\n const repoName = value ? Utils.cyan(value) : Utils.dim.cyan(\"repo-name\");\n return `${Utils.cyan.dim(`${address.protocol}//`)}${repoName}${Utils.cyan.dim(\n `.${address.hostname}`\n )}`;\n}\n\nexport async function promptForRepoName(base: string): Promise<string> {\n const address = new URL(base);\n\n Utils.writeInfo(\n \"The name acts as a domain/endpoint for your content repo and should be completely unique.\"\n );\n\n return inquirer\n .prompt<Record<string, string>>([\n {\n name: \"repoName\",\n message: \"Name your Prismic repository\",\n type: \"input\",\n required: true,\n transformer: (value) => prettyRepoName(address, String(value)),\n async validate(name: string) {\n const result = await Communication.validateRepositoryName(\n name,\n base,\n false\n );\n return result === name || result;\n },\n },\n ])\n .then((res) => res.repoName);\n}\n\nexport type RepoPrompt = { name: string; value: string; disabled?: string };\n\nexport type PromptOrSeparator = RepoPrompt | Separator;\n\nexport type RepoPrompts = Array<PromptOrSeparator>;\n\nexport function makeReposPretty(base: string) {\n return function ({ name, domain, role }: Repository): RepoPrompt {\n const address = new URL(base);\n address.hostname = `${domain}.${address.hostname}`;\n if (Utils.roles.canUpdateCustomTypes(role) === false) {\n return {\n name: `${Utils.purple.dim(\"Use\")} ${Utils.bold.dim(\n name\n )} ${Utils.purple.dim(`\"${address.hostname}\"`)}`,\n value: domain,\n disabled: \"Unauthorized\",\n };\n }\n\n return {\n name: `${Utils.purple(\"Use\")} ${Utils.bold(name)} ${Utils.purple(\n `\"${address.hostname}\"`\n )}`,\n value: name,\n };\n };\n}\n\nexport function orderPrompts(maybeName?: string | null) {\n return (a: PromptOrSeparator, b: PromptOrSeparator): number => {\n if (a instanceof Separator || b instanceof Separator) return 0;\n if (maybeName && (a.value === maybeName || b.value === maybeName)) return 0;\n if (a.value === CREATE_REPO || b.value === CREATE_REPO) return 0;\n if (a.disabled && !b.disabled) return 1;\n if (!a.disabled && b.disabled) return -1;\n return 0;\n };\n}\n\nexport function maybeStickTheRepoToTheTopOfTheList(repoName?: string | null) {\n return (acc: RepoPrompts, curr: RepoPrompt): RepoPrompts => {\n if (repoName && curr.value === repoName) {\n return [curr, ...acc];\n }\n return [...acc, curr];\n };\n}\n\nexport function sortReposForPrompt(\n repos: Repositories,\n base: string,\n cwd: string\n): RepoPrompts {\n const createNew = {\n name: `${Utils.purple(\"Create a\")} ${Utils.bold(\"new\")} ${Utils.purple(\n \"Repository\"\n )}`,\n value: CREATE_REPO,\n };\n\n const maybeConfiguredRepoName = FileSystem.maybeRepoNameFromSMFile(cwd, base);\n\n return repos\n .reverse()\n .map(makeReposPretty(base))\n .reduce(maybeStickTheRepoToTheTopOfTheList(maybeConfiguredRepoName), [\n createNew,\n ])\n .sort(orderPrompts(maybeConfiguredRepoName));\n}\n\nexport async function maybeExistingRepo(\n cookies: string,\n cwd: string,\n base = DEFAULT_BASE\n): Promise<{ repository: string; existing: boolean }> {\n const token = parsePrismicAuthToken(cookies);\n const repos = await Communication.listRepositories(token);\n\n if (repos.length === 0) {\n const name = await promptForRepoName(base);\n return { existing: false, repository: name };\n }\n\n const choices = sortReposForPrompt(repos, base, cwd);\n\n const numberOfDisabledRepos = choices.filter((repo) => {\n if (repo instanceof Separator) return false;\n return repo.disabled;\n }).length;\n\n const res = await inquirer.prompt<Record<string, string>>([\n {\n type: \"list\",\n name: \"repoName\",\n default: 0,\n required: true,\n message: \"Connect a Prismic Repository or create a new one\",\n choices,\n pageSize: numberOfDisabledRepos + 2 <= 7 ? 7 : numberOfDisabledRepos + 2,\n // loop: false\n },\n ]);\n\n if (res.repoName === CREATE_REPO) {\n const name = await promptForRepoName(base);\n return { existing: false, repository: name };\n }\n return { existing: true, repository: res.repoName };\n}\n","import { Communication, Utils } from \"@slicemachine/core\";\nimport type { Models } from \"@slicemachine/core\";\n\nexport function createRepository(\n domain: string,\n framework: Models.Frameworks,\n config: Models.PrismicSharedConfig\n): Promise<void> {\n const spinner = Utils.spinner(\"Creating Prismic Repository\");\n spinner.start();\n\n return Communication.createRepository(\n domain,\n config.cookies,\n framework,\n config.base\n )\n .then((res) => {\n const addressUrl = new URL(config.base);\n addressUrl.hostname = `${res.data.domain || domain}.${\n addressUrl.hostname\n }`;\n const address = addressUrl.toString();\n spinner.succeed(`We created your new repository ${address}`);\n })\n .catch((error: Error) => {\n spinner.fail(`Error creating repository ${domain}`);\n if (error.message) {\n Utils.writeError(error.message);\n }\n Utils.writeError(`We failed to create you new prismic repository`);\n console.log(`Run ${Utils.bold(\"npx slicemachine init\")} again!`);\n process.exit(-1);\n });\n}\n","import { Utils } from \"@slicemachine/core\";\nimport { Models } from \"@slicemachine/core\";\nimport * as inquirer from \"inquirer\";\n\nexport type FrameworkResult = {\n value: Models.Frameworks;\n manuallyAdded: boolean;\n};\n\nexport async function promptForFramework(): Promise<FrameworkResult> {\n const choices = Models.SupportedFrameworks.map((framework) => {\n return {\n name: Utils.Framework.fancyName(framework),\n value: framework,\n };\n });\n\n return inquirer\n .prompt<{ framework: Models.Frameworks }>([\n {\n name: \"framework\",\n type: \"list\",\n message: \"Select a framework to use\",\n required: true,\n choices,\n },\n ])\n .then((res) => {\n return {\n value: res.framework,\n manuallyAdded: true,\n };\n });\n}\n\nexport async function detectFramework(cwd: string): Promise<FrameworkResult> {\n const failMessage = `Please run ${Utils.bold(\n \"npx slicemachine init\"\n )} in a Nuxt or Next.js project`;\n\n const spinner = Utils.spinner(\n \"Detecting framework to install correct dependencies\"\n );\n\n spinner.start();\n\n try {\n const maybeFramework = Utils.Framework.defineFramework({\n cwd,\n supportedFrameworks: Object.values(Models.Frameworks),\n });\n\n spinner.stop();\n\n if (!maybeFramework || maybeFramework === Models.Frameworks.vanillajs) {\n Utils.writeError(\"Framework not detected\");\n return await promptForFramework();\n }\n\n const nameToPrint = Utils.Framework.fancyName(maybeFramework);\n\n if (!Utils.Framework.isFrameworkSupported(maybeFramework)) {\n Utils.writeError(`${nameToPrint} is currently not supported`);\n console.log(failMessage);\n process.exit(1);\n }\n\n Utils.writeCheck(`${nameToPrint} detected`);\n\n return {\n value: maybeFramework,\n manuallyAdded: false,\n };\n } catch (error) {\n spinner.fail(\"package.json not found\");\n\n if (error instanceof Error && error.message) {\n Utils.writeError(error.message);\n } else {\n console.log(failMessage);\n }\n\n process.exit(1);\n }\n}\n","import axios from \"axios\";\nimport * as t from \"io-ts\";\nimport { pipe } from \"fp-ts/function\";\nimport { fold } from \"fp-ts/Either\";\nimport { Utils, Communication, FileSystem } from \"@slicemachine/core\";\n\nconst UserProfile = t.exact(\n t.type({\n userId: t.string,\n shortId: t.string,\n email: t.string,\n firstName: t.string,\n lastName: t.string,\n })\n);\n\nexport type UserProfile = t.TypeOf<typeof UserProfile>;\n\nexport async function getUserProfile(\n cookies: string,\n base = Utils.CONSTS.DEFAULT_BASE\n): Promise<UserProfile> {\n const userServiceBase =\n Utils.CONSTS.DEFAULT_BASE === base\n ? Utils.CONSTS.USER_SERVICE_BASE\n : \"https://user.wroom.io/\";\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<UserProfile>(endpoint, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n })\n .then((res) =>\n pipe(\n UserProfile.decode(res.data),\n fold<t.Errors, UserProfile, UserProfile>(\n () => {\n throw new Error(\"Can't parse user profile\");\n },\n (data: UserProfile) => data\n )\n )\n );\n}\n\nexport async function validateSessionAndGetProfile(\n base = Utils.CONSTS.DEFAULT_BASE\n): Promise<{\n info: Communication.UserInfo;\n profile: UserProfile | null;\n} | null> {\n const config = FileSystem.PrismicSharedConfigManager.get();\n\n if (!config.cookies.length) return Promise.resolve(null); // default config, logged out.\n if (base != config.base) return Promise.resolve(null); // not the same base so it doesn't\n\n try {\n const info = await Communication.validateSession(config.cookies, base);\n const profile = await getUserProfile(config.cookies, base).catch(\n () => null\n );\n if (profile?.shortId) {\n FileSystem.PrismicSharedConfigManager.setProperties({\n shortId: profile.shortId,\n });\n }\n return { info, profile };\n } catch {\n return null;\n }\n}\n","import { Utils, Communication, Auth } from \"@slicemachine/core\";\nimport {\n validateSessionAndGetProfile,\n UserProfile,\n} from \"../utils/communication\";\n\nexport async function loginOrBypass(base: string): Promise<{\n info: Communication.UserInfo;\n profile: UserProfile | null;\n} | null> {\n const user = await validateSessionAndGetProfile(base).catch((err) =>\n console.log(err)\n );\n if (user) {\n const email = user.info.email;\n Utils.writeCheck(`Logged in as ${Utils.bold(email)}`);\n return user;\n } else {\n await Auth.login(base);\n const user = await validateSessionAndGetProfile(base);\n return user;\n }\n}\n","import { FileSystem, Utils } from \"@slicemachine/core\";\nimport type { Models } from \"@slicemachine/core\";\nimport { FrameworkResult } from \"./detect-framework\";\n\ntype Base = Utils.Endpoints.Base;\n\nexport function configureProject(\n cwd: string,\n base: Base,\n repository: string,\n framework: FrameworkResult,\n sliceLibPath: string[] = [],\n tracking = true\n): void {\n const spinner = Utils.spinner(\n `Configuring your ${framework.value} & Prismic project...`\n );\n spinner.start();\n\n try {\n const manifest = FileSystem.retrieveManifest(cwd);\n\n const manifestUpdated: Models.Manifest = {\n ...(manifest.exists && manifest.content ? manifest.content : {}),\n apiEndpoint: Utils.Endpoints.buildRepositoryEndpoint(base, repository),\n libraries: [\"@/slices\", ...sliceLibPath],\n ...(framework.manuallyAdded ? { framework: framework.value } : {}),\n ...(!tracking ? { tracking } : {}),\n };\n\n if (!manifest.exists) FileSystem.createManifest(cwd, manifestUpdated);\n else FileSystem.patchManifest(cwd, manifestUpdated);\n\n // create the default slices folder if it doesn't exist.\n const pathToSlicesFolder = FileSystem.CustomPaths(cwd)\n .library(\"slices\")\n .value();\n if (!Utils.Files.exists(pathToSlicesFolder))\n Utils.Files.mkdir(pathToSlicesFolder, { recursive: true });\n\n // add slicemachine script to package.json.\n FileSystem.addJsonPackageSmScript(cwd);\n\n spinner.succeed(\"Project configured! Ready to start\");\n } catch {\n spinner.fail(\"Failed to configure your Prismic Local Builder\");\n process.exit(-1);\n }\n}\n","import { Utils, FileSystem } from \"@slicemachine/core\";\n\nexport function displayFinalMessage(cwd: string): void {\n const yarnLock = Utils.Files.exists(FileSystem.YarnLockPath(cwd));\n const command = `${yarnLock ? \"yarn\" : \"npm\"} run ${\n Utils.CONSTS.SCRIPT_NAME\n }`;\n\n console.log(\n `${Utils.white(\"■\")} Run ${Utils.purple(\n command\n )} to now launch your Local Builder`\n );\n}\n","import { Utils, FileSystem } from \"@slicemachine/core\";\nimport { execCommand } from \"../utils\";\n\nexport type Dependency = string | { name: string; version: string };\nexport const Dependencies = {\n fromPkgFormat(\n pkgDeps: Record<string, string> | undefined\n ): ReadonlyArray<Dependency> | undefined {\n if (!pkgDeps) return;\n\n return Object.entries(pkgDeps).map(([name, version]) => ({\n name,\n version,\n }));\n },\n};\nfunction formatDeps(dependencies: ReadonlyArray<Dependency>): string {\n return dependencies\n .map((dep) => {\n if (typeof dep === \"string\") return dep;\n return `${dep.name}@${dep.version}`;\n })\n .join(\" \");\n}\n\nexport interface PackageManager {\n install(dependencies: ReadonlyArray<Dependency>): Promise<{ stderr: string }>;\n installDev(\n dependencies: ReadonlyArray<Dependency>\n ): Promise<{ stderr: string }>;\n}\n\nexport const PackageManager = {\n get(cwd: string): PackageManager {\n if (Utils.Files.exists(FileSystem.YarnLockPath(cwd))) {\n return Yarn;\n }\n return Npm;\n },\n};\n\nexport const Yarn: PackageManager = {\n install(\n dependencies: ReadonlyArray<Dependency>\n ): Promise<{ stderr: string }> {\n return execCommand(`yarn add ${formatDeps(dependencies)}`);\n },\n installDev(\n dependencies: ReadonlyArray<Dependency>\n ): Promise<{ stderr: string }> {\n return execCommand(`yarn add --dev ${formatDeps(dependencies)}`);\n },\n};\n\nexport const Npm: PackageManager = {\n install(\n dependencies: ReadonlyArray<Dependency>\n ): Promise<{ stderr: string }> {\n return execCommand(`npm i --save ${formatDeps(dependencies)}`);\n },\n installDev(\n dependencies: ReadonlyArray<Dependency>\n ): Promise<{ stderr: string }> {\n return execCommand(`npm i --save-dev ${formatDeps(dependencies)}`);\n },\n};\n","import { Utils } from \"@slicemachine/core\";\nimport tmp from \"tmp\";\nimport AdmZip from \"adm-zip\";\nimport fsExtra from \"fs-extra\";\nimport axios from \"axios\";\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport { getOrElseW } from \"fp-ts/Either\";\nimport { PackageManager, Dependencies } from \"../utils/PackageManager\";\nimport { PackageJsonHelper } from \"@slicemachine/core/build/src/utils/PackageJson\";\nimport {\n Manifest,\n ManifestHelper,\n} from \"@slicemachine/core/build/src/models/Manifest\";\nimport Files from \"@slicemachine/core/build/src/utils/files\";\nimport Tracker from \"../utils/tracker\";\n\nconst downloadFile = async (reqUrl: string): Promise<string> => {\n const res = await axios.get<Buffer>(reqUrl, { responseType: \"arraybuffer\" });\n\n return new Promise((resolve, reject) => {\n if (res.status == 200) {\n const tmpZipFile = tmp.tmpNameSync();\n const zip = new AdmZip(res.data);\n zip.extractAllTo(tmpZipFile);\n resolve(tmpZipFile);\n } else {\n reject();\n }\n });\n};\n\nfunction toGithubSource(githubPath: string, branch: string): string {\n return `https://codeload.github.com/${githubPath}/zip/${branch}`;\n}\n\nexport async function installLib(\n cwd: string,\n libGithubPath: string,\n branch = \"HEAD\"\n): Promise<string[] | undefined> {\n const spinner = Utils.spinner(\n `Installing the ${libGithubPath} lib in your project...`\n );\n\n try {\n spinner.start();\n\n const [githubUserName, githubProjectName] = libGithubPath.split(\"/\");\n const source = toGithubSource(libGithubPath, branch);\n\n const zipFilePath = await downloadFile(source);\n const outputFolder = `${githubProjectName}-${branch}`;\n const projectPath = path.join(zipFilePath, outputFolder);\n\n const name = `${githubUserName}-${githubProjectName}`;\n const libDestinationFolder = path.join(cwd, name);\n\n // We should be able to offer the ability to override or not an existing library\n if (fs.existsSync(libDestinationFolder)) {\n spinner.succeed(`Lib \"${libGithubPath}\" was already installed (skipped)`);\n return;\n }\n\n // We copy all the slices into the the user project minus the src folder\n fsExtra.moveSync(path.join(projectPath, \"src\"), libDestinationFolder);\n\n // handle dependencies\n const pkgManager = PackageManager.get(cwd);\n const pkgJson = PackageJsonHelper.fromPath(\n path.join(projectPath, \"package.json\")\n );\n if (pkgJson instanceof Error) throw pkgJson;\n\n const dependencies = Dependencies.fromPkgFormat(pkgJson.dependencies);\n if (dependencies) await pkgManager.install(dependencies);\n\n // generate meta file\n Files.write(path.join(libDestinationFolder, \"meta.json\"), {\n name: pkgJson.name,\n });\n\n // retrieve all slices lib paths\n const manifest = Files.readEntity<Error | Manifest>(\n path.join(projectPath, \"sm.json\"),\n (payload: unknown) => {\n return getOrElseW(\n () => new Error(`Unable to parse sm.json from lib ${libGithubPath}`)\n )(Manifest.decode(payload));\n }\n );\n if (manifest instanceof Error) throw manifest;\n\n const localLibs = ManifestHelper.localLibraries(manifest).map(\n ({ path }) => {\n return `~/${name}/${path.replace(\"src/\", \"\")}`;\n }\n );\n\n spinner.succeed(\n `Slice library \"${libGithubPath}\" was installed successfully`\n );\n\n Tracker.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 { Utils, FileSystem } from \"@slicemachine/core\";\nimport Tracker from \"./utils/tracker\";\n\nimport {\n installRequiredDependencies,\n validatePkg,\n maybeExistingRepo,\n createRepository,\n loginOrBypass,\n configureProject,\n displayFinalMessage,\n detectFramework,\n installLib,\n} from \"./steps\";\nimport { findArgument } from \"./utils\";\n\nasync function init() {\n const cwd = findArgument(process.argv, \"cwd\") || process.cwd();\n const base = findArgument(process.argv, \"base\") || Utils.CONSTS.DEFAULT_BASE;\n const lib: string | undefined = findArgument(process.argv, \"library\");\n const branch: string | undefined = findArgument(process.argv, \"branch\");\n const isTrackingAvailable =\n findArgument(process.argv, \"tracking\") !== \"false\";\n\n Tracker.get().initialize(\n process.env.NEXT_PUBLIC_SEGMENT_KEY || \"JfTfmHaATChc4xueS7RcCBsixI71dJIJ\",\n isTrackingAvailable\n );\n\n Tracker.get().trackInitStart();\n\n console.log(\n Utils.purple(\n \"You're about to configure Slicemachine... Press ctrl + C to cancel\"\n )\n );\n\n // verify package.json file exist\n validatePkg(cwd);\n\n // login\n const user = await loginOrBypass(base);\n if (!user) throw new Error(\"The user should be logged in!\");\n\n // 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);\n }\n\n // retrieve tokens for api calls\n const config = FileSystem.PrismicSharedConfigManager.get();\n\n // detect the framework used by the project\n const frameworkResult = await detectFramework(cwd);\n\n // select the repository used with the project.\n const { existing, repository } = await maybeExistingRepo(\n config.cookies,\n cwd,\n config.base\n );\n\n if (!existing) {\n await createRepository(repository, frameworkResult.value, config);\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 repository,\n frameworkResult,\n sliceLibPath,\n isTrackingAvailable\n );\n\n Tracker.get().trackInitDone(frameworkResult.value, repository);\n\n // Ask the user to run slice-machine.\n displayFinalMessage(cwd);\n}\n\ntry {\n void init();\n} catch (error) {\n if (error instanceof Error) Utils.writeError(error.message);\n else console.error(error);\n}\n"],"names":["uuidv4","ServerAnalytics","util","exec","Utils","Models","FileSystem","path","inquirer","Communication","Separator","parsePrismicAuthToken","t","axios","pipe","fold","Auth","tmp","AdmZip","fs","PackageJsonHelper","Files","getOrElseW","Manifest","ManifestHelper"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@slicemachine/init",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.1-alpha.3",
|
|
4
4
|
"description": "The easiest way to add Slice Machine to your project",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"bin": {
|
|
@@ -9,15 +9,16 @@
|
|
|
9
9
|
"scripts": {
|
|
10
10
|
"audit": "better-npm-audit audit -l high -p",
|
|
11
11
|
"audit-fix": "npm audit fix",
|
|
12
|
-
"build": "siroc build",
|
|
12
|
+
"build": "npm run tsc && siroc build",
|
|
13
13
|
"lint": "eslint --ext .ts .",
|
|
14
14
|
"lint:precommit": "eslint",
|
|
15
15
|
"prepublishOnly": "npm run test && npm run build",
|
|
16
16
|
"test": "jest",
|
|
17
|
-
"
|
|
17
|
+
"tsc": "tsc --project tsconfig.json --noEmit",
|
|
18
|
+
"watch": "tsc --project tsconfig.json --noEmit --watch"
|
|
18
19
|
},
|
|
19
20
|
"dependencies": {
|
|
20
|
-
"@slicemachine/core": "1.1.
|
|
21
|
+
"@slicemachine/core": "1.1.1-alpha.3",
|
|
21
22
|
"adm-zip": "^0.5.9",
|
|
22
23
|
"analytics-node": "^6.0.0",
|
|
23
24
|
"axios": "^0.24.0",
|
|
@@ -25,7 +26,8 @@
|
|
|
25
26
|
"fs-extra": "^10.0.0",
|
|
26
27
|
"inquirer": "^8.2.0",
|
|
27
28
|
"io-ts": "^2.2.16",
|
|
28
|
-
"tmp": "^0.2.1"
|
|
29
|
+
"tmp": "^0.2.1",
|
|
30
|
+
"uuid": "^8.3.2"
|
|
29
31
|
},
|
|
30
32
|
"devDependencies": {
|
|
31
33
|
"@babel/core": "^7.15.8",
|
|
@@ -38,6 +40,7 @@
|
|
|
38
40
|
"@types/inquirer": "^8.1.3",
|
|
39
41
|
"@types/jest": "^27.0.2",
|
|
40
42
|
"@types/tmp": "^0.2.2",
|
|
43
|
+
"@types/uuid": "^8.3.4",
|
|
41
44
|
"@typescript-eslint/eslint-plugin": "^5.10.0",
|
|
42
45
|
"@typescript-eslint/parser": "^5.10.0",
|
|
43
46
|
"babel-jest": "^27.0.2",
|
|
@@ -47,7 +50,7 @@
|
|
|
47
50
|
"eslint-import-resolver-typescript": "^2.4.0",
|
|
48
51
|
"eslint-plugin-import": "^2.24.0",
|
|
49
52
|
"eslint-plugin-jest": "^24.4.0",
|
|
50
|
-
"jest": "^27.
|
|
53
|
+
"jest": "^27.4.7",
|
|
51
54
|
"mock-stdin": "^1.0.0",
|
|
52
55
|
"nock": "^13.1.3",
|
|
53
56
|
"siroc": "^0.16.0",
|
|
@@ -58,5 +61,5 @@
|
|
|
58
61
|
"engines": {
|
|
59
62
|
"node": ">=12"
|
|
60
63
|
},
|
|
61
|
-
"gitHead": "
|
|
64
|
+
"gitHead": "6d3a65c1e766c4e571bf3f051a82ee3ae69556b6"
|
|
62
65
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Utils, FileSystem } from "@slicemachine/core";
|
|
2
|
-
import
|
|
2
|
+
import Tracker from "./utils/tracker";
|
|
3
|
+
|
|
3
4
|
import {
|
|
4
5
|
installRequiredDependencies,
|
|
5
6
|
validatePkg,
|
|
@@ -19,7 +20,14 @@ async function init() {
|
|
|
19
20
|
const lib: string | undefined = findArgument(process.argv, "library");
|
|
20
21
|
const branch: string | undefined = findArgument(process.argv, "branch");
|
|
21
22
|
const isTrackingAvailable =
|
|
22
|
-
findArgument(process.argv, "tracking")
|
|
23
|
+
findArgument(process.argv, "tracking") !== "false";
|
|
24
|
+
|
|
25
|
+
Tracker.get().initialize(
|
|
26
|
+
process.env.NEXT_PUBLIC_SEGMENT_KEY || "JfTfmHaATChc4xueS7RcCBsixI71dJIJ",
|
|
27
|
+
isTrackingAvailable
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
Tracker.get().trackInitStart();
|
|
23
31
|
|
|
24
32
|
console.log(
|
|
25
33
|
Utils.purple(
|
|
@@ -34,6 +42,11 @@ async function init() {
|
|
|
34
42
|
const user = await loginOrBypass(base);
|
|
35
43
|
if (!user) throw new Error("The user should be logged in!");
|
|
36
44
|
|
|
45
|
+
// If we get the info from the profile we want to identify all the previous events sent or continue in anonymous mode
|
|
46
|
+
if (user.profile) {
|
|
47
|
+
Tracker.get().identifyUser(user.profile.shortId);
|
|
48
|
+
}
|
|
49
|
+
|
|
37
50
|
// retrieve tokens for api calls
|
|
38
51
|
const config = FileSystem.PrismicSharedConfigManager.get();
|
|
39
52
|
|
|
@@ -41,46 +54,34 @@ async function init() {
|
|
|
41
54
|
const frameworkResult = await detectFramework(cwd);
|
|
42
55
|
|
|
43
56
|
// select the repository used with the project.
|
|
44
|
-
const { existing,
|
|
57
|
+
const { existing, repository } = await maybeExistingRepo(
|
|
45
58
|
config.cookies,
|
|
46
59
|
cwd,
|
|
47
60
|
config.base
|
|
48
61
|
);
|
|
49
62
|
|
|
50
63
|
if (!existing) {
|
|
51
|
-
await createRepository(
|
|
64
|
+
await createRepository(repository, frameworkResult.value, config);
|
|
52
65
|
}
|
|
53
66
|
|
|
54
|
-
|
|
55
|
-
? Tracker.build(
|
|
56
|
-
process.env.NEXT_PUBLIC_SEGMENT_KEY ||
|
|
57
|
-
"JfTfmHaATChc4xueS7RcCBsixI71dJIJ",
|
|
58
|
-
name,
|
|
59
|
-
{
|
|
60
|
-
userId: user.profile.shortId,
|
|
61
|
-
},
|
|
62
|
-
isTrackingAvailable
|
|
63
|
-
)
|
|
64
|
-
: undefined;
|
|
65
|
-
|
|
66
|
-
// install the required dependencies in the project.
|
|
67
|
+
// Install the required dependencies in the project.
|
|
67
68
|
await installRequiredDependencies(cwd, frameworkResult.value);
|
|
68
69
|
|
|
69
|
-
const sliceLibPath = lib
|
|
70
|
-
? await installLib(tracker, cwd, lib, branch)
|
|
71
|
-
: undefined;
|
|
70
|
+
const sliceLibPath = lib ? await installLib(cwd, lib, branch) : undefined;
|
|
72
71
|
|
|
73
72
|
// configure the SM.json file and the json package file of the project..
|
|
74
73
|
configureProject(
|
|
75
74
|
cwd,
|
|
76
75
|
base,
|
|
77
|
-
|
|
76
|
+
repository,
|
|
78
77
|
frameworkResult,
|
|
79
78
|
sliceLibPath,
|
|
80
79
|
isTrackingAvailable
|
|
81
80
|
);
|
|
82
81
|
|
|
83
|
-
|
|
82
|
+
Tracker.get().trackInitDone(frameworkResult.value, repository);
|
|
83
|
+
|
|
84
|
+
// Ask the user to run slice-machine.
|
|
84
85
|
displayFinalMessage(cwd);
|
|
85
86
|
}
|
|
86
87
|
|
|
@@ -45,10 +45,11 @@ export async function detectFramework(cwd: string): Promise<FrameworkResult> {
|
|
|
45
45
|
spinner.start();
|
|
46
46
|
|
|
47
47
|
try {
|
|
48
|
-
const maybeFramework = Utils.Framework.
|
|
48
|
+
const maybeFramework = Utils.Framework.defineFramework({
|
|
49
49
|
cwd,
|
|
50
|
-
Object.values(Models.Frameworks)
|
|
51
|
-
);
|
|
50
|
+
supportedFrameworks: Object.values(Models.Frameworks),
|
|
51
|
+
});
|
|
52
|
+
|
|
52
53
|
spinner.stop();
|
|
53
54
|
|
|
54
55
|
if (!maybeFramework || maybeFramework === Models.Frameworks.vanillajs) {
|
|
@@ -58,7 +59,7 @@ export async function detectFramework(cwd: string): Promise<FrameworkResult> {
|
|
|
58
59
|
|
|
59
60
|
const nameToPrint = Utils.Framework.fancyName(maybeFramework);
|
|
60
61
|
|
|
61
|
-
if (Utils.Framework.
|
|
62
|
+
if (!Utils.Framework.isFrameworkSupported(maybeFramework)) {
|
|
62
63
|
Utils.writeError(`${nameToPrint} is currently not supported`);
|
|
63
64
|
console.log(failMessage);
|
|
64
65
|
process.exit(1);
|
package/src/steps/install-lib.ts
CHANGED
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
ManifestHelper,
|
|
15
15
|
} from "@slicemachine/core/build/src/models/Manifest";
|
|
16
16
|
import Files from "@slicemachine/core/build/src/utils/files";
|
|
17
|
-
import
|
|
17
|
+
import Tracker from "../utils/tracker";
|
|
18
18
|
|
|
19
19
|
const downloadFile = async (reqUrl: string): Promise<string> => {
|
|
20
20
|
const res = await axios.get<Buffer>(reqUrl, { responseType: "arraybuffer" });
|
|
@@ -36,7 +36,6 @@ function toGithubSource(githubPath: string, branch: string): string {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
export async function installLib(
|
|
39
|
-
tracker: Tracker | undefined,
|
|
40
39
|
cwd: string,
|
|
41
40
|
libGithubPath: string,
|
|
42
41
|
branch = "HEAD"
|
|
@@ -103,7 +102,7 @@ export async function installLib(
|
|
|
103
102
|
`Slice library "${libGithubPath}" was installed successfully`
|
|
104
103
|
);
|
|
105
104
|
|
|
106
|
-
|
|
105
|
+
Tracker.get().trackDownloadLibrary(libGithubPath);
|
|
107
106
|
return localLibs;
|
|
108
107
|
} catch (error) {
|
|
109
108
|
spinner.fail(`Error installing ${libGithubPath} lib!`);
|
|
@@ -119,13 +119,13 @@ export async function maybeExistingRepo(
|
|
|
119
119
|
cookies: string,
|
|
120
120
|
cwd: string,
|
|
121
121
|
base = DEFAULT_BASE
|
|
122
|
-
): Promise<{
|
|
122
|
+
): Promise<{ repository: string; existing: boolean }> {
|
|
123
123
|
const token = parsePrismicAuthToken(cookies);
|
|
124
124
|
const repos = await Communication.listRepositories(token);
|
|
125
125
|
|
|
126
126
|
if (repos.length === 0) {
|
|
127
127
|
const name = await promptForRepoName(base);
|
|
128
|
-
return { existing: false, name };
|
|
128
|
+
return { existing: false, repository: name };
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
const choices = sortReposForPrompt(repos, base, cwd);
|
|
@@ -150,7 +150,7 @@ export async function maybeExistingRepo(
|
|
|
150
150
|
|
|
151
151
|
if (res.repoName === CREATE_REPO) {
|
|
152
152
|
const name = await promptForRepoName(base);
|
|
153
|
-
return { existing: false, name };
|
|
153
|
+
return { existing: false, repository: name };
|
|
154
154
|
}
|
|
155
|
-
return { existing: true,
|
|
155
|
+
return { existing: true, repository: res.repoName };
|
|
156
156
|
}
|
|
@@ -20,10 +20,13 @@ export async function getUserProfile(
|
|
|
20
20
|
cookies: string,
|
|
21
21
|
base = Utils.CONSTS.DEFAULT_BASE
|
|
22
22
|
): Promise<UserProfile> {
|
|
23
|
-
|
|
23
|
+
const userServiceBase =
|
|
24
|
+
Utils.CONSTS.DEFAULT_BASE === base
|
|
25
|
+
? Utils.CONSTS.USER_SERVICE_BASE
|
|
26
|
+
: "https://user.wroom.io/";
|
|
24
27
|
|
|
25
|
-
|
|
26
|
-
url
|
|
28
|
+
// note the auth server also provides a userId
|
|
29
|
+
const url = new URL(userServiceBase);
|
|
27
30
|
url.pathname = "profile";
|
|
28
31
|
|
|
29
32
|
const endpoint = url.toString();
|
|
@@ -32,7 +35,7 @@ export async function getUserProfile(
|
|
|
32
35
|
return axios
|
|
33
36
|
.get<UserProfile>(endpoint, {
|
|
34
37
|
headers: {
|
|
35
|
-
Authorization: `Bearer
|
|
38
|
+
Authorization: `Bearer ${token}`,
|
|
36
39
|
},
|
|
37
40
|
})
|
|
38
41
|
.then((res) =>
|
package/src/utils/tracker.ts
CHANGED
|
@@ -1,57 +1,115 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* DUPLICATION
|
|
3
|
-
* this file is a duplication of ServerTracker in sm-ui
|
|
4
|
-
* this duplication has been done on purpose to simplify the merge if init becomes part of sm-ui
|
|
5
|
-
* or if we decide to share the tracker implementation from a lib, but it'll need some refactoring
|
|
6
|
-
* Duplication means no entanglement so don't merge this with the other implem and keep the structure.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
1
|
import ServerAnalytics from "analytics-node";
|
|
2
|
+
import { v4 as uuidv4 } from "uuid";
|
|
3
|
+
import { Frameworks } from "@slicemachine/core/build/src/models";
|
|
10
4
|
|
|
11
5
|
export enum EventType {
|
|
12
6
|
DownloadLibrary = "SliceMachine Download Library",
|
|
7
|
+
InitStart = "SliceMachine Init Start",
|
|
8
|
+
InitDone = "SliceMachine Init Done",
|
|
13
9
|
}
|
|
14
10
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
writeKey: string,
|
|
25
|
-
repo: string | undefined,
|
|
26
|
-
identifier: { userId: string } | { anonymousId: string },
|
|
27
|
-
tracking = true
|
|
28
|
-
): Tracker | undefined {
|
|
11
|
+
type SegmentIdentifier = { userId: string } | { anonymousId: string };
|
|
12
|
+
|
|
13
|
+
export class InitTracker {
|
|
14
|
+
#client: ServerAnalytics | null = null;
|
|
15
|
+
#isTrackingActive = true;
|
|
16
|
+
#anonymousId = "";
|
|
17
|
+
#userId: string | null = null;
|
|
18
|
+
|
|
19
|
+
initialize(segmentKey: string, isTrackingActive = true): void {
|
|
29
20
|
try {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
21
|
+
// The initialize method cannot be used for changing some class properties
|
|
22
|
+
if (!!this.#client) return;
|
|
23
|
+
|
|
24
|
+
this.#isTrackingActive = isTrackingActive;
|
|
25
|
+
this.#anonymousId = uuidv4();
|
|
26
|
+
this.#client = new ServerAnalytics(segmentKey);
|
|
33
27
|
} catch (error) {
|
|
34
|
-
|
|
35
|
-
return;
|
|
28
|
+
// If the client is not correctly setup we are silently failing as the tracker is not a critical feature
|
|
36
29
|
}
|
|
37
30
|
}
|
|
38
31
|
|
|
39
|
-
|
|
32
|
+
/** Private methods **/
|
|
33
|
+
|
|
34
|
+
_trackEvent(
|
|
40
35
|
eventType: EventType,
|
|
41
36
|
attributes: Record<string, unknown> = {}
|
|
42
37
|
): void {
|
|
43
|
-
this.
|
|
44
|
-
|
|
38
|
+
if (!this._isTrackingPossible(this.#client)) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const identifier = this._createSegmentIdentifier();
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
this.#client.track({
|
|
45
46
|
event: eventType,
|
|
46
|
-
...
|
|
47
|
+
...identifier,
|
|
47
48
|
properties: attributes,
|
|
48
49
|
});
|
|
50
|
+
} catch {
|
|
51
|
+
// If the client is not correctly setup we are silently failing as the tracker is not a critical feature
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
_identifyEvent(userId: string): void {
|
|
56
|
+
if (!this._isTrackingPossible(this.#client)) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
this.#client.identify({
|
|
62
|
+
userId,
|
|
63
|
+
anonymousId: this.#anonymousId,
|
|
64
|
+
});
|
|
65
|
+
} catch {
|
|
66
|
+
// If the client is not correctly setup we are silently failing as the tracker is not a critical feature
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
_isTrackingPossible(
|
|
71
|
+
client: ServerAnalytics | null
|
|
72
|
+
): client is ServerAnalytics {
|
|
73
|
+
return !!client && this.#isTrackingActive;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
_createSegmentIdentifier(): SegmentIdentifier {
|
|
77
|
+
return !!this.#userId
|
|
78
|
+
? { userId: this.#userId }
|
|
79
|
+
: { anonymousId: this.#anonymousId };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Public methods **/
|
|
83
|
+
|
|
84
|
+
identifyUser(userId: string): void {
|
|
85
|
+
this.#userId = userId;
|
|
86
|
+
this._identifyEvent(userId);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
trackDownloadLibrary(library: string): void {
|
|
90
|
+
this._trackEvent(EventType.DownloadLibrary, { library });
|
|
49
91
|
}
|
|
50
92
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
93
|
+
trackInitStart(): void {
|
|
94
|
+
this._trackEvent(EventType.InitStart);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
trackInitDone(framework: Frameworks, repo: string): void {
|
|
98
|
+
this._trackEvent(EventType.InitDone, { framework, repo });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const Tracker = (() => {
|
|
103
|
+
let smTrackerInstance: InitTracker;
|
|
104
|
+
|
|
105
|
+
const init = () => new InitTracker();
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
get() {
|
|
109
|
+
if (!smTrackerInstance) smTrackerInstance = init();
|
|
110
|
+
return smTrackerInstance;
|
|
55
111
|
},
|
|
56
112
|
};
|
|
57
|
-
}
|
|
113
|
+
})();
|
|
114
|
+
|
|
115
|
+
export default Tracker;
|