@slicemachine/manager 0.1.1-dev-plugins.11 → 0.1.1-dev-plugins.13

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.
Files changed (65) hide show
  1. package/README.md +85 -0
  2. package/dist/constants/API_ENDPOINTS.cjs.map +1 -1
  3. package/dist/constants/API_ENDPOINTS.d.ts +1 -2
  4. package/dist/constants/API_ENDPOINTS.js.map +1 -1
  5. package/dist/errors.cjs.map +1 -1
  6. package/dist/errors.d.ts +1 -1
  7. package/dist/errors.js.map +1 -1
  8. package/dist/lib/buildPrismicRepositoryAPIEndpoint.cjs +9 -0
  9. package/dist/lib/buildPrismicRepositoryAPIEndpoint.cjs.map +1 -0
  10. package/dist/lib/buildPrismicRepositoryAPIEndpoint.d.ts +4 -0
  11. package/dist/lib/buildPrismicRepositoryAPIEndpoint.js +9 -0
  12. package/dist/lib/buildPrismicRepositoryAPIEndpoint.js.map +1 -0
  13. package/dist/lib/decodePackageJSON.cjs +29 -0
  14. package/dist/lib/decodePackageJSON.cjs.map +1 -0
  15. package/dist/lib/decodePackageJSON.d.ts +12 -0
  16. package/dist/lib/decodePackageJSON.js +12 -0
  17. package/dist/lib/decodePackageJSON.js.map +1 -0
  18. package/dist/lib/locateFileUpward.cjs +8 -11
  19. package/dist/lib/locateFileUpward.cjs.map +1 -1
  20. package/dist/lib/locateFileUpward.js +8 -11
  21. package/dist/lib/locateFileUpward.js.map +1 -1
  22. package/dist/managers/SliceMachineManager.cjs +17 -11
  23. package/dist/managers/SliceMachineManager.cjs.map +1 -1
  24. package/dist/managers/SliceMachineManager.d.ts +6 -0
  25. package/dist/managers/SliceMachineManager.js +17 -11
  26. package/dist/managers/SliceMachineManager.js.map +1 -1
  27. package/dist/managers/createSliceMachineManager.cjs +2 -2
  28. package/dist/managers/createSliceMachineManager.cjs.map +1 -1
  29. package/dist/managers/createSliceMachineManager.d.ts +4 -3
  30. package/dist/managers/createSliceMachineManager.js +2 -2
  31. package/dist/managers/createSliceMachineManager.js.map +1 -1
  32. package/dist/managers/slices/SlicesManager.cjs +21 -4
  33. package/dist/managers/slices/SlicesManager.cjs.map +1 -1
  34. package/dist/managers/slices/SlicesManager.d.ts +1 -1
  35. package/dist/managers/slices/SlicesManager.js +21 -4
  36. package/dist/managers/slices/SlicesManager.js.map +1 -1
  37. package/dist/managers/telemetry/TelemetryManager.cjs +3 -1
  38. package/dist/managers/telemetry/TelemetryManager.cjs.map +1 -1
  39. package/dist/managers/telemetry/TelemetryManager.js +3 -1
  40. package/dist/managers/telemetry/TelemetryManager.js.map +1 -1
  41. package/dist/managers/user/UserManager.cjs +6 -2
  42. package/dist/managers/user/UserManager.cjs.map +1 -1
  43. package/dist/managers/user/UserManager.d.ts +2 -0
  44. package/dist/managers/user/UserManager.js +6 -2
  45. package/dist/managers/user/UserManager.js.map +1 -1
  46. package/dist/managers/versions/VersionsManager.cjs +14 -3
  47. package/dist/managers/versions/VersionsManager.cjs.map +1 -1
  48. package/dist/managers/versions/VersionsManager.js +14 -3
  49. package/dist/managers/versions/VersionsManager.js.map +1 -1
  50. package/dist/managers/versions/types.d.ts +1 -1
  51. package/dist/types.d.ts +1 -1
  52. package/package.json +7 -5
  53. package/src/constants/API_ENDPOINTS.ts +1 -1
  54. package/src/errors.ts +1 -74
  55. package/src/lib/buildPrismicRepositoryAPIEndpoint.ts +16 -0
  56. package/src/lib/decodePackageJSON.ts +18 -0
  57. package/src/lib/locateFileUpward.ts +8 -12
  58. package/src/managers/SliceMachineManager.ts +31 -31
  59. package/src/managers/createSliceMachineManager.ts +3 -3
  60. package/src/managers/slices/SlicesManager.ts +24 -7
  61. package/src/managers/telemetry/TelemetryManager.ts +6 -0
  62. package/src/managers/user/UserManager.ts +12 -0
  63. package/src/managers/versions/VersionsManager.ts +22 -6
  64. package/src/managers/versions/types.ts +1 -1
  65. package/src/types.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TelemetryManager.js","sources":["../../../../src/managers/telemetry/TelemetryManager.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\n\nimport SegmentClient from \"analytics-node\";\n\nimport { readPrismicrc } from \"../../lib/prismicrc\";\n\nimport { API_TOKENS } from \"../../constants/API_TOKENS\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nimport {\n\tHumanSegmentEventType,\n\tHumanSegmentEventTypes,\n\tSegmentEvents,\n} from \"./types\";\n\ntype TelemetryManagerTrackArgs = SegmentEvents;\n\ntype TelemetryManagerIdentifyArgs = {\n\tuserID: string;\n\tintercomHash: string;\n};\n\nfunction assertTelemetryInitialized(\n\tsegmentClient: SegmentClient | undefined,\n): asserts segmentClient is NonNullable<typeof segmentClient> {\n\tif (segmentClient == undefined) {\n\t\tthrow new Error(\n\t\t\t\"Telemetry has not been initialized. Run `SliceMachineManager.telemetry.prototype.initTelemetry()` before re-calling this method.\",\n\t\t);\n\t}\n}\n\nexport class TelemetryManager extends BaseManager {\n\tprivate _enabled = false;\n\tprivate _segmentClient: SegmentClient | undefined = undefined;\n\tprivate _anonymousID: string | undefined = undefined;\n\tprivate _userID: string | undefined = undefined;\n\n\tasync initTelemetry(): Promise<void> {\n\t\tif (this._segmentClient) {\n\t\t\t// Prevent subsequent initializations.\n\t\t\treturn;\n\t\t}\n\n\t\tlet root: string;\n\t\ttry {\n\t\t\troot = await this.project.getRoot();\n\t\t} catch {\n\t\t\troot = await this.project.suggestRoot();\n\t\t}\n\n\t\tthis._enabled = readPrismicrc(root).telemetry !== false;\n\t\tthis._segmentClient = new SegmentClient(API_TOKENS.SegmentKey, {\n\t\t\t// Since it's a local app, we do not benefit from event batching the way a server would normally do, all tracking event will be awaited.\n\t\t\tflushAt: 1,\n\t\t\t// TODO: Verify that this actually does not send data to Segment when false.\n\t\t\tenable: this._enabled,\n\t\t});\n\t\tthis._anonymousID = randomUUID();\n\t}\n\n\t// TODO: Should `userId` be automatically populated by the logged in\n\t// user? We already have their info via UserRepository.\n\ttrack(args: TelemetryManagerTrackArgs): Promise<void> {\n\t\tconst { event, repository, ...properties } = args;\n\n\t\tconst payload: {\n\t\t\tevent: HumanSegmentEventTypes;\n\t\t\tuserId?: string;\n\t\t\tanonymousId?: string;\n\t\t\tproperties?: Record<string, unknown>;\n\t\t\tcontext?: {\n\t\t\t\tgroupId?: {\n\t\t\t\t\tRepository?: string;\n\t\t\t\t};\n\t\t\t};\n\t\t} = {\n\t\t\tevent: HumanSegmentEventType[event],\n\t\t\tproperties: {\n\t\t\t\trepo: repository,\n\t\t\t\t...properties,\n\t\t\t},\n\t\t};\n\n\t\tif (this._userID) {\n\t\t\tpayload.userId = this._userID;\n\t\t} else {\n\t\t\tpayload.anonymousId = this._anonymousID;\n\t\t}\n\n\t\tif (args.repository) {\n\t\t\tpayload.context ||= {};\n\t\t\tpayload.context.groupId ||= {};\n\t\t\tpayload.context.groupId.Repository = repository;\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tassertTelemetryInitialized(this._segmentClient);\n\n\t\t\t// TODO: Make sure client fails gracefully when no internet connection\n\t\t\tthis._segmentClient.track(payload, (maybeError?: Error) => {\n\t\t\t\tif (maybeError) {\n\t\t\t\t\t// TODO: Not sure how we want to deal with that\n\t\t\t\t\tconsole.warn(`An error occurred during Segment tracking`, maybeError);\n\t\t\t\t}\n\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n\n\t// TODO: Should `userID` and `intercomHash` be automatically populated\n\t// by the logged in user? We already have their info via\n\t// UserRepository.\n\tidentify(args: TelemetryManagerIdentifyArgs): Promise<void> {\n\t\treturn new Promise((resolve) => {\n\t\t\tassertTelemetryInitialized(this._segmentClient);\n\n\t\t\tconst payload = {\n\t\t\t\tuserId: args.userID,\n\t\t\t\tanonymousId: this._anonymousID,\n\t\t\t\tintegrations: {\n\t\t\t\t\tIntercom: {\n\t\t\t\t\t\tuser_hash: args.intercomHash,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t\tthis._userID = args.userID;\n\n\t\t\t// TODO: Make sure client fails gracefully when no internet connection\n\t\t\tthis._segmentClient.identify(payload, (maybeError?: Error) => {\n\t\t\t\tif (maybeError) {\n\t\t\t\t\t// TODO: Not sure how we want to deal with that\n\t\t\t\t\tconsole.warn(`An error occurred during Segment identify`, maybeError);\n\t\t\t\t}\n\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAuBA,SAAS,2BACR,eAAwC;AAExC,MAAI,iBAAiB,QAAW;AACzB,UAAA,IAAI,MACT,kIAAkI;AAAA,EAEnI;AACF;AAEM,MAAO,yBAAyB,YAAW;AAAA,EAA3C;AAAA;AACG,oCAAW;AACX;AACA;AACA;AAAA;AAAA,EAER,MAAM,gBAAa;AAClB,QAAI,KAAK,gBAAgB;AAExB;AAAA,IACA;AAEG,QAAA;AACA,QAAA;AACI,aAAA,MAAM,KAAK,QAAQ;YACzB;AACM,aAAA,MAAM,KAAK,QAAQ;IAC1B;AAED,SAAK,WAAW,cAAc,IAAI,EAAE,cAAc;AAClD,SAAK,iBAAiB,IAAI,cAAc,WAAW,YAAY;AAAA;AAAA,MAE9D,SAAS;AAAA;AAAA,MAET,QAAQ,KAAK;AAAA,IAAA,CACb;AACD,SAAK,eAAe;EACrB;AAAA;AAAA;AAAA,EAIA,MAAM,MAA+B;;AACpC,UAAM,EAAE,OAAO,YAAY,GAAG,eAAe;AAE7C,UAAM,UAUF;AAAA,MACH,OAAO,sBAAsB,KAAK;AAAA,MAClC,YAAY;AAAA,QACX,MAAM;AAAA,QACN,GAAG;AAAA,MACH;AAAA,IAAA;AAGF,QAAI,KAAK,SAAS;AACjB,cAAQ,SAAS,KAAK;AAAA,IAAA,OAChB;AACN,cAAQ,cAAc,KAAK;AAAA,IAC3B;AAED,QAAI,KAAK,YAAY;AACpB,cAAQ,YAAR,QAAQ,UAAY;AACZ,oBAAA,SAAQ,YAAR,GAAQ,UAAY;AACpB,cAAA,QAAQ,QAAQ,aAAa;AAAA,IACrC;AAEM,WAAA,IAAI,QAAQ,CAAC,YAAW;AAC9B,iCAA2B,KAAK,cAAc;AAG9C,WAAK,eAAe,MAAM,SAAS,CAAC,eAAsB;AACzD,YAAI,YAAY;AAEP,kBAAA,KAAK,6CAA6C,UAAU;AAAA,QACpE;;OAGD;AAAA,IAAA,CACD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MAAkC;AACnC,WAAA,IAAI,QAAQ,CAAC,YAAW;AAC9B,iCAA2B,KAAK,cAAc;AAE9C,YAAM,UAAU;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,aAAa,KAAK;AAAA,QAClB,cAAc;AAAA,UACb,UAAU;AAAA,YACT,WAAW,KAAK;AAAA,UAChB;AAAA,QACD;AAAA,MAAA;AAEF,WAAK,UAAU,KAAK;AAGpB,WAAK,eAAe,SAAS,SAAS,CAAC,eAAsB;AAC5D,YAAI,YAAY;AAEP,kBAAA,KAAK,6CAA6C,UAAU;AAAA,QACpE;;OAGD;AAAA,IAAA,CACD;AAAA,EACF;AACA;"}
