@slicemachine/init 1.1.9 → 1.1.10-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,171 @@
1
+ import { CustomType } from "@prismicio/types-internal/lib/customtypes";
2
+ import { Slices, SliceSM } from "@slicemachine/core/build/models";
3
+ import axios from "axios";
4
+ import { logs } from "../../utils";
5
+ import type { ApiEndpoints } from "./endpoints";
6
+
7
+ function handelErrors(prefix: string, err: unknown) {
8
+ if (axios.isAxiosError(err) && err.response) {
9
+ logs.writeError(
10
+ `${prefix} | [${err.response.status}]: ${err.response.statusText}`
11
+ );
12
+ } else if (err instanceof Error) {
13
+ logs.writeError(`${prefix} ${err.message}`);
14
+ } else {
15
+ logs.writeError(`${prefix} ${String(err)}`);
16
+ }
17
+ }
18
+
19
+ export async function getRemoteSliceIds(
20
+ customTypeApiEndpoint: ApiEndpoints["Models"],
21
+ repository: string,
22
+ authorization: string
23
+ ): Promise<Array<string>> {
24
+ const addr = `${stripLastSlash(customTypeApiEndpoint)}/slices`;
25
+ return axios
26
+ .get<Array<{ id: string }>>(addr, {
27
+ headers: {
28
+ Authorization: `Bearer ${authorization}`,
29
+ repository,
30
+ },
31
+ })
32
+ .then((res) => {
33
+ return Array.isArray(res.data) ? res.data.map((model) => model.id) : [];
34
+ });
35
+ }
36
+
37
+ async function sendModelToPrismic(
38
+ repository: string,
39
+ authorization: string,
40
+ customTypesApiEndpoint: string,
41
+ remoteSliceIds: Array<string>,
42
+ model: SliceSM
43
+ ): Promise<void> {
44
+ const data = Slices.fromSM(model);
45
+ const updateOrInsertUrl = `${customTypesApiEndpoint}slices/${
46
+ remoteSliceIds.includes(model.id) ? "update" : "insert"
47
+ }`;
48
+
49
+ return axios
50
+ .post(updateOrInsertUrl, data, {
51
+ headers: {
52
+ Authorization: `Bearer ${authorization}`,
53
+ repository,
54
+ },
55
+ })
56
+ .then(() => {
57
+ return;
58
+ })
59
+ .catch((err) => {
60
+ handelErrors(
61
+ `sending slice ${model.id}, please try again. If the problem persists, contact us.`,
62
+ err
63
+ );
64
+ throw err;
65
+ });
66
+ }
67
+
68
+ export async function sendManyModelsToPrismic(
69
+ repository: string,
70
+ authorization: string,
71
+ customTypesApiEndpoint: string,
72
+ remoteSliceIds: Array<string>,
73
+ models: Array<SliceSM>
74
+ ): Promise<void> {
75
+ return Promise.all(
76
+ models.map((model) =>
77
+ sendModelToPrismic(
78
+ repository,
79
+ authorization,
80
+ customTypesApiEndpoint,
81
+ remoteSliceIds,
82
+ model
83
+ )
84
+ )
85
+ )
86
+ .then(() => {
87
+ return;
88
+ })
89
+ .catch(() => {
90
+ process.exit(1);
91
+ });
92
+ }
93
+
94
+ function stripLastSlash(str: string) {
95
+ return str.replace(/\/*$/g, "");
96
+ }
97
+
98
+ export function getRemoteCustomTypeIds(
99
+ customTypeApiEndpoint: ApiEndpoints["Models"],
100
+ repository: string,
101
+ authorization: string
102
+ ): Promise<Array<string>> {
103
+ const addr = `${stripLastSlash(customTypeApiEndpoint)}/customtypes`;
104
+ return axios
105
+ .get<CustomType[]>(addr, {
106
+ headers: {
107
+ Authorization: `Bearer ${authorization}`,
108
+ repository,
109
+ },
110
+ })
111
+ .then((res) => {
112
+ return Array.isArray(res.data) ? res.data.map((ct) => ct.id) : [];
113
+ });
114
+ }
115
+
116
+ async function sendCustomTypeToPrismic(
117
+ repository: string,
118
+ authorization: string,
119
+ customTypeApiEndpoint: string,
120
+ remoteCustomTypeIds: Array<string>,
121
+ customType: CustomType
122
+ ): Promise<void> {
123
+ const shouldUpdate = remoteCustomTypeIds.includes(customType.id);
124
+ const addr = `${stripLastSlash(customTypeApiEndpoint)}/customtypes/${
125
+ shouldUpdate ? "update" : "insert"
126
+ }`;
127
+
128
+ return axios
129
+ .post(addr, customType, {
130
+ headers: {
131
+ repository,
132
+ Authorization: `Bearer ${authorization}`,
133
+ },
134
+ })
135
+ .then(() => {
136
+ return;
137
+ })
138
+ .catch((err) => {
139
+ handelErrors(
140
+ `sending custom type ${customType.id}, please try again. If the problem persists, contact us.`,
141
+ err
142
+ );
143
+ throw err;
144
+ });
145
+ }
146
+
147
+ export async function sendManyCustomTypesToPrismic(
148
+ repository: string,
149
+ authorization: string,
150
+ customTypeApiEndpoint: string,
151
+ remoteCustomTypeIds: Array<string>,
152
+ customTypes: Array<CustomType>
153
+ ): Promise<void> {
154
+ return Promise.all(
155
+ customTypes.map((customType) =>
156
+ sendCustomTypeToPrismic(
157
+ repository,
158
+ authorization,
159
+ customTypeApiEndpoint,
160
+ remoteCustomTypeIds,
161
+ customType
162
+ )
163
+ )
164
+ )
165
+ .then(() => {
166
+ return;
167
+ })
168
+ .catch(() => {
169
+ process.exit(1);
170
+ });
171
+ }
@@ -0,0 +1,82 @@
1
+ import { CustomType } from "@prismicio/types-internal/lib/customtypes";
2
+ import { Files, CustomTypesPaths } from "@slicemachine/core/build/node-utils";
3
+ import { isLeft } from "fp-ts/lib/Either";
4
+ import {
5
+ getRemoteCustomTypeIds,
6
+ sendManyCustomTypesToPrismic,
7
+ } from "./communication";
8
+ import { promptToPushCustomTypes } from "./prompts";
9
+ import { getEndpointsFromBase } from "./endpoints";
10
+ import { logs } from "../../utils";
11
+
12
+ export function readCustomTypes(cwd: string): Array<CustomType> {
13
+ const customTypePaths = CustomTypesPaths(cwd);
14
+ const dir = customTypePaths.value();
15
+
16
+ if (Files.isDirectory(dir) === false) return [];
17
+
18
+ const fileNames = Files.readDirectory(dir);
19
+
20
+ const files = fileNames.reduce<Array<CustomType>>((acc, fileName) => {
21
+ const filePath = customTypePaths.customType(fileName).model();
22
+ const json = Files.safeReadJson(filePath);
23
+
24
+ if (!json) return acc;
25
+
26
+ const file = CustomType.decode(json);
27
+
28
+ if (file instanceof Error) {
29
+ logs.writeError(`reading ${filePath}: ${file.message}`);
30
+ return acc;
31
+ }
32
+ if (isLeft(file)) {
33
+ logs.writeError(`validating ${filePath}: ${JSON.stringify(file.left)}`);
34
+ return acc;
35
+ }
36
+
37
+ return [...acc, file.right];
38
+ }, []);
39
+
40
+ return files;
41
+ }
42
+
43
+ export async function sendCustomTypesFromStarter(
44
+ repository: string,
45
+ authorization: string,
46
+ base: string,
47
+ cwd: string
48
+ ) {
49
+ const customTypeApiEndpoint = getEndpointsFromBase(base).Models;
50
+
51
+ const customTypes = readCustomTypes(cwd);
52
+
53
+ if (customTypes.length === 0) return Promise.resolve(false);
54
+
55
+ const remoteCustomTypeIds = await getRemoteCustomTypeIds(
56
+ customTypeApiEndpoint,
57
+ repository,
58
+ authorization
59
+ );
60
+
61
+ if (remoteCustomTypeIds.length) {
62
+ const shouldPush = await promptToPushCustomTypes();
63
+ if (shouldPush === false) return Promise.resolve(false);
64
+ }
65
+
66
+ const spinner = logs.spinner(
67
+ "Pushing existing custom types to your repository"
68
+ );
69
+ spinner.start();
70
+
71
+ await sendManyCustomTypesToPrismic(
72
+ repository,
73
+ authorization,
74
+ customTypeApiEndpoint,
75
+ remoteCustomTypeIds,
76
+ customTypes
77
+ );
78
+
79
+ spinner.succeed();
80
+
81
+ return Promise.resolve(true);
82
+ }
@@ -0,0 +1,20 @@
1
+ export type ApiEndpoints = {
2
+ Models: string;
3
+ AclProvider: string;
4
+ };
5
+
6
+ const ProductionApisEndpoints: ApiEndpoints = {
7
+ Models: "https://customtypes.prismic.io/",
8
+ AclProvider: "https://0yyeb2g040.execute-api.us-east-1.amazonaws.com/prod/",
9
+ };
10
+
11
+ const StageApisEndpoints: ApiEndpoints = {
12
+ Models: "https://customtypes.wroom.io/",
13
+ AclProvider: "https://2iamcvnxf4.execute-api.us-east-1.amazonaws.com/stage/",
14
+ };
15
+
16
+ export const getEndpointsFromBase = (base: string): ApiEndpoints => {
17
+ const url = new URL(base);
18
+ if (url.hostname === "wroom.io") return StageApisEndpoints;
19
+ return ProductionApisEndpoints;
20
+ };
@@ -0,0 +1,29 @@
1
+ import inquirer from "inquirer";
2
+
3
+ export async function promptToPushSlices(): Promise<boolean> {
4
+ return inquirer
5
+ .prompt<{ pushSlices: boolean }>([
6
+ {
7
+ type: "confirm",
8
+ name: "pushSlices",
9
+ default: false,
10
+ message:
11
+ "Your repository already contains Slices. Do you want to continue pushing your local Slices?",
12
+ },
13
+ ])
14
+ .then((res) => res.pushSlices);
15
+ }
16
+
17
+ export async function promptToPushCustomTypes(): Promise<boolean> {
18
+ return inquirer
19
+ .prompt<{ pushCustomTypes: boolean }>([
20
+ {
21
+ type: "confirm",
22
+ name: "pushCustomTypes",
23
+ default: false,
24
+ message:
25
+ "Your repository already contains Custom Types. Do you want to continue pushing your local Slices?",
26
+ },
27
+ ])
28
+ .then((res) => res.pushCustomTypes);
29
+ }
@@ -0,0 +1,201 @@
1
+ import fs from "fs";
2
+ import axios from "axios";
3
+ import mime from "mime";
4
+ import snakeCase from "lodash.snakecase";
5
+ import path from "path";
6
+ import FormData from "form-data";
7
+ import uniqid from "uniqid";
8
+ import { logs } from "../../utils";
9
+ import {
10
+ Component,
11
+ ComponentInfo,
12
+ VariationSM,
13
+ SliceSM,
14
+ } from "@slicemachine/core/build/models";
15
+
16
+ export type ALC = {
17
+ values: {
18
+ url: string;
19
+ fields: Record<string, string>;
20
+ };
21
+ imgixEndpoint: string;
22
+ err: null | string;
23
+ };
24
+
25
+ export async function createAcl(
26
+ address: string,
27
+ repository: string,
28
+ authorization: string
29
+ ): Promise<ALC> {
30
+ return axios
31
+ .get<ALC>(address + "create", {
32
+ headers: {
33
+ repository,
34
+ Authorization: `Bearer ${authorization}`,
35
+ "User-Agent": "slice-machine",
36
+ },
37
+ })
38
+ .then((res) => res.data);
39
+ }
40
+
41
+ async function createFormForS3(
42
+ key: string,
43
+ filename: string,
44
+ filePath: string,
45
+ acl: ALC
46
+ ): Promise<FormData | null> {
47
+ const form = new FormData();
48
+ Object.entries(acl.values.fields).forEach(([k, value]) => {
49
+ form.append(k, value);
50
+ });
51
+ form.append("key", key);
52
+ const contentType = mime.getType(filePath);
53
+ contentType && form.append("Content-Type", contentType);
54
+
55
+ return fs.promises
56
+ .readFile(filePath)
57
+ .then((file) => {
58
+ form.append("file", file, { filename });
59
+ return form;
60
+ })
61
+ .catch(() => {
62
+ logs.writeError(`Error reading preview image: ${filename}`);
63
+ return null;
64
+ });
65
+ }
66
+
67
+ function createS3Key(
68
+ repository: string,
69
+ sliceName: string,
70
+ variationId: string,
71
+ filename: string
72
+ ): string {
73
+ return `${repository}/shared-slices/${snakeCase(sliceName)}/${snakeCase(
74
+ variationId
75
+ )}-${uniqid()}/${filename}`;
76
+ }
77
+
78
+ async function sendVariationPreviewToS3(
79
+ acl: ALC,
80
+ repository: string,
81
+ sliceName: string,
82
+ variationId: string,
83
+ filePath: string
84
+ ): Promise<string | null> {
85
+ const filename = path.basename(filePath);
86
+ const key = createS3Key(repository, sliceName, variationId, filename);
87
+ const form = await createFormForS3(key, filename, filePath, acl);
88
+ if (form === null) return null;
89
+ if (form.hasKnownLength() === false) {
90
+ logs.writeError(
91
+ `[slice/push] An error occurred while uploading preview image ${filePath} as length in unknown`
92
+ );
93
+ }
94
+
95
+ const errorMessage = `[slice/push] An error occurred while uploading preview images for ${sliceName}-${variationId} - please contact support`;
96
+
97
+ return axios
98
+ .post(acl.values.url, form, {
99
+ headers: {
100
+ ...form.getHeaders(),
101
+ "Content-Length": String(form.getLengthSync()),
102
+ },
103
+ })
104
+ .then((res) => {
105
+ if (res.status !== 204) {
106
+ logs.writeError(errorMessage);
107
+ logs.writeError(`${res.status}: ${res.statusText}`);
108
+ return null;
109
+ } else {
110
+ return `${acl.imgixEndpoint}/${key}`;
111
+ }
112
+ })
113
+ .catch((err) => {
114
+ logs.writeError(errorMessage);
115
+ if (axios.isAxiosError(err) && err.response) {
116
+ logs.writeError(`${err.response.status}: ${err.response.statusText}`);
117
+ } else if (err instanceof Error) {
118
+ logs.writeError(err.message);
119
+ } else {
120
+ logs.writeError(String(err));
121
+ }
122
+ return null;
123
+ });
124
+ }
125
+
126
+ async function maybeAddImageUrlToVariation(
127
+ acl: ALC,
128
+ repository: string,
129
+ modelId: string,
130
+ pathToScreenShot: string,
131
+ variation: VariationSM
132
+ ): Promise<VariationSM> {
133
+ const imageUrl = await sendVariationPreviewToS3(
134
+ acl,
135
+ repository,
136
+ modelId,
137
+ variation.id,
138
+ pathToScreenShot
139
+ );
140
+ if (!imageUrl) return variation;
141
+
142
+ return {
143
+ ...variation,
144
+ imageUrl,
145
+ };
146
+ }
147
+
148
+ async function addImageUrlsToVariations(
149
+ acl: ALC,
150
+ repository: string,
151
+ modelId: string,
152
+ screenshotPaths: ComponentInfo["screenshotPaths"],
153
+ variations: Array<VariationSM>
154
+ ): Promise<Array<VariationSM>> {
155
+ return Promise.all(
156
+ variations.map(async (variation) => {
157
+ const screenshot = screenshotPaths[variation.id];
158
+ if (!screenshot || !screenshot.path) return variation;
159
+
160
+ return maybeAddImageUrlToVariation(
161
+ acl,
162
+ repository,
163
+ modelId,
164
+ screenshot.path,
165
+ variation
166
+ );
167
+ })
168
+ );
169
+ }
170
+
171
+ async function maybeUpdateModelVariationsWithImageUrl(
172
+ acl: ALC,
173
+ repository: string,
174
+ component: Component
175
+ ): Promise<SliceSM> {
176
+ const { screenshotPaths, model } = component;
177
+ const variations = await addImageUrlsToVariations(
178
+ acl,
179
+ repository,
180
+ model.id,
181
+ screenshotPaths,
182
+ model.variations
183
+ );
184
+
185
+ return {
186
+ ...model,
187
+ variations,
188
+ };
189
+ }
190
+
191
+ export async function addImageUrlsToModelVariations(
192
+ acl: ALC,
193
+ repository: string,
194
+ components: Array<Component>
195
+ ): Promise<Array<SliceSM>> {
196
+ return Promise.all(
197
+ components.map(async (component) =>
198
+ maybeUpdateModelVariationsWithImageUrl(acl, repository, component)
199
+ )
200
+ );
201
+ }
@@ -0,0 +1,62 @@
1
+ import { Component } from "@slicemachine/core/build/models";
2
+ import * as Libraries from "@slicemachine/core/build/libraries";
3
+ import { logs } from "../../utils";
4
+ import { getRemoteSliceIds, sendManyModelsToPrismic } from "./communication";
5
+ import { getEndpointsFromBase } from "./endpoints";
6
+ import { promptToPushSlices } from "./prompts";
7
+ import { addImageUrlsToModelVariations, createAcl } from "./s3";
8
+
9
+ export async function sendSlicesFromStarter(
10
+ base: string,
11
+ repository: string,
12
+ authorization: string,
13
+ libraryPaths: Array<string>,
14
+ cwd: string
15
+ ) {
16
+ const endpoints = getEndpointsFromBase(base);
17
+ const libraries = Libraries.libraries(cwd, libraryPaths);
18
+
19
+ if (libraries.length === 0) return Promise.resolve(false);
20
+
21
+ const remoteSlices = await getRemoteSliceIds(
22
+ endpoints.Models,
23
+ repository,
24
+ authorization
25
+ );
26
+
27
+ if (remoteSlices.length) {
28
+ // do prompt about slices
29
+
30
+ const pushAnyway = await promptToPushSlices();
31
+
32
+ if (pushAnyway === false) return Promise.resolve(true);
33
+ }
34
+
35
+ const spinner = logs.spinner(
36
+ "Pushing existing Slice models to your repository"
37
+ );
38
+ spinner.start();
39
+
40
+ const acl = await createAcl(endpoints.AclProvider, repository, authorization);
41
+
42
+ const components = libraries.reduce<Array<Component>>((acc, lib) => {
43
+ return [...acc, ...lib.components];
44
+ }, []);
45
+
46
+ const models = await addImageUrlsToModelVariations(
47
+ acl,
48
+ repository,
49
+ components
50
+ );
51
+
52
+ await sendManyModelsToPrismic(
53
+ repository,
54
+ authorization,
55
+ endpoints.Models,
56
+ remoteSlices,
57
+ models
58
+ );
59
+
60
+ spinner.succeed();
61
+ return Promise.resolve(true);
62
+ }
package/.caches/eslint DELETED
@@ -1 +0,0 @@
1
- [{"/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/check.test.ts":"1","/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/choose-or-create-repo.test.ts":"2","/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/configure-project.test.ts":"3","/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/create-repo-sm-core.test.ts":"4","/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/detect-framework.test.ts":"5","/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/install-lib.test.ts":"6","/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/install-required-dependencies.test.ts":"7","/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/logInOrBypass.test.ts":"8","/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/utils/auth.test.ts":"9","/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/utils/communication.test.ts":"10","/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/utils/create-repo.test.ts":"11","/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/utils/index.test.ts":"12","/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/utils/tracker.test.ts":"13","/Users/marc/Projects/prismic/slice-machine/packages/init/src/index.ts":"14","/Users/marc/Projects/prismic/slice-machine/packages/init/src/steps/choose-or-create-a-repository.ts":"15","/Users/marc/Projects/prismic/slice-machine/packages/init/src/steps/configure-project.ts":"16","/Users/marc/Projects/prismic/slice-machine/packages/init/src/steps/detect-framework.ts":"17","/Users/marc/Projects/prismic/slice-machine/packages/init/src/steps/display-final-message.ts":"18","/Users/marc/Projects/prismic/slice-machine/packages/init/src/steps/index.ts":"19","/Users/marc/Projects/prismic/slice-machine/packages/init/src/steps/install-lib.ts":"20","/Users/marc/Projects/prismic/slice-machine/packages/init/src/steps/install-required-dependencies.ts":"21","/Users/marc/Projects/prismic/slice-machine/packages/init/src/steps/loginOrBypass.ts":"22","/Users/marc/Projects/prismic/slice-machine/packages/init/src/steps/validate-pkg.ts":"23","/Users/marc/Projects/prismic/slice-machine/packages/init/src/utils/PackageManager.ts":"24","/Users/marc/Projects/prismic/slice-machine/packages/init/src/utils/auth/helpers.ts":"25","/Users/marc/Projects/prismic/slice-machine/packages/init/src/utils/auth/index.ts":"26","/Users/marc/Projects/prismic/slice-machine/packages/init/src/utils/communication.ts":"27","/Users/marc/Projects/prismic/slice-machine/packages/init/src/utils/create-repo.ts":"28","/Users/marc/Projects/prismic/slice-machine/packages/init/src/utils/index.ts":"29","/Users/marc/Projects/prismic/slice-machine/packages/init/src/utils/logs.ts":"30","/Users/marc/Projects/prismic/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},"1b7mvzj","961df16402003e17b627b5bd56efd69b",{"filePath":"97","messages":"98","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"b732a4122a7b882e82b98e3a2d52016d",{"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},"3439b285eeacc711dad9073d4ffac791",{"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},"c61c12d13a5cd2fae48ca10963e88003",{"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},"52a27bf060c4a76ad1201b853a0f2e91",{"filePath":"119","messages":"120","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"cfb9f9de80597d5d6678f1a79447d9b1",{"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},"e5d8b2db316dd5b448154dddcc81ad40",{"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},"cf9081f34e2511376279cb263a6c3ebc",{"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},"4d15a5af3c4942486308237d8e8f5d57",{"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},"7db4902e037b6febf41feb40bf2099a6",{"filePath":"155","messages":"156","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/check.test.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/choose-or-create-repo.test.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/configure-project.test.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/create-repo-sm-core.test.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/detect-framework.test.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/install-lib.test.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/install-required-dependencies.test.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/logInOrBypass.test.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/utils/auth.test.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/utils/communication.test.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/utils/create-repo.test.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/utils/index.test.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/__tests__/utils/tracker.test.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/src/index.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/src/steps/choose-or-create-a-repository.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/src/steps/configure-project.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/src/steps/detect-framework.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/src/steps/display-final-message.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/src/steps/index.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/src/steps/install-lib.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/src/steps/install-required-dependencies.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/src/steps/loginOrBypass.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/src/steps/validate-pkg.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/src/utils/PackageManager.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/src/utils/auth/helpers.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/src/utils/auth/index.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/src/utils/communication.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/src/utils/create-repo.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/src/utils/index.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/src/utils/logs.ts",[],"/Users/marc/Projects/prismic/slice-machine/packages/init/src/utils/tracker.ts",[]]