@slicemachine/manager 0.1.1-dev-plugins-m2-validation.0 → 0.1.1-dev-plugins-m2-validation.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.
package/dist/errors.cjs CHANGED
@@ -45,7 +45,11 @@ class InternalError extends SliceMachineError {
45
45
  }
46
46
  }
47
47
  const isSliceMachineError = (error) => {
48
- return typeof error === "object" && error !== null && "_sliceMachineError" in error;
48
+ if (typeof window !== "undefined") {
49
+ return typeof error === "object" && error !== null;
50
+ } else {
51
+ return typeof error === "object" && error !== null && "_sliceMachineError" in error;
52
+ }
49
53
  };
50
54
  const isUnauthorizedError = (error) => {
51
55
  return isSliceMachineError(error) && error.name === UnauthorizedError.name;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.cjs","sources":["../../src/errors.ts"],"sourcesContent":["import { HookError } from \"@slicemachine/plugin-kit\";\n\nexport class SliceMachineError extends Error {\n\t_sliceMachineError = true;\n\tname = \"SliceMachineError\";\n}\nexport class UnauthorizedError extends SliceMachineError {\n\tname = \"UnauthorizedError\";\n}\nexport class UnauthenticatedError extends SliceMachineError {\n\tname = \"UnauthenticatedError\";\n\tmessage = \"Authenticate before trying again.\";\n}\nexport class NotFoundError extends SliceMachineError {\n\tname = \"NotFoundError\";\n}\nexport class UnexpectedDataError extends SliceMachineError {\n\tname = \"UnexpectedDataError\";\n}\nexport class InternalError extends SliceMachineError {\n\tname = \"InternalError\";\n}\nexport class PluginError extends SliceMachineError {\n\tname = \"PluginError\";\n}\nexport class PluginHookResultError extends SliceMachineError {\n\tname = \"PluginHookResultError\";\n\n\tconstructor(errors: HookError[]) {\n\t\tsuper(\n\t\t\t`${errors.length} error${\n\t\t\t\terrors.length === 1 ? \"\" : \"s\"\n\t\t\t} were returned by one or more plugins.`,\n\t\t\t{\n\t\t\t\tcause: errors,\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport const isSliceMachineError = (\n\terror: unknown,\n): error is SliceMachineError => {\n\treturn (\n\t\ttypeof error === \"object\" && error !== null && \"_sliceMachineError\" in error\n\t);\n};\n\nexport const isUnauthorizedError = (\n\terror: unknown,\n): error is UnauthorizedError => {\n\treturn isSliceMachineError(error) && error.name === UnauthorizedError.name;\n};\n\nexport const isUnauthenticatedError = (\n\terror: unknown,\n): error is UnauthenticatedError => {\n\treturn isSliceMachineError(error) && error.name === UnauthenticatedError.name;\n};\n\nexport const isNotFoundError = (error: unknown): error is NotFoundError => {\n\treturn isSliceMachineError(error) && error.name === NotFoundError.name;\n};\n\nexport const isUnexpectedDataError = (\n\terror: unknown,\n): error is UnexpectedDataError => {\n\treturn isSliceMachineError(error) && error.name === UnexpectedDataError.name;\n};\n\nexport const isInternalError = (error: unknown): error is InternalError => {\n\treturn isSliceMachineError(error) && error.name === InternalError.name;\n};\n"],"names":[],"mappings":";;;;;;;;AAEM,MAAO,0BAA0B,MAAK;AAAA,EAAtC;AAAA;AACL,8CAAqB;AACrB,gCAAO;AAAA;AACP;AACK,MAAO,0BAA0B,kBAAiB;AAAA,EAAlD;AAAA;AACL,gCAAO;AAAA;AACP;AACK,MAAO,6BAA6B,kBAAiB;AAAA,EAArD;AAAA;AACL,gCAAO;AACP,mCAAU;AAAA;AACV;AACK,MAAO,sBAAsB,kBAAiB;AAAA,EAA9C;AAAA;AACL,gCAAO;AAAA;AACP;AACK,MAAO,4BAA4B,kBAAiB;AAAA,EAApD;AAAA;AACL,gCAAO;AAAA;AACP;AACK,MAAO,sBAAsB,kBAAiB;AAAA,EAA9C;AAAA;AACL,gCAAO;AAAA;AACP;AAmBY,MAAA,sBAAsB,CAClC,UAC+B;AAC/B,SACC,OAAO,UAAU,YAAY,UAAU,QAAQ,wBAAwB;AAEzE;AAEa,MAAA,sBAAsB,CAClC,UAC+B;AAC/B,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,kBAAkB;AACvE;AAEa,MAAA,yBAAyB,CACrC,UACkC;AAClC,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,qBAAqB;AAC1E;AAEa,MAAA,kBAAkB,CAAC,UAA0C;AACzE,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,cAAc;AACnE;AAEa,MAAA,wBAAwB,CACpC,UACiC;AACjC,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,oBAAoB;AACzE;AAEa,MAAA,kBAAkB,CAAC,UAA0C;AACzE,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,cAAc;AACnE;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"errors.cjs","sources":["../../src/errors.ts"],"sourcesContent":["import { HookError } from \"@slicemachine/plugin-kit\";\n\nexport class SliceMachineError extends Error {\n\t_sliceMachineError = true;\n\tname = \"SliceMachineError\";\n}\nexport class UnauthorizedError extends SliceMachineError {\n\tname = \"UnauthorizedError\";\n}\nexport class UnauthenticatedError extends SliceMachineError {\n\tname = \"UnauthenticatedError\";\n\tmessage = \"Authenticate before trying again.\";\n}\nexport class NotFoundError extends SliceMachineError {\n\tname = \"NotFoundError\";\n}\nexport class UnexpectedDataError extends SliceMachineError {\n\tname = \"UnexpectedDataError\";\n}\nexport class InternalError extends SliceMachineError {\n\tname = \"InternalError\";\n}\nexport class PluginError extends SliceMachineError {\n\tname = \"PluginError\";\n}\nexport class PluginHookResultError extends SliceMachineError {\n\tname = \"PluginHookResultError\";\n\n\tconstructor(errors: HookError[]) {\n\t\tsuper(\n\t\t\t`${errors.length} error${\n\t\t\t\terrors.length === 1 ? \"\" : \"s\"\n\t\t\t} were returned by one or more plugins.`,\n\t\t\t{\n\t\t\t\tcause: errors,\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport const isSliceMachineError = (\n\terror: unknown,\n): error is SliceMachineError => {\n\t// TODO: Discuss a stronger way to serialize error for the client to detect with r19\n\t// @ts-expect-error We don't want to add \"dom\" to tsconfig \"lib\" because of the TODO\n\tif (typeof window !== \"undefined\") {\n\t\treturn typeof error === \"object\" && error !== null;\n\t} else {\n\t\treturn (\n\t\t\ttypeof error === \"object\" &&\n\t\t\terror !== null &&\n\t\t\t\"_sliceMachineError\" in error\n\t\t);\n\t}\n};\n\nexport const isUnauthorizedError = (\n\terror: unknown,\n): error is UnauthorizedError => {\n\treturn isSliceMachineError(error) && error.name === UnauthorizedError.name;\n};\n\nexport const isUnauthenticatedError = (\n\terror: unknown,\n): error is UnauthenticatedError => {\n\treturn isSliceMachineError(error) && error.name === UnauthenticatedError.name;\n};\n\nexport const isNotFoundError = (error: unknown): error is NotFoundError => {\n\treturn isSliceMachineError(error) && error.name === NotFoundError.name;\n};\n\nexport const isUnexpectedDataError = (\n\terror: unknown,\n): error is UnexpectedDataError => {\n\treturn isSliceMachineError(error) && error.name === UnexpectedDataError.name;\n};\n\nexport const isInternalError = (error: unknown): error is InternalError => {\n\treturn isSliceMachineError(error) && error.name === InternalError.name;\n};\n"],"names":[],"mappings":";;;;;;;;AAEM,MAAO,0BAA0B,MAAK;AAAA,EAAtC;AAAA;AACL,8CAAqB;AACrB,gCAAO;AAAA;AACP;AACK,MAAO,0BAA0B,kBAAiB;AAAA,EAAlD;AAAA;AACL,gCAAO;AAAA;AACP;AACK,MAAO,6BAA6B,kBAAiB;AAAA,EAArD;AAAA;AACL,gCAAO;AACP,mCAAU;AAAA;AACV;AACK,MAAO,sBAAsB,kBAAiB;AAAA,EAA9C;AAAA;AACL,gCAAO;AAAA;AACP;AACK,MAAO,4BAA4B,kBAAiB;AAAA,EAApD;AAAA;AACL,gCAAO;AAAA;AACP;AACK,MAAO,sBAAsB,kBAAiB;AAAA,EAA9C;AAAA;AACL,gCAAO;AAAA;AACP;AAmBY,MAAA,sBAAsB,CAClC,UAC+B;AAG3B,MAAA,OAAO,WAAW,aAAa;AAC3B,WAAA,OAAO,UAAU,YAAY,UAAU;AAAA,EAAA,OACxC;AACN,WACC,OAAO,UAAU,YACjB,UAAU,QACV,wBAAwB;AAAA,EAEzB;AACF;AAEa,MAAA,sBAAsB,CAClC,UAC+B;AAC/B,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,kBAAkB;AACvE;AAEa,MAAA,yBAAyB,CACrC,UACkC;AAClC,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,qBAAqB;AAC1E;AAEa,MAAA,kBAAkB,CAAC,UAA0C;AACzE,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,cAAc;AACnE;AAEa,MAAA,wBAAwB,CACpC,UACiC;AACjC,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,oBAAoB;AACzE;AAEa,MAAA,kBAAkB,CAAC,UAA0C;AACzE,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,cAAc;AACnE;;;;;;;;;;;;;"}
package/dist/errors.js CHANGED
@@ -43,7 +43,11 @@ class InternalError extends SliceMachineError {
43
43
  }
44
44
  }
45
45
  const isSliceMachineError = (error) => {
46
- return typeof error === "object" && error !== null && "_sliceMachineError" in error;
46
+ if (typeof window !== "undefined") {
47
+ return typeof error === "object" && error !== null;
48
+ } else {
49
+ return typeof error === "object" && error !== null && "_sliceMachineError" in error;
50
+ }
47
51
  };
48
52
  const isUnauthorizedError = (error) => {
49
53
  return isSliceMachineError(error) && error.name === UnauthorizedError.name;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sources":["../../src/errors.ts"],"sourcesContent":["import { HookError } from \"@slicemachine/plugin-kit\";\n\nexport class SliceMachineError extends Error {\n\t_sliceMachineError = true;\n\tname = \"SliceMachineError\";\n}\nexport class UnauthorizedError extends SliceMachineError {\n\tname = \"UnauthorizedError\";\n}\nexport class UnauthenticatedError extends SliceMachineError {\n\tname = \"UnauthenticatedError\";\n\tmessage = \"Authenticate before trying again.\";\n}\nexport class NotFoundError extends SliceMachineError {\n\tname = \"NotFoundError\";\n}\nexport class UnexpectedDataError extends SliceMachineError {\n\tname = \"UnexpectedDataError\";\n}\nexport class InternalError extends SliceMachineError {\n\tname = \"InternalError\";\n}\nexport class PluginError extends SliceMachineError {\n\tname = \"PluginError\";\n}\nexport class PluginHookResultError extends SliceMachineError {\n\tname = \"PluginHookResultError\";\n\n\tconstructor(errors: HookError[]) {\n\t\tsuper(\n\t\t\t`${errors.length} error${\n\t\t\t\terrors.length === 1 ? \"\" : \"s\"\n\t\t\t} were returned by one or more plugins.`,\n\t\t\t{\n\t\t\t\tcause: errors,\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport const isSliceMachineError = (\n\terror: unknown,\n): error is SliceMachineError => {\n\treturn (\n\t\ttypeof error === \"object\" && error !== null && \"_sliceMachineError\" in error\n\t);\n};\n\nexport const isUnauthorizedError = (\n\terror: unknown,\n): error is UnauthorizedError => {\n\treturn isSliceMachineError(error) && error.name === UnauthorizedError.name;\n};\n\nexport const isUnauthenticatedError = (\n\terror: unknown,\n): error is UnauthenticatedError => {\n\treturn isSliceMachineError(error) && error.name === UnauthenticatedError.name;\n};\n\nexport const isNotFoundError = (error: unknown): error is NotFoundError => {\n\treturn isSliceMachineError(error) && error.name === NotFoundError.name;\n};\n\nexport const isUnexpectedDataError = (\n\terror: unknown,\n): error is UnexpectedDataError => {\n\treturn isSliceMachineError(error) && error.name === UnexpectedDataError.name;\n};\n\nexport const isInternalError = (error: unknown): error is InternalError => {\n\treturn isSliceMachineError(error) && error.name === InternalError.name;\n};\n"],"names":[],"mappings":";;;;;;AAEM,MAAO,0BAA0B,MAAK;AAAA,EAAtC;AAAA;AACL,8CAAqB;AACrB,gCAAO;AAAA;AACP;AACK,MAAO,0BAA0B,kBAAiB;AAAA,EAAlD;AAAA;AACL,gCAAO;AAAA;AACP;AACK,MAAO,6BAA6B,kBAAiB;AAAA,EAArD;AAAA;AACL,gCAAO;AACP,mCAAU;AAAA;AACV;AACK,MAAO,sBAAsB,kBAAiB;AAAA,EAA9C;AAAA;AACL,gCAAO;AAAA;AACP;AACK,MAAO,4BAA4B,kBAAiB;AAAA,EAApD;AAAA;AACL,gCAAO;AAAA;AACP;AACK,MAAO,sBAAsB,kBAAiB;AAAA,EAA9C;AAAA;AACL,gCAAO;AAAA;AACP;AAmBY,MAAA,sBAAsB,CAClC,UAC+B;AAC/B,SACC,OAAO,UAAU,YAAY,UAAU,QAAQ,wBAAwB;AAEzE;AAEa,MAAA,sBAAsB,CAClC,UAC+B;AAC/B,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,kBAAkB;AACvE;AAEa,MAAA,yBAAyB,CACrC,UACkC;AAClC,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,qBAAqB;AAC1E;AAEa,MAAA,kBAAkB,CAAC,UAA0C;AACzE,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,cAAc;AACnE;AAEa,MAAA,wBAAwB,CACpC,UACiC;AACjC,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,oBAAoB;AACzE;AAEa,MAAA,kBAAkB,CAAC,UAA0C;AACzE,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,cAAc;AACnE;"}
1
+ {"version":3,"file":"errors.js","sources":["../../src/errors.ts"],"sourcesContent":["import { HookError } from \"@slicemachine/plugin-kit\";\n\nexport class SliceMachineError extends Error {\n\t_sliceMachineError = true;\n\tname = \"SliceMachineError\";\n}\nexport class UnauthorizedError extends SliceMachineError {\n\tname = \"UnauthorizedError\";\n}\nexport class UnauthenticatedError extends SliceMachineError {\n\tname = \"UnauthenticatedError\";\n\tmessage = \"Authenticate before trying again.\";\n}\nexport class NotFoundError extends SliceMachineError {\n\tname = \"NotFoundError\";\n}\nexport class UnexpectedDataError extends SliceMachineError {\n\tname = \"UnexpectedDataError\";\n}\nexport class InternalError extends SliceMachineError {\n\tname = \"InternalError\";\n}\nexport class PluginError extends SliceMachineError {\n\tname = \"PluginError\";\n}\nexport class PluginHookResultError extends SliceMachineError {\n\tname = \"PluginHookResultError\";\n\n\tconstructor(errors: HookError[]) {\n\t\tsuper(\n\t\t\t`${errors.length} error${\n\t\t\t\terrors.length === 1 ? \"\" : \"s\"\n\t\t\t} were returned by one or more plugins.`,\n\t\t\t{\n\t\t\t\tcause: errors,\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport const isSliceMachineError = (\n\terror: unknown,\n): error is SliceMachineError => {\n\t// TODO: Discuss a stronger way to serialize error for the client to detect with r19\n\t// @ts-expect-error We don't want to add \"dom\" to tsconfig \"lib\" because of the TODO\n\tif (typeof window !== \"undefined\") {\n\t\treturn typeof error === \"object\" && error !== null;\n\t} else {\n\t\treturn (\n\t\t\ttypeof error === \"object\" &&\n\t\t\terror !== null &&\n\t\t\t\"_sliceMachineError\" in error\n\t\t);\n\t}\n};\n\nexport const isUnauthorizedError = (\n\terror: unknown,\n): error is UnauthorizedError => {\n\treturn isSliceMachineError(error) && error.name === UnauthorizedError.name;\n};\n\nexport const isUnauthenticatedError = (\n\terror: unknown,\n): error is UnauthenticatedError => {\n\treturn isSliceMachineError(error) && error.name === UnauthenticatedError.name;\n};\n\nexport const isNotFoundError = (error: unknown): error is NotFoundError => {\n\treturn isSliceMachineError(error) && error.name === NotFoundError.name;\n};\n\nexport const isUnexpectedDataError = (\n\terror: unknown,\n): error is UnexpectedDataError => {\n\treturn isSliceMachineError(error) && error.name === UnexpectedDataError.name;\n};\n\nexport const isInternalError = (error: unknown): error is InternalError => {\n\treturn isSliceMachineError(error) && error.name === InternalError.name;\n};\n"],"names":[],"mappings":";;;;;;AAEM,MAAO,0BAA0B,MAAK;AAAA,EAAtC;AAAA;AACL,8CAAqB;AACrB,gCAAO;AAAA;AACP;AACK,MAAO,0BAA0B,kBAAiB;AAAA,EAAlD;AAAA;AACL,gCAAO;AAAA;AACP;AACK,MAAO,6BAA6B,kBAAiB;AAAA,EAArD;AAAA;AACL,gCAAO;AACP,mCAAU;AAAA;AACV;AACK,MAAO,sBAAsB,kBAAiB;AAAA,EAA9C;AAAA;AACL,gCAAO;AAAA;AACP;AACK,MAAO,4BAA4B,kBAAiB;AAAA,EAApD;AAAA;AACL,gCAAO;AAAA;AACP;AACK,MAAO,sBAAsB,kBAAiB;AAAA,EAA9C;AAAA;AACL,gCAAO;AAAA;AACP;AAmBY,MAAA,sBAAsB,CAClC,UAC+B;AAG3B,MAAA,OAAO,WAAW,aAAa;AAC3B,WAAA,OAAO,UAAU,YAAY,UAAU;AAAA,EAAA,OACxC;AACN,WACC,OAAO,UAAU,YACjB,UAAU,QACV,wBAAwB;AAAA,EAEzB;AACF;AAEa,MAAA,sBAAsB,CAClC,UAC+B;AAC/B,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,kBAAkB;AACvE;AAEa,MAAA,yBAAyB,CACrC,UACkC;AAClC,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,qBAAqB;AAC1E;AAEa,MAAA,kBAAkB,CAAC,UAA0C;AACzE,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,cAAc;AACnE;AAEa,MAAA,wBAAwB,CACpC,UACiC;AACjC,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,oBAAoB;AACzE;AAEa,MAAA,kBAAkB,CAAC,UAA0C;AACzE,SAAO,oBAAoB,KAAK,KAAK,MAAM,SAAS,cAAc;AACnE;"}
@@ -133,6 +133,7 @@ class SliceMachineManager {
133
133
  localSliceSimulatorURL: sliceMachineConfig.localSliceSimulatorURL
134
134
  },
135
135
  packageManager,
136
+ supportsSliceSimulator: this.simulator.supportsSliceSimulator(),
136
137
  repo: sliceMachineConfig.repositoryName,
137
138
  intercomHash: profile == null ? void 0 : profile.intercomHash,
138
139
  shortId: profile == null ? void 0 : profile.shortId