1
+ {"version":3,"file":"TelemetryManager.js","sources":["../../../../src/managers/telemetry/TelemetryManager.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\n\nimport SegmentClient from \"analytics-node\";\n\nimport { readPrismicrc } from \"../../lib/prismicrc\";\n\nimport { API_TOKENS } from \"../../constants/API_TOKENS\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nimport {\n\tHumanSegmentEventType,\n\tHumanSegmentEventTypes,\n\tSegmentEvents,\n} from \"./types\";\n\ntype TelemetryManagerTrackArgs = SegmentEvents;\n\ntype TelemetryManagerIdentifyArgs = {\n\tuserID: string;\n\tintercomHash: string;\n};\n\nfunction assertTelemetryInitialized(\n\tsegmentClient: SegmentClient | undefined,\n): asserts segmentClient is NonNullable<typeof segmentClient> {\n\tif (segmentClient == undefined) {\n\t\tthrow new Error(\n\t\t\t\"Telemetry has not been initialized. Run `SliceMachineManager.telemetry.prototype.initTelemetry()` before re-calling this method.\",\n\t\t);\n\t}\n}\n\nexport class TelemetryManager extends BaseManager {\n\tprivate _enabled = false;\n\tprivate _segmentClient: SegmentClient | undefined = undefined;\n\tprivate _anonymousID: string | undefined = undefined;\n\tprivate _userID: string | undefined = undefined;\n\n\tasync initTelemetry(): Promise<void> {\n\t\tif (this._segmentClient) {\n\t\t\t// Prevent subsequent initializations.\n\t\t\treturn;\n\t\t}\n\n\t\tlet root: string;\n\t\ttry {\n\t\t\troot = await this.project.getRoot();\n\t\t} catch {\n\t\t\troot = await this.project.suggestRoot();\n\t\t}\n\n\t\tthis._enabled = readPrismicrc(root).telemetry !== false;\n\t\tthis._segmentClient = new SegmentClient(API_TOKENS.SegmentKey, {\n\t\t\t// Since it's a local app, we do not benefit from event batching the way a server would normally do, all tracking event will be awaited.\n\t\t\tflushAt: 1,\n\t\t\t// TODO: Verify that this actually does not send data to Segment when false.\n\t\t\tenable: this._enabled,\n\t\t\terrorHandler: () => {\n\t\t\t\t// noop - We don't care if the tracking event\n\t\t\t\t// failed. Some users or networks intentionally\n\t\t\t\t// block Segment, so we can't block the app if\n\t\t\t\t// a tracking event is unsuccessful.\n\t\t\t},\n\t\t});\n\t\tthis._anonymousID = randomUUID();\n\t}\n\n\t// TODO: Should `userId` be automatically populated by the logged in\n\t// user? We already have their info via UserRepository.\n\ttrack(args: TelemetryManagerTrackArgs): Promise<void> {\n\t\tconst { event, repository, ...properties } = args;\n\n\t\tconst payload: {\n\t\t\tevent: HumanSegmentEventTypes;\n\t\t\tuserId?: string;\n\t\t\tanonymousId?: string;\n\t\t\tproperties?: Record<string, unknown>;\n\t\t\tcontext?: {\n\t\t\t\tgroupId?: {\n\t\t\t\t\tRepository?: string;\n\t\t\t\t};\n\t\t\t};\n\t\t} = {\n\t\t\tevent: HumanSegmentEventType[event],\n\t\t\tproperties: {\n\t\t\t\trepo: repository,\n\t\t\t\t...properties,\n\t\t\t},\n\t\t};\n\n\t\tif (this._userID) {\n\t\t\tpayload.userId = this._userID;\n\t\t} else {\n\t\t\tpayload.anonymousId = this._anonymousID;\n\t\t}\n\n\t\tif (args.repository) {\n\t\t\tpayload.context ||= {};\n\t\t\tpayload.context.groupId ||= {};\n\t\t\tpayload.context.groupId.Repository = repository;\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tassertTelemetryInitialized(this._segmentClient);\n\n\t\t\t// TODO: Make sure client fails gracefully when no internet connection\n\t\t\tthis._segmentClient.track(payload, (maybeError?: Error) => {\n\t\t\t\tif (maybeError) {\n\t\t\t\t\t// TODO: Not sure how we want to deal with that\n\t\t\t\t\tconsole.warn(`An error occurred during Segment tracking`, maybeError);\n\t\t\t\t}\n\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n\n\t// TODO: Should `userID` and `intercomHash` be automatically populated\n\t// by the logged in user? We already have their info via\n\t// UserRepository.\n\tidentify(args: TelemetryManagerIdentifyArgs): Promise<void> {\n\t\treturn new Promise((resolve) => {\n\t\t\tassertTelemetryInitialized(this._segmentClient);\n\n\t\t\tconst payload = {\n\t\t\t\tuserId: args.userID,\n\t\t\t\tanonymousId: this._anonymousID,\n\t\t\t\tintegrations: {\n\t\t\t\t\tIntercom: {\n\t\t\t\t\t\tuser_hash: args.intercomHash,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t\tthis._userID = args.userID;\n\n\t\t\t// TODO: Make sure client fails gracefully when no internet connection\n\t\t\tthis._segmentClient.identify(payload, (maybeError?: Error) => {\n\t\t\t\tif (maybeError) {\n\t\t\t\t\t// TODO: Not sure how we want to deal with that\n\t\t\t\t\tconsole.warn(`An error occurred during Segment identify`, maybeError);\n\t\t\t\t}\n\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAuBA,SAAS,2BACR,eAAwC;AAExC,MAAI,iBAAiB,QAAW;AACzB,UAAA,IAAI,MACT,kIAAkI;AAAA,EAEnI;AACF;AAEM,MAAO,yBAAyB,YAAW;AAAA,EAA3C;AAAA;AACG,oCAAW;AACX;AACA;AACA;AAAA;AAAA,EAER,MAAM,gBAAa;AAClB,QAAI,KAAK,gBAAgB;AAExB;AAAA,IACA;AAEG,QAAA;AACA,QAAA;AACI,aAAA,MAAM,KAAK,QAAQ;YACzB;AACM,aAAA,MAAM,KAAK,QAAQ;IAC1B;AAED,SAAK,WAAW,cAAc,IAAI,EAAE,cAAc;AAClD,SAAK,iBAAiB,IAAI,cAAc,WAAW,YAAY;AAAA;AAAA,MAE9D,SAAS;AAAA;AAAA,MAET,QAAQ,KAAK;AAAA,MACb,cAAc,MAAK;AAAA,MAKnB;AAAA,IAAA,CACA;AACD,SAAK,eAAe;EACrB;AAAA;AAAA;AAAA,EAIA,MAAM,MAA+B;;AACpC,UAAM,EAAE,OAAO,YAAY,GAAG,eAAe;AAE7C,UAAM,UAUF;AAAA,MACH,OAAO,sBAAsB,KAAK;AAAA,MAClC,YAAY;AAAA,QACX,MAAM;AAAA,QACN,GAAG;AAAA,MACH;AAAA,IAAA;AAGF,QAAI,KAAK,SAAS;AACjB,cAAQ,SAAS,KAAK;AAAA,IAAA,OAChB;AACN,cAAQ,cAAc,KAAK;AAAA,IAC3B;AAED,QAAI,KAAK,YAAY;AACpB,cAAQ,YAAR,QAAQ,UAAY;AACZ,oBAAA,SAAQ,YAAR,GAAQ,UAAY;AACpB,cAAA,QAAQ,QAAQ,aAAa;AAAA,IACrC;AAEM,WAAA,IAAI,QAAQ,CAAC,YAAW;AAC9B,iCAA2B,KAAK,cAAc;AAG9C,WAAK,eAAe,MAAM,SAAS,CAAC,eAAsB;AACzD,YAAI,YAAY;AAEP,kBAAA,KAAK,6CAA6C,UAAU;AAAA,QACpE;;OAGD;AAAA,IAAA,CACD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MAAkC;AACnC,WAAA,IAAI,QAAQ,CAAC,YAAW;AAC9B,iCAA2B,KAAK,cAAc;AAE9C,YAAM,UAAU;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,aAAa,KAAK;AAAA,QAClB,cAAc;AAAA,UACb,UAAU;AAAA,YACT,WAAW,KAAK;AAAA,UAChB;AAAA,QACD;AAAA,MAAA;AAEF,WAAK,UAAU,KAAK;AAGpB,WAAK,eAAe,SAAS,SAAS,CAAC,eAAsB;AAC5D,YAAI,YAAY;AAEP,kBAAA,KAAK,6CAA6C,UAAU;AAAA,QACpE;;OAGD;AAAA,IAAA,CACD;AAAA,EACF;AACA;"}
@@ -6,10 +6,11 @@ var __publicField = (obj, key, value) => {
6
6
  return value;
7
7
  };
8
8
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
9
+ const errors = require("../../errors.cjs");
9
10
  const BaseManager = require("../BaseManager.cjs");
10
11
  class UserManager extends BaseManager.BaseManager {
11
- constructor() {
12
- super(...arguments);
12
+ constructor(sliceMachineManager) {
13
+ super(sliceMachineManager);
13
14
  __publicField(this, "login", this.prismicAuthManager.login.bind(this.prismicAuthManager));
14
15
  __publicField(this, "getLoginSessionInfo", this.prismicAuthManager.getLoginSessionInfo.bind(this.prismicAuthManager));
15
16
  __publicField(this, "nodeLoginSession", this.prismicAuthManager.nodeLoginSession.bind(this.prismicAuthManager));
@@ -19,6 +20,9 @@ class UserManager extends BaseManager.BaseManager {
19
20
  __publicField(this, "getAuthenticationToken", this.prismicAuthManager.getAuthenticationToken.bind(this.prismicAuthManager));
20
21
  __publicField(this, "getAuthenticationCookies", this.prismicAuthManager.getAuthenticationCookies.bind(this.prismicAuthManager));
21
22
  __publicField(this, "getProfile", this.prismicAuthManager.getProfile.bind(this.prismicAuthManager));
23
+ if (!sliceMachineManager.getPrismicAuthManager()) {
24
+ throw new errors.SliceMachineError("SliceMachineManager._prismicAuthManager must be set with a PrismicAuthManager instance before instantiating UserManager.");
25
+ }
22
26
  }
23
27
  }
24
28
  exports.UserManager = UserManager;
@@ -1 +1 @@
1
- {"version":3,"file":"UserManager.cjs","sources":["../../../../src/managers/user/UserManager.ts"],"sourcesContent":["import { BaseManager } from \"../BaseManager\";\n\nexport class UserManager extends BaseManager {\n\tlogin = this.prismicAuthManager.login.bind(this.prismicAuthManager);\n\tgetLoginSessionInfo = this.prismicAuthManager.getLoginSessionInfo.bind(\n\t\tthis.prismicAuthManager,\n\t);\n\tnodeLoginSession = this.prismicAuthManager.nodeLoginSession.bind(\n\t\tthis.prismicAuthManager,\n\t);\n\tlogout = this.prismicAuthManager.logout.bind(this.prismicAuthManager);\n\tcheckIsLoggedIn = this.prismicAuthManager.checkIsLoggedIn.bind(\n\t\tthis.prismicAuthManager,\n\t);\n\trefreshAuthenticationToken =\n\t\tthis.prismicAuthManager.refreshAuthenticationToken.bind(\n\t\t\tthis.prismicAuthManager,\n\t\t);\n\tgetAuthenticationToken = this.prismicAuthManager.getAuthenticationToken.bind(\n\t\tthis.prismicAuthManager,\n\t);\n\tgetAuthenticationCookies =\n\t\tthis.prismicAuthManager.getAuthenticationCookies.bind(\n\t\t\tthis.prismicAuthManager,\n\t\t);\n\tgetProfile = this.prismicAuthManager.getProfile.bind(this.prismicAuthManager);\n}\n"],"names":["BaseManager"],"mappings":";;;;;;;;;AAEM,MAAO,oBAAoBA,YAAAA,YAAW;AAAA,EAAtC;AAAA;AACL,iCAAQ,KAAK,mBAAmB,MAAM,KAAK,KAAK,kBAAkB;AAClE,+CAAsB,KAAK,mBAAmB,oBAAoB,KACjE,KAAK,kBAAkB;AAExB,4CAAmB,KAAK,mBAAmB,iBAAiB,KAC3D,KAAK,kBAAkB;AAExB,kCAAS,KAAK,mBAAmB,OAAO,KAAK,KAAK,kBAAkB;AACpE,2CAAkB,KAAK,mBAAmB,gBAAgB,KACzD,KAAK,kBAAkB;AAExB,sDACC,KAAK,mBAAmB,2BAA2B,KAClD,KAAK,kBAAkB;AAEzB,kDAAyB,KAAK,mBAAmB,uBAAuB,KACvE,KAAK,kBAAkB;AAExB,oDACC,KAAK,mBAAmB,yBAAyB,KAChD,KAAK,kBAAkB;AAEzB,sCAAa,KAAK,mBAAmB,WAAW,KAAK,KAAK,kBAAkB;AAAA;AAC5E;;"}
1
+ {"version":3,"file":"UserManager.cjs","sources":["../../../../src/managers/user/UserManager.ts"],"sourcesContent":["import { SliceMachineError } from \"../../errors\";\nimport { BaseManager } from \"../BaseManager\";\nimport { SliceMachineManager } from \"../SliceMachineManager\";\n\nexport class UserManager extends BaseManager {\n\tconstructor(sliceMachineManager: SliceMachineManager) {\n\t\tsuper(sliceMachineManager);\n\n\t\tif (!sliceMachineManager.getPrismicAuthManager()) {\n\t\t\tthrow new SliceMachineError(\n\t\t\t\t\"SliceMachineManager._prismicAuthManager must be set with a PrismicAuthManager instance before instantiating UserManager.\",\n\t\t\t);\n\t\t}\n\t}\n\n\tlogin = this.prismicAuthManager.login.bind(this.prismicAuthManager);\n\tgetLoginSessionInfo = this.prismicAuthManager.getLoginSessionInfo.bind(\n\t\tthis.prismicAuthManager,\n\t);\n\tnodeLoginSession = this.prismicAuthManager.nodeLoginSession.bind(\n\t\tthis.prismicAuthManager,\n\t);\n\tlogout = this.prismicAuthManager.logout.bind(this.prismicAuthManager);\n\tcheckIsLoggedIn = this.prismicAuthManager.checkIsLoggedIn.bind(\n\t\tthis.prismicAuthManager,\n\t);\n\trefreshAuthenticationToken =\n\t\tthis.prismicAuthManager.refreshAuthenticationToken.bind(\n\t\t\tthis.prismicAuthManager,\n\t\t);\n\tgetAuthenticationToken = this.prismicAuthManager.getAuthenticationToken.bind(\n\t\tthis.prismicAuthManager,\n\t);\n\tgetAuthenticationCookies =\n\t\tthis.prismicAuthManager.getAuthenticationCookies.bind(\n\t\t\tthis.prismicAuthManager,\n\t\t);\n\tgetProfile = this.prismicAuthManager.getProfile.bind(this.prismicAuthManager);\n}\n"],"names":["BaseManager","SliceMachineError"],"mappings":";;;;;;;;;;AAIM,MAAO,oBAAoBA,YAAAA,YAAW;AAAA,EAC3C,YAAY,qBAAwC;AACnD,UAAM,mBAAmB;AAS1B,iCAAQ,KAAK,mBAAmB,MAAM,KAAK,KAAK,kBAAkB;AAClE,+CAAsB,KAAK,mBAAmB,oBAAoB,KACjE,KAAK,kBAAkB;AAExB,4CAAmB,KAAK,mBAAmB,iBAAiB,KAC3D,KAAK,kBAAkB;AAExB,kCAAS,KAAK,mBAAmB,OAAO,KAAK,KAAK,kBAAkB;AACpE,2CAAkB,KAAK,mBAAmB,gBAAgB,KACzD,KAAK,kBAAkB;AAExB,sDACC,KAAK,mBAAmB,2BAA2B,KAClD,KAAK,kBAAkB;AAEzB,kDAAyB,KAAK,mBAAmB,uBAAuB,KACvE,KAAK,kBAAkB;AAExB,oDACC,KAAK,mBAAmB,yBAAyB,KAChD,KAAK,kBAAkB;AAEzB,sCAAa,KAAK,mBAAmB,WAAW,KAAK,KAAK,kBAAkB;AA7BvE,QAAA,CAAC,oBAAoB,yBAAyB;AAC3C,YAAA,IAAIC,OAAAA,kBACT,0HAA0H;AAAA,IAE3H;AAAA,EACF;AAyBA;;"}
@@ -1,5 +1,7 @@
1
1
  import { BaseManager } from "../BaseManager";
2
+ import { SliceMachineManager } from "../SliceMachineManager";
2
3
  export declare class UserManager extends BaseManager {
4
+ constructor(sliceMachineManager: SliceMachineManager);
3
5
  login: (args: {
4
6
  email: string;
5
7
  cookies: string[];
@@ -4,10 +4,11 @@ var __publicField = (obj, key, value) => {
4
4
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
5
  return value;
6
6
  };
7
+ import { SliceMachineError } from "../../errors.js";
7
8
  import { BaseManager } from "../BaseManager.js";
8
9
  class UserManager extends BaseManager {
9
- constructor() {
10
- super(...arguments);
10
+ constructor(sliceMachineManager) {
11
+ super(sliceMachineManager);
11
12
  __publicField(this, "login", this.prismicAuthManager.login.bind(this.prismicAuthManager));
12
13
  __publicField(this, "getLoginSessionInfo", this.prismicAuthManager.getLoginSessionInfo.bind(this.prismicAuthManager));
13
14
  __publicField(this, "nodeLoginSession", this.prismicAuthManager.nodeLoginSession.bind(this.prismicAuthManager));
@@ -17,6 +18,9 @@ class UserManager extends BaseManager {
17
18
  __publicField(this, "getAuthenticationToken", this.prismicAuthManager.getAuthenticationToken.bind(this.prismicAuthManager));
18
19
  __publicField(this, "getAuthenticationCookies", this.prismicAuthManager.getAuthenticationCookies.bind(this.prismicAuthManager));
19
20
  __publicField(this, "getProfile", this.prismicAuthManager.getProfile.bind(this.prismicAuthManager));
21
+ if (!sliceMachineManager.getPrismicAuthManager()) {
22
+ throw new SliceMachineError("SliceMachineManager._prismicAuthManager must be set with a PrismicAuthManager instance before instantiating UserManager.");
23
+ }
20
24
  }
21
25
  }
22
26
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"UserManager.js","sources":["../../../../src/managers/user/UserManager.ts"],"sourcesContent":["import { BaseManager } from \"../BaseManager\";\n\nexport class UserManager extends BaseManager {\n\tlogin = this.prismicAuthManager.login.bind(this.prismicAuthManager);\n\tgetLoginSessionInfo = this.prismicAuthManager.getLoginSessionInfo.bind(\n\t\tthis.prismicAuthManager,\n\t);\n\tnodeLoginSession = this.prismicAuthManager.nodeLoginSession.bind(\n\t\tthis.prismicAuthManager,\n\t);\n\tlogout = this.prismicAuthManager.logout.bind(this.prismicAuthManager);\n\tcheckIsLoggedIn = this.prismicAuthManager.checkIsLoggedIn.bind(\n\t\tthis.prismicAuthManager,\n\t);\n\trefreshAuthenticationToken =\n\t\tthis.prismicAuthManager.refreshAuthenticationToken.bind(\n\t\t\tthis.prismicAuthManager,\n\t\t);\n\tgetAuthenticationToken = this.prismicAuthManager.getAuthenticationToken.bind(\n\t\tthis.prismicAuthManager,\n\t);\n\tgetAuthenticationCookies =\n\t\tthis.prismicAuthManager.getAuthenticationCookies.bind(\n\t\t\tthis.prismicAuthManager,\n\t\t);\n\tgetProfile = this.prismicAuthManager.getProfile.bind(this.prismicAuthManager);\n}\n"],"names":[],"mappings":";;;;;;;AAEM,MAAO,oBAAoB,YAAW;AAAA,EAAtC;AAAA;AACL,iCAAQ,KAAK,mBAAmB,MAAM,KAAK,KAAK,kBAAkB;AAClE,+CAAsB,KAAK,mBAAmB,oBAAoB,KACjE,KAAK,kBAAkB;AAExB,4CAAmB,KAAK,mBAAmB,iBAAiB,KAC3D,KAAK,kBAAkB;AAExB,kCAAS,KAAK,mBAAmB,OAAO,KAAK,KAAK,kBAAkB;AACpE,2CAAkB,KAAK,mBAAmB,gBAAgB,KACzD,KAAK,kBAAkB;AAExB,sDACC,KAAK,mBAAmB,2BAA2B,KAClD,KAAK,kBAAkB;AAEzB,kDAAyB,KAAK,mBAAmB,uBAAuB,KACvE,KAAK,kBAAkB;AAExB,oDACC,KAAK,mBAAmB,yBAAyB,KAChD,KAAK,kBAAkB;AAEzB,sCAAa,KAAK,mBAAmB,WAAW,KAAK,KAAK,kBAAkB;AAAA;AAC5E;"}
1
+ {"version":3,"file":"UserManager.js","sources":["../../../../src/managers/user/UserManager.ts"],"sourcesContent":["import { SliceMachineError } from \"../../errors\";\nimport { BaseManager } from \"../BaseManager\";\nimport { SliceMachineManager } from \"../SliceMachineManager\";\n\nexport class UserManager extends BaseManager {\n\tconstructor(sliceMachineManager: SliceMachineManager) {\n\t\tsuper(sliceMachineManager);\n\n\t\tif (!sliceMachineManager.getPrismicAuthManager()) {\n\t\t\tthrow new SliceMachineError(\n\t\t\t\t\"SliceMachineManager._prismicAuthManager must be set with a PrismicAuthManager instance before instantiating UserManager.\",\n\t\t\t);\n\t\t}\n\t}\n\n\tlogin = this.prismicAuthManager.login.bind(this.prismicAuthManager);\n\tgetLoginSessionInfo = this.prismicAuthManager.getLoginSessionInfo.bind(\n\t\tthis.prismicAuthManager,\n\t);\n\tnodeLoginSession = this.prismicAuthManager.nodeLoginSession.bind(\n\t\tthis.prismicAuthManager,\n\t);\n\tlogout = this.prismicAuthManager.logout.bind(this.prismicAuthManager);\n\tcheckIsLoggedIn = this.prismicAuthManager.checkIsLoggedIn.bind(\n\t\tthis.prismicAuthManager,\n\t);\n\trefreshAuthenticationToken =\n\t\tthis.prismicAuthManager.refreshAuthenticationToken.bind(\n\t\t\tthis.prismicAuthManager,\n\t\t);\n\tgetAuthenticationToken = this.prismicAuthManager.getAuthenticationToken.bind(\n\t\tthis.prismicAuthManager,\n\t);\n\tgetAuthenticationCookies =\n\t\tthis.prismicAuthManager.getAuthenticationCookies.bind(\n\t\t\tthis.prismicAuthManager,\n\t\t);\n\tgetProfile = this.prismicAuthManager.getProfile.bind(this.prismicAuthManager);\n}\n"],"names":[],"mappings":";;;;;;;;AAIM,MAAO,oBAAoB,YAAW;AAAA,EAC3C,YAAY,qBAAwC;AACnD,UAAM,mBAAmB;AAS1B,iCAAQ,KAAK,mBAAmB,MAAM,KAAK,KAAK,kBAAkB;AAClE,+CAAsB,KAAK,mBAAmB,oBAAoB,KACjE,KAAK,kBAAkB;AAExB,4CAAmB,KAAK,mBAAmB,iBAAiB,KAC3D,KAAK,kBAAkB;AAExB,kCAAS,KAAK,mBAAmB,OAAO,KAAK,KAAK,kBAAkB;AACpE,2CAAkB,KAAK,mBAAmB,gBAAgB,KACzD,KAAK,kBAAkB;AAExB,sDACC,KAAK,mBAAmB,2BAA2B,KAClD,KAAK,kBAAkB;AAEzB,kDAAyB,KAAK,mBAAmB,uBAAuB,KACvE,KAAK,kBAAkB;AAExB,oDACC,KAAK,mBAAmB,yBAAyB,KAChD,KAAK,kBAAkB;AAEzB,sCAAa,KAAK,mBAAmB,WAAW,KAAK,KAAK,kBAAkB;AA7BvE,QAAA,CAAC,oBAAoB,yBAAyB;AAC3C,YAAA,IAAI,kBACT,0HAA0H;AAAA,IAE3H;AAAA,EACF;AAyBA;"}
@@ -9,6 +9,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
9
9
  const fs = require("node:fs/promises");
10
10
  const path = require("node:path");
11
11
  const semver = require("semver");
12
+ const decodePackageJSON = require("../../lib/decodePackageJSON.cjs");
12
13
  const fetchGitHubReleaseBodyForRelease = require("../../lib/fetchGitHubReleaseBodyForRelease.cjs");
13
14
  const fetchNPMPackageVersions = require("../../lib/fetchNPMPackageVersions.cjs");
14
15
  const SLICE_MACHINE_GITHUB_PACKAGE_NAME = require("../../constants/SLICE_MACHINE_GITHUB_PACKAGE_NAME.cjs");
@@ -39,7 +40,9 @@ const detectVersionBumpKind = (to, from) => {
39
40
  if (!from) {
40
41
  return VERSION_KIND.VERSION_KIND.FIRST;
41
42
  }
42
- if (semver.satisfies(to, `~${from}`)) {
43
+ if (semver.eq(to, from)) {
44
+ return void 0;
45
+ } else if (semver.satisfies(to, `~${from}`)) {
43
46
  return VERSION_KIND.VERSION_KIND.PATCH;
44
47
  } else if (semver.satisfies(to, `^${from}`)) {
45
48
  return VERSION_KIND.VERSION_KIND.MINOR;
@@ -58,8 +61,16 @@ class VersionsManager extends BaseManager.BaseManager {
58
61
  async getRunningSliceMachineVersion() {
59
62
  const sliceMachineDir = await this.project.locateSliceMachineUIDir();
60
63
  const sliceMachinePackageJSONContents = await fs__namespace.readFile(path__namespace.join(sliceMachineDir, "package.json"), "utf8");
61
- const json = JSON.parse(sliceMachinePackageJSONContents);
62
- return json.version;
64
+ let sliceMachinePackageJSON;
65
+ try {
66
+ sliceMachinePackageJSON = JSON.parse(sliceMachinePackageJSONContents);
67
+ } catch {
68
+ }
69
+ const { value, error } = decodePackageJSON.decodePackageJSON(sliceMachinePackageJSON);
70
+ if (error) {
71
+ throw new Error(`Invalid ${SLICE_MACHINE_NPM_PACKAGE_NAME.SLICE_MACHINE_NPM_PACKAGE_NAME} \`package.json\` file. ${error.errors.join(", ")}`);
72
+ }
73
+ return value.version;
63
74
  }
64
75
  async getAllStableSliceMachineVersions() {
65
76
  const versions = await fetchNPMPackageVersions.fetchNPMPackageVersions({
@@ -1 +1 @@
1
- {"version":3,"file":"VersionsManager.cjs","sources":["../../../../src/managers/versions/VersionsManager.ts"],"sourcesContent":["import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport semver from \"semver\";\n\nimport {\n\tfetchGitHubReleaseBodyForRelease,\n\tGitHubReleaseMetadata,\n} from \"../../lib/fetchGitHubReleaseBodyForRelease\";\nimport { fetchNPMPackageVersions } from \"../../lib/fetchNPMPackageVersions\";\n\nimport { SLICE_MACHINE_GITHUB_PACKAGE_NAME } from \"../../constants/SLICE_MACHINE_GITHUB_PACKAGE_NAME\";\nimport { SLICE_MACHINE_GITHUB_REPOSITORY_NAME } from \"../../constants/SLICE_MACHINE_GITHUB_REPOSITORY_NAME\";\nimport { SLICE_MACHINE_GITHUB_REPOSITORY_ORGANIZATION } from \"../../constants/SLICE_MACHINE_GITHUB_REPOSITORY_ORGANIZATION\";\nimport { SLICE_MACHINE_NPM_PACKAGE_NAME } from \"../../constants/SLICE_MACHINE_NPM_PACKAGE_NAME\";\nimport { VERSION_KIND } from \"../../constants/VERSION_KIND\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nimport { Version } from \"./types\";\n\nconst detectVersionBumpKind = (\n\tto: string,\n\tfrom?: string,\n): typeof VERSION_KIND[keyof typeof VERSION_KIND] => {\n\tif (!from) {\n\t\treturn VERSION_KIND.FIRST;\n\t}\n\n\tif (semver.satisfies(to, `~${from}`)) {\n\t\treturn VERSION_KIND.PATCH;\n\t} else if (semver.satisfies(to, `^${from}`)) {\n\t\treturn VERSION_KIND.MINOR;\n\t} else {\n\t\treturn VERSION_KIND.MAJOR;\n\t}\n};\n\ntype SliceMachineManagerGetReleaseNotesForVersionArgs = {\n\tversion: string;\n};\n\nexport class VersionsManager extends BaseManager {\n\t/**\n\t * Record of version numbers mapped to their GitHub release metadata.\n\t */\n\tgitHubSliceMachineReleaseMetadataCache: Record<\n\t\tstring,\n\t\tGitHubReleaseMetadata | undefined\n\t> = {};\n\n\tasync getRunningSliceMachineVersion(): Promise<string> {\n\t\tconst sliceMachineDir = await this.project.locateSliceMachineUIDir();\n\n\t\tconst sliceMachinePackageJSONContents = await fs.readFile(\n\t\t\tpath.join(sliceMachineDir, \"package.json\"),\n\t\t\t\"utf8\",\n\t\t);\n\n\t\t// TODO: Validate the contents? This code currently assumes a\n\t\t// well-formed document.\n\t\tconst json = JSON.parse(sliceMachinePackageJSONContents);\n\n\t\treturn json.version;\n\t}\n\n\tasync getAllStableSliceMachineVersions(): Promise<string[]> {\n\t\tconst versions = await fetchNPMPackageVersions({\n\t\t\tpackageName: SLICE_MACHINE_NPM_PACKAGE_NAME,\n\t\t});\n\n\t\tconst filteredVersions = versions.filter((version) => {\n\t\t\t// Exclude tagged versions (e.g. `1.0.0-alpha.0`).\n\t\t\t// Exclude versions < 0.1.0 (e.g. `0.0.1`).\n\t\t\treturn (\n\t\t\t\t/^[1-9]\\d*\\.\\d+\\.\\d+$/.test(version) ||\n\t\t\t\t/^\\d+\\.[1-9]\\d*\\.\\d+$/.test(version)\n\t\t\t);\n\t\t});\n\n\t\treturn semver.rsort(filteredVersions);\n\t}\n\n\tasync getAllStableSliceMachineVersionsWithKind(): Promise<Version[]> {\n\t\tconst versions = await this.getAllStableSliceMachineVersions();\n\n\t\treturn versions.map((version, i) => {\n\t\t\tconst previousVersion = versions[i + 1];\n\n\t\t\treturn {\n\t\t\t\tversion,\n\t\t\t\tkind: detectVersionBumpKind(version, previousVersion),\n\t\t\t};\n\t\t});\n\t}\n\n\tasync getLatestNonBreakingSliceMachineVersion(): Promise<string | undefined> {\n\t\tconst versions = await this.getAllStableSliceMachineVersions();\n\t\tconst currentVersion = await this.getRunningSliceMachineVersion();\n\n\t\treturn semver.maxSatisfying(versions, `^${currentVersion}`) ?? undefined;\n\t}\n\n\tasync checkIsUpdateAvailable(): Promise<boolean> {\n\t\tconst versions = await this.getAllStableSliceMachineVersions();\n\t\tconst currentVersion = await this.getRunningSliceMachineVersion();\n\n\t\treturn semver.gt(versions[0], currentVersion);\n\t}\n\n\tasync getSliceMachineReleaseNotesForVersion(\n\t\targs: SliceMachineManagerGetReleaseNotesForVersionArgs,\n\t): Promise<string | undefined> {\n\t\treturn await fetchGitHubReleaseBodyForRelease({\n\t\t\trepositoryOwner: SLICE_MACHINE_GITHUB_REPOSITORY_ORGANIZATION,\n\t\t\trepositoryName: SLICE_MACHINE_GITHUB_REPOSITORY_NAME,\n\t\t\tpackageName: SLICE_MACHINE_GITHUB_PACKAGE_NAME,\n\t\t\tversion: args.version,\n\t\t\tcache: this.gitHubSliceMachineReleaseMetadataCache,\n\t\t});\n\t}\n}\n"],"names":["VERSION_KIND","BaseManager","fs","path","fetchNPMPackageVersions","SLICE_MACHINE_NPM_PACKAGE_NAME","fetchGitHubReleaseBodyForRelease","SLICE_MACHINE_GITHUB_REPOSITORY_ORGANIZATION","SLICE_MACHINE_GITHUB_REPOSITORY_NAME","SLICE_MACHINE_GITHUB_PACKAGE_NAME"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,MAAM,wBAAwB,CAC7B,IACA,SACmD;AACnD,MAAI,CAAC,MAAM;AACV,WAAOA,aAAAA,aAAa;AAAA,EACpB;AAED,MAAI,OAAO,UAAU,IAAI,IAAI,MAAM,GAAG;AACrC,WAAOA,aAAAA,aAAa;AAAA,EAAA,WACV,OAAO,UAAU,IAAI,IAAI,MAAM,GAAG;AAC5C,WAAOA,aAAAA,aAAa;AAAA,EAAA,OACd;AACN,WAAOA,aAAAA,aAAa;AAAA,EACpB;AACF;AAMM,MAAO,wBAAwBC,YAAAA,YAAW;AAAA,EAA1C;AAAA;AAIL;AAAA;AAAA;AAAA,kEAGI,CAAA;AAAA;AAAA,EAEJ,MAAM,gCAA6B;AAClC,UAAM,kBAAkB,MAAM,KAAK,QAAQ,wBAAuB;AAE5D,UAAA,kCAAkC,MAAMC,cAAG,SAChDC,gBAAK,KAAK,iBAAiB,cAAc,GACzC,MAAM;AAKD,UAAA,OAAO,KAAK,MAAM,+BAA+B;AAEvD,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,MAAM,mCAAgC;AAC/B,UAAA,WAAW,MAAMC,gDAAwB;AAAA,MAC9C,aAAaC,+BAAA;AAAA,IAAA,CACb;AAED,UAAM,mBAAmB,SAAS,OAAO,CAAC,YAAW;AAGpD,aACC,uBAAuB,KAAK,OAAO,KACnC,uBAAuB,KAAK,OAAO;AAAA,IAAA,CAEpC;AAEM,WAAA,OAAO,MAAM,gBAAgB;AAAA,EACrC;AAAA,EAEA,MAAM,2CAAwC;AACvC,UAAA,WAAW,MAAM,KAAK;AAE5B,WAAO,SAAS,IAAI,CAAC,SAAS,MAAK;AAC5B,YAAA,kBAAkB,SAAS,IAAI,CAAC;AAE/B,aAAA;AAAA,QACN;AAAA,QACA,MAAM,sBAAsB,SAAS,eAAe;AAAA,MAAA;AAAA,KAErD;AAAA,EACF;AAAA,EAEA,MAAM,0CAAuC;AACtC,UAAA,WAAW,MAAM,KAAK;AACtB,UAAA,iBAAiB,MAAM,KAAK;AAElC,WAAO,OAAO,cAAc,UAAU,IAAI,gBAAgB,KAAK;AAAA,EAChE;AAAA,EAEA,MAAM,yBAAsB;AACrB,UAAA,WAAW,MAAM,KAAK;AACtB,UAAA,iBAAiB,MAAM,KAAK;AAElC,WAAO,OAAO,GAAG,SAAS,CAAC,GAAG,cAAc;AAAA,EAC7C;AAAA,EAEA,MAAM,sCACL,MAAsD;AAEtD,WAAO,MAAMC,iCAAAA,iCAAiC;AAAA,MAC7C,iBAAiBC,6CAAA;AAAA,MACjB,gBAAgBC,qCAAA;AAAA,MAChB,aAAaC,kCAAA;AAAA,MACb,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,IAAA,CACZ;AAAA,EACF;AACA;;"}
1
+ {"version":3,"file":"VersionsManager.cjs","sources":["../../../../src/managers/versions/VersionsManager.ts"],"sourcesContent":["import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport semver from \"semver\";\n\nimport { decodePackageJSON } from \"../../lib/decodePackageJSON\";\nimport {\n\tfetchGitHubReleaseBodyForRelease,\n\tGitHubReleaseMetadata,\n} from \"../../lib/fetchGitHubReleaseBodyForRelease\";\nimport { fetchNPMPackageVersions } from \"../../lib/fetchNPMPackageVersions\";\n\nimport { SLICE_MACHINE_GITHUB_PACKAGE_NAME } from \"../../constants/SLICE_MACHINE_GITHUB_PACKAGE_NAME\";\nimport { SLICE_MACHINE_GITHUB_REPOSITORY_NAME } from \"../../constants/SLICE_MACHINE_GITHUB_REPOSITORY_NAME\";\nimport { SLICE_MACHINE_GITHUB_REPOSITORY_ORGANIZATION } from \"../../constants/SLICE_MACHINE_GITHUB_REPOSITORY_ORGANIZATION\";\nimport { SLICE_MACHINE_NPM_PACKAGE_NAME } from \"../../constants/SLICE_MACHINE_NPM_PACKAGE_NAME\";\nimport { VERSION_KIND } from \"../../constants/VERSION_KIND\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nimport { Version } from \"./types\";\n\nconst detectVersionBumpKind = (\n\tto: string,\n\tfrom?: string,\n): typeof VERSION_KIND[keyof typeof VERSION_KIND] | undefined => {\n\tif (!from) {\n\t\treturn VERSION_KIND.FIRST;\n\t}\n\n\tif (semver.eq(to, from)) {\n\t\treturn undefined;\n\t} else if (semver.satisfies(to, `~${from}`)) {\n\t\treturn VERSION_KIND.PATCH;\n\t} else if (semver.satisfies(to, `^${from}`)) {\n\t\treturn VERSION_KIND.MINOR;\n\t} else {\n\t\treturn VERSION_KIND.MAJOR;\n\t}\n};\n\ntype SliceMachineManagerGetReleaseNotesForVersionArgs = {\n\tversion: string;\n};\n\nexport class VersionsManager extends BaseManager {\n\t/**\n\t * Record of version numbers mapped to their GitHub release metadata.\n\t */\n\tgitHubSliceMachineReleaseMetadataCache: Record<\n\t\tstring,\n\t\tGitHubReleaseMetadata | undefined\n\t> = {};\n\n\tasync getRunningSliceMachineVersion(): Promise<string> {\n\t\tconst sliceMachineDir = await this.project.locateSliceMachineUIDir();\n\n\t\tconst sliceMachinePackageJSONContents = await fs.readFile(\n\t\t\tpath.join(sliceMachineDir, \"package.json\"),\n\t\t\t\"utf8\",\n\t\t);\n\n\t\tlet sliceMachinePackageJSON: unknown;\n\t\ttry {\n\t\t\tsliceMachinePackageJSON = JSON.parse(sliceMachinePackageJSONContents);\n\t\t} catch {\n\t\t\t// noop\n\t\t}\n\n\t\tconst { value, error } = decodePackageJSON(sliceMachinePackageJSON);\n\n\t\tif (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid ${SLICE_MACHINE_NPM_PACKAGE_NAME} \\`package.json\\` file. ${error.errors.join(\n\t\t\t\t\t\", \",\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\n\t\treturn value.version;\n\t}\n\n\tasync getAllStableSliceMachineVersions(): Promise<string[]> {\n\t\tconst versions = await fetchNPMPackageVersions({\n\t\t\tpackageName: SLICE_MACHINE_NPM_PACKAGE_NAME,\n\t\t});\n\n\t\tconst filteredVersions = versions.filter((version) => {\n\t\t\t// Exclude tagged versions (e.g. `1.0.0-alpha.0`).\n\t\t\t// Exclude versions < 0.1.0 (e.g. `0.0.1`).\n\t\t\treturn (\n\t\t\t\t/^[1-9]\\d*\\.\\d+\\.\\d+$/.test(version) ||\n\t\t\t\t/^\\d+\\.[1-9]\\d*\\.\\d+$/.test(version)\n\t\t\t);\n\t\t});\n\n\t\treturn semver.rsort(filteredVersions);\n\t}\n\n\tasync getAllStableSliceMachineVersionsWithKind(): Promise<Version[]> {\n\t\tconst versions = await this.getAllStableSliceMachineVersions();\n\n\t\treturn versions.map((version, i) => {\n\t\t\tconst previousVersion = versions[i + 1];\n\n\t\t\treturn {\n\t\t\t\tversion,\n\t\t\t\tkind: detectVersionBumpKind(version, previousVersion),\n\t\t\t};\n\t\t});\n\t}\n\n\tasync getLatestNonBreakingSliceMachineVersion(): Promise<string | undefined> {\n\t\tconst versions = await this.getAllStableSliceMachineVersions();\n\t\tconst currentVersion = await this.getRunningSliceMachineVersion();\n\n\t\treturn semver.maxSatisfying(versions, `^${currentVersion}`) ?? undefined;\n\t}\n\n\tasync checkIsUpdateAvailable(): Promise<boolean> {\n\t\tconst versions = await this.getAllStableSliceMachineVersions();\n\t\tconst currentVersion = await this.getRunningSliceMachineVersion();\n\n\t\treturn semver.gt(versions[0], currentVersion);\n\t}\n\n\tasync getSliceMachineReleaseNotesForVersion(\n\t\targs: SliceMachineManagerGetReleaseNotesForVersionArgs,\n\t): Promise<string | undefined> {\n\t\treturn await fetchGitHubReleaseBodyForRelease({\n\t\t\trepositoryOwner: SLICE_MACHINE_GITHUB_REPOSITORY_ORGANIZATION,\n\t\t\trepositoryName: SLICE_MACHINE_GITHUB_REPOSITORY_NAME,\n\t\t\tpackageName: SLICE_MACHINE_GITHUB_PACKAGE_NAME,\n\t\t\tversion: args.version,\n\t\t\tcache: this.gitHubSliceMachineReleaseMetadataCache,\n\t\t});\n\t}\n}\n"],"names":["VERSION_KIND","BaseManager","fs","path","decodePackageJSON","SLICE_MACHINE_NPM_PACKAGE_NAME","fetchNPMPackageVersions","fetchGitHubReleaseBodyForRelease","SLICE_MACHINE_GITHUB_REPOSITORY_ORGANIZATION","SLICE_MACHINE_GITHUB_REPOSITORY_NAME","SLICE_MACHINE_GITHUB_PACKAGE_NAME"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,MAAM,wBAAwB,CAC7B,IACA,SAC+D;AAC/D,MAAI,CAAC,MAAM;AACV,WAAOA,aAAAA,aAAa;AAAA,EACpB;AAED,MAAI,OAAO,GAAG,IAAI,IAAI,GAAG;AACjB,WAAA;AAAA,EAAA,WACG,OAAO,UAAU,IAAI,IAAI,MAAM,GAAG;AAC5C,WAAOA,aAAAA,aAAa;AAAA,EAAA,WACV,OAAO,UAAU,IAAI,IAAI,MAAM,GAAG;AAC5C,WAAOA,aAAAA,aAAa;AAAA,EAAA,OACd;AACN,WAAOA,aAAAA,aAAa;AAAA,EACpB;AACF;AAMM,MAAO,wBAAwBC,YAAAA,YAAW;AAAA,EAA1C;AAAA;AAIL;AAAA;AAAA;AAAA,kEAGI,CAAA;AAAA;AAAA,EAEJ,MAAM,gCAA6B;AAClC,UAAM,kBAAkB,MAAM,KAAK,QAAQ,wBAAuB;AAE5D,UAAA,kCAAkC,MAAMC,cAAG,SAChDC,gBAAK,KAAK,iBAAiB,cAAc,GACzC,MAAM;AAGH,QAAA;AACA,QAAA;AACuB,gCAAA,KAAK,MAAM,+BAA+B;AAAA,IAAA,QACnE;AAAA,IAED;AAED,UAAM,EAAE,OAAO,MAAK,IAAKC,oCAAkB,uBAAuB;AAElE,QAAI,OAAO;AACJ,YAAA,IAAI,MACT,WAAWC,+BAAA,yDAAyD,MAAM,OAAO,KAChF,IAAI,GACF;AAAA,IAEJ;AAED,WAAO,MAAM;AAAA,EACd;AAAA,EAEA,MAAM,mCAAgC;AAC/B,UAAA,WAAW,MAAMC,gDAAwB;AAAA,MAC9C,aAAaD,+BAAA;AAAA,IAAA,CACb;AAED,UAAM,mBAAmB,SAAS,OAAO,CAAC,YAAW;AAGpD,aACC,uBAAuB,KAAK,OAAO,KACnC,uBAAuB,KAAK,OAAO;AAAA,IAAA,CAEpC;AAEM,WAAA,OAAO,MAAM,gBAAgB;AAAA,EACrC;AAAA,EAEA,MAAM,2CAAwC;AACvC,UAAA,WAAW,MAAM,KAAK;AAE5B,WAAO,SAAS,IAAI,CAAC,SAAS,MAAK;AAC5B,YAAA,kBAAkB,SAAS,IAAI,CAAC;AAE/B,aAAA;AAAA,QACN;AAAA,QACA,MAAM,sBAAsB,SAAS,eAAe;AAAA,MAAA;AAAA,KAErD;AAAA,EACF;AAAA,EAEA,MAAM,0CAAuC;AACtC,UAAA,WAAW,MAAM,KAAK;AACtB,UAAA,iBAAiB,MAAM,KAAK;AAElC,WAAO,OAAO,cAAc,UAAU,IAAI,gBAAgB,KAAK;AAAA,EAChE;AAAA,EAEA,MAAM,yBAAsB;AACrB,UAAA,WAAW,MAAM,KAAK;AACtB,UAAA,iBAAiB,MAAM,KAAK;AAElC,WAAO,OAAO,GAAG,SAAS,CAAC,GAAG,cAAc;AAAA,EAC7C;AAAA,EAEA,MAAM,sCACL,MAAsD;AAEtD,WAAO,MAAME,iCAAAA,iCAAiC;AAAA,MAC7C,iBAAiBC,6CAAA;AAAA,MACjB,gBAAgBC,qCAAA;AAAA,MAChB,aAAaC,kCAAA;AAAA,MACb,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,IAAA,CACZ;AAAA,EACF;AACA;;"}
@@ -7,6 +7,7 @@ var __publicField = (obj, key, value) => {
7
7
  import * as fs from "node:fs/promises";
8
8
  import * as path from "node:path";
9
9
  import semver from "semver";
10
+ import { decodePackageJSON } from "../../lib/decodePackageJSON.js";
10
11
  import { fetchGitHubReleaseBodyForRelease } from "../../lib/fetchGitHubReleaseBodyForRelease.js";
11
12
  import { fetchNPMPackageVersions } from "../../lib/fetchNPMPackageVersions.js";
12
13
  import { SLICE_MACHINE_GITHUB_PACKAGE_NAME } from "../../constants/SLICE_MACHINE_GITHUB_PACKAGE_NAME.js";
@@ -19,7 +20,9 @@ const detectVersionBumpKind = (to, from) => {
19
20
  if (!from) {
20
21
  return VERSION_KIND.FIRST;
21
22
  }
22
- if (semver.satisfies(to, `~${from}`)) {
23
+ if (semver.eq(to, from)) {
24
+ return void 0;
25
+ } else if (semver.satisfies(to, `~${from}`)) {
23
26
  return VERSION_KIND.PATCH;
24
27
  } else if (semver.satisfies(to, `^${from}`)) {
25
28
  return VERSION_KIND.MINOR;
@@ -38,8 +41,16 @@ class VersionsManager extends BaseManager {
38
41
  async getRunningSliceMachineVersion() {
39
42
  const sliceMachineDir = await this.project.locateSliceMachineUIDir();
40
43
  const sliceMachinePackageJSONContents = await fs.readFile(path.join(sliceMachineDir, "package.json"), "utf8");
41
- const json = JSON.parse(sliceMachinePackageJSONContents);
42
- return json.version;
44
+ let sliceMachinePackageJSON;
45
+ try {
46
+ sliceMachinePackageJSON = JSON.parse(sliceMachinePackageJSONContents);
47
+ } catch {
48
+ }
49
+ const { value, error } = decodePackageJSON(sliceMachinePackageJSON);
50
+ if (error) {
51
+ throw new Error(`Invalid ${SLICE_MACHINE_NPM_PACKAGE_NAME} \`package.json\` file. ${error.errors.join(", ")}`);
52
+ }
53
+ return value.version;
43
54
  }
44
55
  async getAllStableSliceMachineVersions() {
45
56
  const versions = await fetchNPMPackageVersions({
@@ -1 +1 @@
1
- {"version":3,"file":"VersionsManager.js","sources":["../../../../src/managers/versions/VersionsManager.ts"],"sourcesContent":["import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport semver from \"semver\";\n\nimport {\n\tfetchGitHubReleaseBodyForRelease,\n\tGitHubReleaseMetadata,\n} from \"../../lib/fetchGitHubReleaseBodyForRelease\";\nimport { fetchNPMPackageVersions } from \"../../lib/fetchNPMPackageVersions\";\n\nimport { SLICE_MACHINE_GITHUB_PACKAGE_NAME } from \"../../constants/SLICE_MACHINE_GITHUB_PACKAGE_NAME\";\nimport { SLICE_MACHINE_GITHUB_REPOSITORY_NAME } from \"../../constants/SLICE_MACHINE_GITHUB_REPOSITORY_NAME\";\nimport { SLICE_MACHINE_GITHUB_REPOSITORY_ORGANIZATION } from \"../../constants/SLICE_MACHINE_GITHUB_REPOSITORY_ORGANIZATION\";\nimport { SLICE_MACHINE_NPM_PACKAGE_NAME } from \"../../constants/SLICE_MACHINE_NPM_PACKAGE_NAME\";\nimport { VERSION_KIND } from \"../../constants/VERSION_KIND\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nimport { Version } from \"./types\";\n\nconst detectVersionBumpKind = (\n\tto: string,\n\tfrom?: string,\n): typeof VERSION_KIND[keyof typeof VERSION_KIND] => {\n\tif (!from) {\n\t\treturn VERSION_KIND.FIRST;\n\t}\n\n\tif (semver.satisfies(to, `~${from}`)) {\n\t\treturn VERSION_KIND.PATCH;\n\t} else if (semver.satisfies(to, `^${from}`)) {\n\t\treturn VERSION_KIND.MINOR;\n\t} else {\n\t\treturn VERSION_KIND.MAJOR;\n\t}\n};\n\ntype SliceMachineManagerGetReleaseNotesForVersionArgs = {\n\tversion: string;\n};\n\nexport class VersionsManager extends BaseManager {\n\t/**\n\t * Record of version numbers mapped to their GitHub release metadata.\n\t */\n\tgitHubSliceMachineReleaseMetadataCache: Record<\n\t\tstring,\n\t\tGitHubReleaseMetadata | undefined\n\t> = {};\n\n\tasync getRunningSliceMachineVersion(): Promise<string> {\n\t\tconst sliceMachineDir = await this.project.locateSliceMachineUIDir();\n\n\t\tconst sliceMachinePackageJSONContents = await fs.readFile(\n\t\t\tpath.join(sliceMachineDir, \"package.json\"),\n\t\t\t\"utf8\",\n\t\t);\n\n\t\t// TODO: Validate the contents? This code currently assumes a\n\t\t// well-formed document.\n\t\tconst json = JSON.parse(sliceMachinePackageJSONContents);\n\n\t\treturn json.version;\n\t}\n\n\tasync getAllStableSliceMachineVersions(): Promise<string[]> {\n\t\tconst versions = await fetchNPMPackageVersions({\n\t\t\tpackageName: SLICE_MACHINE_NPM_PACKAGE_NAME,\n\t\t});\n\n\t\tconst filteredVersions = versions.filter((version) => {\n\t\t\t// Exclude tagged versions (e.g. `1.0.0-alpha.0`).\n\t\t\t// Exclude versions < 0.1.0 (e.g. `0.0.1`).\n\t\t\treturn (\n\t\t\t\t/^[1-9]\\d*\\.\\d+\\.\\d+$/.test(version) ||\n\t\t\t\t/^\\d+\\.[1-9]\\d*\\.\\d+$/.test(version)\n\t\t\t);\n\t\t});\n\n\t\treturn semver.rsort(filteredVersions);\n\t}\n\n\tasync getAllStableSliceMachineVersionsWithKind(): Promise<Version[]> {\n\t\tconst versions = await this.getAllStableSliceMachineVersions();\n\n\t\treturn versions.map((version, i) => {\n\t\t\tconst previousVersion = versions[i + 1];\n\n\t\t\treturn {\n\t\t\t\tversion,\n\t\t\t\tkind: detectVersionBumpKind(version, previousVersion),\n\t\t\t};\n\t\t});\n\t}\n\n\tasync getLatestNonBreakingSliceMachineVersion(): Promise<string | undefined> {\n\t\tconst versions = await this.getAllStableSliceMachineVersions();\n\t\tconst currentVersion = await this.getRunningSliceMachineVersion();\n\n\t\treturn semver.maxSatisfying(versions, `^${currentVersion}`) ?? undefined;\n\t}\n\n\tasync checkIsUpdateAvailable(): Promise<boolean> {\n\t\tconst versions = await this.getAllStableSliceMachineVersions();\n\t\tconst currentVersion = await this.getRunningSliceMachineVersion();\n\n\t\treturn semver.gt(versions[0], currentVersion);\n\t}\n\n\tasync getSliceMachineReleaseNotesForVersion(\n\t\targs: SliceMachineManagerGetReleaseNotesForVersionArgs,\n\t): Promise<string | undefined> {\n\t\treturn await fetchGitHubReleaseBodyForRelease({\n\t\t\trepositoryOwner: SLICE_MACHINE_GITHUB_REPOSITORY_ORGANIZATION,\n\t\t\trepositoryName: SLICE_MACHINE_GITHUB_REPOSITORY_NAME,\n\t\t\tpackageName: SLICE_MACHINE_GITHUB_PACKAGE_NAME,\n\t\t\tversion: args.version,\n\t\t\tcache: this.gitHubSliceMachineReleaseMetadataCache,\n\t\t});\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAoBA,MAAM,wBAAwB,CAC7B,IACA,SACmD;AACnD,MAAI,CAAC,MAAM;AACV,WAAO,aAAa;AAAA,EACpB;AAED,MAAI,OAAO,UAAU,IAAI,IAAI,MAAM,GAAG;AACrC,WAAO,aAAa;AAAA,EAAA,WACV,OAAO,UAAU,IAAI,IAAI,MAAM,GAAG;AAC5C,WAAO,aAAa;AAAA,EAAA,OACd;AACN,WAAO,aAAa;AAAA,EACpB;AACF;AAMM,MAAO,wBAAwB,YAAW;AAAA,EAA1C;AAAA;AAIL;AAAA;AAAA;AAAA,kEAGI,CAAA;AAAA;AAAA,EAEJ,MAAM,gCAA6B;AAClC,UAAM,kBAAkB,MAAM,KAAK,QAAQ,wBAAuB;AAE5D,UAAA,kCAAkC,MAAM,GAAG,SAChD,KAAK,KAAK,iBAAiB,cAAc,GACzC,MAAM;AAKD,UAAA,OAAO,KAAK,MAAM,+BAA+B;AAEvD,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,MAAM,mCAAgC;AAC/B,UAAA,WAAW,MAAM,wBAAwB;AAAA,MAC9C,aAAa;AAAA,IAAA,CACb;AAED,UAAM,mBAAmB,SAAS,OAAO,CAAC,YAAW;AAGpD,aACC,uBAAuB,KAAK,OAAO,KACnC,uBAAuB,KAAK,OAAO;AAAA,IAAA,CAEpC;AAEM,WAAA,OAAO,MAAM,gBAAgB;AAAA,EACrC;AAAA,EAEA,MAAM,2CAAwC;AACvC,UAAA,WAAW,MAAM,KAAK;AAE5B,WAAO,SAAS,IAAI,CAAC,SAAS,MAAK;AAC5B,YAAA,kBAAkB,SAAS,IAAI,CAAC;AAE/B,aAAA;AAAA,QACN;AAAA,QACA,MAAM,sBAAsB,SAAS,eAAe;AAAA,MAAA;AAAA,KAErD;AAAA,EACF;AAAA,EAEA,MAAM,0CAAuC;AACtC,UAAA,WAAW,MAAM,KAAK;AACtB,UAAA,iBAAiB,MAAM,KAAK;AAElC,WAAO,OAAO,cAAc,UAAU,IAAI,gBAAgB,KAAK;AAAA,EAChE;AAAA,EAEA,MAAM,yBAAsB;AACrB,UAAA,WAAW,MAAM,KAAK;AACtB,UAAA,iBAAiB,MAAM,KAAK;AAElC,WAAO,OAAO,GAAG,SAAS,CAAC,GAAG,cAAc;AAAA,EAC7C;AAAA,EAEA,MAAM,sCACL,MAAsD;AAEtD,WAAO,MAAM,iCAAiC;AAAA,MAC7C,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,IAAA,CACZ;AAAA,EACF;AACA;"}
1
+ {"version":3,"file":"VersionsManager.js","sources":["../../../../src/managers/versions/VersionsManager.ts"],"sourcesContent":["import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport semver from \"semver\";\n\nimport { decodePackageJSON } from \"../../lib/decodePackageJSON\";\nimport {\n\tfetchGitHubReleaseBodyForRelease,\n\tGitHubReleaseMetadata,\n} from \"../../lib/fetchGitHubReleaseBodyForRelease\";\nimport { fetchNPMPackageVersions } from \"../../lib/fetchNPMPackageVersions\";\n\nimport { SLICE_MACHINE_GITHUB_PACKAGE_NAME } from \"../../constants/SLICE_MACHINE_GITHUB_PACKAGE_NAME\";\nimport { SLICE_MACHINE_GITHUB_REPOSITORY_NAME } from \"../../constants/SLICE_MACHINE_GITHUB_REPOSITORY_NAME\";\nimport { SLICE_MACHINE_GITHUB_REPOSITORY_ORGANIZATION } from \"../../constants/SLICE_MACHINE_GITHUB_REPOSITORY_ORGANIZATION\";\nimport { SLICE_MACHINE_NPM_PACKAGE_NAME } from \"../../constants/SLICE_MACHINE_NPM_PACKAGE_NAME\";\nimport { VERSION_KIND } from \"../../constants/VERSION_KIND\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nimport { Version } from \"./types\";\n\nconst detectVersionBumpKind = (\n\tto: string,\n\tfrom?: string,\n): typeof VERSION_KIND[keyof typeof VERSION_KIND] | undefined => {\n\tif (!from) {\n\t\treturn VERSION_KIND.FIRST;\n\t}\n\n\tif (semver.eq(to, from)) {\n\t\treturn undefined;\n\t} else if (semver.satisfies(to, `~${from}`)) {\n\t\treturn VERSION_KIND.PATCH;\n\t} else if (semver.satisfies(to, `^${from}`)) {\n\t\treturn VERSION_KIND.MINOR;\n\t} else {\n\t\treturn VERSION_KIND.MAJOR;\n\t}\n};\n\ntype SliceMachineManagerGetReleaseNotesForVersionArgs = {\n\tversion: string;\n};\n\nexport class VersionsManager extends BaseManager {\n\t/**\n\t * Record of version numbers mapped to their GitHub release metadata.\n\t */\n\tgitHubSliceMachineReleaseMetadataCache: Record<\n\t\tstring,\n\t\tGitHubReleaseMetadata | undefined\n\t> = {};\n\n\tasync getRunningSliceMachineVersion(): Promise<string> {\n\t\tconst sliceMachineDir = await this.project.locateSliceMachineUIDir();\n\n\t\tconst sliceMachinePackageJSONContents = await fs.readFile(\n\t\t\tpath.join(sliceMachineDir, \"package.json\"),\n\t\t\t\"utf8\",\n\t\t);\n\n\t\tlet sliceMachinePackageJSON: unknown;\n\t\ttry {\n\t\t\tsliceMachinePackageJSON = JSON.parse(sliceMachinePackageJSONContents);\n\t\t} catch {\n\t\t\t// noop\n\t\t}\n\n\t\tconst { value, error } = decodePackageJSON(sliceMachinePackageJSON);\n\n\t\tif (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid ${SLICE_MACHINE_NPM_PACKAGE_NAME} \\`package.json\\` file. ${error.errors.join(\n\t\t\t\t\t\", \",\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\n\t\treturn value.version;\n\t}\n\n\tasync getAllStableSliceMachineVersions(): Promise<string[]> {\n\t\tconst versions = await fetchNPMPackageVersions({\n\t\t\tpackageName: SLICE_MACHINE_NPM_PACKAGE_NAME,\n\t\t});\n\n\t\tconst filteredVersions = versions.filter((version) => {\n\t\t\t// Exclude tagged versions (e.g. `1.0.0-alpha.0`).\n\t\t\t// Exclude versions < 0.1.0 (e.g. `0.0.1`).\n\t\t\treturn (\n\t\t\t\t/^[1-9]\\d*\\.\\d+\\.\\d+$/.test(version) ||\n\t\t\t\t/^\\d+\\.[1-9]\\d*\\.\\d+$/.test(version)\n\t\t\t);\n\t\t});\n\n\t\treturn semver.rsort(filteredVersions);\n\t}\n\n\tasync getAllStableSliceMachineVersionsWithKind(): Promise<Version[]> {\n\t\tconst versions = await this.getAllStableSliceMachineVersions();\n\n\t\treturn versions.map((version, i) => {\n\t\t\tconst previousVersion = versions[i + 1];\n\n\t\t\treturn {\n\t\t\t\tversion,\n\t\t\t\tkind: detectVersionBumpKind(version, previousVersion),\n\t\t\t};\n\t\t});\n\t}\n\n\tasync getLatestNonBreakingSliceMachineVersion(): Promise<string | undefined> {\n\t\tconst versions = await this.getAllStableSliceMachineVersions();\n\t\tconst currentVersion = await this.getRunningSliceMachineVersion();\n\n\t\treturn semver.maxSatisfying(versions, `^${currentVersion}`) ?? undefined;\n\t}\n\n\tasync checkIsUpdateAvailable(): Promise<boolean> {\n\t\tconst versions = await this.getAllStableSliceMachineVersions();\n\t\tconst currentVersion = await this.getRunningSliceMachineVersion();\n\n\t\treturn semver.gt(versions[0], currentVersion);\n\t}\n\n\tasync getSliceMachineReleaseNotesForVersion(\n\t\targs: SliceMachineManagerGetReleaseNotesForVersionArgs,\n\t): Promise<string | undefined> {\n\t\treturn await fetchGitHubReleaseBodyForRelease({\n\t\t\trepositoryOwner: SLICE_MACHINE_GITHUB_REPOSITORY_ORGANIZATION,\n\t\t\trepositoryName: SLICE_MACHINE_GITHUB_REPOSITORY_NAME,\n\t\t\tpackageName: SLICE_MACHINE_GITHUB_PACKAGE_NAME,\n\t\t\tversion: args.version,\n\t\t\tcache: this.gitHubSliceMachineReleaseMetadataCache,\n\t\t});\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAqBA,MAAM,wBAAwB,CAC7B,IACA,SAC+D;AAC/D,MAAI,CAAC,MAAM;AACV,WAAO,aAAa;AAAA,EACpB;AAED,MAAI,OAAO,GAAG,IAAI,IAAI,GAAG;AACjB,WAAA;AAAA,EAAA,WACG,OAAO,UAAU,IAAI,IAAI,MAAM,GAAG;AAC5C,WAAO,aAAa;AAAA,EAAA,WACV,OAAO,UAAU,IAAI,IAAI,MAAM,GAAG;AAC5C,WAAO,aAAa;AAAA,EAAA,OACd;AACN,WAAO,aAAa;AAAA,EACpB;AACF;AAMM,MAAO,wBAAwB,YAAW;AAAA,EAA1C;AAAA;AAIL;AAAA;AAAA;AAAA,kEAGI,CAAA;AAAA;AAAA,EAEJ,MAAM,gCAA6B;AAClC,UAAM,kBAAkB,MAAM,KAAK,QAAQ,wBAAuB;AAE5D,UAAA,kCAAkC,MAAM,GAAG,SAChD,KAAK,KAAK,iBAAiB,cAAc,GACzC,MAAM;AAGH,QAAA;AACA,QAAA;AACuB,gCAAA,KAAK,MAAM,+BAA+B;AAAA,IAAA,QACnE;AAAA,IAED;AAED,UAAM,EAAE,OAAO,MAAK,IAAK,kBAAkB,uBAAuB;AAElE,QAAI,OAAO;AACJ,YAAA,IAAI,MACT,WAAW,yDAAyD,MAAM,OAAO,KAChF,IAAI,GACF;AAAA,IAEJ;AAED,WAAO,MAAM;AAAA,EACd;AAAA,EAEA,MAAM,mCAAgC;AAC/B,UAAA,WAAW,MAAM,wBAAwB;AAAA,MAC9C,aAAa;AAAA,IAAA,CACb;AAED,UAAM,mBAAmB,SAAS,OAAO,CAAC,YAAW;AAGpD,aACC,uBAAuB,KAAK,OAAO,KACnC,uBAAuB,KAAK,OAAO;AAAA,IAAA,CAEpC;AAEM,WAAA,OAAO,MAAM,gBAAgB;AAAA,EACrC;AAAA,EAEA,MAAM,2CAAwC;AACvC,UAAA,WAAW,MAAM,KAAK;AAE5B,WAAO,SAAS,IAAI,CAAC,SAAS,MAAK;AAC5B,YAAA,kBAAkB,SAAS,IAAI,CAAC;AAE/B,aAAA;AAAA,QACN;AAAA,QACA,MAAM,sBAAsB,SAAS,eAAe;AAAA,MAAA;AAAA,KAErD;AAAA,EACF;AAAA,EAEA,MAAM,0CAAuC;AACtC,UAAA,WAAW,MAAM,KAAK;AACtB,UAAA,iBAAiB,MAAM,KAAK;AAElC,WAAO,OAAO,cAAc,UAAU,IAAI,gBAAgB,KAAK;AAAA,EAChE;AAAA,EAEA,MAAM,yBAAsB;AACrB,UAAA,WAAW,MAAM,KAAK;AACtB,UAAA,iBAAiB,MAAM,KAAK;AAElC,WAAO,OAAO,GAAG,SAAS,CAAC,GAAG,cAAc;AAAA,EAC7C;AAAA,EAEA,MAAM,sCACL,MAAsD;AAEtD,WAAO,MAAM,iCAAiC;AAAA,MAC7C,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,IAAA,CACZ;AAAA,EACF;AACA;"}
@@ -1,5 +1,5 @@
1
1
  import { VERSION_KIND } from "../../constants/VERSION_KIND";
2
2
  export type Version = {
3
3
  version: string;
4
- kind: typeof VERSION_KIND[keyof typeof VERSION_KIND];
4
+ kind: typeof VERSION_KIND[keyof typeof VERSION_KIND] | undefined;
5
5
  };
package/dist/types.d.ts CHANGED
@@ -10,7 +10,7 @@ export type PackageChangelog = {
10
10
  export type PackageVersion = {
11
11
  versionNumber: string;
12
12
  releaseNote: string | null;
13
- kind: typeof VERSION_KIND[keyof typeof VERSION_KIND] | null;
13
+ kind: typeof VERSION_KIND[keyof typeof VERSION_KIND] | undefined;
14
14
  };
15
15
  /**
16
16
  * A string, object, or instance representing a registered plugin.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slicemachine/manager",
3
- "version": "0.1.1-dev-plugins.11",
3
+ "version": "0.1.1-dev-plugins.13",
4
4
  "description": "Manage all aspects of a Slice Machine project.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -52,7 +52,8 @@
52
52
  "lint": "eslint --ext .js,.ts .",
53
53
  "prepare": "npm run build",
54
54
  "size": "size-limit",
55
- "test": "npm run lint && npm run unit && npm run build && npm run size",
55
+ "test": "npm run lint && npm run types && npm run unit && npm run build && npm run size",
56
+ "types": "tsc --noEmit",
56
57
  "unit": "vitest run --coverage",
57
58
  "unit:watch": "vitest watch",
58
59
  "depcheck": "depcheck --config=.depcheckrc"
@@ -60,7 +61,7 @@
60
61
  "dependencies": {
61
62
  "@prismicio/custom-types-client": "^1.0.2",
62
63
  "@prismicio/types-internal": "^1.5.3",
63
- "@slicemachine/plugin-kit": "0.1.8-dev-plugins.11",
64
+ "@slicemachine/plugin-kit": "0.1.8-dev-plugins.13",
64
65
  "@wooorm/starry-night": "^1.4.2",
65
66
  "analytics-node": "^6.2.0",
66
67
  "cookie": "^0.5.0",
@@ -87,8 +88,9 @@
87
88
  "devDependencies": {
88
89
  "@prismicio/mock": "^0.2.0",
89
90
  "@size-limit/preset-small-lib": "^8.1.0",
90
- "@types/analytics-node": "^3.1.9",
91
+ "@types/analytics-node": "^3.1.10",
91
92
  "@types/cookie": "^0.5.1",
93
+ "@types/express": "^4.17.17",
92
94
  "@types/semver": "^7.3.13",
93
95
  "@typescript-eslint/eslint-plugin": "~5.46.1",
94
96
  "@typescript-eslint/parser": "^5.46.1",
@@ -124,5 +126,5 @@
124
126
  "publishConfig": {
125
127
  "access": "public"
126
128
  },
127
- "gitHead": "033da5acbcbf93792fa478b4d83386034a0f4f09"
129
+ "gitHead": "e368e5e7b09008aaffdc28bbadaa8a495d7396b9"
128
130
  }
@@ -1,6 +1,6 @@
1
1
  import { APPLICATION_MODE } from "./APPLICATION_MODE";
2
2
 
3
- type APIEndpoints = {
3
+ export type APIEndpoints = {
4
4
  PrismicWroom: string;
5
5
  PrismicAuthentication: string;
6
6
  PrismicModels: string;
package/src/errors.ts CHANGED
@@ -1,53 +1,6 @@
1
- // const Errors = {
2
- // 1000: {
3
- // message: "Could not refresh token",
4
- // description:
5
- // "You are not logged in. Log in before refreshing your authentication token.",
6
- // },
7
- // 1001: {
8
- // message: "Failed to refresh authentication token",
9
- // description:
10
- // "The Prismic Authentication service returned an invalid response.",
11
- // },
12
- // 1002: {
13
- // message: "Failed to refresh authentication token",
14
- // description:
15
- // "You are not logged in. Log in before attempting to get your authentication token.",
16
- // },
17
- // // 1000: {
18
- // // message: "Unauthenticated",
19
- // // description:
20
- // // "Unable to access the Prismic Custom Types API. Log in to fix this issue.",
21
- // // },
22
- // // 1001: {
23
- // // message: "Unauthorized",
24
- // // description:
25
- // // "Unable to access the Prismic Custom Types API. Grant the user access to the repository to fix this issue.",
26
- // // },
27
- // } as const;
28
- // type Errors = typeof Errors;
29
-
30
1
  import { HookError } from "@slicemachine/plugin-kit";
31
2
 
32
- // const InternalErrorCodes = {
33
- // Unauthorized: "Unauthorized",
34
- // Unauthenticated: "Unauthenticated",
35
- // InternalServerError: "InternalServerError",
36
- // } as const;
37
- // type InternalErrorCodes =
38
- // typeof InternalErrorCodes[keyof typeof InternalErrorCodes];
39
-
40
- // type InternalErrorCode =
41
- // | typeof InternalError.Unauthorized
42
- // | typeof InternalError.Unauthenticated
43
- // | typeof InternalError.InternalServerError;
44
-
45
- // type InternalErrorArgs = {
46
- // message?: string;
47
- // cause?: Error;
48
- // };
49
-
50
- export abstract class SliceMachineError extends Error {
3
+ export class SliceMachineError extends Error {
51
4
  _sliceMachineError = true;
52
5
  name = "SliceMachineError";
53
6
  }
@@ -118,29 +71,3 @@ export const isUnexpectedDataError = (
118
71
  export const isInternalError = (error: unknown): error is InternalError => {
119
72
  return isSliceMachineError(error) && error.name === InternalError.name;
120
73
  };
121
-
122
- // export class InternalError<TCode extends InternalErrorCode> extends Error {
123
- // static Unauthorized = "Unauthorized" as const;
124
- // static Unauthenticated = "Unauthenticated" as const;
125
- // static InternalServerError = "InternalServerError" as const;
126
- //
127
- // code: TCode;
128
- // cause?: Error;
129
- //
130
- // constructor(code: TCode, args: InternalErrorArgs = {}) {
131
- // super(args.message);
132
- //
133
- // this.code = code;
134
- // this.cause = args.cause;
135
- //
136
- // // const error = Errors[code];
137
- //
138
- // // this.message = error.message as TMessage;
139
- //
140
- // // if ("description" in error) {
141
- // // this.description = error.description as TDescription;
142
- // // } else {
143
- // // this.description = undefined as TDescription;
144
- // // }
145
- // }
146
- // }
@@ -0,0 +1,16 @@
1
+ import { API_ENDPOINTS } from "../constants/API_ENDPOINTS";
2
+
3
+ export type BuildPrismicRepositoryAPIEndpointConfig = {
4
+ withCDN?: boolean;
5
+ };
6
+
7
+ export const buildPrismicRepositoryAPIEndpoint = (
8
+ repositoryName: string,
9
+ { withCDN = true }: BuildPrismicRepositoryAPIEndpointConfig = {},
10
+ ): string => {
11
+ const baseEndpoint = new URL(API_ENDPOINTS.PrismicWroom);
12
+
13
+ return `${baseEndpoint.protocol}://${repositoryName}${
14
+ withCDN ? ".cdn" : ""
15
+ }.${baseEndpoint.host}/api/v2`;
16
+ };
@@ -0,0 +1,18 @@
1
+ import * as t from "io-ts";
2
+
3
+ import { decode, DecodeReturnType } from "./decode";
4
+
5
+ /**
6
+ * A minimally defined codec for package.json files. Only data needed for
7
+ * version detection is defined.
8
+ */
9
+ const PackageJSONCodec = t.type({
10
+ version: t.string,
11
+ });
12
+ type PackageJSON = t.TypeOf<typeof PackageJSONCodec>;
13
+
14
+ export const decodePackageJSON = (
15
+ input: unknown,
16
+ ): DecodeReturnType<PackageJSON, PackageJSON, unknown> => {
17
+ return decode(PackageJSONCodec, input);
18
+ };
@@ -24,25 +24,21 @@ export const locateFileUpward = async (
24
24
 
25
25
  const filePaths = castArray(filePathOrPaths);
26
26
 
27
- try {
28
- for (const filePath of filePaths) {
29
- const resolvedFilePath = path.resolve(startDir, filePath);
27
+ for (const filePath of filePaths) {
28
+ const resolvedFilePath = path.resolve(startDir, filePath);
30
29
 
31
- try {
32
- await fs.access(resolvedFilePath);
30
+ try {
31
+ await fs.access(resolvedFilePath);
33
32
 
34
- return resolvedFilePath;
35
- } catch {
36
- continue;
37
- }
33
+ return resolvedFilePath;
34
+ } catch {
35
+ continue;
38
36
  }
39
- } catch {
40
- // noop
41
37
  }
42
38
 
43
39
  if (startDir === stopDir) {
44
40
  const formattedFilePaths = filePaths
45
- .map((filePath) => `\`${filePath}\``)
41
+ .map((filePath) => "`" + filePath + "`")
46
42
  .join(" or ");
47
43
 
48
44
  throw new Error(
@@ -7,18 +7,15 @@ import {
7
7
 
8
8
  import { createContentDigest } from "../lib/createContentDigest";
9
9
 
10
- import {
11
- PackageChangelog,
12
- PackageManager,
13
- // PackageVersion,
14
- SliceMachineConfig,
15
- } from "../types";
10
+ import { PackageChangelog, PackageManager, SliceMachineConfig } from "../types";
16
11
  import {
17
12
  PrismicAuthManager,
18
13
  PrismicUserProfile,
19
14
  } from "../auth/PrismicAuthManager";
20
15
  import { createPrismicAuthManager } from "../auth/createPrismicAuthManager";
21
16
 
17
+ import { API_ENDPOINTS, APIEndpoints } from "../constants/API_ENDPOINTS";
18
+
22
19
  import { UserManager } from "./user/UserManager";
23
20
  import { PrismicRepositoryManager } from "./prismicRepository/PrismicRepositoryManager";
24
21
 
@@ -34,18 +31,20 @@ import { SimulatorManager } from "./simulator/SimulatorManager";
34
31
  import { VersionsManager } from "./versions/VersionsManager";
35
32
 
36
33
  import { TelemetryManager } from "./telemetry/TelemetryManager";
34
+ import { buildPrismicRepositoryAPIEndpoint } from "../lib/buildPrismicRepositoryAPIEndpoint";
37
35
 
38
36
  type SliceMachineManagerGetStateReturnType = {
39
37
  env: {
40
38
  shortId?: string;
41
39
  intercomHash?: string;
42
40
  manifest: {
41
+ apiEndpoint: string;
43
42
  localSliceSimulatorURL?: string;
44
43
  };
45
44
  repo: string;
46
45
  changelog?: PackageChangelog;
47
46
  packageManager: PackageManager;
48
- mockConfig: unknown;
47
+ mockConfig: unknown; // TODO: Remove
49
48
  framework: unknown; // TODO: Remove
50
49
  sliceMachineAPIUrl: string;
51
50
  };
@@ -69,6 +68,7 @@ type SliceMachineManagerGetStateReturnType = {
69
68
  }
70
69
  >;
71
70
  mock?: SharedSliceContent[];
71
+ mockConfig: unknown; // TODO: Remove
72
72
  }[];
73
73
  meta: {
74
74
  name?: string;
@@ -81,7 +81,12 @@ type SliceMachineManagerGetStateReturnType = {
81
81
  customTypes: CustomTypes.CustomType[];
82
82
  remoteCustomTypes: CustomTypes.CustomType[];
83
83
  remoteSlices: CustomTypes.Widgets.Slices.SharedSlice[];
84
- clientError?: { message: string; status: number };
84
+ clientError?: {
85
+ name: string;
86
+ message: string;
87
+ status: number;
88
+ reason: string;
89
+ };
85
90
  };
86
91
 
87
92
  type SliceMachineManagerConstructorArgs = {
@@ -153,6 +158,10 @@ export class SliceMachineManager {
153
158
  return this._prismicAuthManager;
154
159
  }
155
160
 
161
+ getAPIEndpoints(): APIEndpoints {
162
+ return API_ENDPOINTS;
163
+ }
164
+
156
165
  // TODO: Remove this global-state method. It is expensive and a
157
166
  // potential source of bugs due to data inconsistency. SM UI relies on
158
167
  // it heavily, so removal will require significant effort.
@@ -161,8 +170,6 @@ export class SliceMachineManager {
161
170
  { sliceMachineConfig, libraries },
162
171
  { profile, remoteCustomTypes, remoteSlices },
163
172
  customTypes,
164
- // currentVersion,
165
- // allStableVersions,
166
173
  ] = await Promise.all([
167
174
  this.project.getSliceMachineConfig().then(async (sliceMachineConfig) => {
168
175
  const libraries = await this._getLibraries(sliceMachineConfig);
@@ -190,39 +197,31 @@ export class SliceMachineManager {
190
197
  }
191
198
  }),
192
199
  this._getCustomTypes(),
193
- // this.versions.getRunningSliceMachineVersion(),
194
- // this.versions.getAllStableSliceMachineVersions(),
195
200
  ]);
196
201
 
197
- // const latestNonBreakingVersion = ""; // TODO
198
- // const updateAvailable = false; // TODO
199
- // const versions = await Promise.all(
200
- // allStableVersions.map(async (version): Promise<PackageVersion> => {
201
- // const releaseNotes =
202
- // await this.versions.getSliceMachineReleaseNotesForVersion({
203
- // version,
204
- // });
205
- //
206
- // return {
207
- // versionNumber: version,
208
- // releaseNote: releaseNotes ?? null,
209
- // // TODO
210
- // kind: "MINOR",
211
- // };
212
- // }),
213
- // );
214
-
215
202
  // TODO: SM UI detects if a user is logged out by looking at
216
203
  // `clientError`. Here, we simulate what the old core does by
217
204
  // returning an `ErrorWithStatus`-like object if the user is
218
205
  // not logged in.
219
206
  const clientError: SliceMachineManagerGetStateReturnType["clientError"] =
220
- profile ? undefined : { message: "Could not fetch slices", status: 401 };
207
+ profile
208
+ ? undefined
209
+ : {
210
+ name: "__stub__",
211
+ message: "__stub__",
212
+ reason: "__stub__",
213
+ status: 401, // Needed to trigger the unauthorized flow.
214
+ };
221
215
 
222
216
  return {
223
217
  env: {
224
218
  framework: "",
225
219
  manifest: {
220
+ apiEndpoint:
221
+ sliceMachineConfig.apiEndpoint ||
222
+ buildPrismicRepositoryAPIEndpoint(
223
+ sliceMachineConfig.repositoryName,
224
+ ),
226
225
  localSliceSimulatorURL: sliceMachineConfig.localSliceSimulatorURL,
227
226
  },
228
227
  mockConfig: {},
@@ -309,6 +308,7 @@ export class SliceMachineManager {
309
308
  model,
310
309
  screenshots,
311
310
  mock: mocks,
311
+ mockConfig: {}, // TODO: This property can probably be removed.
312
312
  });
313
313
  }
314
314
  }),