@@ -1 +1 @@
1
- {"version":3,"file":"SliceMachineManager.cjs","sources":["../../../src/managers/SliceMachineManager.ts"],"sourcesContent":["import { CustomTypes } from \"@prismicio/types-internal\";\nimport { SharedSliceContent } from \"@prismicio/types-internal/lib/content\";\nimport {\n\tForbiddenError,\n\tUnauthorizedError,\n} from \"@prismicio/custom-types-client\";\nimport {\n\tSliceMachinePlugin,\n\tSliceMachinePluginRunner,\n} from \"@slicemachine/plugin-kit\";\n\nimport { createContentDigest } from \"../lib/createContentDigest\";\n\nimport { PackageChangelog, PackageManager, SliceMachineConfig } from \"../types\";\nimport {\n\tPrismicAuthManager,\n\tPrismicUserProfile,\n} from \"../auth/PrismicAuthManager\";\nimport { createPrismicAuthManager } from \"../auth/createPrismicAuthManager\";\n\nimport { API_ENDPOINTS, APIEndpoints } from \"../constants/API_ENDPOINTS\";\n\nimport { UserManager } from \"./user/UserManager\";\nimport { PrismicRepositoryManager } from \"./prismicRepository/PrismicRepositoryManager\";\n\nimport { PluginsManager } from \"./plugins/PluginsManager\";\n\nimport { ProjectManager } from \"./project/ProjectManager\";\nimport { CustomTypesManager } from \"./customTypes/CustomTypesManager\";\nimport { SlicesManager } from \"./slices/SlicesManager\";\nimport { SnippetsManager } from \"./snippets/SnippetsManager\";\nimport { ScreenshotsManager } from \"./screenshots/ScreenshotsManager\";\nimport { SimulatorManager } from \"./simulator/SimulatorManager\";\n\nimport { VersionsManager } from \"./versions/VersionsManager\";\n\nimport { TelemetryManager } from \"./telemetry/TelemetryManager\";\nimport { buildPrismicRepositoryAPIEndpoint } from \"../lib/buildPrismicRepositoryAPIEndpoint\";\n\ntype SliceMachineManagerGetStateReturnType = {\n\tenv: {\n\t\tshortId?: string;\n\t\tintercomHash?: string;\n\t\tmanifest: {\n\t\t\tapiEndpoint: string;\n\t\t\tlocalSliceSimulatorURL?: string;\n\t\t};\n\t\trepo: string;\n\t\tchangelog?: PackageChangelog;\n\t\tpackageManager: PackageManager;\n\t};\n\tlibraries: {\n\t\tname: string;\n\t\tpath: string;\n\t\tisLocal: boolean;\n\t\tcomponents: {\n\t\t\tfrom: string;\n\t\t\thref: string;\n\t\t\tpathToSlice: string;\n\t\t\tfileName: string | null;\n\t\t\textension: string | null;\n\t\t\tmodel: CustomTypes.Widgets.Slices.SharedSlice;\n\t\t\tscreenshots: Record<\n\t\t\t\tstring,\n\t\t\t\t{\n\t\t\t\t\thash: string;\n\t\t\t\t\tdata: Buffer;\n\t\t\t\t}\n\t\t\t>;\n\t\t\tmock?: SharedSliceContent[];\n\t\t}[];\n\t\tmeta: {\n\t\t\tname?: string;\n\t\t\tversion?: string;\n\t\t\tisNodeModule: boolean;\n\t\t\tisDownloaded: boolean;\n\t\t\tisManual: boolean;\n\t\t};\n\t}[];\n\tcustomTypes: CustomTypes.CustomType[];\n\tremoteCustomTypes: CustomTypes.CustomType[];\n\tremoteSlices: CustomTypes.Widgets.Slices.SharedSlice[];\n\tclientError?: {\n\t\tname: string;\n\t\tmessage: string;\n\t\tstatus: number;\n\t\treason: string;\n\t};\n};\n\ntype SliceMachineManagerConstructorArgs = {\n\tcwd?: string;\n\tnativePlugins?: Record<string, SliceMachinePlugin>;\n};\n\nexport class SliceMachineManager {\n\tprivate _sliceMachinePluginRunner: SliceMachinePluginRunner | undefined =\n\t\tundefined;\n\tprivate _prismicAuthManager: PrismicAuthManager;\n\n\tcwd: string;\n\n\tcustomTypes: CustomTypesManager;\n\tplugins: PluginsManager;\n\tprismicRepository: PrismicRepositoryManager;\n\tproject: ProjectManager;\n\tscreenshots: ScreenshotsManager;\n\tsimulator: SimulatorManager;\n\tslices: SlicesManager;\n\tsnippets: SnippetsManager;\n\ttelemetry: TelemetryManager;\n\tuser: UserManager;\n\tversions: VersionsManager;\n\n\tconstructor(args?: SliceMachineManagerConstructorArgs) {\n\t\t// _prismicAuthManager must be set at least before UserManager\n\t\t// is instantiated. It depends on the PrismicAuthManager for\n\t\t// authentication-related methods.\n\t\tthis._prismicAuthManager = createPrismicAuthManager();\n\n\t\tthis.user = new UserManager(this);\n\t\tthis.prismicRepository = new PrismicRepositoryManager(this);\n\n\t\tthis.plugins = new PluginsManager(this, {\n\t\t\tnativePlugins: args?.nativePlugins,\n\t\t});\n\n\t\tthis.project = new ProjectManager(this);\n\t\tthis.customTypes = new CustomTypesManager(this);\n\t\tthis.slices = new SlicesManager(this);\n\t\tthis.snippets = new SnippetsManager(this);\n\t\tthis.screenshots = new ScreenshotsManager(this);\n\t\tthis.simulator = new SimulatorManager(this);\n\n\t\tthis.versions = new VersionsManager(this);\n\n\t\tthis.telemetry = new TelemetryManager(this);\n\n\t\tthis.cwd = args?.cwd ?? process.cwd();\n\t}\n\n\t// The `_sliceMachinePluginRunner` property is hidden behind a function to\n\t// discourage access. Using a function deliberatly breaks the pattern\n\t// of other child managers that are accessible as properties, like\n\t// `project`, `plugins`, etc. We do not treat SliceMachinePluginRunner\n\t// as a child manager.\n\tgetSliceMachinePluginRunner(): SliceMachinePluginRunner | undefined {\n\t\treturn this._sliceMachinePluginRunner;\n\t}\n\n\t// The `_prismicAuthManager` property is hidden behind a function to\n\t// discourage access. Using a function deliberatly breaks the pattern\n\t// of other child managers that are accessible as properties, like\n\t// `project`, `plugins`, etc. We do not treat PrismicAuthManager as a\n\t// child manager.\n\tgetPrismicAuthManager(): PrismicAuthManager {\n\t\treturn this._prismicAuthManager;\n\t}\n\n\tgetAPIEndpoints(): APIEndpoints {\n\t\treturn API_ENDPOINTS;\n\t}\n\n\t// TODO: Remove this global-state method. It is expensive and a\n\t// potential source of bugs due to data inconsistency. SM UI relies on\n\t// it heavily, so removal will require significant effort.\n\tasync getState(): Promise<SliceMachineManagerGetStateReturnType> {\n\t\tconst [\n\t\t\t{ sliceMachineConfig, libraries },\n\t\t\t{ profile, remoteCustomTypes, remoteSlices, authError },\n\t\t\tcustomTypes,\n\t\t\tpackageManager,\n\t\t] = await Promise.all([\n\t\t\tthis.project.getSliceMachineConfig().then(async (sliceMachineConfig) => {\n\t\t\t\tconst libraries = await this._getLibraries(sliceMachineConfig);\n\n\t\t\t\treturn { sliceMachineConfig, libraries };\n\t\t\t}),\n\t\t\tthis._getProfile().then(async (profile) => {\n\t\t\t\tlet authError;\n\t\t\t\tif (profile) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst [remoteCustomTypes, remoteSlices] = await Promise.all([\n\t\t\t\t\t\t\tthis.customTypes.fetchRemoteCustomTypes(),\n\t\t\t\t\t\t\tthis.slices.fetchRemoteSlices(),\n\t\t\t\t\t\t]);\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tprofile,\n\t\t\t\t\t\t\tremoteCustomTypes,\n\t\t\t\t\t\t\tremoteSlices,\n\t\t\t\t\t\t\tauthError,\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t// Non-Prismic error\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\terror instanceof UnauthorizedError ||\n\t\t\t\t\t\t\terror instanceof ForbiddenError\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tauthError = {\n\t\t\t\t\t\t\t\tname: \"__stub__\",\n\t\t\t\t\t\t\t\tmessage: \"__stub__\",\n\t\t\t\t\t\t\t\treason: \"__stub__\",\n\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tprofile,\n\t\t\t\t\tremoteCustomTypes: [],\n\t\t\t\t\tremoteSlices: [],\n\t\t\t\t\tauthError,\n\t\t\t\t};\n\t\t\t}),\n\t\t\tthis._getCustomTypes(),\n\t\t\tthis.project.detectPackageManager(),\n\t\t]);\n\n\t\t// SM UI detects if a user is logged out by looking at\n\t\t// `clientError`. Here, we simulate what the old core does by\n\t\t// returning an `ErrorWithStatus`-like object if the user does\n\t\t// not have access to the repository or is not logged in.\n\t\tconst clientError: SliceMachineManagerGetStateReturnType[\"clientError\"] =\n\t\t\tauthError ||\n\t\t\t(profile\n\t\t\t\t? undefined\n\t\t\t\t: {\n\t\t\t\t\t\tname: \"__stub__\",\n\t\t\t\t\t\tmessage: \"__stub__\",\n\t\t\t\t\t\treason: \"__stub__\",\n\t\t\t\t\t\tstatus: 401, // Needed to trigger the unauthorized flow.\n\t\t\t\t });\n\n\t\treturn {\n\t\t\tenv: {\n\t\t\t\tmanifest: {\n\t\t\t\t\tapiEndpoint:\n\t\t\t\t\t\tsliceMachineConfig.apiEndpoint ||\n\t\t\t\t\t\tbuildPrismicRepositoryAPIEndpoint(\n\t\t\t\t\t\t\tsliceMachineConfig.repositoryName,\n\t\t\t\t\t\t),\n\t\t\t\t\tlocalSliceSimulatorURL: sliceMachineConfig.localSliceSimulatorURL,\n\t\t\t\t},\n\t\t\t\tpackageManager,\n\t\t\t\trepo: sliceMachineConfig.repositoryName,\n\t\t\t\tintercomHash: profile?.intercomHash,\n\t\t\t\tshortId: profile?.shortId,\n\t\t\t},\n\t\t\tlibraries,\n\t\t\tcustomTypes,\n\t\t\tremoteCustomTypes,\n\t\t\tremoteSlices,\n\t\t\tclientError,\n\t\t};\n\t}\n\n\tprivate async _getProfile(): Promise<PrismicUserProfile | undefined> {\n\t\tlet profile: PrismicUserProfile | undefined;\n\n\t\tconst isLoggedIn = await this.user.checkIsLoggedIn();\n\n\t\tif (isLoggedIn) {\n\t\t\tprofile = await this.user.getProfile();\n\t\t\tawait this.user.refreshAuthenticationToken();\n\t\t}\n\n\t\treturn profile;\n\t}\n\n\tprivate async _getLibraries(\n\t\tsliceMachineConfig: SliceMachineConfig,\n\t): Promise<SliceMachineManagerGetStateReturnType[\"libraries\"]> {\n\t\tconst libraries: SliceMachineManagerGetStateReturnType[\"libraries\"] = [];\n\n\t\tif (sliceMachineConfig.libraries) {\n\t\t\tawait Promise.all(\n\t\t\t\tsliceMachineConfig.libraries.map(async (libraryID) => {\n\t\t\t\t\tconst { sliceIDs } = await this.slices.readSliceLibrary({\n\t\t\t\t\t\tlibraryID,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (sliceIDs) {\n\t\t\t\t\t\tconst components: SliceMachineManagerGetStateReturnType[\"libraries\"][number][\"components\"] =\n\t\t\t\t\t\t\t[];\n\n\t\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\t\tsliceIDs.map(async (sliceID) => {\n\t\t\t\t\t\t\t\tconst [{ model }, { mocks }] = await Promise.all([\n\t\t\t\t\t\t\t\t\tthis.slices.readSlice({ libraryID, sliceID }),\n\t\t\t\t\t\t\t\t\tthis.slices.readSliceMocks({ libraryID, sliceID }),\n\t\t\t\t\t\t\t\t]);\n\n\t\t\t\t\t\t\t\tif (model) {\n\t\t\t\t\t\t\t\t\tconst screenshots: (typeof components)[number][\"screenshots\"] =\n\t\t\t\t\t\t\t\t\t\t{};\n\t\t\t\t\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\t\t\t\t\tmodel.variations.map(async (variation) => {\n\t\t\t\t\t\t\t\t\t\t\tconst screenshot = await this.slices.readSliceScreenshot({\n\t\t\t\t\t\t\t\t\t\t\t\tlibraryID,\n\t\t\t\t\t\t\t\t\t\t\t\tsliceID,\n\t\t\t\t\t\t\t\t\t\t\t\tvariationID: variation.id,\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\tif (screenshot.data) {\n\t\t\t\t\t\t\t\t\t\t\t\tscreenshots[variation.id] = {\n\t\t\t\t\t\t\t\t\t\t\t\t\thash: createContentDigest(screenshot.data),\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata: screenshot.data,\n\t\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\tcomponents.push({\n\t\t\t\t\t\t\t\t\t\tfrom: libraryID,\n\t\t\t\t\t\t\t\t\t\thref: libraryID.replace(/\\//g, \"--\"),\n\t\t\t\t\t\t\t\t\t\tpathToSlice: \"pathToSlice\",\n\t\t\t\t\t\t\t\t\t\tfileName: \"fileName\",\n\t\t\t\t\t\t\t\t\t\textension: \"extension\",\n\t\t\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\t\t\tscreenshots,\n\t\t\t\t\t\t\t\t\t\tmock: mocks,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tlibraries.push({\n\t\t\t\t\t\t\tname: libraryID,\n\t\t\t\t\t\t\tpath: libraryID,\n\t\t\t\t\t\t\tisLocal: true, // TODO: Do we still support node_modules-based libraries?\n\t\t\t\t\t\t\tcomponents,\n\t\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\t\t// TODO: Do we still support node_modules-based libraries?\n\t\t\t\t\t\t\t\tisNodeModule: false,\n\t\t\t\t\t\t\t\tisDownloaded: false,\n\t\t\t\t\t\t\t\tisManual: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\t// Preserve library order from config file\n\t\treturn libraries.sort((library1, library2) => {\n\t\t\tconst libraryIndex1 =\n\t\t\t\tsliceMachineConfig.libraries?.indexOf(library1.name) || 0;\n\t\t\tconst libraryIndex2 =\n\t\t\t\tsliceMachineConfig.libraries?.indexOf(library2.name) || 0;\n\n\t\t\treturn Math.sign(libraryIndex1 - libraryIndex2);\n\t\t});\n\t}\n\n\tprivate async _getCustomTypes(): Promise<\n\t\tSliceMachineManagerGetStateReturnType[\"customTypes\"]\n\t> {\n\t\tconst customTypes: SliceMachineManagerGetStateReturnType[\"customTypes\"] =\n\t\t\t[];\n\n\t\tconst { ids: customTypeIDs } =\n\t\t\tawait this.customTypes.readCustomTypeLibrary();\n\n\t\tif (customTypeIDs) {\n\t\t\tawait Promise.all(\n\t\t\t\tcustomTypeIDs.map(async (customTypeID) => {\n\t\t\t\t\tconst { model } = await this.customTypes.readCustomType({\n\t\t\t\t\t\tid: customTypeID,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (model) {\n\t\t\t\t\t\tcustomTypes.push(model);\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\treturn customTypes;\n\t}\n}\n"],"names":["createPrismicAuthManager","UserManager","PrismicRepositoryManager","PluginsManager","ProjectManager","CustomTypesManager","SlicesManager","SnippetsManager","ScreenshotsManager","SimulatorManager","VersionsManager","TelemetryManager","API_ENDPOINTS","sliceMachineConfig","libraries","profile","authError","remoteCustomTypes","remoteSlices","UnauthorizedError","ForbiddenError","buildPrismicRepositoryAPIEndpoint","createContentDigest"],"mappings":"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"}
1
+ {"version":3,"file":"SliceMachineManager.cjs","sources":["../../../src/managers/SliceMachineManager.ts"],"sourcesContent":["import { CustomTypes } from \"@prismicio/types-internal\";\nimport { SharedSliceContent } from \"@prismicio/types-internal/lib/content\";\nimport {\n\tForbiddenError,\n\tUnauthorizedError,\n} from \"@prismicio/custom-types-client\";\nimport {\n\tSliceMachinePlugin,\n\tSliceMachinePluginRunner,\n} from \"@slicemachine/plugin-kit\";\n\nimport { createContentDigest } from \"../lib/createContentDigest\";\n\nimport { PackageChangelog, PackageManager, SliceMachineConfig } from \"../types\";\nimport {\n\tPrismicAuthManager,\n\tPrismicUserProfile,\n} from \"../auth/PrismicAuthManager\";\nimport { createPrismicAuthManager } from \"../auth/createPrismicAuthManager\";\n\nimport { API_ENDPOINTS, APIEndpoints } from \"../constants/API_ENDPOINTS\";\n\nimport { UserManager } from \"./user/UserManager\";\nimport { PrismicRepositoryManager } from \"./prismicRepository/PrismicRepositoryManager\";\n\nimport { PluginsManager } from \"./plugins/PluginsManager\";\n\nimport { ProjectManager } from \"./project/ProjectManager\";\nimport { CustomTypesManager } from \"./customTypes/CustomTypesManager\";\nimport { SlicesManager } from \"./slices/SlicesManager\";\nimport { SnippetsManager } from \"./snippets/SnippetsManager\";\nimport { ScreenshotsManager } from \"./screenshots/ScreenshotsManager\";\nimport { SimulatorManager } from \"./simulator/SimulatorManager\";\n\nimport { VersionsManager } from \"./versions/VersionsManager\";\n\nimport { TelemetryManager } from \"./telemetry/TelemetryManager\";\nimport { buildPrismicRepositoryAPIEndpoint } from \"../lib/buildPrismicRepositoryAPIEndpoint\";\n\ntype SliceMachineManagerGetStateReturnType = {\n\tenv: {\n\t\tshortId?: string;\n\t\tintercomHash?: string;\n\t\tmanifest: {\n\t\t\tapiEndpoint: string;\n\t\t\tlocalSliceSimulatorURL?: string;\n\t\t};\n\t\trepo: string;\n\t\tchangelog?: PackageChangelog;\n\t\tpackageManager: PackageManager;\n\t\tsupportsSliceSimulator: boolean;\n\t};\n\tlibraries: {\n\t\tname: string;\n\t\tpath: string;\n\t\tisLocal: boolean;\n\t\tcomponents: {\n\t\t\tfrom: string;\n\t\t\thref: string;\n\t\t\tpathToSlice: string;\n\t\t\tfileName: string | null;\n\t\t\textension: string | null;\n\t\t\tmodel: CustomTypes.Widgets.Slices.SharedSlice;\n\t\t\tscreenshots: Record<\n\t\t\t\tstring,\n\t\t\t\t{\n\t\t\t\t\thash: string;\n\t\t\t\t\tdata: Buffer;\n\t\t\t\t}\n\t\t\t>;\n\t\t\tmock?: SharedSliceContent[];\n\t\t}[];\n\t\tmeta: {\n\t\t\tname?: string;\n\t\t\tversion?: string;\n\t\t\tisNodeModule: boolean;\n\t\t\tisDownloaded: boolean;\n\t\t\tisManual: boolean;\n\t\t};\n\t}[];\n\tcustomTypes: CustomTypes.CustomType[];\n\tremoteCustomTypes: CustomTypes.CustomType[];\n\tremoteSlices: CustomTypes.Widgets.Slices.SharedSlice[];\n\tclientError?: {\n\t\tname: string;\n\t\tmessage: string;\n\t\tstatus: number;\n\t\treason: string;\n\t};\n};\n\ntype SliceMachineManagerConstructorArgs = {\n\tcwd?: string;\n\tnativePlugins?: Record<string, SliceMachinePlugin>;\n};\n\nexport class SliceMachineManager {\n\tprivate _sliceMachinePluginRunner: SliceMachinePluginRunner | undefined =\n\t\tundefined;\n\tprivate _prismicAuthManager: PrismicAuthManager;\n\n\tcwd: string;\n\n\tcustomTypes: CustomTypesManager;\n\tplugins: PluginsManager;\n\tprismicRepository: PrismicRepositoryManager;\n\tproject: ProjectManager;\n\tscreenshots: ScreenshotsManager;\n\tsimulator: SimulatorManager;\n\tslices: SlicesManager;\n\tsnippets: SnippetsManager;\n\ttelemetry: TelemetryManager;\n\tuser: UserManager;\n\tversions: VersionsManager;\n\n\tconstructor(args?: SliceMachineManagerConstructorArgs) {\n\t\t// _prismicAuthManager must be set at least before UserManager\n\t\t// is instantiated. It depends on the PrismicAuthManager for\n\t\t// authentication-related methods.\n\t\tthis._prismicAuthManager = createPrismicAuthManager();\n\n\t\tthis.user = new UserManager(this);\n\t\tthis.prismicRepository = new PrismicRepositoryManager(this);\n\n\t\tthis.plugins = new PluginsManager(this, {\n\t\t\tnativePlugins: args?.nativePlugins,\n\t\t});\n\n\t\tthis.project = new ProjectManager(this);\n\t\tthis.customTypes = new CustomTypesManager(this);\n\t\tthis.slices = new SlicesManager(this);\n\t\tthis.snippets = new SnippetsManager(this);\n\t\tthis.screenshots = new ScreenshotsManager(this);\n\t\tthis.simulator = new SimulatorManager(this);\n\n\t\tthis.versions = new VersionsManager(this);\n\n\t\tthis.telemetry = new TelemetryManager(this);\n\n\t\tthis.cwd = args?.cwd ?? process.cwd();\n\t}\n\n\t// The `_sliceMachinePluginRunner` property is hidden behind a function to\n\t// discourage access. Using a function deliberatly breaks the pattern\n\t// of other child managers that are accessible as properties, like\n\t// `project`, `plugins`, etc. We do not treat SliceMachinePluginRunner\n\t// as a child manager.\n\tgetSliceMachinePluginRunner(): SliceMachinePluginRunner | undefined {\n\t\treturn this._sliceMachinePluginRunner;\n\t}\n\n\t// The `_prismicAuthManager` property is hidden behind a function to\n\t// discourage access. Using a function deliberatly breaks the pattern\n\t// of other child managers that are accessible as properties, like\n\t// `project`, `plugins`, etc. We do not treat PrismicAuthManager as a\n\t// child manager.\n\tgetPrismicAuthManager(): PrismicAuthManager {\n\t\treturn this._prismicAuthManager;\n\t}\n\n\tgetAPIEndpoints(): APIEndpoints {\n\t\treturn API_ENDPOINTS;\n\t}\n\n\t// TODO: Remove this global-state method. It is expensive and a\n\t// potential source of bugs due to data inconsistency. SM UI relies on\n\t// it heavily, so removal will require significant effort.\n\tasync getState(): Promise<SliceMachineManagerGetStateReturnType> {\n\t\tconst [\n\t\t\t{ sliceMachineConfig, libraries },\n\t\t\t{ profile, remoteCustomTypes, remoteSlices, authError },\n\t\t\tcustomTypes,\n\t\t\tpackageManager,\n\t\t] = await Promise.all([\n\t\t\tthis.project.getSliceMachineConfig().then(async (sliceMachineConfig) => {\n\t\t\t\tconst libraries = await this._getLibraries(sliceMachineConfig);\n\n\t\t\t\treturn { sliceMachineConfig, libraries };\n\t\t\t}),\n\t\t\tthis._getProfile().then(async (profile) => {\n\t\t\t\tlet authError;\n\t\t\t\tif (profile) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst [remoteCustomTypes, remoteSlices] = await Promise.all([\n\t\t\t\t\t\t\tthis.customTypes.fetchRemoteCustomTypes(),\n\t\t\t\t\t\t\tthis.slices.fetchRemoteSlices(),\n\t\t\t\t\t\t]);\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tprofile,\n\t\t\t\t\t\t\tremoteCustomTypes,\n\t\t\t\t\t\t\tremoteSlices,\n\t\t\t\t\t\t\tauthError,\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t// Non-Prismic error\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\terror instanceof UnauthorizedError ||\n\t\t\t\t\t\t\terror instanceof ForbiddenError\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tauthError = {\n\t\t\t\t\t\t\t\tname: \"__stub__\",\n\t\t\t\t\t\t\t\tmessage: \"__stub__\",\n\t\t\t\t\t\t\t\treason: \"__stub__\",\n\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tprofile,\n\t\t\t\t\tremoteCustomTypes: [],\n\t\t\t\t\tremoteSlices: [],\n\t\t\t\t\tauthError,\n\t\t\t\t};\n\t\t\t}),\n\t\t\tthis._getCustomTypes(),\n\t\t\tthis.project.detectPackageManager(),\n\t\t]);\n\n\t\t// SM UI detects if a user is logged out by looking at\n\t\t// `clientError`. Here, we simulate what the old core does by\n\t\t// returning an `ErrorWithStatus`-like object if the user does\n\t\t// not have access to the repository or is not logged in.\n\t\tconst clientError: SliceMachineManagerGetStateReturnType[\"clientError\"] =\n\t\t\tauthError ||\n\t\t\t(profile\n\t\t\t\t? undefined\n\t\t\t\t: {\n\t\t\t\t\t\tname: \"__stub__\",\n\t\t\t\t\t\tmessage: \"__stub__\",\n\t\t\t\t\t\treason: \"__stub__\",\n\t\t\t\t\t\tstatus: 401, // Needed to trigger the unauthorized flow.\n\t\t\t\t });\n\n\t\treturn {\n\t\t\tenv: {\n\t\t\t\tmanifest: {\n\t\t\t\t\tapiEndpoint:\n\t\t\t\t\t\tsliceMachineConfig.apiEndpoint ||\n\t\t\t\t\t\tbuildPrismicRepositoryAPIEndpoint(\n\t\t\t\t\t\t\tsliceMachineConfig.repositoryName,\n\t\t\t\t\t\t),\n\t\t\t\t\tlocalSliceSimulatorURL: sliceMachineConfig.localSliceSimulatorURL,\n\t\t\t\t},\n\t\t\t\tpackageManager,\n\t\t\t\tsupportsSliceSimulator: this.simulator.supportsSliceSimulator(),\n\t\t\t\trepo: sliceMachineConfig.repositoryName,\n\t\t\t\tintercomHash: profile?.intercomHash,\n\t\t\t\tshortId: profile?.shortId,\n\t\t\t},\n\t\t\tlibraries,\n\t\t\tcustomTypes,\n\t\t\tremoteCustomTypes,\n\t\t\tremoteSlices,\n\t\t\tclientError,\n\t\t};\n\t}\n\n\tprivate async _getProfile(): Promise<PrismicUserProfile | undefined> {\n\t\tlet profile: PrismicUserProfile | undefined;\n\n\t\tconst isLoggedIn = await this.user.checkIsLoggedIn();\n\n\t\tif (isLoggedIn) {\n\t\t\tprofile = await this.user.getProfile();\n\t\t\tawait this.user.refreshAuthenticationToken();\n\t\t}\n\n\t\treturn profile;\n\t}\n\n\tprivate async _getLibraries(\n\t\tsliceMachineConfig: SliceMachineConfig,\n\t): Promise<SliceMachineManagerGetStateReturnType[\"libraries\"]> {\n\t\tconst libraries: SliceMachineManagerGetStateReturnType[\"libraries\"] = [];\n\n\t\tif (sliceMachineConfig.libraries) {\n\t\t\tawait Promise.all(\n\t\t\t\tsliceMachineConfig.libraries.map(async (libraryID) => {\n\t\t\t\t\tconst { sliceIDs } = await this.slices.readSliceLibrary({\n\t\t\t\t\t\tlibraryID,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (sliceIDs) {\n\t\t\t\t\t\tconst components: SliceMachineManagerGetStateReturnType[\"libraries\"][number][\"components\"] =\n\t\t\t\t\t\t\t[];\n\n\t\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\t\tsliceIDs.map(async (sliceID) => {\n\t\t\t\t\t\t\t\tconst [{ model }, { mocks }] = await Promise.all([\n\t\t\t\t\t\t\t\t\tthis.slices.readSlice({ libraryID, sliceID }),\n\t\t\t\t\t\t\t\t\tthis.slices.readSliceMocks({ libraryID, sliceID }),\n\t\t\t\t\t\t\t\t]);\n\n\t\t\t\t\t\t\t\tif (model) {\n\t\t\t\t\t\t\t\t\tconst screenshots: (typeof components)[number][\"screenshots\"] =\n\t\t\t\t\t\t\t\t\t\t{};\n\t\t\t\t\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\t\t\t\t\tmodel.variations.map(async (variation) => {\n\t\t\t\t\t\t\t\t\t\t\tconst screenshot = await this.slices.readSliceScreenshot({\n\t\t\t\t\t\t\t\t\t\t\t\tlibraryID,\n\t\t\t\t\t\t\t\t\t\t\t\tsliceID,\n\t\t\t\t\t\t\t\t\t\t\t\tvariationID: variation.id,\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\tif (screenshot.data) {\n\t\t\t\t\t\t\t\t\t\t\t\tscreenshots[variation.id] = {\n\t\t\t\t\t\t\t\t\t\t\t\t\thash: createContentDigest(screenshot.data),\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata: screenshot.data,\n\t\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\tcomponents.push({\n\t\t\t\t\t\t\t\t\t\tfrom: libraryID,\n\t\t\t\t\t\t\t\t\t\thref: libraryID.replace(/\\//g, \"--\"),\n\t\t\t\t\t\t\t\t\t\tpathToSlice: \"pathToSlice\",\n\t\t\t\t\t\t\t\t\t\tfileName: \"fileName\",\n\t\t\t\t\t\t\t\t\t\textension: \"extension\",\n\t\t\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\t\t\tscreenshots,\n\t\t\t\t\t\t\t\t\t\tmock: mocks,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tlibraries.push({\n\t\t\t\t\t\t\tname: libraryID,\n\t\t\t\t\t\t\tpath: libraryID,\n\t\t\t\t\t\t\tisLocal: true, // TODO: Do we still support node_modules-based libraries?\n\t\t\t\t\t\t\tcomponents,\n\t\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\t\t// TODO: Do we still support node_modules-based libraries?\n\t\t\t\t\t\t\t\tisNodeModule: false,\n\t\t\t\t\t\t\t\tisDownloaded: false,\n\t\t\t\t\t\t\t\tisManual: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\t// Preserve library order from config file\n\t\treturn libraries.sort((library1, library2) => {\n\t\t\tconst libraryIndex1 =\n\t\t\t\tsliceMachineConfig.libraries?.indexOf(library1.name) || 0;\n\t\t\tconst libraryIndex2 =\n\t\t\t\tsliceMachineConfig.libraries?.indexOf(library2.name) || 0;\n\n\t\t\treturn Math.sign(libraryIndex1 - libraryIndex2);\n\t\t});\n\t}\n\n\tprivate async _getCustomTypes(): Promise<\n\t\tSliceMachineManagerGetStateReturnType[\"customTypes\"]\n\t> {\n\t\tconst customTypes: SliceMachineManagerGetStateReturnType[\"customTypes\"] =\n\t\t\t[];\n\n\t\tconst { ids: customTypeIDs } =\n\t\t\tawait this.customTypes.readCustomTypeLibrary();\n\n\t\tif (customTypeIDs) {\n\t\t\tawait Promise.all(\n\t\t\t\tcustomTypeIDs.map(async (customTypeID) => {\n\t\t\t\t\tconst { model } = await this.customTypes.readCustomType({\n\t\t\t\t\t\tid: customTypeID,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (model) {\n\t\t\t\t\t\tcustomTypes.push(model);\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\treturn customTypes;\n\t}\n}\n"],"names":["createPrismicAuthManager","UserManager","PrismicRepositoryManager","PluginsManager","ProjectManager","CustomTypesManager","SlicesManager","SnippetsManager","ScreenshotsManager","SimulatorManager","VersionsManager","TelemetryManager","API_ENDPOINTS","sliceMachineConfig","libraries","profile","authError","remoteCustomTypes","remoteSlices","UnauthorizedError","ForbiddenError","buildPrismicRepositoryAPIEndpoint","createContentDigest"],"mappings":"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"}
@@ -27,6 +27,7 @@ type SliceMachineManagerGetStateReturnType = {
27
27
  repo: string;
28
28
  changelog?: PackageChangelog;
29
29
  packageManager: PackageManager;
30
+ supportsSliceSimulator: boolean;
30
31
  };
31
32
  libraries: {
32
33
  name: string;
@@ -131,6 +131,7 @@ class SliceMachineManager {
131
131
  localSliceSimulatorURL: sliceMachineConfig.localSliceSimulatorURL
132
132
  },
133
133
  packageManager,
134
+ supportsSliceSimulator: this.simulator.supportsSliceSimulator(),
134
135
  repo: sliceMachineConfig.repositoryName,
135
136
  intercomHash: profile == null ? void 0 : profile.intercomHash,
136
137
  shortId: profile == null ? void 0 : profile.shortId
@@ -1 +1 @@
1
- {"version":3,"file":"SliceMachineManager.js","sources":["../../../src/managers/SliceMachineManager.ts"],"sourcesContent":["import { CustomTypes } from \"@prismicio/types-internal\";\nimport { SharedSliceContent } from \"@prismicio/types-internal/lib/content\";\nimport {\n\tForbiddenError,\n\tUnauthorizedError,\n} from \"@prismicio/custom-types-client\";\nimport {\n\tSliceMachinePlugin,\n\tSliceMachinePluginRunner,\n} from \"@slicemachine/plugin-kit\";\n\nimport { createContentDigest } from \"../lib/createContentDigest\";\n\nimport { PackageChangelog, PackageManager, SliceMachineConfig } from \"../types\";\nimport {\n\tPrismicAuthManager,\n\tPrismicUserProfile,\n} from \"../auth/PrismicAuthManager\";\nimport { createPrismicAuthManager } from \"../auth/createPrismicAuthManager\";\n\nimport { API_ENDPOINTS, APIEndpoints } from \"../constants/API_ENDPOINTS\";\n\nimport { UserManager } from \"./user/UserManager\";\nimport { PrismicRepositoryManager } from \"./prismicRepository/PrismicRepositoryManager\";\n\nimport { PluginsManager } from \"./plugins/PluginsManager\";\n\nimport { ProjectManager } from \"./project/ProjectManager\";\nimport { CustomTypesManager } from \"./customTypes/CustomTypesManager\";\nimport { SlicesManager } from \"./slices/SlicesManager\";\nimport { SnippetsManager } from \"./snippets/SnippetsManager\";\nimport { ScreenshotsManager } from \"./screenshots/ScreenshotsManager\";\nimport { SimulatorManager } from \"./simulator/SimulatorManager\";\n\nimport { VersionsManager } from \"./versions/VersionsManager\";\n\nimport { TelemetryManager } from \"./telemetry/TelemetryManager\";\nimport { buildPrismicRepositoryAPIEndpoint } from \"../lib/buildPrismicRepositoryAPIEndpoint\";\n\ntype SliceMachineManagerGetStateReturnType = {\n\tenv: {\n\t\tshortId?: string;\n\t\tintercomHash?: string;\n\t\tmanifest: {\n\t\t\tapiEndpoint: string;\n\t\t\tlocalSliceSimulatorURL?: string;\n\t\t};\n\t\trepo: string;\n\t\tchangelog?: PackageChangelog;\n\t\tpackageManager: PackageManager;\n\t};\n\tlibraries: {\n\t\tname: string;\n\t\tpath: string;\n\t\tisLocal: boolean;\n\t\tcomponents: {\n\t\t\tfrom: string;\n\t\t\thref: string;\n\t\t\tpathToSlice: string;\n\t\t\tfileName: string | null;\n\t\t\textension: string | null;\n\t\t\tmodel: CustomTypes.Widgets.Slices.SharedSlice;\n\t\t\tscreenshots: Record<\n\t\t\t\tstring,\n\t\t\t\t{\n\t\t\t\t\thash: string;\n\t\t\t\t\tdata: Buffer;\n\t\t\t\t}\n\t\t\t>;\n\t\t\tmock?: SharedSliceContent[];\n\t\t}[];\n\t\tmeta: {\n\t\t\tname?: string;\n\t\t\tversion?: string;\n\t\t\tisNodeModule: boolean;\n\t\t\tisDownloaded: boolean;\n\t\t\tisManual: boolean;\n\t\t};\n\t}[];\n\tcustomTypes: CustomTypes.CustomType[];\n\tremoteCustomTypes: CustomTypes.CustomType[];\n\tremoteSlices: CustomTypes.Widgets.Slices.SharedSlice[];\n\tclientError?: {\n\t\tname: string;\n\t\tmessage: string;\n\t\tstatus: number;\n\t\treason: string;\n\t};\n};\n\ntype SliceMachineManagerConstructorArgs = {\n\tcwd?: string;\n\tnativePlugins?: Record<string, SliceMachinePlugin>;\n};\n\nexport class SliceMachineManager {\n\tprivate _sliceMachinePluginRunner: SliceMachinePluginRunner | undefined =\n\t\tundefined;\n\tprivate _prismicAuthManager: PrismicAuthManager;\n\n\tcwd: string;\n\n\tcustomTypes: CustomTypesManager;\n\tplugins: PluginsManager;\n\tprismicRepository: PrismicRepositoryManager;\n\tproject: ProjectManager;\n\tscreenshots: ScreenshotsManager;\n\tsimulator: SimulatorManager;\n\tslices: SlicesManager;\n\tsnippets: SnippetsManager;\n\ttelemetry: TelemetryManager;\n\tuser: UserManager;\n\tversions: VersionsManager;\n\n\tconstructor(args?: SliceMachineManagerConstructorArgs) {\n\t\t// _prismicAuthManager must be set at least before UserManager\n\t\t// is instantiated. It depends on the PrismicAuthManager for\n\t\t// authentication-related methods.\n\t\tthis._prismicAuthManager = createPrismicAuthManager();\n\n\t\tthis.user = new UserManager(this);\n\t\tthis.prismicRepository = new PrismicRepositoryManager(this);\n\n\t\tthis.plugins = new PluginsManager(this, {\n\t\t\tnativePlugins: args?.nativePlugins,\n\t\t});\n\n\t\tthis.project = new ProjectManager(this);\n\t\tthis.customTypes = new CustomTypesManager(this);\n\t\tthis.slices = new SlicesManager(this);\n\t\tthis.snippets = new SnippetsManager(this);\n\t\tthis.screenshots = new ScreenshotsManager(this);\n\t\tthis.simulator = new SimulatorManager(this);\n\n\t\tthis.versions = new VersionsManager(this);\n\n\t\tthis.telemetry = new TelemetryManager(this);\n\n\t\tthis.cwd = args?.cwd ?? process.cwd();\n\t}\n\n\t// The `_sliceMachinePluginRunner` property is hidden behind a function to\n\t// discourage access. Using a function deliberatly breaks the pattern\n\t// of other child managers that are accessible as properties, like\n\t// `project`, `plugins`, etc. We do not treat SliceMachinePluginRunner\n\t// as a child manager.\n\tgetSliceMachinePluginRunner(): SliceMachinePluginRunner | undefined {\n\t\treturn this._sliceMachinePluginRunner;\n\t}\n\n\t// The `_prismicAuthManager` property is hidden behind a function to\n\t// discourage access. Using a function deliberatly breaks the pattern\n\t// of other child managers that are accessible as properties, like\n\t// `project`, `plugins`, etc. We do not treat PrismicAuthManager as a\n\t// child manager.\n\tgetPrismicAuthManager(): PrismicAuthManager {\n\t\treturn this._prismicAuthManager;\n\t}\n\n\tgetAPIEndpoints(): APIEndpoints {\n\t\treturn API_ENDPOINTS;\n\t}\n\n\t// TODO: Remove this global-state method. It is expensive and a\n\t// potential source of bugs due to data inconsistency. SM UI relies on\n\t// it heavily, so removal will require significant effort.\n\tasync getState(): Promise<SliceMachineManagerGetStateReturnType> {\n\t\tconst [\n\t\t\t{ sliceMachineConfig, libraries },\n\t\t\t{ profile, remoteCustomTypes, remoteSlices, authError },\n\t\t\tcustomTypes,\n\t\t\tpackageManager,\n\t\t] = await Promise.all([\n\t\t\tthis.project.getSliceMachineConfig().then(async (sliceMachineConfig) => {\n\t\t\t\tconst libraries = await this._getLibraries(sliceMachineConfig);\n\n\t\t\t\treturn { sliceMachineConfig, libraries };\n\t\t\t}),\n\t\t\tthis._getProfile().then(async (profile) => {\n\t\t\t\tlet authError;\n\t\t\t\tif (profile) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst [remoteCustomTypes, remoteSlices] = await Promise.all([\n\t\t\t\t\t\t\tthis.customTypes.fetchRemoteCustomTypes(),\n\t\t\t\t\t\t\tthis.slices.fetchRemoteSlices(),\n\t\t\t\t\t\t]);\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tprofile,\n\t\t\t\t\t\t\tremoteCustomTypes,\n\t\t\t\t\t\t\tremoteSlices,\n\t\t\t\t\t\t\tauthError,\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t// Non-Prismic error\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\terror instanceof UnauthorizedError ||\n\t\t\t\t\t\t\terror instanceof ForbiddenError\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tauthError = {\n\t\t\t\t\t\t\t\tname: \"__stub__\",\n\t\t\t\t\t\t\t\tmessage: \"__stub__\",\n\t\t\t\t\t\t\t\treason: \"__stub__\",\n\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tprofile,\n\t\t\t\t\tremoteCustomTypes: [],\n\t\t\t\t\tremoteSlices: [],\n\t\t\t\t\tauthError,\n\t\t\t\t};\n\t\t\t}),\n\t\t\tthis._getCustomTypes(),\n\t\t\tthis.project.detectPackageManager(),\n\t\t]);\n\n\t\t// SM UI detects if a user is logged out by looking at\n\t\t// `clientError`. Here, we simulate what the old core does by\n\t\t// returning an `ErrorWithStatus`-like object if the user does\n\t\t// not have access to the repository or is not logged in.\n\t\tconst clientError: SliceMachineManagerGetStateReturnType[\"clientError\"] =\n\t\t\tauthError ||\n\t\t\t(profile\n\t\t\t\t? undefined\n\t\t\t\t: {\n\t\t\t\t\t\tname: \"__stub__\",\n\t\t\t\t\t\tmessage: \"__stub__\",\n\t\t\t\t\t\treason: \"__stub__\",\n\t\t\t\t\t\tstatus: 401, // Needed to trigger the unauthorized flow.\n\t\t\t\t });\n\n\t\treturn {\n\t\t\tenv: {\n\t\t\t\tmanifest: {\n\t\t\t\t\tapiEndpoint:\n\t\t\t\t\t\tsliceMachineConfig.apiEndpoint ||\n\t\t\t\t\t\tbuildPrismicRepositoryAPIEndpoint(\n\t\t\t\t\t\t\tsliceMachineConfig.repositoryName,\n\t\t\t\t\t\t),\n\t\t\t\t\tlocalSliceSimulatorURL: sliceMachineConfig.localSliceSimulatorURL,\n\t\t\t\t},\n\t\t\t\tpackageManager,\n\t\t\t\trepo: sliceMachineConfig.repositoryName,\n\t\t\t\tintercomHash: profile?.intercomHash,\n\t\t\t\tshortId: profile?.shortId,\n\t\t\t},\n\t\t\tlibraries,\n\t\t\tcustomTypes,\n\t\t\tremoteCustomTypes,\n\t\t\tremoteSlices,\n\t\t\tclientError,\n\t\t};\n\t}\n\n\tprivate async _getProfile(): Promise<PrismicUserProfile | undefined> {\n\t\tlet profile: PrismicUserProfile | undefined;\n\n\t\tconst isLoggedIn = await this.user.checkIsLoggedIn();\n\n\t\tif (isLoggedIn) {\n\t\t\tprofile = await this.user.getProfile();\n\t\t\tawait this.user.refreshAuthenticationToken();\n\t\t}\n\n\t\treturn profile;\n\t}\n\n\tprivate async _getLibraries(\n\t\tsliceMachineConfig: SliceMachineConfig,\n\t): Promise<SliceMachineManagerGetStateReturnType[\"libraries\"]> {\n\t\tconst libraries: SliceMachineManagerGetStateReturnType[\"libraries\"] = [];\n\n\t\tif (sliceMachineConfig.libraries) {\n\t\t\tawait Promise.all(\n\t\t\t\tsliceMachineConfig.libraries.map(async (libraryID) => {\n\t\t\t\t\tconst { sliceIDs } = await this.slices.readSliceLibrary({\n\t\t\t\t\t\tlibraryID,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (sliceIDs) {\n\t\t\t\t\t\tconst components: SliceMachineManagerGetStateReturnType[\"libraries\"][number][\"components\"] =\n\t\t\t\t\t\t\t[];\n\n\t\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\t\tsliceIDs.map(async (sliceID) => {\n\t\t\t\t\t\t\t\tconst [{ model }, { mocks }] = await Promise.all([\n\t\t\t\t\t\t\t\t\tthis.slices.readSlice({ libraryID, sliceID }),\n\t\t\t\t\t\t\t\t\tthis.slices.readSliceMocks({ libraryID, sliceID }),\n\t\t\t\t\t\t\t\t]);\n\n\t\t\t\t\t\t\t\tif (model) {\n\t\t\t\t\t\t\t\t\tconst screenshots: (typeof components)[number][\"screenshots\"] =\n\t\t\t\t\t\t\t\t\t\t{};\n\t\t\t\t\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\t\t\t\t\tmodel.variations.map(async (variation) => {\n\t\t\t\t\t\t\t\t\t\t\tconst screenshot = await this.slices.readSliceScreenshot({\n\t\t\t\t\t\t\t\t\t\t\t\tlibraryID,\n\t\t\t\t\t\t\t\t\t\t\t\tsliceID,\n\t\t\t\t\t\t\t\t\t\t\t\tvariationID: variation.id,\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\tif (screenshot.data) {\n\t\t\t\t\t\t\t\t\t\t\t\tscreenshots[variation.id] = {\n\t\t\t\t\t\t\t\t\t\t\t\t\thash: createContentDigest(screenshot.data),\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata: screenshot.data,\n\t\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\tcomponents.push({\n\t\t\t\t\t\t\t\t\t\tfrom: libraryID,\n\t\t\t\t\t\t\t\t\t\thref: libraryID.replace(/\\//g, \"--\"),\n\t\t\t\t\t\t\t\t\t\tpathToSlice: \"pathToSlice\",\n\t\t\t\t\t\t\t\t\t\tfileName: \"fileName\",\n\t\t\t\t\t\t\t\t\t\textension: \"extension\",\n\t\t\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\t\t\tscreenshots,\n\t\t\t\t\t\t\t\t\t\tmock: mocks,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tlibraries.push({\n\t\t\t\t\t\t\tname: libraryID,\n\t\t\t\t\t\t\tpath: libraryID,\n\t\t\t\t\t\t\tisLocal: true, // TODO: Do we still support node_modules-based libraries?\n\t\t\t\t\t\t\tcomponents,\n\t\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\t\t// TODO: Do we still support node_modules-based libraries?\n\t\t\t\t\t\t\t\tisNodeModule: false,\n\t\t\t\t\t\t\t\tisDownloaded: false,\n\t\t\t\t\t\t\t\tisManual: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\t// Preserve library order from config file\n\t\treturn libraries.sort((library1, library2) => {\n\t\t\tconst libraryIndex1 =\n\t\t\t\tsliceMachineConfig.libraries?.indexOf(library1.name) || 0;\n\t\t\tconst libraryIndex2 =\n\t\t\t\tsliceMachineConfig.libraries?.indexOf(library2.name) || 0;\n\n\t\t\treturn Math.sign(libraryIndex1 - libraryIndex2);\n\t\t});\n\t}\n\n\tprivate async _getCustomTypes(): Promise<\n\t\tSliceMachineManagerGetStateReturnType[\"customTypes\"]\n\t> {\n\t\tconst customTypes: SliceMachineManagerGetStateReturnType[\"customTypes\"] =\n\t\t\t[];\n\n\t\tconst { ids: customTypeIDs } =\n\t\t\tawait this.customTypes.readCustomTypeLibrary();\n\n\t\tif (customTypeIDs) {\n\t\t\tawait Promise.all(\n\t\t\t\tcustomTypeIDs.map(async (customTypeID) => {\n\t\t\t\t\tconst { model } = await this.customTypes.readCustomType({\n\t\t\t\t\t\tid: customTypeID,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (model) {\n\t\t\t\t\t\tcustomTypes.push(model);\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\treturn customTypes;\n\t}\n}\n"],"names":["sliceMachineConfig","libraries","profile","authError","remoteCustomTypes","remoteSlices"],"mappings":"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"}
1
+ {"version":3,"file":"SliceMachineManager.js","sources":["../../../src/managers/SliceMachineManager.ts"],"sourcesContent":["import { CustomTypes } from \"@prismicio/types-internal\";\nimport { SharedSliceContent } from \"@prismicio/types-internal/lib/content\";\nimport {\n\tForbiddenError,\n\tUnauthorizedError,\n} from \"@prismicio/custom-types-client\";\nimport {\n\tSliceMachinePlugin,\n\tSliceMachinePluginRunner,\n} from \"@slicemachine/plugin-kit\";\n\nimport { createContentDigest } from \"../lib/createContentDigest\";\n\nimport { PackageChangelog, PackageManager, SliceMachineConfig } from \"../types\";\nimport {\n\tPrismicAuthManager,\n\tPrismicUserProfile,\n} from \"../auth/PrismicAuthManager\";\nimport { createPrismicAuthManager } from \"../auth/createPrismicAuthManager\";\n\nimport { API_ENDPOINTS, APIEndpoints } from \"../constants/API_ENDPOINTS\";\n\nimport { UserManager } from \"./user/UserManager\";\nimport { PrismicRepositoryManager } from \"./prismicRepository/PrismicRepositoryManager\";\n\nimport { PluginsManager } from \"./plugins/PluginsManager\";\n\nimport { ProjectManager } from \"./project/ProjectManager\";\nimport { CustomTypesManager } from \"./customTypes/CustomTypesManager\";\nimport { SlicesManager } from \"./slices/SlicesManager\";\nimport { SnippetsManager } from \"./snippets/SnippetsManager\";\nimport { ScreenshotsManager } from \"./screenshots/ScreenshotsManager\";\nimport { SimulatorManager } from \"./simulator/SimulatorManager\";\n\nimport { VersionsManager } from \"./versions/VersionsManager\";\n\nimport { TelemetryManager } from \"./telemetry/TelemetryManager\";\nimport { buildPrismicRepositoryAPIEndpoint } from \"../lib/buildPrismicRepositoryAPIEndpoint\";\n\ntype SliceMachineManagerGetStateReturnType = {\n\tenv: {\n\t\tshortId?: string;\n\t\tintercomHash?: string;\n\t\tmanifest: {\n\t\t\tapiEndpoint: string;\n\t\t\tlocalSliceSimulatorURL?: string;\n\t\t};\n\t\trepo: string;\n\t\tchangelog?: PackageChangelog;\n\t\tpackageManager: PackageManager;\n\t\tsupportsSliceSimulator: boolean;\n\t};\n\tlibraries: {\n\t\tname: string;\n\t\tpath: string;\n\t\tisLocal: boolean;\n\t\tcomponents: {\n\t\t\tfrom: string;\n\t\t\thref: string;\n\t\t\tpathToSlice: string;\n\t\t\tfileName: string | null;\n\t\t\textension: string | null;\n\t\t\tmodel: CustomTypes.Widgets.Slices.SharedSlice;\n\t\t\tscreenshots: Record<\n\t\t\t\tstring,\n\t\t\t\t{\n\t\t\t\t\thash: string;\n\t\t\t\t\tdata: Buffer;\n\t\t\t\t}\n\t\t\t>;\n\t\t\tmock?: SharedSliceContent[];\n\t\t}[];\n\t\tmeta: {\n\t\t\tname?: string;\n\t\t\tversion?: string;\n\t\t\tisNodeModule: boolean;\n\t\t\tisDownloaded: boolean;\n\t\t\tisManual: boolean;\n\t\t};\n\t}[];\n\tcustomTypes: CustomTypes.CustomType[];\n\tremoteCustomTypes: CustomTypes.CustomType[];\n\tremoteSlices: CustomTypes.Widgets.Slices.SharedSlice[];\n\tclientError?: {\n\t\tname: string;\n\t\tmessage: string;\n\t\tstatus: number;\n\t\treason: string;\n\t};\n};\n\ntype SliceMachineManagerConstructorArgs = {\n\tcwd?: string;\n\tnativePlugins?: Record<string, SliceMachinePlugin>;\n};\n\nexport class SliceMachineManager {\n\tprivate _sliceMachinePluginRunner: SliceMachinePluginRunner | undefined =\n\t\tundefined;\n\tprivate _prismicAuthManager: PrismicAuthManager;\n\n\tcwd: string;\n\n\tcustomTypes: CustomTypesManager;\n\tplugins: PluginsManager;\n\tprismicRepository: PrismicRepositoryManager;\n\tproject: ProjectManager;\n\tscreenshots: ScreenshotsManager;\n\tsimulator: SimulatorManager;\n\tslices: SlicesManager;\n\tsnippets: SnippetsManager;\n\ttelemetry: TelemetryManager;\n\tuser: UserManager;\n\tversions: VersionsManager;\n\n\tconstructor(args?: SliceMachineManagerConstructorArgs) {\n\t\t// _prismicAuthManager must be set at least before UserManager\n\t\t// is instantiated. It depends on the PrismicAuthManager for\n\t\t// authentication-related methods.\n\t\tthis._prismicAuthManager = createPrismicAuthManager();\n\n\t\tthis.user = new UserManager(this);\n\t\tthis.prismicRepository = new PrismicRepositoryManager(this);\n\n\t\tthis.plugins = new PluginsManager(this, {\n\t\t\tnativePlugins: args?.nativePlugins,\n\t\t});\n\n\t\tthis.project = new ProjectManager(this);\n\t\tthis.customTypes = new CustomTypesManager(this);\n\t\tthis.slices = new SlicesManager(this);\n\t\tthis.snippets = new SnippetsManager(this);\n\t\tthis.screenshots = new ScreenshotsManager(this);\n\t\tthis.simulator = new SimulatorManager(this);\n\n\t\tthis.versions = new VersionsManager(this);\n\n\t\tthis.telemetry = new TelemetryManager(this);\n\n\t\tthis.cwd = args?.cwd ?? process.cwd();\n\t}\n\n\t// The `_sliceMachinePluginRunner` property is hidden behind a function to\n\t// discourage access. Using a function deliberatly breaks the pattern\n\t// of other child managers that are accessible as properties, like\n\t// `project`, `plugins`, etc. We do not treat SliceMachinePluginRunner\n\t// as a child manager.\n\tgetSliceMachinePluginRunner(): SliceMachinePluginRunner | undefined {\n\t\treturn this._sliceMachinePluginRunner;\n\t}\n\n\t// The `_prismicAuthManager` property is hidden behind a function to\n\t// discourage access. Using a function deliberatly breaks the pattern\n\t// of other child managers that are accessible as properties, like\n\t// `project`, `plugins`, etc. We do not treat PrismicAuthManager as a\n\t// child manager.\n\tgetPrismicAuthManager(): PrismicAuthManager {\n\t\treturn this._prismicAuthManager;\n\t}\n\n\tgetAPIEndpoints(): APIEndpoints {\n\t\treturn API_ENDPOINTS;\n\t}\n\n\t// TODO: Remove this global-state method. It is expensive and a\n\t// potential source of bugs due to data inconsistency. SM UI relies on\n\t// it heavily, so removal will require significant effort.\n\tasync getState(): Promise<SliceMachineManagerGetStateReturnType> {\n\t\tconst [\n\t\t\t{ sliceMachineConfig, libraries },\n\t\t\t{ profile, remoteCustomTypes, remoteSlices, authError },\n\t\t\tcustomTypes,\n\t\t\tpackageManager,\n\t\t] = await Promise.all([\n\t\t\tthis.project.getSliceMachineConfig().then(async (sliceMachineConfig) => {\n\t\t\t\tconst libraries = await this._getLibraries(sliceMachineConfig);\n\n\t\t\t\treturn { sliceMachineConfig, libraries };\n\t\t\t}),\n\t\t\tthis._getProfile().then(async (profile) => {\n\t\t\t\tlet authError;\n\t\t\t\tif (profile) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst [remoteCustomTypes, remoteSlices] = await Promise.all([\n\t\t\t\t\t\t\tthis.customTypes.fetchRemoteCustomTypes(),\n\t\t\t\t\t\t\tthis.slices.fetchRemoteSlices(),\n\t\t\t\t\t\t]);\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tprofile,\n\t\t\t\t\t\t\tremoteCustomTypes,\n\t\t\t\t\t\t\tremoteSlices,\n\t\t\t\t\t\t\tauthError,\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t// Non-Prismic error\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\terror instanceof UnauthorizedError ||\n\t\t\t\t\t\t\terror instanceof ForbiddenError\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tauthError = {\n\t\t\t\t\t\t\t\tname: \"__stub__\",\n\t\t\t\t\t\t\t\tmessage: \"__stub__\",\n\t\t\t\t\t\t\t\treason: \"__stub__\",\n\t\t\t\t\t\t\t\tstatus: 401,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tprofile,\n\t\t\t\t\tremoteCustomTypes: [],\n\t\t\t\t\tremoteSlices: [],\n\t\t\t\t\tauthError,\n\t\t\t\t};\n\t\t\t}),\n\t\t\tthis._getCustomTypes(),\n\t\t\tthis.project.detectPackageManager(),\n\t\t]);\n\n\t\t// SM UI detects if a user is logged out by looking at\n\t\t// `clientError`. Here, we simulate what the old core does by\n\t\t// returning an `ErrorWithStatus`-like object if the user does\n\t\t// not have access to the repository or is not logged in.\n\t\tconst clientError: SliceMachineManagerGetStateReturnType[\"clientError\"] =\n\t\t\tauthError ||\n\t\t\t(profile\n\t\t\t\t? undefined\n\t\t\t\t: {\n\t\t\t\t\t\tname: \"__stub__\",\n\t\t\t\t\t\tmessage: \"__stub__\",\n\t\t\t\t\t\treason: \"__stub__\",\n\t\t\t\t\t\tstatus: 401, // Needed to trigger the unauthorized flow.\n\t\t\t\t });\n\n\t\treturn {\n\t\t\tenv: {\n\t\t\t\tmanifest: {\n\t\t\t\t\tapiEndpoint:\n\t\t\t\t\t\tsliceMachineConfig.apiEndpoint ||\n\t\t\t\t\t\tbuildPrismicRepositoryAPIEndpoint(\n\t\t\t\t\t\t\tsliceMachineConfig.repositoryName,\n\t\t\t\t\t\t),\n\t\t\t\t\tlocalSliceSimulatorURL: sliceMachineConfig.localSliceSimulatorURL,\n\t\t\t\t},\n\t\t\t\tpackageManager,\n\t\t\t\tsupportsSliceSimulator: this.simulator.supportsSliceSimulator(),\n\t\t\t\trepo: sliceMachineConfig.repositoryName,\n\t\t\t\tintercomHash: profile?.intercomHash,\n\t\t\t\tshortId: profile?.shortId,\n\t\t\t},\n\t\t\tlibraries,\n\t\t\tcustomTypes,\n\t\t\tremoteCustomTypes,\n\t\t\tremoteSlices,\n\t\t\tclientError,\n\t\t};\n\t}\n\n\tprivate async _getProfile(): Promise<PrismicUserProfile | undefined> {\n\t\tlet profile: PrismicUserProfile | undefined;\n\n\t\tconst isLoggedIn = await this.user.checkIsLoggedIn();\n\n\t\tif (isLoggedIn) {\n\t\t\tprofile = await this.user.getProfile();\n\t\t\tawait this.user.refreshAuthenticationToken();\n\t\t}\n\n\t\treturn profile;\n\t}\n\n\tprivate async _getLibraries(\n\t\tsliceMachineConfig: SliceMachineConfig,\n\t): Promise<SliceMachineManagerGetStateReturnType[\"libraries\"]> {\n\t\tconst libraries: SliceMachineManagerGetStateReturnType[\"libraries\"] = [];\n\n\t\tif (sliceMachineConfig.libraries) {\n\t\t\tawait Promise.all(\n\t\t\t\tsliceMachineConfig.libraries.map(async (libraryID) => {\n\t\t\t\t\tconst { sliceIDs } = await this.slices.readSliceLibrary({\n\t\t\t\t\t\tlibraryID,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (sliceIDs) {\n\t\t\t\t\t\tconst components: SliceMachineManagerGetStateReturnType[\"libraries\"][number][\"components\"] =\n\t\t\t\t\t\t\t[];\n\n\t\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\t\tsliceIDs.map(async (sliceID) => {\n\t\t\t\t\t\t\t\tconst [{ model }, { mocks }] = await Promise.all([\n\t\t\t\t\t\t\t\t\tthis.slices.readSlice({ libraryID, sliceID }),\n\t\t\t\t\t\t\t\t\tthis.slices.readSliceMocks({ libraryID, sliceID }),\n\t\t\t\t\t\t\t\t]);\n\n\t\t\t\t\t\t\t\tif (model) {\n\t\t\t\t\t\t\t\t\tconst screenshots: (typeof components)[number][\"screenshots\"] =\n\t\t\t\t\t\t\t\t\t\t{};\n\t\t\t\t\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\t\t\t\t\tmodel.variations.map(async (variation) => {\n\t\t\t\t\t\t\t\t\t\t\tconst screenshot = await this.slices.readSliceScreenshot({\n\t\t\t\t\t\t\t\t\t\t\t\tlibraryID,\n\t\t\t\t\t\t\t\t\t\t\t\tsliceID,\n\t\t\t\t\t\t\t\t\t\t\t\tvariationID: variation.id,\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\tif (screenshot.data) {\n\t\t\t\t\t\t\t\t\t\t\t\tscreenshots[variation.id] = {\n\t\t\t\t\t\t\t\t\t\t\t\t\thash: createContentDigest(screenshot.data),\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata: screenshot.data,\n\t\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\tcomponents.push({\n\t\t\t\t\t\t\t\t\t\tfrom: libraryID,\n\t\t\t\t\t\t\t\t\t\thref: libraryID.replace(/\\//g, \"--\"),\n\t\t\t\t\t\t\t\t\t\tpathToSlice: \"pathToSlice\",\n\t\t\t\t\t\t\t\t\t\tfileName: \"fileName\",\n\t\t\t\t\t\t\t\t\t\textension: \"extension\",\n\t\t\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\t\t\tscreenshots,\n\t\t\t\t\t\t\t\t\t\tmock: mocks,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tlibraries.push({\n\t\t\t\t\t\t\tname: libraryID,\n\t\t\t\t\t\t\tpath: libraryID,\n\t\t\t\t\t\t\tisLocal: true, // TODO: Do we still support node_modules-based libraries?\n\t\t\t\t\t\t\tcomponents,\n\t\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\t\t// TODO: Do we still support node_modules-based libraries?\n\t\t\t\t\t\t\t\tisNodeModule: false,\n\t\t\t\t\t\t\t\tisDownloaded: false,\n\t\t\t\t\t\t\t\tisManual: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\t// Preserve library order from config file\n\t\treturn libraries.sort((library1, library2) => {\n\t\t\tconst libraryIndex1 =\n\t\t\t\tsliceMachineConfig.libraries?.indexOf(library1.name) || 0;\n\t\t\tconst libraryIndex2 =\n\t\t\t\tsliceMachineConfig.libraries?.indexOf(library2.name) || 0;\n\n\t\t\treturn Math.sign(libraryIndex1 - libraryIndex2);\n\t\t});\n\t}\n\n\tprivate async _getCustomTypes(): Promise<\n\t\tSliceMachineManagerGetStateReturnType[\"customTypes\"]\n\t> {\n\t\tconst customTypes: SliceMachineManagerGetStateReturnType[\"customTypes\"] =\n\t\t\t[];\n\n\t\tconst { ids: customTypeIDs } =\n\t\t\tawait this.customTypes.readCustomTypeLibrary();\n\n\t\tif (customTypeIDs) {\n\t\t\tawait Promise.all(\n\t\t\t\tcustomTypeIDs.map(async (customTypeID) => {\n\t\t\t\t\tconst { model } = await this.customTypes.readCustomType({\n\t\t\t\t\t\tid: customTypeID,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (model) {\n\t\t\t\t\t\tcustomTypes.push(model);\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\treturn customTypes;\n\t}\n}\n"],"names":["sliceMachineConfig","libraries","profile","authError","remoteCustomTypes","remoteSlices"],"mappings":"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"}
@@ -280,30 +280,28 @@ class PrismicRepositoryManager extends BaseManager.BaseManager {
280
280
  confirmDeleteDocuments: args.confirmDeleteDocuments,
281
281
  changes: allChanges
282
282
  };
283
- const authenticationToken = await this.user.getAuthenticationToken();
284
283
  const sliceMachineConfig = await this.project.getSliceMachineConfig();
285
- return index.default(new URL("/bulk", API_ENDPOINTS.API_ENDPOINTS.PrismicModels).toString(), {
286
- body: JSON.stringify(requestBody),
284
+ const response = await this._fetch({
285
+ url: new URL("/bulk", API_ENDPOINTS.API_ENDPOINTS.PrismicModels),
287
286
  method: "POST",
288
- headers: {
289
- Authorization: `Bearer ${authenticationToken}`,
290
- "User-Agent": "slice-machine",
291
- repository: sliceMachineConfig.repositoryName,
292
- "Content-Type": "application/json"
293
- }
294
- }).then(async (response) => {
295
- if (response.status === 204) {
296
- return null;
297
- }
298
- return this._decodeLimitOrThrow(await response.json(), response.status, types.LimitType.SOFT);
299
- }).catch((err) => {
300
- try {
301
- const data = JSON.parse(err.message);
302
- return this._decodeLimitOrThrow(data, err.status, types.LimitType.HARD);
303
- } catch {
304
- throw err;
305
- }
287
+ body: requestBody,
288
+ repository: sliceMachineConfig.repositoryName
306
289
  });
290
+ switch (response.status) {
291
+ case 202:
292
+ return this._decodeLimitOrThrow(await response.json(), response.status, types.LimitType.SOFT);
293
+ case 204:
294
+ return null;
295
+ case 401:
296
+ throw new errors.UnauthenticatedError();
297
+ case 403:
298
+ return this._decodeLimitOrThrow(await response.json(), response.status, types.LimitType.HARD);
299
+ case 400:
300
+ const text = await response.text();
301
+ throw new Error(text);
302
+ default:
303
+ throw new Error(`Unexpected status code ${response.status}`);
304
+ }
307
305
  } catch (err) {
308
306
  console.error("An error happened while pushing your changes");
309
307
  console.error(err);
@@ -328,6 +326,9 @@ class PrismicRepositoryManager extends BaseManager.BaseManager {
328
326
  if (args.body) {
329
327
  extraHeaders["Content-Type"] = "application/json";
330
328
  }
329
+ if (args.repository) {
330
+ extraHeaders.repository = args.repository;
331
+ }
331
332
  return await index.default(args.url.toString(), {
332
333
  method: args.method,
333
334
  body: args.body ? JSON.stringify(args.body) : void 0,
@@ -1 +1 @@
1
- {"version":3,"file":"PrismicRepositoryManager.cjs","sources":["../../../../src/managers/prismicRepository/PrismicRepositoryManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport fetch, { Response } from \"node-fetch\";\nimport { fold } from \"fp-ts/Either\";\n\nimport { decode } from \"../../lib/decode\";\nimport { serializeCookies } from \"../../lib/serializeCookies\";\n\nimport { SLICE_MACHINE_USER_AGENT } from \"../../constants/SLICE_MACHINE_USER_AGENT\";\nimport { API_ENDPOINTS } from \"../../constants/API_ENDPOINTS\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nimport {\n\tAllChangeTypes,\n\tBulkBody,\n\tChangeTypes,\n\tClientError,\n\tLimit,\n\tLimitType,\n\tPrismicRepository,\n\tPrismicRepositoryRole,\n\tPrismicRepositoryUserAgent,\n\tPrismicRepositoryUserAgents,\n\tRawLimit,\n\tTransactionalMergeArgs,\n\tTransactionalMergeReturnType,\n} from \"./types\";\nimport { assertPluginsInitialized } from \"../../lib/assertPluginsInitialized\";\nimport { UnauthenticatedError } from \"../../errors\";\n\nconst DEFAULT_REPOSITORY_SETTINGS = {\n\tplan: \"personal\",\n\tisAnnual: \"false\",\n\trole: \"developer\",\n};\n\ntype PrismicRepositoryManagerCheckExistsArgs = {\n\tdomain: string;\n};\n\ntype PrismicRepositoryManagerCreateArgs = {\n\tdomain: string;\n\tframework: string; // TODO: Type(?)\n};\n\ntype PrismicRepositoryManagerDeleteArgs = {\n\tdomain: string;\n\tpassword: string;\n};\n\ntype PrismicRepositoryManagerPushDocumentsArgs = {\n\tdomain: string;\n\tsignature: string;\n\tdocuments: Record<string, unknown>; // TODO: Type unknown if possible(?)\n};\n\nexport class PrismicRepositoryManager extends BaseManager {\n\t// TODO: Add methods for repository-specific actions. E.g. creating a\n\t// new repository.\n\n\tasync readAll(): Promise<PrismicRepository[]> {\n\t\tconst url = new URL(\"./repositories\", API_ENDPOINTS.PrismicUser);\n\t\tconst res = await this._fetch({ url });\n\t\tconst json = await res.json();\n\n\t\tif (res.ok) {\n\t\t\tconst { value: repositories, error } = decode(\n\t\t\t\tt.array(PrismicRepository),\n\t\t\t\tjson,\n\t\t\t);\n\n\t\t\tif (error) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to decode repositories: ${error.errors.join(\", \")}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn repositories;\n\t\t} else {\n\t\t\tthrow new Error(`Failed to read repositories`, { cause: json });\n\t\t}\n\t}\n\n\t// Should this be in manager? It's one of the few sync method\n\t//\n\t// Reply from Angelo 2022-12-22: I think it should be in manager\n\t// because we shouldn't be exporting root-level utilities from this\n\t// package. If we want to make it more inline with the other methods,\n\t// we could simplify the API by changing its signature to the\n\t// following:\n\t//\n\t// ```ts\n\t// (repositoryName: string) => Promise<boolean>\n\t// ```\n\t//\n\t// This method would:\n\t//\n\t// 1. Fetch the list of repositories for the user using `readAll()`.\n\t// The list would be cached.\n\t// 2. Determine if the user has write access to the given repository.\n\t//\n\t// This version has the following benefits:\n\t//\n\t// - Does not expect the consumer to supply a repository object; it\n\t// only requires a repository name, which could be sourced from\n\t// anything (incl. the project's `sm.json`).\n\t//\n\t// - Similarly, it does not expect the consumer to call `readAll()`\n\t// before calling this method.\n\t//\n\t// - Works for repositories that the user does not have access to. For\n\t// example, I could use it to check if I have access to \"qwerty\",\n\t// even if I am not added as a user. The purpose of the method is\n\t// still valid: do I have write access to a given repository?\n\thasWriteAccess(repository: PrismicRepository): boolean {\n\t\tswitch (repository.role) {\n\t\t\tcase PrismicRepositoryRole.SuperUser:\n\t\t\tcase PrismicRepositoryRole.Owner:\n\t\t\tcase PrismicRepositoryRole.Administrator:\n\t\t\t\treturn true;\n\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync checkExists(\n\t\targs: PrismicRepositoryManagerCheckExistsArgs,\n\t): Promise<boolean> {\n\t\tconst url = new URL(\n\t\t\t`./app/dashboard/repositories/${args.domain}/exists`,\n\t\t\tAPI_ENDPOINTS.PrismicWroom,\n\t\t);\n\t\tconst res = await this._fetch({ url });\n\t\tconst text = await res.text();\n\n\t\tif (res.ok) {\n\t\t\treturn text === \"false\"; // Endpoint returns `false` when repository exists\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to check repository existence for domain \\`${args.domain}\\``,\n\t\t\t\t{ cause: text },\n\t\t\t);\n\t\t}\n\t}\n\n\tasync create(args: PrismicRepositoryManagerCreateArgs): Promise<void> {\n\t\tconst url = new URL(\n\t\t\t\"./authentication/newrepository?app=slicemachine\",\n\t\t\tAPI_ENDPOINTS.PrismicWroom,\n\t\t);\n\n\t\tconst body = {\n\t\t\t...DEFAULT_REPOSITORY_SETTINGS,\n\t\t\tdomain: args.domain,\n\t\t\tframework: args.framework, // This property appears to be optional for the API\n\t\t};\n\n\t\tconst res = await this._fetch({\n\t\t\turl,\n\t\t\tmethod: \"POST\",\n\t\t\tbody,\n\t\t\tuserAgent: PrismicRepositoryUserAgent.SliceMachine, // Custom User Agent is required\n\t\t});\n\t\tconst text = await res.text();\n\n\t\t// Endpoint returns repository name on success, which must be more than 4 characters and less than 30\n\t\t// if (!res.ok) {\n\t\tif (!res.ok || text.length < 4 || text.length > 30) {\n\t\t\tthrow new Error(`Failed to create repository \\`${args.domain}\\``, {\n\t\t\t\tcause: res,\n\t\t\t});\n\t\t}\n\t}\n\n\t// TODO: Delete this endpoint? It doesn't seem to be used (I might be wrong). - Angelo\n\tasync delete(args: PrismicRepositoryManagerDeleteArgs): Promise<void> {\n\t\tconst cookies = await this.user.getAuthenticationCookies();\n\n\t\tconst url = new URL(\n\t\t\t`./app/settings/delete?_=${cookies[\"X_XSRF\"]}`, // TODO: Maybe we want to throw early if the token is no available, or get the token another way\n\t\t\tAPI_ENDPOINTS.PrismicWroom,\n\t\t);\n\t\t// Update hostname to include repository domain\n\t\turl.hostname = `${args.domain}.${url.hostname}`;\n\n\t\tconst body = {\n\t\t\tconfirm: args.domain,\n\t\t\tpassword: args.password,\n\t\t};\n\n\t\tconst res = await this._fetch({\n\t\t\turl,\n\t\t\tmethod: \"POST\",\n\t\t\tbody,\n\t\t\tuserAgent: PrismicRepositoryUserAgent.LegacyZero, // Custom User Agent is required\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tthrow new Error(`Failed to delete repository \\`${args.domain}\\``, {\n\t\t\t\tcause: res,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync pushDocuments(\n\t\targs: PrismicRepositoryManagerPushDocumentsArgs,\n\t): Promise<void> {\n\t\tconst url = new URL(\"./starter/documents\", API_ENDPOINTS.PrismicWroom);\n\t\t// Update hostname to include repository domain\n\t\turl.hostname = `${args.domain}.${url.hostname}`;\n\n\t\tconst body = {\n\t\t\tsignature: args.signature,\n\t\t\tdocuments: JSON.stringify(args.documents),\n\t\t};\n\n\t\tconst res = await this._fetch({\n\t\t\turl,\n\t\t\tmethod: \"POST\",\n\t\t\tbody,\n\t\t\tuserAgent: PrismicRepositoryUserAgent.LegacyZero, // Custom User Agent is required\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tlet reason: string | null = null;\n\t\t\ttry {\n\t\t\t\treason = await res.text();\n\t\t\t} catch {\n\t\t\t\t// Noop\n\t\t\t}\n\n\t\t\t// Ideally the API should throw a 409 or something like that...\n\t\t\tif (reason === \"Repository should not contain documents\") {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to push documents to repository \\`${args.domain}\\`, repository is not empty`,\n\t\t\t\t\t{\n\t\t\t\t\t\tcause: res,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to push documents to repository \\`${args.domain}\\`, ${res.status} ${res.statusText}`,\n\t\t\t\t{\n\t\t\t\t\tcause: res,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t}\n\n\tasync pushChanges(\n\t\targs: TransactionalMergeArgs,\n\t): Promise<TransactionalMergeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tif (!(await this.user.checkIsLoggedIn())) {\n\t\t\tthrow new UnauthenticatedError();\n\t\t}\n\n\t\ttry {\n\t\t\tconst allChanges: AllChangeTypes[] = await Promise.all(\n\t\t\t\targs.changes.map(async (change) => {\n\t\t\t\t\tif (change.type === \"Slice\") {\n\t\t\t\t\t\tswitch (change.status) {\n\t\t\t\t\t\t\tcase \"NEW\": {\n\t\t\t\t\t\t\t\tconst { model } = await this.slices.readSlice({\n\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\tsliceID: change.id,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (!model) {\n\t\t\t\t\t\t\t\t\tthrow Error(`Could not find model ${change.id}`);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst modelWithScreenshots =\n\t\t\t\t\t\t\t\t\tawait this.slices.updateSliceModelScreenshotsInPlace({\n\t\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tawait this.slices.updateSlice({\n\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\tmodel: modelWithScreenshots,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.SLICE_INSERT,\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: modelWithScreenshots,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase \"MODIFIED\": {\n\t\t\t\t\t\t\t\tconst { model } = await this.slices.readSlice({\n\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\tsliceID: change.id,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (!model) {\n\t\t\t\t\t\t\t\t\tthrow Error(`Could not find model ${change.id}`);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst modelWithScreenshots =\n\t\t\t\t\t\t\t\t\tawait this.slices.updateSliceModelScreenshotsInPlace({\n\t\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tawait this.slices.updateSlice({\n\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\tmodel: modelWithScreenshots,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.SLICE_UPDATE,\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: modelWithScreenshots,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase \"DELETED\":\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: { id: change.id },\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.SLICE_DELETE,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tswitch (change.status) {\n\t\t\t\t\t\t\tcase \"NEW\": {\n\t\t\t\t\t\t\t\tconst { model } = await this.customTypes.readCustomType({\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (!model) {\n\t\t\t\t\t\t\t\t\tthrow Error(`Could not find model ${change.id}`);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.CUSTOM_TYPE_INSERT,\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: model,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase \"MODIFIED\": {\n\t\t\t\t\t\t\t\tconst { model } = await this.customTypes.readCustomType({\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (!model) {\n\t\t\t\t\t\t\t\t\tthrow Error(`Could not find model ${change.id}`);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.CUSTOM_TYPE_UPDATE,\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: model,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase \"DELETED\":\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: { id: change.id },\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.CUSTOM_TYPE_DELETE,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\t// Compute the POST body\n\t\t\tconst requestBody: BulkBody = {\n\t\t\t\tconfirmDeleteDocuments: args.confirmDeleteDocuments,\n\t\t\t\tchanges: allChanges,\n\t\t\t};\n\n\t\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\t\tconst sliceMachineConfig = await this.project.getSliceMachineConfig();\n\n\t\t\t// TODO: move to customtypes client\n\t\t\treturn fetch(new URL(\"/bulk\", API_ENDPOINTS.PrismicModels).toString(), {\n\t\t\t\tbody: JSON.stringify(requestBody),\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: `Bearer ${authenticationToken}`,\n\t\t\t\t\t\"User-Agent\": \"slice-machine\",\n\t\t\t\t\trepository: sliceMachineConfig.repositoryName,\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t},\n\t\t\t})\n\t\t\t\t.then(async (response) => {\n\t\t\t\t\tif (response.status === 204) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this._decodeLimitOrThrow(\n\t\t\t\t\t\tawait response.json(),\n\t\t\t\t\t\tresponse.status,\n\t\t\t\t\t\tLimitType.SOFT,\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t\t.catch((err: ClientError) => {\n\t\t\t\t\t// Try to decode a limit from the error or throw the original error\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst data: unknown = JSON.parse(err.message);\n\n\t\t\t\t\t\treturn this._decodeLimitOrThrow(data, err.status, LimitType.HARD);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tthrow err;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t} catch (err) {\n\t\t\tconsole.error(\"An error happened while pushing your changes\");\n\t\t\tconsole.error(err);\n\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tprivate _decodeLimitOrThrow(\n\t\tpotentialLimit: unknown,\n\t\tstatusCode: number,\n\t\tlimitType: LimitType,\n\t): Limit | null {\n\t\treturn fold<t.Errors, RawLimit, Limit | null>(\n\t\t\t() => {\n\t\t\t\tconst error: ClientError = {\n\t\t\t\t\tstatus: statusCode,\n\t\t\t\t\tmessage: `Unable to parse raw limit from ${JSON.stringify(\n\t\t\t\t\t\tpotentialLimit,\n\t\t\t\t\t)}`,\n\t\t\t\t};\n\t\t\t\tthrow error;\n\t\t\t},\n\t\t\t(rawLimit: RawLimit) => {\n\t\t\t\tconst limit = { ...rawLimit, type: limitType };\n\n\t\t\t\treturn limit;\n\t\t\t},\n\t\t)(RawLimit.decode(potentialLimit));\n\t}\n\n\tprivate async _fetch(args: {\n\t\turl: URL;\n\t\tmethod?: \"GET\" | \"POST\";\n\t\tbody?: unknown;\n\t\tuserAgent?: PrismicRepositoryUserAgents;\n\t}): Promise<Response> {\n\t\tconst cookies = await this.user.getAuthenticationCookies();\n\n\t\tconst extraHeaders: Record<string, string> = {};\n\n\t\tif (args.body) {\n\t\t\textraHeaders[\"Content-Type\"] = \"application/json\";\n\t\t}\n\n\t\treturn await fetch(args.url.toString(), {\n\t\t\tmethod: args.method,\n\t\t\tbody: args.body ? JSON.stringify(args.body) : undefined,\n\t\t\theaders: {\n\t\t\t\t// Some endpoints rely on the authorization header...\n\t\t\t\tAuthorization: `Bearer ${cookies[\"prismic-auth\"]}`,\n\t\t\t\tCookie: serializeCookies(cookies),\n\t\t\t\t\"User-Agent\": args.userAgent || SLICE_MACHINE_USER_AGENT,\n\t\t\t\t...extraHeaders,\n\t\t\t},\n\t\t});\n\t}\n}\n"],"names":["BaseManager","API_ENDPOINTS","decode","t","PrismicRepository","PrismicRepositoryRole","PrismicRepositoryUserAgent","assertPluginsInitialized","UnauthenticatedError","ChangeTypes","fetch","LimitType","fold","RawLimit","serializeCookies","SLICE_MACHINE_USER_AGENT"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,MAAM,8BAA8B;AAAA,EACnC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;;AAuBD,MAAO,iCAAiCA,YAAAA,YAAW;AAAA;AAAA;AAAA,EAIxD,MAAM,UAAO;AACZ,UAAM,MAAM,IAAI,IAAI,kBAAkBC,4BAAc,WAAW;AAC/D,UAAM,MAAM,MAAM,KAAK,OAAO,EAAE,IAAK,CAAA;AAC/B,UAAA,OAAO,MAAM,IAAI;AAEvB,QAAI,IAAI,IAAI;AACL,YAAA,EAAE,OAAO,cAAc,UAAUC,OAAAA,OACtCC,aAAE,MAAMC,MAAAA,iBAAiB,GACzB,IAAI;AAGL,UAAI,OAAO;AACV,cAAM,IAAI,MACT,kCAAkC,MAAM,OAAO,KAAK,IAAI,GAAG;AAAA,MAE5D;AAEM,aAAA;AAAA,IAAA,OACD;AACN,YAAM,IAAI,MAAM,+BAA+B,EAAE,OAAO,MAAM;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCA,eAAe,YAA6B;AAC3C,YAAQ,WAAW,MAAM;AAAA,MACxB,KAAKC,MAAAA,sBAAsB;AAAA,MAC3B,KAAKA,MAAAA,sBAAsB;AAAA,MAC3B,KAAKA,MAAsB,sBAAA;AACnB,eAAA;AAAA,MAER;AACQ,eAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,YACL,MAA6C;AAE7C,UAAM,MAAM,IAAI,IACf,gCAAgC,KAAK,iBACrCJ,4BAAc,YAAY;AAE3B,UAAM,MAAM,MAAM,KAAK,OAAO,EAAE,IAAK,CAAA;AAC/B,UAAA,OAAO,MAAM,IAAI;AAEvB,QAAI,IAAI,IAAI;AACX,aAAO,SAAS;AAAA,IAAA,OACV;AACA,YAAA,IAAI,MACT,qDAAqD,KAAK,YAC1D,EAAE,OAAO,MAAM;AAAA,IAEhB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAwC;AACpD,UAAM,MAAM,IAAI,IACf,mDACAA,4BAAc,YAAY;AAG3B,UAAM,OAAO;AAAA,MACZ,GAAG;AAAA,MACH,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA;AAAA,IAAA;AAGX,UAAA,MAAM,MAAM,KAAK,OAAO;AAAA,MAC7B;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,WAAWK,MAA2B,2BAAA;AAAA;AAAA,IAAA,CACtC;AACK,UAAA,OAAO,MAAM,IAAI;AAInB,QAAA,CAAC,IAAI,MAAM,KAAK,SAAS,KAAK,KAAK,SAAS,IAAI;AACnD,YAAM,IAAI,MAAM,iCAAiC,KAAK,YAAY;AAAA,QACjE,OAAO;AAAA,MAAA,CACP;AAAA,IACD;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAO,MAAwC;AACpD,UAAM,UAAU,MAAM,KAAK,KAAK,yBAAwB;AAExD,UAAM,MAAM,IAAI;AAAA,MACf,2BAA2B,QAAQ,QAAQ;AAAA;AAAA,MAC3CL,cAAAA,cAAc;AAAA,IAAA;AAGf,QAAI,WAAW,GAAG,KAAK,UAAU,IAAI;AAErC,UAAM,OAAO;AAAA,MACZ,SAAS,KAAK;AAAA,MACd,UAAU,KAAK;AAAA,IAAA;AAGV,UAAA,MAAM,MAAM,KAAK,OAAO;AAAA,MAC7B;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,WAAWK,MAA2B,2BAAA;AAAA;AAAA,IAAA,CACtC;AAEG,QAAA,CAAC,IAAI,IAAI;AACZ,YAAM,IAAI,MAAM,iCAAiC,KAAK,YAAY;AAAA,QACjE,OAAO;AAAA,MAAA,CACP;AAAA,IACD;AAAA,EACF;AAAA,EAEA,MAAM,cACL,MAA+C;AAE/C,UAAM,MAAM,IAAI,IAAI,uBAAuBL,4BAAc,YAAY;AAErE,QAAI,WAAW,GAAG,KAAK,UAAU,IAAI;AAErC,UAAM,OAAO;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK,UAAU,KAAK,SAAS;AAAA,IAAA;AAGnC,UAAA,MAAM,MAAM,KAAK,OAAO;AAAA,MAC7B;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,WAAWK,MAA2B,2BAAA;AAAA;AAAA,IAAA,CACtC;AAEG,QAAA,CAAC,IAAI,IAAI;AACZ,UAAI,SAAwB;AACxB,UAAA;AACM,iBAAA,MAAM,IAAI;cAClB;AAAA,MAED;AAGD,UAAI,WAAW,2CAA2C;AACzD,cAAM,IAAI,MACT,4CAA4C,KAAK,qCACjD;AAAA,UACC,OAAO;AAAA,QAAA,CACP;AAAA,MAEF;AAEK,YAAA,IAAI,MACT,4CAA4C,KAAK,aAAa,IAAI,UAAU,IAAI,cAChF;AAAA,QACC,OAAO;AAAA,MAAA,CACP;AAAA,IAEF;AAAA,EACF;AAAA,EAEA,MAAM,YACL,MAA4B;AAE5BC,sDAAyB,KAAK,wBAAwB;AAEtD,QAAI,CAAE,MAAM,KAAK,KAAK,mBAAoB;AACzC,YAAM,IAAIC,OAAoB,qBAAA;AAAA,IAC9B;AAEG,QAAA;AACG,YAAA,aAA+B,MAAM,QAAQ,IAClD,KAAK,QAAQ,IAAI,OAAO,WAAU;AAC7B,YAAA,OAAO,SAAS,SAAS;AAC5B,kBAAQ,OAAO,QAAQ;AAAA,YACtB,KAAK,OAAO;AACX,oBAAM,EAAE,MAAK,IAAK,MAAM,KAAK,OAAO,UAAU;AAAA,gBAC7C,WAAW,OAAO;AAAA,gBAClB,SAAS,OAAO;AAAA,cAAA,CAChB;AAED,kBAAI,CAAC,OAAO;AACL,sBAAA,MAAM,wBAAwB,OAAO,IAAI;AAAA,cAC/C;AAED,oBAAM,uBACL,MAAM,KAAK,OAAO,mCAAmC;AAAA,gBACpD,WAAW,OAAO;AAAA,gBAClB;AAAA,cAAA,CACA;AAEI,oBAAA,KAAK,OAAO,YAAY;AAAA,gBAC7B,WAAW,OAAO;AAAA,gBAClB,OAAO;AAAA,cAAA,CACP;AAEM,qBAAA;AAAA,gBACN,MAAMC,MAAY,YAAA;AAAA,gBAClB,IAAI,OAAO;AAAA,gBACX,SAAS;AAAA,cAAA;AAAA,YAEV;AAAA,YACD,KAAK,YAAY;AAChB,oBAAM,EAAE,MAAK,IAAK,MAAM,KAAK,OAAO,UAAU;AAAA,gBAC7C,WAAW,OAAO;AAAA,gBAClB,SAAS,OAAO;AAAA,cAAA,CAChB;AAED,kBAAI,CAAC,OAAO;AACL,sBAAA,MAAM,yBAAyB,OAAO,IAAI;AAAA,cAChD;AAED,oBAAM,uBACL,MAAM,KAAK,OAAO,mCAAmC;AAAA,gBACpD,WAAW,OAAO;AAAA,gBAClB;AAAA,cAAA,CACA;AAEI,oBAAA,KAAK,OAAO,YAAY;AAAA,gBAC7B,WAAW,OAAO;AAAA,gBAClB,OAAO;AAAA,cAAA,CACP;AAEM,qBAAA;AAAA,gBACN,MAAMA,MAAY,YAAA;AAAA,gBAClB,IAAI,OAAO;AAAA,gBACX,SAAS;AAAA,cAAA;AAAA,YAEV;AAAA,YACD,KAAK;AACG,qBAAA;AAAA,gBACN,IAAI,OAAO;AAAA,gBACX,SAAS,EAAE,IAAI,OAAO,GAAI;AAAA,gBAC1B,MAAMA,MAAY,YAAA;AAAA,cAAA;AAAA,UAEpB;AAAA,QAAA,OACK;AACN,kBAAQ,OAAO,QAAQ;AAAA,YACtB,KAAK,OAAO;AACX,oBAAM,EAAE,MAAK,IAAK,MAAM,KAAK,YAAY,eAAe;AAAA,gBACvD,IAAI,OAAO;AAAA,cAAA,CACX;AACD,kBAAI,CAAC,OAAO;AACL,sBAAA,MAAM,wBAAwB,OAAO,IAAI;AAAA,cAC/C;AAEM,qBAAA;AAAA,gBACN,MAAMA,MAAY,YAAA;AAAA,gBAClB,IAAI,OAAO;AAAA,gBACX,SAAS;AAAA,cAAA;AAAA,YAEV;AAAA,YACD,KAAK,YAAY;AAChB,oBAAM,EAAE,MAAK,IAAK,MAAM,KAAK,YAAY,eAAe;AAAA,gBACvD,IAAI,OAAO;AAAA,cAAA,CACX;AACD,kBAAI,CAAC,OAAO;AACL,sBAAA,MAAM,wBAAwB,OAAO,IAAI;AAAA,cAC/C;AAEM,qBAAA;AAAA,gBACN,MAAMA,MAAY,YAAA;AAAA,gBAClB,IAAI,OAAO;AAAA,gBACX,SAAS;AAAA,cAAA;AAAA,YAEV;AAAA,YACD,KAAK;AACG,qBAAA;AAAA,gBACN,IAAI,OAAO;AAAA,gBACX,SAAS,EAAE,IAAI,OAAO,GAAI;AAAA,gBAC1B,MAAMA,MAAY,YAAA;AAAA,cAAA;AAAA,UAEpB;AAAA,QACD;AAAA,MACD,CAAA,CAAC;AAIH,YAAM,cAAwB;AAAA,QAC7B,wBAAwB,KAAK;AAAA,QAC7B,SAAS;AAAA,MAAA;AAGV,YAAM,sBAAsB,MAAM,KAAK,KAAK,uBAAsB;AAClE,YAAM,qBAAqB,MAAM,KAAK,QAAQ,sBAAqB;AAG5D,aAAAC,MAAAA,QAAM,IAAI,IAAI,SAAST,cAAAA,cAAc,aAAa,EAAE,YAAY;AAAA,QACtE,MAAM,KAAK,UAAU,WAAW;AAAA,QAChC,QAAQ;AAAA,QACR,SAAS;AAAA,UACR,eAAe,UAAU;AAAA,UACzB,cAAc;AAAA,UACd,YAAY,mBAAmB;AAAA,UAC/B,gBAAgB;AAAA,QAChB;AAAA,MAAA,CACD,EACC,KAAK,OAAO,aAAY;AACpB,YAAA,SAAS,WAAW,KAAK;AACrB,iBAAA;AAAA,QACP;AAEM,eAAA,KAAK,oBACX,MAAM,SAAS,QACf,SAAS,QACTU,gBAAU,IAAI;AAAA,MAAA,CAEf,EACA,MAAM,CAAC,QAAoB;AAEvB,YAAA;AACH,gBAAM,OAAgB,KAAK,MAAM,IAAI,OAAO;AAE5C,iBAAO,KAAK,oBAAoB,MAAM,IAAI,QAAQA,MAAAA,UAAU,IAAI;AAAA,QAAA,QAC/D;AACK,gBAAA;AAAA,QACN;AAAA,MAAA,CACD;AAAA,aACM;AACR,cAAQ,MAAM,8CAA8C;AAC5D,cAAQ,MAAM,GAAG;AAEX,YAAA;AAAA,IACN;AAAA,EACF;AAAA,EAEQ,oBACP,gBACA,YACA,WAAoB;AAEpB,WAAOC,YACN,MAAK;AACJ,YAAM,QAAqB;AAAA,QAC1B,QAAQ;AAAA,QACR,SAAS,kCAAkC,KAAK,UAC/C,cAAc;AAAA,MAAA;AAGV,YAAA;AAAA,IACP,GACA,CAAC,aAAsB;AACtB,YAAM,QAAQ,EAAE,GAAG,UAAU,MAAM,UAAS;AAErC,aAAA;AAAA,IACP,CAAA,EACAC,MAAS,SAAA,OAAO,cAAc,CAAC;AAAA,EAClC;AAAA,EAEQ,MAAM,OAAO,MAKpB;AACA,UAAM,UAAU,MAAM,KAAK,KAAK,yBAAwB;AAExD,UAAM,eAAuC,CAAA;AAE7C,QAAI,KAAK,MAAM;AACd,mBAAa,cAAc,IAAI;AAAA,IAC/B;AAED,WAAO,MAAMH,MAAAA,QAAM,KAAK,IAAI,YAAY;AAAA,MACvC,QAAQ,KAAK;AAAA,MACb,MAAM,KAAK,OAAO,KAAK,UAAU,KAAK,IAAI,IAAI;AAAA,MAC9C,SAAS;AAAA;AAAA,QAER,eAAe,UAAU,QAAQ,cAAc;AAAA,QAC/C,QAAQI,kCAAiB,OAAO;AAAA,QAChC,cAAc,KAAK,aAAaC,yBAAA;AAAA,QAChC,GAAG;AAAA,MACH;AAAA,IAAA,CACD;AAAA,EACF;AACA;;"}
1
+ {"version":3,"file":"PrismicRepositoryManager.cjs","sources":["../../../../src/managers/prismicRepository/PrismicRepositoryManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport fetch, { Response } from \"node-fetch\";\nimport { fold } from \"fp-ts/Either\";\n\nimport { decode } from \"../../lib/decode\";\nimport { serializeCookies } from \"../../lib/serializeCookies\";\n\nimport { SLICE_MACHINE_USER_AGENT } from \"../../constants/SLICE_MACHINE_USER_AGENT\";\nimport { API_ENDPOINTS } from \"../../constants/API_ENDPOINTS\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nimport {\n\tAllChangeTypes,\n\tBulkBody,\n\tChangeTypes,\n\tClientError,\n\tLimit,\n\tLimitType,\n\tPrismicRepository,\n\tPrismicRepositoryRole,\n\tPrismicRepositoryUserAgent,\n\tPrismicRepositoryUserAgents,\n\tRawLimit,\n\tTransactionalMergeArgs,\n\tTransactionalMergeReturnType,\n} from \"./types\";\nimport { assertPluginsInitialized } from \"../../lib/assertPluginsInitialized\";\nimport { UnauthenticatedError } from \"../../errors\";\n\nconst DEFAULT_REPOSITORY_SETTINGS = {\n\tplan: \"personal\",\n\tisAnnual: \"false\",\n\trole: \"developer\",\n};\n\ntype PrismicRepositoryManagerCheckExistsArgs = {\n\tdomain: string;\n};\n\ntype PrismicRepositoryManagerCreateArgs = {\n\tdomain: string;\n\tframework: string; // TODO: Type(?)\n};\n\ntype PrismicRepositoryManagerDeleteArgs = {\n\tdomain: string;\n\tpassword: string;\n};\n\ntype PrismicRepositoryManagerPushDocumentsArgs = {\n\tdomain: string;\n\tsignature: string;\n\tdocuments: Record<string, unknown>; // TODO: Type unknown if possible(?)\n};\n\nexport class PrismicRepositoryManager extends BaseManager {\n\t// TODO: Add methods for repository-specific actions. E.g. creating a\n\t// new repository.\n\n\tasync readAll(): Promise<PrismicRepository[]> {\n\t\tconst url = new URL(\"./repositories\", API_ENDPOINTS.PrismicUser);\n\t\tconst res = await this._fetch({ url });\n\t\tconst json = await res.json();\n\n\t\tif (res.ok) {\n\t\t\tconst { value: repositories, error } = decode(\n\t\t\t\tt.array(PrismicRepository),\n\t\t\t\tjson,\n\t\t\t);\n\n\t\t\tif (error) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to decode repositories: ${error.errors.join(\", \")}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn repositories;\n\t\t} else {\n\t\t\tthrow new Error(`Failed to read repositories`, { cause: json });\n\t\t}\n\t}\n\n\t// Should this be in manager? It's one of the few sync method\n\t//\n\t// Reply from Angelo 2022-12-22: I think it should be in manager\n\t// because we shouldn't be exporting root-level utilities from this\n\t// package. If we want to make it more inline with the other methods,\n\t// we could simplify the API by changing its signature to the\n\t// following:\n\t//\n\t// ```ts\n\t// (repositoryName: string) => Promise<boolean>\n\t// ```\n\t//\n\t// This method would:\n\t//\n\t// 1. Fetch the list of repositories for the user using `readAll()`.\n\t// The list would be cached.\n\t// 2. Determine if the user has write access to the given repository.\n\t//\n\t// This version has the following benefits:\n\t//\n\t// - Does not expect the consumer to supply a repository object; it\n\t// only requires a repository name, which could be sourced from\n\t// anything (incl. the project's `sm.json`).\n\t//\n\t// - Similarly, it does not expect the consumer to call `readAll()`\n\t// before calling this method.\n\t//\n\t// - Works for repositories that the user does not have access to. For\n\t// example, I could use it to check if I have access to \"qwerty\",\n\t// even if I am not added as a user. The purpose of the method is\n\t// still valid: do I have write access to a given repository?\n\thasWriteAccess(repository: PrismicRepository): boolean {\n\t\tswitch (repository.role) {\n\t\t\tcase PrismicRepositoryRole.SuperUser:\n\t\t\tcase PrismicRepositoryRole.Owner:\n\t\t\tcase PrismicRepositoryRole.Administrator:\n\t\t\t\treturn true;\n\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync checkExists(\n\t\targs: PrismicRepositoryManagerCheckExistsArgs,\n\t): Promise<boolean> {\n\t\tconst url = new URL(\n\t\t\t`./app/dashboard/repositories/${args.domain}/exists`,\n\t\t\tAPI_ENDPOINTS.PrismicWroom,\n\t\t);\n\t\tconst res = await this._fetch({ url });\n\t\tconst text = await res.text();\n\n\t\tif (res.ok) {\n\t\t\treturn text === \"false\"; // Endpoint returns `false` when repository exists\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to check repository existence for domain \\`${args.domain}\\``,\n\t\t\t\t{ cause: text },\n\t\t\t);\n\t\t}\n\t}\n\n\tasync create(args: PrismicRepositoryManagerCreateArgs): Promise<void> {\n\t\tconst url = new URL(\n\t\t\t\"./authentication/newrepository?app=slicemachine\",\n\t\t\tAPI_ENDPOINTS.PrismicWroom,\n\t\t);\n\n\t\tconst body = {\n\t\t\t...DEFAULT_REPOSITORY_SETTINGS,\n\t\t\tdomain: args.domain,\n\t\t\tframework: args.framework, // This property appears to be optional for the API\n\t\t};\n\n\t\tconst res = await this._fetch({\n\t\t\turl,\n\t\t\tmethod: \"POST\",\n\t\t\tbody,\n\t\t\tuserAgent: PrismicRepositoryUserAgent.SliceMachine, // Custom User Agent is required\n\t\t});\n\t\tconst text = await res.text();\n\n\t\t// Endpoint returns repository name on success, which must be more than 4 characters and less than 30\n\t\t// if (!res.ok) {\n\t\tif (!res.ok || text.length < 4 || text.length > 30) {\n\t\t\tthrow new Error(`Failed to create repository \\`${args.domain}\\``, {\n\t\t\t\tcause: res,\n\t\t\t});\n\t\t}\n\t}\n\n\t// TODO: Delete this endpoint? It doesn't seem to be used (I might be wrong). - Angelo\n\tasync delete(args: PrismicRepositoryManagerDeleteArgs): Promise<void> {\n\t\tconst cookies = await this.user.getAuthenticationCookies();\n\n\t\tconst url = new URL(\n\t\t\t`./app/settings/delete?_=${cookies[\"X_XSRF\"]}`, // TODO: Maybe we want to throw early if the token is no available, or get the token another way\n\t\t\tAPI_ENDPOINTS.PrismicWroom,\n\t\t);\n\t\t// Update hostname to include repository domain\n\t\turl.hostname = `${args.domain}.${url.hostname}`;\n\n\t\tconst body = {\n\t\t\tconfirm: args.domain,\n\t\t\tpassword: args.password,\n\t\t};\n\n\t\tconst res = await this._fetch({\n\t\t\turl,\n\t\t\tmethod: \"POST\",\n\t\t\tbody,\n\t\t\tuserAgent: PrismicRepositoryUserAgent.LegacyZero, // Custom User Agent is required\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tthrow new Error(`Failed to delete repository \\`${args.domain}\\``, {\n\t\t\t\tcause: res,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync pushDocuments(\n\t\targs: PrismicRepositoryManagerPushDocumentsArgs,\n\t): Promise<void> {\n\t\tconst url = new URL(\"./starter/documents\", API_ENDPOINTS.PrismicWroom);\n\t\t// Update hostname to include repository domain\n\t\turl.hostname = `${args.domain}.${url.hostname}`;\n\n\t\tconst body = {\n\t\t\tsignature: args.signature,\n\t\t\tdocuments: JSON.stringify(args.documents),\n\t\t};\n\n\t\tconst res = await this._fetch({\n\t\t\turl,\n\t\t\tmethod: \"POST\",\n\t\t\tbody,\n\t\t\tuserAgent: PrismicRepositoryUserAgent.LegacyZero, // Custom User Agent is required\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tlet reason: string | null = null;\n\t\t\ttry {\n\t\t\t\treason = await res.text();\n\t\t\t} catch {\n\t\t\t\t// Noop\n\t\t\t}\n\n\t\t\t// Ideally the API should throw a 409 or something like that...\n\t\t\tif (reason === \"Repository should not contain documents\") {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to push documents to repository \\`${args.domain}\\`, repository is not empty`,\n\t\t\t\t\t{\n\t\t\t\t\t\tcause: res,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to push documents to repository \\`${args.domain}\\`, ${res.status} ${res.statusText}`,\n\t\t\t\t{\n\t\t\t\t\tcause: res,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t}\n\n\tasync pushChanges(\n\t\targs: TransactionalMergeArgs,\n\t): Promise<TransactionalMergeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tif (!(await this.user.checkIsLoggedIn())) {\n\t\t\tthrow new UnauthenticatedError();\n\t\t}\n\n\t\ttry {\n\t\t\tconst allChanges: AllChangeTypes[] = await Promise.all(\n\t\t\t\targs.changes.map(async (change) => {\n\t\t\t\t\tif (change.type === \"Slice\") {\n\t\t\t\t\t\tswitch (change.status) {\n\t\t\t\t\t\t\tcase \"NEW\": {\n\t\t\t\t\t\t\t\tconst { model } = await this.slices.readSlice({\n\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\tsliceID: change.id,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (!model) {\n\t\t\t\t\t\t\t\t\tthrow Error(`Could not find model ${change.id}`);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst modelWithScreenshots =\n\t\t\t\t\t\t\t\t\tawait this.slices.updateSliceModelScreenshotsInPlace({\n\t\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tawait this.slices.updateSlice({\n\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\tmodel: modelWithScreenshots,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.SLICE_INSERT,\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: modelWithScreenshots,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase \"MODIFIED\": {\n\t\t\t\t\t\t\t\tconst { model } = await this.slices.readSlice({\n\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\tsliceID: change.id,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (!model) {\n\t\t\t\t\t\t\t\t\tthrow Error(`Could not find model ${change.id}`);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst modelWithScreenshots =\n\t\t\t\t\t\t\t\t\tawait this.slices.updateSliceModelScreenshotsInPlace({\n\t\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tawait this.slices.updateSlice({\n\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\tmodel: modelWithScreenshots,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.SLICE_UPDATE,\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: modelWithScreenshots,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase \"DELETED\":\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: { id: change.id },\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.SLICE_DELETE,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tswitch (change.status) {\n\t\t\t\t\t\t\tcase \"NEW\": {\n\t\t\t\t\t\t\t\tconst { model } = await this.customTypes.readCustomType({\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (!model) {\n\t\t\t\t\t\t\t\t\tthrow Error(`Could not find model ${change.id}`);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.CUSTOM_TYPE_INSERT,\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: model,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase \"MODIFIED\": {\n\t\t\t\t\t\t\t\tconst { model } = await this.customTypes.readCustomType({\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (!model) {\n\t\t\t\t\t\t\t\t\tthrow Error(`Could not find model ${change.id}`);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.CUSTOM_TYPE_UPDATE,\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: model,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase \"DELETED\":\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: { id: change.id },\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.CUSTOM_TYPE_DELETE,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\t// Compute the POST body\n\t\t\tconst requestBody: BulkBody = {\n\t\t\t\tconfirmDeleteDocuments: args.confirmDeleteDocuments,\n\t\t\t\tchanges: allChanges,\n\t\t\t};\n\n\t\t\tconst sliceMachineConfig = await this.project.getSliceMachineConfig();\n\n\t\t\t// TODO: move to customtypes client\n\t\t\tconst response = await this._fetch({\n\t\t\t\turl: new URL(\"/bulk\", API_ENDPOINTS.PrismicModels),\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tbody: requestBody,\n\t\t\t\trepository: sliceMachineConfig.repositoryName,\n\t\t\t});\n\n\t\t\tswitch (response.status) {\n\t\t\t\tcase 202:\n\t\t\t\t\treturn this._decodeLimitOrThrow(\n\t\t\t\t\t\tawait response.json(),\n\t\t\t\t\t\tresponse.status,\n\t\t\t\t\t\tLimitType.SOFT,\n\t\t\t\t\t);\n\t\t\t\tcase 204:\n\t\t\t\t\treturn null;\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthenticatedError();\n\t\t\t\tcase 403:\n\t\t\t\t\treturn this._decodeLimitOrThrow(\n\t\t\t\t\t\tawait response.json(),\n\t\t\t\t\t\tresponse.status,\n\t\t\t\t\t\tLimitType.HARD,\n\t\t\t\t\t);\n\t\t\t\tcase 400:\n\t\t\t\t\tconst text = await response.text();\n\t\t\t\t\tthrow new Error(text);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unexpected status code ${response.status}`);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.error(\"An error happened while pushing your changes\");\n\t\t\tconsole.error(err);\n\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tprivate _decodeLimitOrThrow(\n\t\tpotentialLimit: unknown,\n\t\tstatusCode: number,\n\t\tlimitType: LimitType,\n\t): Limit | null {\n\t\treturn fold<t.Errors, RawLimit, Limit | null>(\n\t\t\t() => {\n\t\t\t\tconst error: ClientError = {\n\t\t\t\t\tstatus: statusCode,\n\t\t\t\t\tmessage: `Unable to parse raw limit from ${JSON.stringify(\n\t\t\t\t\t\tpotentialLimit,\n\t\t\t\t\t)}`,\n\t\t\t\t};\n\t\t\t\tthrow error;\n\t\t\t},\n\t\t\t(rawLimit: RawLimit) => {\n\t\t\t\tconst limit = { ...rawLimit, type: limitType };\n\n\t\t\t\treturn limit;\n\t\t\t},\n\t\t)(RawLimit.decode(potentialLimit));\n\t}\n\n\tprivate async _fetch(args: {\n\t\turl: URL;\n\t\tmethod?: \"GET\" | \"POST\";\n\t\tbody?: unknown;\n\t\tuserAgent?: PrismicRepositoryUserAgents;\n\t\trepository?: string;\n\t}): Promise<Response> {\n\t\tconst cookies = await this.user.getAuthenticationCookies();\n\n\t\tconst extraHeaders: Record<string, string> = {};\n\n\t\tif (args.body) {\n\t\t\textraHeaders[\"Content-Type\"] = \"application/json\";\n\t\t}\n\n\t\tif (args.repository) {\n\t\t\textraHeaders.repository = args.repository;\n\t\t}\n\n\t\treturn await fetch(args.url.toString(), {\n\t\t\tmethod: args.method,\n\t\t\tbody: args.body ? JSON.stringify(args.body) : undefined,\n\t\t\theaders: {\n\t\t\t\t// Some endpoints rely on the authorization header...\n\t\t\t\tAuthorization: `Bearer ${cookies[\"prismic-auth\"]}`,\n\t\t\t\tCookie: serializeCookies(cookies),\n\t\t\t\t\"User-Agent\": args.userAgent || SLICE_MACHINE_USER_AGENT,\n\t\t\t\t...extraHeaders,\n\t\t\t},\n\t\t});\n\t}\n}\n"],"names":["BaseManager","API_ENDPOINTS","decode","t","PrismicRepository","PrismicRepositoryRole","PrismicRepositoryUserAgent","assertPluginsInitialized","UnauthenticatedError","ChangeTypes","LimitType","fold","RawLimit","fetch","serializeCookies","SLICE_MACHINE_USER_AGENT"],"mappings":"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"}
@@ -261,30 +261,28 @@ class PrismicRepositoryManager extends BaseManager {
261
261
  confirmDeleteDocuments: args.confirmDeleteDocuments,
262
262
  changes: allChanges
263
263
  };
264
- const authenticationToken = await this.user.getAuthenticationToken();
265
264
  const sliceMachineConfig = await this.project.getSliceMachineConfig();
266
- return fetch(new URL("/bulk", API_ENDPOINTS.PrismicModels).toString(), {
267
- body: JSON.stringify(requestBody),
265
+ const response = await this._fetch({
266
+ url: new URL("/bulk", API_ENDPOINTS.PrismicModels),
268
267
  method: "POST",
269
- headers: {
270
- Authorization: `Bearer ${authenticationToken}`,
271
- "User-Agent": "slice-machine",
272
- repository: sliceMachineConfig.repositoryName,
273
- "Content-Type": "application/json"
274
- }
275
- }).then(async (response) => {
276
- if (response.status === 204) {
277
- return null;
278
- }
279
- return this._decodeLimitOrThrow(await response.json(), response.status, LimitType.SOFT);
280
- }).catch((err) => {
281
- try {
282
- const data = JSON.parse(err.message);
283
- return this._decodeLimitOrThrow(data, err.status, LimitType.HARD);
284
- } catch {
285
- throw err;
286
- }
268
+ body: requestBody,
269
+ repository: sliceMachineConfig.repositoryName
287
270
  });
271
+ switch (response.status) {
272
+ case 202:
273
+ return this._decodeLimitOrThrow(await response.json(), response.status, LimitType.SOFT);
274
+ case 204:
275
+ return null;
276
+ case 401:
277
+ throw new UnauthenticatedError();
278
+ case 403:
279
+ return this._decodeLimitOrThrow(await response.json(), response.status, LimitType.HARD);
280
+ case 400:
281
+ const text = await response.text();
282
+ throw new Error(text);
283
+ default:
284
+ throw new Error(`Unexpected status code ${response.status}`);
285
+ }
288
286
  } catch (err) {
289
287
  console.error("An error happened while pushing your changes");
290
288
  console.error(err);
@@ -309,6 +307,9 @@ class PrismicRepositoryManager extends BaseManager {
309
307
  if (args.body) {
310
308
  extraHeaders["Content-Type"] = "application/json";
311
309
  }
310
+ if (args.repository) {
311
+ extraHeaders.repository = args.repository;
312
+ }
312
313
  return await fetch(args.url.toString(), {
313
314
  method: args.method,
314
315
  body: args.body ? JSON.stringify(args.body) : void 0,
@@ -1 +1 @@
1
- {"version":3,"file":"PrismicRepositoryManager.js","sources":["../../../../src/managers/prismicRepository/PrismicRepositoryManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport fetch, { Response } from \"node-fetch\";\nimport { fold } from \"fp-ts/Either\";\n\nimport { decode } from \"../../lib/decode\";\nimport { serializeCookies } from \"../../lib/serializeCookies\";\n\nimport { SLICE_MACHINE_USER_AGENT } from \"../../constants/SLICE_MACHINE_USER_AGENT\";\nimport { API_ENDPOINTS } from \"../../constants/API_ENDPOINTS\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nimport {\n\tAllChangeTypes,\n\tBulkBody,\n\tChangeTypes,\n\tClientError,\n\tLimit,\n\tLimitType,\n\tPrismicRepository,\n\tPrismicRepositoryRole,\n\tPrismicRepositoryUserAgent,\n\tPrismicRepositoryUserAgents,\n\tRawLimit,\n\tTransactionalMergeArgs,\n\tTransactionalMergeReturnType,\n} from \"./types\";\nimport { assertPluginsInitialized } from \"../../lib/assertPluginsInitialized\";\nimport { UnauthenticatedError } from \"../../errors\";\n\nconst DEFAULT_REPOSITORY_SETTINGS = {\n\tplan: \"personal\",\n\tisAnnual: \"false\",\n\trole: \"developer\",\n};\n\ntype PrismicRepositoryManagerCheckExistsArgs = {\n\tdomain: string;\n};\n\ntype PrismicRepositoryManagerCreateArgs = {\n\tdomain: string;\n\tframework: string; // TODO: Type(?)\n};\n\ntype PrismicRepositoryManagerDeleteArgs = {\n\tdomain: string;\n\tpassword: string;\n};\n\ntype PrismicRepositoryManagerPushDocumentsArgs = {\n\tdomain: string;\n\tsignature: string;\n\tdocuments: Record<string, unknown>; // TODO: Type unknown if possible(?)\n};\n\nexport class PrismicRepositoryManager extends BaseManager {\n\t// TODO: Add methods for repository-specific actions. E.g. creating a\n\t// new repository.\n\n\tasync readAll(): Promise<PrismicRepository[]> {\n\t\tconst url = new URL(\"./repositories\", API_ENDPOINTS.PrismicUser);\n\t\tconst res = await this._fetch({ url });\n\t\tconst json = await res.json();\n\n\t\tif (res.ok) {\n\t\t\tconst { value: repositories, error } = decode(\n\t\t\t\tt.array(PrismicRepository),\n\t\t\t\tjson,\n\t\t\t);\n\n\t\t\tif (error) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to decode repositories: ${error.errors.join(\", \")}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn repositories;\n\t\t} else {\n\t\t\tthrow new Error(`Failed to read repositories`, { cause: json });\n\t\t}\n\t}\n\n\t// Should this be in manager? It's one of the few sync method\n\t//\n\t// Reply from Angelo 2022-12-22: I think it should be in manager\n\t// because we shouldn't be exporting root-level utilities from this\n\t// package. If we want to make it more inline with the other methods,\n\t// we could simplify the API by changing its signature to the\n\t// following:\n\t//\n\t// ```ts\n\t// (repositoryName: string) => Promise<boolean>\n\t// ```\n\t//\n\t// This method would:\n\t//\n\t// 1. Fetch the list of repositories for the user using `readAll()`.\n\t// The list would be cached.\n\t// 2. Determine if the user has write access to the given repository.\n\t//\n\t// This version has the following benefits:\n\t//\n\t// - Does not expect the consumer to supply a repository object; it\n\t// only requires a repository name, which could be sourced from\n\t// anything (incl. the project's `sm.json`).\n\t//\n\t// - Similarly, it does not expect the consumer to call `readAll()`\n\t// before calling this method.\n\t//\n\t// - Works for repositories that the user does not have access to. For\n\t// example, I could use it to check if I have access to \"qwerty\",\n\t// even if I am not added as a user. The purpose of the method is\n\t// still valid: do I have write access to a given repository?\n\thasWriteAccess(repository: PrismicRepository): boolean {\n\t\tswitch (repository.role) {\n\t\t\tcase PrismicRepositoryRole.SuperUser:\n\t\t\tcase PrismicRepositoryRole.Owner:\n\t\t\tcase PrismicRepositoryRole.Administrator:\n\t\t\t\treturn true;\n\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync checkExists(\n\t\targs: PrismicRepositoryManagerCheckExistsArgs,\n\t): Promise<boolean> {\n\t\tconst url = new URL(\n\t\t\t`./app/dashboard/repositories/${args.domain}/exists`,\n\t\t\tAPI_ENDPOINTS.PrismicWroom,\n\t\t);\n\t\tconst res = await this._fetch({ url });\n\t\tconst text = await res.text();\n\n\t\tif (res.ok) {\n\t\t\treturn text === \"false\"; // Endpoint returns `false` when repository exists\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to check repository existence for domain \\`${args.domain}\\``,\n\t\t\t\t{ cause: text },\n\t\t\t);\n\t\t}\n\t}\n\n\tasync create(args: PrismicRepositoryManagerCreateArgs): Promise<void> {\n\t\tconst url = new URL(\n\t\t\t\"./authentication/newrepository?app=slicemachine\",\n\t\t\tAPI_ENDPOINTS.PrismicWroom,\n\t\t);\n\n\t\tconst body = {\n\t\t\t...DEFAULT_REPOSITORY_SETTINGS,\n\t\t\tdomain: args.domain,\n\t\t\tframework: args.framework, // This property appears to be optional for the API\n\t\t};\n\n\t\tconst res = await this._fetch({\n\t\t\turl,\n\t\t\tmethod: \"POST\",\n\t\t\tbody,\n\t\t\tuserAgent: PrismicRepositoryUserAgent.SliceMachine, // Custom User Agent is required\n\t\t});\n\t\tconst text = await res.text();\n\n\t\t// Endpoint returns repository name on success, which must be more than 4 characters and less than 30\n\t\t// if (!res.ok) {\n\t\tif (!res.ok || text.length < 4 || text.length > 30) {\n\t\t\tthrow new Error(`Failed to create repository \\`${args.domain}\\``, {\n\t\t\t\tcause: res,\n\t\t\t});\n\t\t}\n\t}\n\n\t// TODO: Delete this endpoint? It doesn't seem to be used (I might be wrong). - Angelo\n\tasync delete(args: PrismicRepositoryManagerDeleteArgs): Promise<void> {\n\t\tconst cookies = await this.user.getAuthenticationCookies();\n\n\t\tconst url = new URL(\n\t\t\t`./app/settings/delete?_=${cookies[\"X_XSRF\"]}`, // TODO: Maybe we want to throw early if the token is no available, or get the token another way\n\t\t\tAPI_ENDPOINTS.PrismicWroom,\n\t\t);\n\t\t// Update hostname to include repository domain\n\t\turl.hostname = `${args.domain}.${url.hostname}`;\n\n\t\tconst body = {\n\t\t\tconfirm: args.domain,\n\t\t\tpassword: args.password,\n\t\t};\n\n\t\tconst res = await this._fetch({\n\t\t\turl,\n\t\t\tmethod: \"POST\",\n\t\t\tbody,\n\t\t\tuserAgent: PrismicRepositoryUserAgent.LegacyZero, // Custom User Agent is required\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tthrow new Error(`Failed to delete repository \\`${args.domain}\\``, {\n\t\t\t\tcause: res,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync pushDocuments(\n\t\targs: PrismicRepositoryManagerPushDocumentsArgs,\n\t): Promise<void> {\n\t\tconst url = new URL(\"./starter/documents\", API_ENDPOINTS.PrismicWroom);\n\t\t// Update hostname to include repository domain\n\t\turl.hostname = `${args.domain}.${url.hostname}`;\n\n\t\tconst body = {\n\t\t\tsignature: args.signature,\n\t\t\tdocuments: JSON.stringify(args.documents),\n\t\t};\n\n\t\tconst res = await this._fetch({\n\t\t\turl,\n\t\t\tmethod: \"POST\",\n\t\t\tbody,\n\t\t\tuserAgent: PrismicRepositoryUserAgent.LegacyZero, // Custom User Agent is required\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tlet reason: string | null = null;\n\t\t\ttry {\n\t\t\t\treason = await res.text();\n\t\t\t} catch {\n\t\t\t\t// Noop\n\t\t\t}\n\n\t\t\t// Ideally the API should throw a 409 or something like that...\n\t\t\tif (reason === \"Repository should not contain documents\") {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to push documents to repository \\`${args.domain}\\`, repository is not empty`,\n\t\t\t\t\t{\n\t\t\t\t\t\tcause: res,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to push documents to repository \\`${args.domain}\\`, ${res.status} ${res.statusText}`,\n\t\t\t\t{\n\t\t\t\t\tcause: res,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t}\n\n\tasync pushChanges(\n\t\targs: TransactionalMergeArgs,\n\t): Promise<TransactionalMergeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tif (!(await this.user.checkIsLoggedIn())) {\n\t\t\tthrow new UnauthenticatedError();\n\t\t}\n\n\t\ttry {\n\t\t\tconst allChanges: AllChangeTypes[] = await Promise.all(\n\t\t\t\targs.changes.map(async (change) => {\n\t\t\t\t\tif (change.type === \"Slice\") {\n\t\t\t\t\t\tswitch (change.status) {\n\t\t\t\t\t\t\tcase \"NEW\": {\n\t\t\t\t\t\t\t\tconst { model } = await this.slices.readSlice({\n\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\tsliceID: change.id,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (!model) {\n\t\t\t\t\t\t\t\t\tthrow Error(`Could not find model ${change.id}`);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst modelWithScreenshots =\n\t\t\t\t\t\t\t\t\tawait this.slices.updateSliceModelScreenshotsInPlace({\n\t\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tawait this.slices.updateSlice({\n\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\tmodel: modelWithScreenshots,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.SLICE_INSERT,\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: modelWithScreenshots,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase \"MODIFIED\": {\n\t\t\t\t\t\t\t\tconst { model } = await this.slices.readSlice({\n\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\tsliceID: change.id,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (!model) {\n\t\t\t\t\t\t\t\t\tthrow Error(`Could not find model ${change.id}`);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst modelWithScreenshots =\n\t\t\t\t\t\t\t\t\tawait this.slices.updateSliceModelScreenshotsInPlace({\n\t\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tawait this.slices.updateSlice({\n\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\tmodel: modelWithScreenshots,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.SLICE_UPDATE,\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: modelWithScreenshots,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase \"DELETED\":\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: { id: change.id },\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.SLICE_DELETE,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tswitch (change.status) {\n\t\t\t\t\t\t\tcase \"NEW\": {\n\t\t\t\t\t\t\t\tconst { model } = await this.customTypes.readCustomType({\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (!model) {\n\t\t\t\t\t\t\t\t\tthrow Error(`Could not find model ${change.id}`);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.CUSTOM_TYPE_INSERT,\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: model,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase \"MODIFIED\": {\n\t\t\t\t\t\t\t\tconst { model } = await this.customTypes.readCustomType({\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (!model) {\n\t\t\t\t\t\t\t\t\tthrow Error(`Could not find model ${change.id}`);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.CUSTOM_TYPE_UPDATE,\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: model,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase \"DELETED\":\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: { id: change.id },\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.CUSTOM_TYPE_DELETE,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\t// Compute the POST body\n\t\t\tconst requestBody: BulkBody = {\n\t\t\t\tconfirmDeleteDocuments: args.confirmDeleteDocuments,\n\t\t\t\tchanges: allChanges,\n\t\t\t};\n\n\t\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\t\tconst sliceMachineConfig = await this.project.getSliceMachineConfig();\n\n\t\t\t// TODO: move to customtypes client\n\t\t\treturn fetch(new URL(\"/bulk\", API_ENDPOINTS.PrismicModels).toString(), {\n\t\t\t\tbody: JSON.stringify(requestBody),\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: `Bearer ${authenticationToken}`,\n\t\t\t\t\t\"User-Agent\": \"slice-machine\",\n\t\t\t\t\trepository: sliceMachineConfig.repositoryName,\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t},\n\t\t\t})\n\t\t\t\t.then(async (response) => {\n\t\t\t\t\tif (response.status === 204) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this._decodeLimitOrThrow(\n\t\t\t\t\t\tawait response.json(),\n\t\t\t\t\t\tresponse.status,\n\t\t\t\t\t\tLimitType.SOFT,\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t\t.catch((err: ClientError) => {\n\t\t\t\t\t// Try to decode a limit from the error or throw the original error\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst data: unknown = JSON.parse(err.message);\n\n\t\t\t\t\t\treturn this._decodeLimitOrThrow(data, err.status, LimitType.HARD);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tthrow err;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t} catch (err) {\n\t\t\tconsole.error(\"An error happened while pushing your changes\");\n\t\t\tconsole.error(err);\n\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tprivate _decodeLimitOrThrow(\n\t\tpotentialLimit: unknown,\n\t\tstatusCode: number,\n\t\tlimitType: LimitType,\n\t): Limit | null {\n\t\treturn fold<t.Errors, RawLimit, Limit | null>(\n\t\t\t() => {\n\t\t\t\tconst error: ClientError = {\n\t\t\t\t\tstatus: statusCode,\n\t\t\t\t\tmessage: `Unable to parse raw limit from ${JSON.stringify(\n\t\t\t\t\t\tpotentialLimit,\n\t\t\t\t\t)}`,\n\t\t\t\t};\n\t\t\t\tthrow error;\n\t\t\t},\n\t\t\t(rawLimit: RawLimit) => {\n\t\t\t\tconst limit = { ...rawLimit, type: limitType };\n\n\t\t\t\treturn limit;\n\t\t\t},\n\t\t)(RawLimit.decode(potentialLimit));\n\t}\n\n\tprivate async _fetch(args: {\n\t\turl: URL;\n\t\tmethod?: \"GET\" | \"POST\";\n\t\tbody?: unknown;\n\t\tuserAgent?: PrismicRepositoryUserAgents;\n\t}): Promise<Response> {\n\t\tconst cookies = await this.user.getAuthenticationCookies();\n\n\t\tconst extraHeaders: Record<string, string> = {};\n\n\t\tif (args.body) {\n\t\t\textraHeaders[\"Content-Type\"] = \"application/json\";\n\t\t}\n\n\t\treturn await fetch(args.url.toString(), {\n\t\t\tmethod: args.method,\n\t\t\tbody: args.body ? JSON.stringify(args.body) : undefined,\n\t\t\theaders: {\n\t\t\t\t// Some endpoints rely on the authorization header...\n\t\t\t\tAuthorization: `Bearer ${cookies[\"prismic-auth\"]}`,\n\t\t\t\tCookie: serializeCookies(cookies),\n\t\t\t\t\"User-Agent\": args.userAgent || SLICE_MACHINE_USER_AGENT,\n\t\t\t\t...extraHeaders,\n\t\t\t},\n\t\t});\n\t}\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PrismicRepositoryManager.js","sources":["../../../../src/managers/prismicRepository/PrismicRepositoryManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport fetch, { Response } from \"node-fetch\";\nimport { fold } from \"fp-ts/Either\";\n\nimport { decode } from \"../../lib/decode\";\nimport { serializeCookies } from \"../../lib/serializeCookies\";\n\nimport { SLICE_MACHINE_USER_AGENT } from \"../../constants/SLICE_MACHINE_USER_AGENT\";\nimport { API_ENDPOINTS } from \"../../constants/API_ENDPOINTS\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nimport {\n\tAllChangeTypes,\n\tBulkBody,\n\tChangeTypes,\n\tClientError,\n\tLimit,\n\tLimitType,\n\tPrismicRepository,\n\tPrismicRepositoryRole,\n\tPrismicRepositoryUserAgent,\n\tPrismicRepositoryUserAgents,\n\tRawLimit,\n\tTransactionalMergeArgs,\n\tTransactionalMergeReturnType,\n} from \"./types\";\nimport { assertPluginsInitialized } from \"../../lib/assertPluginsInitialized\";\nimport { UnauthenticatedError } from \"../../errors\";\n\nconst DEFAULT_REPOSITORY_SETTINGS = {\n\tplan: \"personal\",\n\tisAnnual: \"false\",\n\trole: \"developer\",\n};\n\ntype PrismicRepositoryManagerCheckExistsArgs = {\n\tdomain: string;\n};\n\ntype PrismicRepositoryManagerCreateArgs = {\n\tdomain: string;\n\tframework: string; // TODO: Type(?)\n};\n\ntype PrismicRepositoryManagerDeleteArgs = {\n\tdomain: string;\n\tpassword: string;\n};\n\ntype PrismicRepositoryManagerPushDocumentsArgs = {\n\tdomain: string;\n\tsignature: string;\n\tdocuments: Record<string, unknown>; // TODO: Type unknown if possible(?)\n};\n\nexport class PrismicRepositoryManager extends BaseManager {\n\t// TODO: Add methods for repository-specific actions. E.g. creating a\n\t// new repository.\n\n\tasync readAll(): Promise<PrismicRepository[]> {\n\t\tconst url = new URL(\"./repositories\", API_ENDPOINTS.PrismicUser);\n\t\tconst res = await this._fetch({ url });\n\t\tconst json = await res.json();\n\n\t\tif (res.ok) {\n\t\t\tconst { value: repositories, error } = decode(\n\t\t\t\tt.array(PrismicRepository),\n\t\t\t\tjson,\n\t\t\t);\n\n\t\t\tif (error) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to decode repositories: ${error.errors.join(\", \")}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn repositories;\n\t\t} else {\n\t\t\tthrow new Error(`Failed to read repositories`, { cause: json });\n\t\t}\n\t}\n\n\t// Should this be in manager? It's one of the few sync method\n\t//\n\t// Reply from Angelo 2022-12-22: I think it should be in manager\n\t// because we shouldn't be exporting root-level utilities from this\n\t// package. If we want to make it more inline with the other methods,\n\t// we could simplify the API by changing its signature to the\n\t// following:\n\t//\n\t// ```ts\n\t// (repositoryName: string) => Promise<boolean>\n\t// ```\n\t//\n\t// This method would:\n\t//\n\t// 1. Fetch the list of repositories for the user using `readAll()`.\n\t// The list would be cached.\n\t// 2. Determine if the user has write access to the given repository.\n\t//\n\t// This version has the following benefits:\n\t//\n\t// - Does not expect the consumer to supply a repository object; it\n\t// only requires a repository name, which could be sourced from\n\t// anything (incl. the project's `sm.json`).\n\t//\n\t// - Similarly, it does not expect the consumer to call `readAll()`\n\t// before calling this method.\n\t//\n\t// - Works for repositories that the user does not have access to. For\n\t// example, I could use it to check if I have access to \"qwerty\",\n\t// even if I am not added as a user. The purpose of the method is\n\t// still valid: do I have write access to a given repository?\n\thasWriteAccess(repository: PrismicRepository): boolean {\n\t\tswitch (repository.role) {\n\t\t\tcase PrismicRepositoryRole.SuperUser:\n\t\t\tcase PrismicRepositoryRole.Owner:\n\t\t\tcase PrismicRepositoryRole.Administrator:\n\t\t\t\treturn true;\n\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync checkExists(\n\t\targs: PrismicRepositoryManagerCheckExistsArgs,\n\t): Promise<boolean> {\n\t\tconst url = new URL(\n\t\t\t`./app/dashboard/repositories/${args.domain}/exists`,\n\t\t\tAPI_ENDPOINTS.PrismicWroom,\n\t\t);\n\t\tconst res = await this._fetch({ url });\n\t\tconst text = await res.text();\n\n\t\tif (res.ok) {\n\t\t\treturn text === \"false\"; // Endpoint returns `false` when repository exists\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to check repository existence for domain \\`${args.domain}\\``,\n\t\t\t\t{ cause: text },\n\t\t\t);\n\t\t}\n\t}\n\n\tasync create(args: PrismicRepositoryManagerCreateArgs): Promise<void> {\n\t\tconst url = new URL(\n\t\t\t\"./authentication/newrepository?app=slicemachine\",\n\t\t\tAPI_ENDPOINTS.PrismicWroom,\n\t\t);\n\n\t\tconst body = {\n\t\t\t...DEFAULT_REPOSITORY_SETTINGS,\n\t\t\tdomain: args.domain,\n\t\t\tframework: args.framework, // This property appears to be optional for the API\n\t\t};\n\n\t\tconst res = await this._fetch({\n\t\t\turl,\n\t\t\tmethod: \"POST\",\n\t\t\tbody,\n\t\t\tuserAgent: PrismicRepositoryUserAgent.SliceMachine, // Custom User Agent is required\n\t\t});\n\t\tconst text = await res.text();\n\n\t\t// Endpoint returns repository name on success, which must be more than 4 characters and less than 30\n\t\t// if (!res.ok) {\n\t\tif (!res.ok || text.length < 4 || text.length > 30) {\n\t\t\tthrow new Error(`Failed to create repository \\`${args.domain}\\``, {\n\t\t\t\tcause: res,\n\t\t\t});\n\t\t}\n\t}\n\n\t// TODO: Delete this endpoint? It doesn't seem to be used (I might be wrong). - Angelo\n\tasync delete(args: PrismicRepositoryManagerDeleteArgs): Promise<void> {\n\t\tconst cookies = await this.user.getAuthenticationCookies();\n\n\t\tconst url = new URL(\n\t\t\t`./app/settings/delete?_=${cookies[\"X_XSRF\"]}`, // TODO: Maybe we want to throw early if the token is no available, or get the token another way\n\t\t\tAPI_ENDPOINTS.PrismicWroom,\n\t\t);\n\t\t// Update hostname to include repository domain\n\t\turl.hostname = `${args.domain}.${url.hostname}`;\n\n\t\tconst body = {\n\t\t\tconfirm: args.domain,\n\t\t\tpassword: args.password,\n\t\t};\n\n\t\tconst res = await this._fetch({\n\t\t\turl,\n\t\t\tmethod: \"POST\",\n\t\t\tbody,\n\t\t\tuserAgent: PrismicRepositoryUserAgent.LegacyZero, // Custom User Agent is required\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tthrow new Error(`Failed to delete repository \\`${args.domain}\\``, {\n\t\t\t\tcause: res,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync pushDocuments(\n\t\targs: PrismicRepositoryManagerPushDocumentsArgs,\n\t): Promise<void> {\n\t\tconst url = new URL(\"./starter/documents\", API_ENDPOINTS.PrismicWroom);\n\t\t// Update hostname to include repository domain\n\t\turl.hostname = `${args.domain}.${url.hostname}`;\n\n\t\tconst body = {\n\t\t\tsignature: args.signature,\n\t\t\tdocuments: JSON.stringify(args.documents),\n\t\t};\n\n\t\tconst res = await this._fetch({\n\t\t\turl,\n\t\t\tmethod: \"POST\",\n\t\t\tbody,\n\t\t\tuserAgent: PrismicRepositoryUserAgent.LegacyZero, // Custom User Agent is required\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tlet reason: string | null = null;\n\t\t\ttry {\n\t\t\t\treason = await res.text();\n\t\t\t} catch {\n\t\t\t\t// Noop\n\t\t\t}\n\n\t\t\t// Ideally the API should throw a 409 or something like that...\n\t\t\tif (reason === \"Repository should not contain documents\") {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to push documents to repository \\`${args.domain}\\`, repository is not empty`,\n\t\t\t\t\t{\n\t\t\t\t\t\tcause: res,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to push documents to repository \\`${args.domain}\\`, ${res.status} ${res.statusText}`,\n\t\t\t\t{\n\t\t\t\t\tcause: res,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t}\n\n\tasync pushChanges(\n\t\targs: TransactionalMergeArgs,\n\t): Promise<TransactionalMergeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tif (!(await this.user.checkIsLoggedIn())) {\n\t\t\tthrow new UnauthenticatedError();\n\t\t}\n\n\t\ttry {\n\t\t\tconst allChanges: AllChangeTypes[] = await Promise.all(\n\t\t\t\targs.changes.map(async (change) => {\n\t\t\t\t\tif (change.type === \"Slice\") {\n\t\t\t\t\t\tswitch (change.status) {\n\t\t\t\t\t\t\tcase \"NEW\": {\n\t\t\t\t\t\t\t\tconst { model } = await this.slices.readSlice({\n\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\tsliceID: change.id,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (!model) {\n\t\t\t\t\t\t\t\t\tthrow Error(`Could not find model ${change.id}`);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst modelWithScreenshots =\n\t\t\t\t\t\t\t\t\tawait this.slices.updateSliceModelScreenshotsInPlace({\n\t\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tawait this.slices.updateSlice({\n\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\tmodel: modelWithScreenshots,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.SLICE_INSERT,\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: modelWithScreenshots,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase \"MODIFIED\": {\n\t\t\t\t\t\t\t\tconst { model } = await this.slices.readSlice({\n\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\tsliceID: change.id,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (!model) {\n\t\t\t\t\t\t\t\t\tthrow Error(`Could not find model ${change.id}`);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst modelWithScreenshots =\n\t\t\t\t\t\t\t\t\tawait this.slices.updateSliceModelScreenshotsInPlace({\n\t\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tawait this.slices.updateSlice({\n\t\t\t\t\t\t\t\t\tlibraryID: change.libraryID,\n\t\t\t\t\t\t\t\t\tmodel: modelWithScreenshots,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.SLICE_UPDATE,\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: modelWithScreenshots,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase \"DELETED\":\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: { id: change.id },\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.SLICE_DELETE,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tswitch (change.status) {\n\t\t\t\t\t\t\tcase \"NEW\": {\n\t\t\t\t\t\t\t\tconst { model } = await this.customTypes.readCustomType({\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (!model) {\n\t\t\t\t\t\t\t\t\tthrow Error(`Could not find model ${change.id}`);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.CUSTOM_TYPE_INSERT,\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: model,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase \"MODIFIED\": {\n\t\t\t\t\t\t\t\tconst { model } = await this.customTypes.readCustomType({\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (!model) {\n\t\t\t\t\t\t\t\t\tthrow Error(`Could not find model ${change.id}`);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.CUSTOM_TYPE_UPDATE,\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: model,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase \"DELETED\":\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tid: change.id,\n\t\t\t\t\t\t\t\t\tpayload: { id: change.id },\n\t\t\t\t\t\t\t\t\ttype: ChangeTypes.CUSTOM_TYPE_DELETE,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\t// Compute the POST body\n\t\t\tconst requestBody: BulkBody = {\n\t\t\t\tconfirmDeleteDocuments: args.confirmDeleteDocuments,\n\t\t\t\tchanges: allChanges,\n\t\t\t};\n\n\t\t\tconst sliceMachineConfig = await this.project.getSliceMachineConfig();\n\n\t\t\t// TODO: move to customtypes client\n\t\t\tconst response = await this._fetch({\n\t\t\t\turl: new URL(\"/bulk\", API_ENDPOINTS.PrismicModels),\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tbody: requestBody,\n\t\t\t\trepository: sliceMachineConfig.repositoryName,\n\t\t\t});\n\n\t\t\tswitch (response.status) {\n\t\t\t\tcase 202:\n\t\t\t\t\treturn this._decodeLimitOrThrow(\n\t\t\t\t\t\tawait response.json(),\n\t\t\t\t\t\tresponse.status,\n\t\t\t\t\t\tLimitType.SOFT,\n\t\t\t\t\t);\n\t\t\t\tcase 204:\n\t\t\t\t\treturn null;\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthenticatedError();\n\t\t\t\tcase 403:\n\t\t\t\t\treturn this._decodeLimitOrThrow(\n\t\t\t\t\t\tawait response.json(),\n\t\t\t\t\t\tresponse.status,\n\t\t\t\t\t\tLimitType.HARD,\n\t\t\t\t\t);\n\t\t\t\tcase 400:\n\t\t\t\t\tconst text = await response.text();\n\t\t\t\t\tthrow new Error(text);\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unexpected status code ${response.status}`);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.error(\"An error happened while pushing your changes\");\n\t\t\tconsole.error(err);\n\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tprivate _decodeLimitOrThrow(\n\t\tpotentialLimit: unknown,\n\t\tstatusCode: number,\n\t\tlimitType: LimitType,\n\t): Limit | null {\n\t\treturn fold<t.Errors, RawLimit, Limit | null>(\n\t\t\t() => {\n\t\t\t\tconst error: ClientError = {\n\t\t\t\t\tstatus: statusCode,\n\t\t\t\t\tmessage: `Unable to parse raw limit from ${JSON.stringify(\n\t\t\t\t\t\tpotentialLimit,\n\t\t\t\t\t)}`,\n\t\t\t\t};\n\t\t\t\tthrow error;\n\t\t\t},\n\t\t\t(rawLimit: RawLimit) => {\n\t\t\t\tconst limit = { ...rawLimit, type: limitType };\n\n\t\t\t\treturn limit;\n\t\t\t},\n\t\t)(RawLimit.decode(potentialLimit));\n\t}\n\n\tprivate async _fetch(args: {\n\t\turl: URL;\n\t\tmethod?: \"GET\" | \"POST\";\n\t\tbody?: unknown;\n\t\tuserAgent?: PrismicRepositoryUserAgents;\n\t\trepository?: string;\n\t}): Promise<Response> {\n\t\tconst cookies = await this.user.getAuthenticationCookies();\n\n\t\tconst extraHeaders: Record<string, string> = {};\n\n\t\tif (args.body) {\n\t\t\textraHeaders[\"Content-Type\"] = \"application/json\";\n\t\t}\n\n\t\tif (args.repository) {\n\t\t\textraHeaders.repository = args.repository;\n\t\t}\n\n\t\treturn await fetch(args.url.toString(), {\n\t\t\tmethod: args.method,\n\t\t\tbody: args.body ? JSON.stringify(args.body) : undefined,\n\t\t\theaders: {\n\t\t\t\t// Some endpoints rely on the authorization header...\n\t\t\t\tAuthorization: `Bearer ${cookies[\"prismic-auth\"]}`,\n\t\t\t\tCookie: serializeCookies(cookies),\n\t\t\t\t\"User-Agent\": args.userAgent || SLICE_MACHINE_USER_AGENT,\n\t\t\t\t...extraHeaders,\n\t\t\t},\n\t\t});\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -95,6 +95,11 @@ class SimulatorManager extends BaseManager.BaseManager {
95
95
  errors: errors2
96
96
  };
97
97
  }
98
+ supportsSliceSimulator() {
99
+ assertPluginsInitialized.assertPluginsInitialized(this.sliceMachinePluginRunner);
100
+ const hooks = this.sliceMachinePluginRunner.hooksForType("slice-simulator:setup:read");
101
+ return hooks.length > 0;
102
+ }
98
103
  }
99
104
  exports.SimulatorManager = SimulatorManager;
100
105
  //# sourceMappingURL=SimulatorManager.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"SimulatorManager.cjs","sources":["../../../../src/managers/simulator/SimulatorManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport { HookError } from \"@slicemachine/plugin-kit\";\nimport fetch from \"node-fetch\";\n\nimport { DecodeError } from \"../../lib/DecodeError\";\nimport { assertPluginsInitialized } from \"../../lib/assertPluginsInitialized\";\nimport { castArray } from \"../../lib/castArray\";\nimport { decode } from \"../../lib/decode\";\nimport { decodeHookResult } from \"../../lib/decodeHookResult\";\nimport { functionCodec } from \"../../lib/functionCodec\";\nimport { markdownToHTML } from \"../../lib/markdownToHTML\";\n\nimport { UnexpectedDataError } from \"../../errors\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nconst sliceSimulatorSetupStepCodec = t.intersection([\n\tt.type({\n\t\ttitle: t.string,\n\t\tbody: t.string,\n\t}),\n\tt.partial({\n\t\tdescription: t.string,\n\t\tvalidate: functionCodec,\n\t}),\n]);\n\nconst SliceSimulatorSetupStepValidationMessageCodec = t.type({\n\ttitle: t.string,\n\tmessage: t.string,\n});\ntype SliceSimulatorSetupStepValidationMessageCodec = t.TypeOf<\n\ttypeof SliceSimulatorSetupStepValidationMessageCodec\n>;\n\nexport type SimulatorManagerReadSliceSimulatorSetupStep = {\n\ttitle: string;\n\tdescription?: string;\n\tbody: string;\n\t/**\n\t * Determines if the step is completed.\n\t *\n\t * This proeprty is `undefined` if the project's adapter does not provide a\n\t * validation function for the step; we cannot know if the step is complete\n\t * without a validator.\n\t */\n\tisComplete: boolean | undefined;\n\tvalidationMessages: SliceSimulatorSetupStepValidationMessageCodec[];\n};\n\nexport type SimulatorManagerReadSliceSimulatorSetupStepsReturnType = {\n\tsteps: SimulatorManagerReadSliceSimulatorSetupStep[];\n\terrors: (DecodeError | HookError)[];\n};\n\nexport class SimulatorManager extends BaseManager {\n\tasync getLocalSliceSimulatorURL(): Promise<string | undefined> {\n\t\tconst sliceMachineConfig = await this.project.getSliceMachineConfig();\n\n\t\treturn sliceMachineConfig.localSliceSimulatorURL;\n\t}\n\n\t/**\n\t * @throws {@link UnexpectedDataError} Thrown if the project is not configured\n\t * with a Slice Simulator URL.\n\t */\n\tasync checkIsLocalSliceSimulatorURLAccessible(): Promise<boolean> {\n\t\tconst localSliceSimulatorURL = await this.getLocalSliceSimulatorURL();\n\n\t\tif (!localSliceSimulatorURL) {\n\t\t\tthrow new UnexpectedDataError(\n\t\t\t\t\"The project has not been configured with a Slice Simulator URL. Add a `localSliceSimulatorURL` property to your project's configuration to fix this error.\",\n\t\t\t);\n\t\t}\n\n\t\tconst res = await fetch(localSliceSimulatorURL);\n\n\t\treturn res.ok;\n\t}\n\n\tasync readSliceSimulatorSetupSteps(): Promise<SimulatorManagerReadSliceSimulatorSetupStepsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"slice-simulator:setup:read\",\n\t\t\tundefined,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.array(sliceSimulatorSetupStepCodec),\n\t\t\thookResult,\n\t\t);\n\n\t\tconst steps = await Promise.all(\n\t\t\tdata[0].map(async (step) => {\n\t\t\t\tconst bodyHTML = await markdownToHTML(step.body);\n\n\t\t\t\tconst res: SimulatorManagerReadSliceSimulatorSetupStep = {\n\t\t\t\t\ttitle: step.title,\n\t\t\t\t\tdescription: step.description,\n\t\t\t\t\tbody: bodyHTML,\n\t\t\t\t\tisComplete: undefined,\n\t\t\t\t\tvalidationMessages: [],\n\t\t\t\t};\n\n\t\t\t\tif (step.validate) {\n\t\t\t\t\tconst validationResult = await step.validate();\n\t\t\t\t\tconst { value: validationMessages, error } = decode(\n\t\t\t\t\t\tt.array(SliceSimulatorSetupStepValidationMessageCodec),\n\t\t\t\t\t\tvalidationResult == null ? [] : castArray(validationResult),\n\t\t\t\t\t);\n\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\t// TODO: We may want to do\n\t\t\t\t\t\t// something with the error,\n\t\t\t\t\t\t// like log to the console.\n\t\t\t\t\t\t// This branch should only be\n\t\t\t\t\t\t// reached if the adapter\n\t\t\t\t\t\t// returns invalid data.\n\n\t\t\t\t\t\treturn res;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst isComplete = validationMessages.length < 1;\n\n\t\t\t\t\tconst processedValidationMessages = await Promise.all(\n\t\t\t\t\t\tvalidationMessages.map(async (validationMessage) => {\n\t\t\t\t\t\t\tconst messageHTML = await markdownToHTML(\n\t\t\t\t\t\t\t\tvalidationMessage.message,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...validationMessage,\n\t\t\t\t\t\t\t\tmessage: messageHTML,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\n\t\t\t\t\tres.isComplete = isComplete;\n\t\t\t\t\tres.validationMessages = processedValidationMessages;\n\t\t\t\t}\n\n\t\t\t\treturn res;\n\t\t\t}),\n\t\t);\n\n\t\treturn {\n\t\t\tsteps,\n\t\t\terrors,\n\t\t};\n\t}\n}\n"],"names":["t","functionCodec","BaseManager","UnexpectedDataError","fetch","assertPluginsInitialized","errors","decodeHookResult","markdownToHTML","decode","castArray"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,MAAM,+BAA+BA,aAAE,aAAa;AAAA,EACnDA,aAAE,KAAK;AAAA,IACN,OAAOA,aAAE;AAAA,IACT,MAAMA,aAAE;AAAA,EAAA,CACR;AAAA,EACDA,aAAE,QAAQ;AAAA,IACT,aAAaA,aAAE;AAAA,IACf,UAAUC,cAAA;AAAA,EAAA,CACV;AACD,CAAA;AAED,MAAM,gDAAgDD,aAAE,KAAK;AAAA,EAC5D,OAAOA,aAAE;AAAA,EACT,SAASA,aAAE;AACX,CAAA;AAyBK,MAAO,yBAAyBE,YAAAA,YAAW;AAAA,EAChD,MAAM,4BAAyB;AAC9B,UAAM,qBAAqB,MAAM,KAAK,QAAQ,sBAAqB;AAEnE,WAAO,mBAAmB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,0CAAuC;AACtC,UAAA,yBAAyB,MAAM,KAAK;AAE1C,QAAI,CAAC,wBAAwB;AACtB,YAAA,IAAIC,OAAAA,oBACT,4JAA4J;AAAA,IAE7J;AAEK,UAAA,MAAM,MAAMC,cAAM,sBAAsB;AAE9C,WAAO,IAAI;AAAA,EACZ;AAAA,EAEA,MAAM,+BAA4B;AACjCC,sDAAyB,KAAK,wBAAwB;AAEtD,UAAM,aAAa,MAAM,KAAK,yBAAyB,SACtD,8BACA,MAAS;AAEJ,UAAA,EAAE,MAAM,QAAAC,QAAM,IAAKC,kCACxBP,aAAE,MAAM,4BAA4B,GACpC,UAAU;AAGL,UAAA,QAAQ,MAAM,QAAQ,IAC3B,KAAK,CAAC,EAAE,IAAI,OAAO,SAAQ;AAC1B,YAAM,WAAW,MAAMQ,eAAAA,eAAe,KAAK,IAAI;AAE/C,YAAM,MAAmD;AAAA,QACxD,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,oBAAoB,CAAE;AAAA,MAAA;AAGvB,UAAI,KAAK,UAAU;AACZ,cAAA,mBAAmB,MAAM,KAAK;AACpC,cAAM,EAAE,OAAO,oBAAoB,MAAK,IAAKC,OAAAA,OAC5CT,aAAE,MAAM,6CAA6C,GACrD,oBAAoB,OAAO,CAAK,IAAAU,UAAA,UAAU,gBAAgB,CAAC;AAG5D,YAAI,OAAO;AAQH,iBAAA;AAAA,QACP;AAEK,cAAA,aAAa,mBAAmB,SAAS;AAE/C,cAAM,8BAA8B,MAAM,QAAQ,IACjD,mBAAmB,IAAI,OAAO,sBAAqB;AAClD,gBAAM,cAAc,MAAMF,eAAAA,eACzB,kBAAkB,OAAO;AAGnB,iBAAA;AAAA,YACN,GAAG;AAAA,YACH,SAAS;AAAA,UAAA;AAAA,QAEV,CAAA,CAAC;AAGH,YAAI,aAAa;AACjB,YAAI,qBAAqB;AAAA,MACzB;AAEM,aAAA;AAAA,IACP,CAAA,CAAC;AAGI,WAAA;AAAA,MACN;AAAA,MACA,QAAAF;AAAA,IAAA;AAAA,EAEF;AACA;;"}
1
+ {"version":3,"file":"SimulatorManager.cjs","sources":["../../../../src/managers/simulator/SimulatorManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport { HookError } from \"@slicemachine/plugin-kit\";\nimport fetch from \"node-fetch\";\n\nimport { DecodeError } from \"../../lib/DecodeError\";\nimport { assertPluginsInitialized } from \"../../lib/assertPluginsInitialized\";\nimport { castArray } from \"../../lib/castArray\";\nimport { decode } from \"../../lib/decode\";\nimport { decodeHookResult } from \"../../lib/decodeHookResult\";\nimport { functionCodec } from \"../../lib/functionCodec\";\nimport { markdownToHTML } from \"../../lib/markdownToHTML\";\n\nimport { UnexpectedDataError } from \"../../errors\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nconst sliceSimulatorSetupStepCodec = t.intersection([\n\tt.type({\n\t\ttitle: t.string,\n\t\tbody: t.string,\n\t}),\n\tt.partial({\n\t\tdescription: t.string,\n\t\tvalidate: functionCodec,\n\t}),\n]);\n\nconst SliceSimulatorSetupStepValidationMessageCodec = t.type({\n\ttitle: t.string,\n\tmessage: t.string,\n});\ntype SliceSimulatorSetupStepValidationMessageCodec = t.TypeOf<\n\ttypeof SliceSimulatorSetupStepValidationMessageCodec\n>;\n\nexport type SimulatorManagerReadSliceSimulatorSetupStep = {\n\ttitle: string;\n\tdescription?: string;\n\tbody: string;\n\t/**\n\t * Determines if the step is completed.\n\t *\n\t * This proeprty is `undefined` if the project's adapter does not provide a\n\t * validation function for the step; we cannot know if the step is complete\n\t * without a validator.\n\t */\n\tisComplete: boolean | undefined;\n\tvalidationMessages: SliceSimulatorSetupStepValidationMessageCodec[];\n};\n\nexport type SimulatorManagerReadSliceSimulatorSetupStepsReturnType = {\n\tsteps: SimulatorManagerReadSliceSimulatorSetupStep[];\n\terrors: (DecodeError | HookError)[];\n};\n\nexport class SimulatorManager extends BaseManager {\n\tasync getLocalSliceSimulatorURL(): Promise<string | undefined> {\n\t\tconst sliceMachineConfig = await this.project.getSliceMachineConfig();\n\n\t\treturn sliceMachineConfig.localSliceSimulatorURL;\n\t}\n\n\t/**\n\t * @throws {@link UnexpectedDataError} Thrown if the project is not configured\n\t * with a Slice Simulator URL.\n\t */\n\tasync checkIsLocalSliceSimulatorURLAccessible(): Promise<boolean> {\n\t\tconst localSliceSimulatorURL = await this.getLocalSliceSimulatorURL();\n\n\t\tif (!localSliceSimulatorURL) {\n\t\t\tthrow new UnexpectedDataError(\n\t\t\t\t\"The project has not been configured with a Slice Simulator URL. Add a `localSliceSimulatorURL` property to your project's configuration to fix this error.\",\n\t\t\t);\n\t\t}\n\n\t\tconst res = await fetch(localSliceSimulatorURL);\n\n\t\treturn res.ok;\n\t}\n\n\tasync readSliceSimulatorSetupSteps(): Promise<SimulatorManagerReadSliceSimulatorSetupStepsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"slice-simulator:setup:read\",\n\t\t\tundefined,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.array(sliceSimulatorSetupStepCodec),\n\t\t\thookResult,\n\t\t);\n\n\t\tconst steps = await Promise.all(\n\t\t\tdata[0].map(async (step) => {\n\t\t\t\tconst bodyHTML = await markdownToHTML(step.body);\n\n\t\t\t\tconst res: SimulatorManagerReadSliceSimulatorSetupStep = {\n\t\t\t\t\ttitle: step.title,\n\t\t\t\t\tdescription: step.description,\n\t\t\t\t\tbody: bodyHTML,\n\t\t\t\t\tisComplete: undefined,\n\t\t\t\t\tvalidationMessages: [],\n\t\t\t\t};\n\n\t\t\t\tif (step.validate) {\n\t\t\t\t\tconst validationResult = await step.validate();\n\t\t\t\t\tconst { value: validationMessages, error } = decode(\n\t\t\t\t\t\tt.array(SliceSimulatorSetupStepValidationMessageCodec),\n\t\t\t\t\t\tvalidationResult == null ? [] : castArray(validationResult),\n\t\t\t\t\t);\n\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\t// TODO: We may want to do\n\t\t\t\t\t\t// something with the error,\n\t\t\t\t\t\t// like log to the console.\n\t\t\t\t\t\t// This branch should only be\n\t\t\t\t\t\t// reached if the adapter\n\t\t\t\t\t\t// returns invalid data.\n\n\t\t\t\t\t\treturn res;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst isComplete = validationMessages.length < 1;\n\n\t\t\t\t\tconst processedValidationMessages = await Promise.all(\n\t\t\t\t\t\tvalidationMessages.map(async (validationMessage) => {\n\t\t\t\t\t\t\tconst messageHTML = await markdownToHTML(\n\t\t\t\t\t\t\t\tvalidationMessage.message,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...validationMessage,\n\t\t\t\t\t\t\t\tmessage: messageHTML,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\n\t\t\t\t\tres.isComplete = isComplete;\n\t\t\t\t\tres.validationMessages = processedValidationMessages;\n\t\t\t\t}\n\n\t\t\t\treturn res;\n\t\t\t}),\n\t\t);\n\n\t\treturn {\n\t\t\tsteps,\n\t\t\terrors,\n\t\t};\n\t}\n\n\tsupportsSliceSimulator(): boolean {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hooks = this.sliceMachinePluginRunner.hooksForType(\n\t\t\t\"slice-simulator:setup:read\",\n\t\t);\n\n\t\treturn hooks.length > 0;\n\t}\n}\n"],"names":["t","functionCodec","BaseManager","UnexpectedDataError","fetch","assertPluginsInitialized","errors","decodeHookResult","markdownToHTML","decode","castArray"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,MAAM,+BAA+BA,aAAE,aAAa;AAAA,EACnDA,aAAE,KAAK;AAAA,IACN,OAAOA,aAAE;AAAA,IACT,MAAMA,aAAE;AAAA,EAAA,CACR;AAAA,EACDA,aAAE,QAAQ;AAAA,IACT,aAAaA,aAAE;AAAA,IACf,UAAUC,cAAA;AAAA,EAAA,CACV;AACD,CAAA;AAED,MAAM,gDAAgDD,aAAE,KAAK;AAAA,EAC5D,OAAOA,aAAE;AAAA,EACT,SAASA,aAAE;AACX,CAAA;AAyBK,MAAO,yBAAyBE,YAAAA,YAAW;AAAA,EAChD,MAAM,4BAAyB;AAC9B,UAAM,qBAAqB,MAAM,KAAK,QAAQ,sBAAqB;AAEnE,WAAO,mBAAmB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,0CAAuC;AACtC,UAAA,yBAAyB,MAAM,KAAK;AAE1C,QAAI,CAAC,wBAAwB;AACtB,YAAA,IAAIC,OAAAA,oBACT,4JAA4J;AAAA,IAE7J;AAEK,UAAA,MAAM,MAAMC,cAAM,sBAAsB;AAE9C,WAAO,IAAI;AAAA,EACZ;AAAA,EAEA,MAAM,+BAA4B;AACjCC,sDAAyB,KAAK,wBAAwB;AAEtD,UAAM,aAAa,MAAM,KAAK,yBAAyB,SACtD,8BACA,MAAS;AAEJ,UAAA,EAAE,MAAM,QAAAC,QAAM,IAAKC,kCACxBP,aAAE,MAAM,4BAA4B,GACpC,UAAU;AAGL,UAAA,QAAQ,MAAM,QAAQ,IAC3B,KAAK,CAAC,EAAE,IAAI,OAAO,SAAQ;AAC1B,YAAM,WAAW,MAAMQ,eAAAA,eAAe,KAAK,IAAI;AAE/C,YAAM,MAAmD;AAAA,QACxD,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,oBAAoB,CAAE;AAAA,MAAA;AAGvB,UAAI,KAAK,UAAU;AACZ,cAAA,mBAAmB,MAAM,KAAK;AACpC,cAAM,EAAE,OAAO,oBAAoB,MAAK,IAAKC,OAAAA,OAC5CT,aAAE,MAAM,6CAA6C,GACrD,oBAAoB,OAAO,CAAK,IAAAU,UAAA,UAAU,gBAAgB,CAAC;AAG5D,YAAI,OAAO;AAQH,iBAAA;AAAA,QACP;AAEK,cAAA,aAAa,mBAAmB,SAAS;AAE/C,cAAM,8BAA8B,MAAM,QAAQ,IACjD,mBAAmB,IAAI,OAAO,sBAAqB;AAClD,gBAAM,cAAc,MAAMF,eAAAA,eACzB,kBAAkB,OAAO;AAGnB,iBAAA;AAAA,YACN,GAAG;AAAA,YACH,SAAS;AAAA,UAAA;AAAA,QAEV,CAAA,CAAC;AAGH,YAAI,aAAa;AACjB,YAAI,qBAAqB;AAAA,MACzB;AAEM,aAAA;AAAA,IACP,CAAA,CAAC;AAGI,WAAA;AAAA,MACN;AAAA,MACA,QAAAF;AAAA,IAAA;AAAA,EAEF;AAAA,EAEA,yBAAsB;AACrBD,sDAAyB,KAAK,wBAAwB;AAEtD,UAAM,QAAQ,KAAK,yBAAyB,aAC3C,4BAA4B;AAG7B,WAAO,MAAM,SAAS;AAAA,EACvB;AACA;;"}
@@ -33,5 +33,6 @@ export declare class SimulatorManager extends BaseManager {
33
33
  */
34
34
  checkIsLocalSliceSimulatorURLAccessible(): Promise<boolean>;
35
35
  readSliceSimulatorSetupSteps(): Promise<SimulatorManagerReadSliceSimulatorSetupStepsReturnType>;
36
+ supportsSliceSimulator(): boolean;
36
37
  }
37
38
  export {};
@@ -76,6 +76,11 @@ class SimulatorManager extends BaseManager {
76
76
  errors
77
77
  };
78
78
  }
79
+ supportsSliceSimulator() {
80
+ assertPluginsInitialized(this.sliceMachinePluginRunner);
81
+ const hooks = this.sliceMachinePluginRunner.hooksForType("slice-simulator:setup:read");
82
+ return hooks.length > 0;
83
+ }
79
84
  }
80
85
  export {
81
86
  SimulatorManager
@@ -1 +1 @@
1
- {"version":3,"file":"SimulatorManager.js","sources":["../../../../src/managers/simulator/SimulatorManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport { HookError } from \"@slicemachine/plugin-kit\";\nimport fetch from \"node-fetch\";\n\nimport { DecodeError } from \"../../lib/DecodeError\";\nimport { assertPluginsInitialized } from \"../../lib/assertPluginsInitialized\";\nimport { castArray } from \"../../lib/castArray\";\nimport { decode } from \"../../lib/decode\";\nimport { decodeHookResult } from \"../../lib/decodeHookResult\";\nimport { functionCodec } from \"../../lib/functionCodec\";\nimport { markdownToHTML } from \"../../lib/markdownToHTML\";\n\nimport { UnexpectedDataError } from \"../../errors\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nconst sliceSimulatorSetupStepCodec = t.intersection([\n\tt.type({\n\t\ttitle: t.string,\n\t\tbody: t.string,\n\t}),\n\tt.partial({\n\t\tdescription: t.string,\n\t\tvalidate: functionCodec,\n\t}),\n]);\n\nconst SliceSimulatorSetupStepValidationMessageCodec = t.type({\n\ttitle: t.string,\n\tmessage: t.string,\n});\ntype SliceSimulatorSetupStepValidationMessageCodec = t.TypeOf<\n\ttypeof SliceSimulatorSetupStepValidationMessageCodec\n>;\n\nexport type SimulatorManagerReadSliceSimulatorSetupStep = {\n\ttitle: string;\n\tdescription?: string;\n\tbody: string;\n\t/**\n\t * Determines if the step is completed.\n\t *\n\t * This proeprty is `undefined` if the project's adapter does not provide a\n\t * validation function for the step; we cannot know if the step is complete\n\t * without a validator.\n\t */\n\tisComplete: boolean | undefined;\n\tvalidationMessages: SliceSimulatorSetupStepValidationMessageCodec[];\n};\n\nexport type SimulatorManagerReadSliceSimulatorSetupStepsReturnType = {\n\tsteps: SimulatorManagerReadSliceSimulatorSetupStep[];\n\terrors: (DecodeError | HookError)[];\n};\n\nexport class SimulatorManager extends BaseManager {\n\tasync getLocalSliceSimulatorURL(): Promise<string | undefined> {\n\t\tconst sliceMachineConfig = await this.project.getSliceMachineConfig();\n\n\t\treturn sliceMachineConfig.localSliceSimulatorURL;\n\t}\n\n\t/**\n\t * @throws {@link UnexpectedDataError} Thrown if the project is not configured\n\t * with a Slice Simulator URL.\n\t */\n\tasync checkIsLocalSliceSimulatorURLAccessible(): Promise<boolean> {\n\t\tconst localSliceSimulatorURL = await this.getLocalSliceSimulatorURL();\n\n\t\tif (!localSliceSimulatorURL) {\n\t\t\tthrow new UnexpectedDataError(\n\t\t\t\t\"The project has not been configured with a Slice Simulator URL. Add a `localSliceSimulatorURL` property to your project's configuration to fix this error.\",\n\t\t\t);\n\t\t}\n\n\t\tconst res = await fetch(localSliceSimulatorURL);\n\n\t\treturn res.ok;\n\t}\n\n\tasync readSliceSimulatorSetupSteps(): Promise<SimulatorManagerReadSliceSimulatorSetupStepsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"slice-simulator:setup:read\",\n\t\t\tundefined,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.array(sliceSimulatorSetupStepCodec),\n\t\t\thookResult,\n\t\t);\n\n\t\tconst steps = await Promise.all(\n\t\t\tdata[0].map(async (step) => {\n\t\t\t\tconst bodyHTML = await markdownToHTML(step.body);\n\n\t\t\t\tconst res: SimulatorManagerReadSliceSimulatorSetupStep = {\n\t\t\t\t\ttitle: step.title,\n\t\t\t\t\tdescription: step.description,\n\t\t\t\t\tbody: bodyHTML,\n\t\t\t\t\tisComplete: undefined,\n\t\t\t\t\tvalidationMessages: [],\n\t\t\t\t};\n\n\t\t\t\tif (step.validate) {\n\t\t\t\t\tconst validationResult = await step.validate();\n\t\t\t\t\tconst { value: validationMessages, error } = decode(\n\t\t\t\t\t\tt.array(SliceSimulatorSetupStepValidationMessageCodec),\n\t\t\t\t\t\tvalidationResult == null ? [] : castArray(validationResult),\n\t\t\t\t\t);\n\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\t// TODO: We may want to do\n\t\t\t\t\t\t// something with the error,\n\t\t\t\t\t\t// like log to the console.\n\t\t\t\t\t\t// This branch should only be\n\t\t\t\t\t\t// reached if the adapter\n\t\t\t\t\t\t// returns invalid data.\n\n\t\t\t\t\t\treturn res;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst isComplete = validationMessages.length < 1;\n\n\t\t\t\t\tconst processedValidationMessages = await Promise.all(\n\t\t\t\t\t\tvalidationMessages.map(async (validationMessage) => {\n\t\t\t\t\t\t\tconst messageHTML = await markdownToHTML(\n\t\t\t\t\t\t\t\tvalidationMessage.message,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...validationMessage,\n\t\t\t\t\t\t\t\tmessage: messageHTML,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\n\t\t\t\t\tres.isComplete = isComplete;\n\t\t\t\t\tres.validationMessages = processedValidationMessages;\n\t\t\t\t}\n\n\t\t\t\treturn res;\n\t\t\t}),\n\t\t);\n\n\t\treturn {\n\t\t\tsteps,\n\t\t\terrors,\n\t\t};\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;;;AAgBA,MAAM,+BAA+B,EAAE,aAAa;AAAA,EACnD,EAAE,KAAK;AAAA,IACN,OAAO,EAAE;AAAA,IACT,MAAM,EAAE;AAAA,EAAA,CACR;AAAA,EACD,EAAE,QAAQ;AAAA,IACT,aAAa,EAAE;AAAA,IACf,UAAU;AAAA,EAAA,CACV;AACD,CAAA;AAED,MAAM,gDAAgD,EAAE,KAAK;AAAA,EAC5D,OAAO,EAAE;AAAA,EACT,SAAS,EAAE;AACX,CAAA;AAyBK,MAAO,yBAAyB,YAAW;AAAA,EAChD,MAAM,4BAAyB;AAC9B,UAAM,qBAAqB,MAAM,KAAK,QAAQ,sBAAqB;AAEnE,WAAO,mBAAmB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,0CAAuC;AACtC,UAAA,yBAAyB,MAAM,KAAK;AAE1C,QAAI,CAAC,wBAAwB;AACtB,YAAA,IAAI,oBACT,4JAA4J;AAAA,IAE7J;AAEK,UAAA,MAAM,MAAM,MAAM,sBAAsB;AAE9C,WAAO,IAAI;AAAA,EACZ;AAAA,EAEA,MAAM,+BAA4B;AACjC,6BAAyB,KAAK,wBAAwB;AAEtD,UAAM,aAAa,MAAM,KAAK,yBAAyB,SACtD,8BACA,MAAS;AAEJ,UAAA,EAAE,MAAM,OAAM,IAAK,iBACxB,EAAE,MAAM,4BAA4B,GACpC,UAAU;AAGL,UAAA,QAAQ,MAAM,QAAQ,IAC3B,KAAK,CAAC,EAAE,IAAI,OAAO,SAAQ;AAC1B,YAAM,WAAW,MAAM,eAAe,KAAK,IAAI;AAE/C,YAAM,MAAmD;AAAA,QACxD,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,oBAAoB,CAAE;AAAA,MAAA;AAGvB,UAAI,KAAK,UAAU;AACZ,cAAA,mBAAmB,MAAM,KAAK;AACpC,cAAM,EAAE,OAAO,oBAAoB,MAAK,IAAK,OAC5C,EAAE,MAAM,6CAA6C,GACrD,oBAAoB,OAAO,CAAK,IAAA,UAAU,gBAAgB,CAAC;AAG5D,YAAI,OAAO;AAQH,iBAAA;AAAA,QACP;AAEK,cAAA,aAAa,mBAAmB,SAAS;AAE/C,cAAM,8BAA8B,MAAM,QAAQ,IACjD,mBAAmB,IAAI,OAAO,sBAAqB;AAClD,gBAAM,cAAc,MAAM,eACzB,kBAAkB,OAAO;AAGnB,iBAAA;AAAA,YACN,GAAG;AAAA,YACH,SAAS;AAAA,UAAA;AAAA,QAEV,CAAA,CAAC;AAGH,YAAI,aAAa;AACjB,YAAI,qBAAqB;AAAA,MACzB;AAEM,aAAA;AAAA,IACP,CAAA,CAAC;AAGI,WAAA;AAAA,MACN;AAAA,MACA;AAAA,IAAA;AAAA,EAEF;AACA;"}
1
+ {"version":3,"file":"SimulatorManager.js","sources":["../../../../src/managers/simulator/SimulatorManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport { HookError } from \"@slicemachine/plugin-kit\";\nimport fetch from \"node-fetch\";\n\nimport { DecodeError } from \"../../lib/DecodeError\";\nimport { assertPluginsInitialized } from \"../../lib/assertPluginsInitialized\";\nimport { castArray } from \"../../lib/castArray\";\nimport { decode } from \"../../lib/decode\";\nimport { decodeHookResult } from \"../../lib/decodeHookResult\";\nimport { functionCodec } from \"../../lib/functionCodec\";\nimport { markdownToHTML } from \"../../lib/markdownToHTML\";\n\nimport { UnexpectedDataError } from \"../../errors\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nconst sliceSimulatorSetupStepCodec = t.intersection([\n\tt.type({\n\t\ttitle: t.string,\n\t\tbody: t.string,\n\t}),\n\tt.partial({\n\t\tdescription: t.string,\n\t\tvalidate: functionCodec,\n\t}),\n]);\n\nconst SliceSimulatorSetupStepValidationMessageCodec = t.type({\n\ttitle: t.string,\n\tmessage: t.string,\n});\ntype SliceSimulatorSetupStepValidationMessageCodec = t.TypeOf<\n\ttypeof SliceSimulatorSetupStepValidationMessageCodec\n>;\n\nexport type SimulatorManagerReadSliceSimulatorSetupStep = {\n\ttitle: string;\n\tdescription?: string;\n\tbody: string;\n\t/**\n\t * Determines if the step is completed.\n\t *\n\t * This proeprty is `undefined` if the project's adapter does not provide a\n\t * validation function for the step; we cannot know if the step is complete\n\t * without a validator.\n\t */\n\tisComplete: boolean | undefined;\n\tvalidationMessages: SliceSimulatorSetupStepValidationMessageCodec[];\n};\n\nexport type SimulatorManagerReadSliceSimulatorSetupStepsReturnType = {\n\tsteps: SimulatorManagerReadSliceSimulatorSetupStep[];\n\terrors: (DecodeError | HookError)[];\n};\n\nexport class SimulatorManager extends BaseManager {\n\tasync getLocalSliceSimulatorURL(): Promise<string | undefined> {\n\t\tconst sliceMachineConfig = await this.project.getSliceMachineConfig();\n\n\t\treturn sliceMachineConfig.localSliceSimulatorURL;\n\t}\n\n\t/**\n\t * @throws {@link UnexpectedDataError} Thrown if the project is not configured\n\t * with a Slice Simulator URL.\n\t */\n\tasync checkIsLocalSliceSimulatorURLAccessible(): Promise<boolean> {\n\t\tconst localSliceSimulatorURL = await this.getLocalSliceSimulatorURL();\n\n\t\tif (!localSliceSimulatorURL) {\n\t\t\tthrow new UnexpectedDataError(\n\t\t\t\t\"The project has not been configured with a Slice Simulator URL. Add a `localSliceSimulatorURL` property to your project's configuration to fix this error.\",\n\t\t\t);\n\t\t}\n\n\t\tconst res = await fetch(localSliceSimulatorURL);\n\n\t\treturn res.ok;\n\t}\n\n\tasync readSliceSimulatorSetupSteps(): Promise<SimulatorManagerReadSliceSimulatorSetupStepsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"slice-simulator:setup:read\",\n\t\t\tundefined,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.array(sliceSimulatorSetupStepCodec),\n\t\t\thookResult,\n\t\t);\n\n\t\tconst steps = await Promise.all(\n\t\t\tdata[0].map(async (step) => {\n\t\t\t\tconst bodyHTML = await markdownToHTML(step.body);\n\n\t\t\t\tconst res: SimulatorManagerReadSliceSimulatorSetupStep = {\n\t\t\t\t\ttitle: step.title,\n\t\t\t\t\tdescription: step.description,\n\t\t\t\t\tbody: bodyHTML,\n\t\t\t\t\tisComplete: undefined,\n\t\t\t\t\tvalidationMessages: [],\n\t\t\t\t};\n\n\t\t\t\tif (step.validate) {\n\t\t\t\t\tconst validationResult = await step.validate();\n\t\t\t\t\tconst { value: validationMessages, error } = decode(\n\t\t\t\t\t\tt.array(SliceSimulatorSetupStepValidationMessageCodec),\n\t\t\t\t\t\tvalidationResult == null ? [] : castArray(validationResult),\n\t\t\t\t\t);\n\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\t// TODO: We may want to do\n\t\t\t\t\t\t// something with the error,\n\t\t\t\t\t\t// like log to the console.\n\t\t\t\t\t\t// This branch should only be\n\t\t\t\t\t\t// reached if the adapter\n\t\t\t\t\t\t// returns invalid data.\n\n\t\t\t\t\t\treturn res;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst isComplete = validationMessages.length < 1;\n\n\t\t\t\t\tconst processedValidationMessages = await Promise.all(\n\t\t\t\t\t\tvalidationMessages.map(async (validationMessage) => {\n\t\t\t\t\t\t\tconst messageHTML = await markdownToHTML(\n\t\t\t\t\t\t\t\tvalidationMessage.message,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...validationMessage,\n\t\t\t\t\t\t\t\tmessage: messageHTML,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\n\t\t\t\t\tres.isComplete = isComplete;\n\t\t\t\t\tres.validationMessages = processedValidationMessages;\n\t\t\t\t}\n\n\t\t\t\treturn res;\n\t\t\t}),\n\t\t);\n\n\t\treturn {\n\t\t\tsteps,\n\t\t\terrors,\n\t\t};\n\t}\n\n\tsupportsSliceSimulator(): boolean {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hooks = this.sliceMachinePluginRunner.hooksForType(\n\t\t\t\"slice-simulator:setup:read\",\n\t\t);\n\n\t\treturn hooks.length > 0;\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;;;AAgBA,MAAM,+BAA+B,EAAE,aAAa;AAAA,EACnD,EAAE,KAAK;AAAA,IACN,OAAO,EAAE;AAAA,IACT,MAAM,EAAE;AAAA,EAAA,CACR;AAAA,EACD,EAAE,QAAQ;AAAA,IACT,aAAa,EAAE;AAAA,IACf,UAAU;AAAA,EAAA,CACV;AACD,CAAA;AAED,MAAM,gDAAgD,EAAE,KAAK;AAAA,EAC5D,OAAO,EAAE;AAAA,EACT,SAAS,EAAE;AACX,CAAA;AAyBK,MAAO,yBAAyB,YAAW;AAAA,EAChD,MAAM,4BAAyB;AAC9B,UAAM,qBAAqB,MAAM,KAAK,QAAQ,sBAAqB;AAEnE,WAAO,mBAAmB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,0CAAuC;AACtC,UAAA,yBAAyB,MAAM,KAAK;AAE1C,QAAI,CAAC,wBAAwB;AACtB,YAAA,IAAI,oBACT,4JAA4J;AAAA,IAE7J;AAEK,UAAA,MAAM,MAAM,MAAM,sBAAsB;AAE9C,WAAO,IAAI;AAAA,EACZ;AAAA,EAEA,MAAM,+BAA4B;AACjC,6BAAyB,KAAK,wBAAwB;AAEtD,UAAM,aAAa,MAAM,KAAK,yBAAyB,SACtD,8BACA,MAAS;AAEJ,UAAA,EAAE,MAAM,OAAM,IAAK,iBACxB,EAAE,MAAM,4BAA4B,GACpC,UAAU;AAGL,UAAA,QAAQ,MAAM,QAAQ,IAC3B,KAAK,CAAC,EAAE,IAAI,OAAO,SAAQ;AAC1B,YAAM,WAAW,MAAM,eAAe,KAAK,IAAI;AAE/C,YAAM,MAAmD;AAAA,QACxD,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,oBAAoB,CAAE;AAAA,MAAA;AAGvB,UAAI,KAAK,UAAU;AACZ,cAAA,mBAAmB,MAAM,KAAK;AACpC,cAAM,EAAE,OAAO,oBAAoB,MAAK,IAAK,OAC5C,EAAE,MAAM,6CAA6C,GACrD,oBAAoB,OAAO,CAAK,IAAA,UAAU,gBAAgB,CAAC;AAG5D,YAAI,OAAO;AAQH,iBAAA;AAAA,QACP;AAEK,cAAA,aAAa,mBAAmB,SAAS;AAE/C,cAAM,8BAA8B,MAAM,QAAQ,IACjD,mBAAmB,IAAI,OAAO,sBAAqB;AAClD,gBAAM,cAAc,MAAM,eACzB,kBAAkB,OAAO;AAGnB,iBAAA;AAAA,YACN,GAAG;AAAA,YACH,SAAS;AAAA,UAAA;AAAA,QAEV,CAAA,CAAC;AAGH,YAAI,aAAa;AACjB,YAAI,qBAAqB;AAAA,MACzB;AAEM,aAAA;AAAA,IACP,CAAA,CAAC;AAGI,WAAA;AAAA,MACN;AAAA,MACA;AAAA,IAAA;AAAA,EAEF;AAAA,EAEA,yBAAsB;AACrB,6BAAyB,KAAK,wBAAwB;AAEtD,UAAM,QAAQ,KAAK,yBAAyB,aAC3C,4BAA4B;AAG7B,WAAO,MAAM,SAAS;AAAA,EACvB;AACA;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slicemachine/manager",
3
- "version": "0.1.1-dev-plugins-m2-validation.0",
3
+ "version": "0.1.1-dev-plugins-m2-validation.1",
4
4
  "description": "Manage all aspects of a Slice Machine project.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -63,7 +63,7 @@
63
63
  "@antfu/ni": "^0.20.0",
64
64
  "@prismicio/custom-types-client": "^1.1.0",
65
65
  "@prismicio/types-internal": "^1.5.3",
66
- "@slicemachine/plugin-kit": "0.1.8-dev-plugins-m2-validation.0",
66
+ "@slicemachine/plugin-kit": "0.1.8-dev-plugins-m2-validation.1",
67
67
  "@wooorm/starry-night": "^1.6.0",
68
68
  "analytics-node": "^6.2.0",
69
69
  "cookie": "^0.5.0",
@@ -136,5 +136,5 @@
136
136
  "publishConfig": {
137
137
  "access": "public"
138
138
  },
139
- "gitHead": "f2b7a99b811ce7bef307e38a39158132b66b43f3"
139
+ "gitHead": "0179bf2dffee40424d83540591d5d15f14596c72"
140
140
  }
package/src/errors.ts CHANGED
@@ -41,9 +41,17 @@ export class PluginHookResultError extends SliceMachineError {
41
41
  export const isSliceMachineError = (
42
42
  error: unknown,
43
43
  ): error is SliceMachineError => {
44
- return (
45
- typeof error === "object" && error !== null && "_sliceMachineError" in error
46
- );
44
+ // TODO: Discuss a stronger way to serialize error for the client to detect with r19
45
+ // @ts-expect-error We don't want to add "dom" to tsconfig "lib" because of the TODO
46
+ if (typeof window !== "undefined") {
47
+ return typeof error === "object" && error !== null;
48
+ } else {
49
+ return (
50
+ typeof error === "object" &&
51
+ error !== null &&
52
+ "_sliceMachineError" in error
53
+ );
54
+ }
47
55
  };
48
56
 
49
57
  export const isUnauthorizedError = (
@@ -48,6 +48,7 @@ type SliceMachineManagerGetStateReturnType = {
48
48
  repo: string;
49
49
  changelog?: PackageChangelog;
50
50
  packageManager: PackageManager;
51
+ supportsSliceSimulator: boolean;
51
52
  };
52
53
  libraries: {
53
54
  name: string;
@@ -246,6 +247,7 @@ export class SliceMachineManager {
246
247
  localSliceSimulatorURL: sliceMachineConfig.localSliceSimulatorURL,
247
248
  },
248
249
  packageManager,
250
+ supportsSliceSimulator: this.simulator.supportsSliceSimulator(),
249
251
  repo: sliceMachineConfig.repositoryName,
250
252
  intercomHash: profile?.intercomHash,
251
253
  shortId: profile?.shortId,
@@ -371,41 +371,39 @@ export class PrismicRepositoryManager extends BaseManager {
371
371
  changes: allChanges,
372
372
  };
373
373
 
374
- const authenticationToken = await this.user.getAuthenticationToken();
375
374
  const sliceMachineConfig = await this.project.getSliceMachineConfig();
376
375
 
377
376
  // TODO: move to customtypes client
378
- return fetch(new URL("/bulk", API_ENDPOINTS.PrismicModels).toString(), {
379
- body: JSON.stringify(requestBody),
377
+ const response = await this._fetch({
378
+ url: new URL("/bulk", API_ENDPOINTS.PrismicModels),
380
379
  method: "POST",
381
- headers: {
382
- Authorization: `Bearer ${authenticationToken}`,
383
- "User-Agent": "slice-machine",
384
- repository: sliceMachineConfig.repositoryName,
385
- "Content-Type": "application/json",
386
- },
387
- })
388
- .then(async (response) => {
389
- if (response.status === 204) {
390
- return null;
391
- }
380
+ body: requestBody,
381
+ repository: sliceMachineConfig.repositoryName,
382
+ });
392
383
 
384
+ switch (response.status) {
385
+ case 202:
393
386
  return this._decodeLimitOrThrow(
394
387
  await response.json(),
395
388
  response.status,
396
389
  LimitType.SOFT,
397
390
  );
398
- })
399
- .catch((err: ClientError) => {
400
- // Try to decode a limit from the error or throw the original error
401
- try {
402
- const data: unknown = JSON.parse(err.message);
403
-
404
- return this._decodeLimitOrThrow(data, err.status, LimitType.HARD);
405
- } catch {
406
- throw err;
407
- }
408
- });
391
+ case 204:
392
+ return null;
393
+ case 401:
394
+ throw new UnauthenticatedError();
395
+ case 403:
396
+ return this._decodeLimitOrThrow(
397
+ await response.json(),
398
+ response.status,
399
+ LimitType.HARD,
400
+ );
401
+ case 400:
402
+ const text = await response.text();
403
+ throw new Error(text);
404
+ default:
405
+ throw new Error(`Unexpected status code ${response.status}`);
406
+ }
409
407
  } catch (err) {
410
408
  console.error("An error happened while pushing your changes");
411
409
  console.error(err);
@@ -442,6 +440,7 @@ export class PrismicRepositoryManager extends BaseManager {
442
440
  method?: "GET" | "POST";
443
441
  body?: unknown;
444
442
  userAgent?: PrismicRepositoryUserAgents;
443
+ repository?: string;
445
444
  }): Promise<Response> {
446
445
  const cookies = await this.user.getAuthenticationCookies();
447
446
 
@@ -451,6 +450,10 @@ export class PrismicRepositoryManager extends BaseManager {
451
450
  extraHeaders["Content-Type"] = "application/json";
452
451
  }
453
452
 
453
+ if (args.repository) {
454
+ extraHeaders.repository = args.repository;
455
+ }
456
+
454
457
  return await fetch(args.url.toString(), {
455
458
  method: args.method,
456
459
  body: args.body ? JSON.stringify(args.body) : undefined,
@@ -148,4 +148,14 @@ export class SimulatorManager extends BaseManager {
148
148
  errors,
149
149
  };
150
150
  }
151
+
152
+ supportsSliceSimulator(): boolean {
153
+ assertPluginsInitialized(this.sliceMachinePluginRunner);
154
+
155
+ const hooks = this.sliceMachinePluginRunner.hooksForType(
156
+ "slice-simulator:setup:read",
157
+ );
158
+
159
+ return hooks.length > 0;
160
+ }
151
161
  }