start-slicemachine 0.12.60-beta.9 → 0.12.60

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.
@@ -159,11 +159,10 @@ ${allSlices.errors.join("\n\n")}`);
159
159
  * cause the process to wait for the tracking to complete.
160
160
  */
161
161
  async _trackStart() {
162
- const [adapter, adapterVersion, customTypes, gitProvider, isAdapterUpdateAvailable, isLoggedIn, isSliceMachineUpdateAvailable, isTypeScriptProject, packageManager, simulatorUrl, sliceMachineVersion, slices, versionControlSystem] = await Promise.all([
162
+ const [adapter, adapterVersion, customTypes, isAdapterUpdateAvailable, isLoggedIn, isSliceMachineUpdateAvailable, isTypeScriptProject, packageManager, simulatorUrl, sliceMachineVersion, slices, versionControlSystem] = await Promise.all([
163
163
  safelyExecute.safelyExecute(() => this._sliceMachineManager.project.getAdapterName()),
164
164
  safelyExecute.safelyExecute(() => this._sliceMachineManager.versions.getRunningAdapterVersion()),
165
165
  safelyExecute.safelyExecute(() => this._sliceMachineManager.customTypes.readAllCustomTypes()),
166
- safelyExecute.safelyExecute(() => this._sliceMachineManager.git.detectGitProvider()),
167
166
  safelyExecute.safelyExecute(() => this._sliceMachineManager.versions.checkIsAdapterUpdateAvailable()),
168
167
  safelyExecute.safelyExecute(() => this._sliceMachineManager.user.checkIsLoggedIn()),
169
168
  safelyExecute.safelyExecute(() => this._sliceMachineManager.versions.checkIsSliceMachineUpdateAvailable()),
@@ -179,7 +178,6 @@ ${allSlices.errors.join("\n\n")}`);
179
178
  _includeEnvironmentKind: true,
180
179
  adapter,
181
180
  adapterVersion,
182
- gitProvider,
183
181
  isAdapterUpdateAvailable,
184
182
  isLoggedIn,
185
183
  isSliceMachineUpdateAvailable,
@@ -1 +1 @@
1
- {"version":3,"file":"StartSliceMachineProcess.cjs","sources":["../../src/StartSliceMachineProcess.ts"],"sourcesContent":["/* eslint-disable no-console */\n\nimport type { AddressInfo } from \"node:net\";\nimport chalk from \"chalk\";\nimport open from \"open\";\nimport os from \"node:os\";\n\nimport {\n\tPrismicUserProfile,\n\tSliceMachineManager,\n\tcreateSliceMachineManager,\n} from \"@slicemachine/manager\";\n\nimport { createSliceMachineExpressApp } from \"./lib/createSliceMachineExpressApp\";\nimport { setupSentry } from \"./lib/setupSentry\";\nimport { migrateSMJSON } from \"./legacyMigrations/migrateSMJSON\";\nimport { migrateAssets } from \"./legacyMigrations/migrateAssets\";\nimport { SLICE_MACHINE_NPM_PACKAGE_NAME } from \"./constants\";\nimport { safelyExecute } from \"./lib/safelyExecute\";\n\nconst DEFAULT_SERVER_PORT = 9999;\n\ntype CreateStartSliceMachineProcessArgs = ConstructorParameters<\n\ttypeof StartSliceMachineProcess\n>;\n\nexport const createStartSliceMachineProcess = (\n\t...args: CreateStartSliceMachineProcessArgs\n): StartSliceMachineProcess => {\n\treturn new StartSliceMachineProcess(...args);\n};\n\nexport type StartSliceMachineProcessConstructorArgs = {\n\topen: boolean;\n\tport?: number;\n};\n\n/**\n * Manages the process that runs Slice Machine's server.\n */\nexport class StartSliceMachineProcess {\n\t/**\n\t * Determines if Slice Machine should automatically be opened once the server\n\t * starts.\n\t *\n\t * @defaultValue `false`\n\t */\n\topen: boolean;\n\n\t/**\n\t * The port on which to start the Slice Machine server.\n\t *\n\t * @defaultValue `9999`\n\t */\n\tport: number;\n\n\t/**\n\t * The Slice Machine manager used for the process.\n\t */\n\tprivate _sliceMachineManager: SliceMachineManager;\n\n\tconstructor(args: StartSliceMachineProcessConstructorArgs) {\n\t\tthis._sliceMachineManager = createSliceMachineManager();\n\n\t\tthis.open = args.open ?? false;\n\t\tthis.port = args.port ?? DEFAULT_SERVER_PORT;\n\t}\n\n\t/**\n\t * Runs the process.\n\t */\n\tasync run(): Promise<void> {\n\t\t// This migration needs to run before the plugins are initialised\n\t\t// Nothing can start without the config file\n\t\tawait migrateSMJSON(this._sliceMachineManager);\n\n\t\t// Initialize Segment and Sentry\n\t\tconst appVersion =\n\t\t\tawait this._sliceMachineManager.versions.getRunningSliceMachineVersion();\n\t\tawait this._sliceMachineManager.telemetry.initTelemetry({\n\t\t\tappName: SLICE_MACHINE_NPM_PACKAGE_NAME,\n\t\t\tappVersion,\n\t\t});\n\t\tconst isTelemetryEnabled =\n\t\t\tawait this._sliceMachineManager.telemetry.checkIsTelemetryEnabled();\n\t\tif (isTelemetryEnabled) {\n\t\t\ttry {\n\t\t\t\tawait setupSentry(this._sliceMachineManager);\n\t\t\t} catch (error) {\n\t\t\t\t// noop - We don't want to stop the user from using Slice Machine\n\t\t\t\t// because of failed tracking set up. We probably couldn't determine the\n\t\t\t\t// Sentry environment.\n\n\t\t\t\tif (import.meta.env.DEV) {\n\t\t\t\t\tconsole.error(\"Error setting up Sentry:\", error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tawait this._sliceMachineManager.plugins.initPlugins();\n\n\t\t// TODO: MIGRATION - Move this to the Migration Manager\n\t\tawait migrateAssets(this._sliceMachineManager);\n\n\t\tawait this._validateProject();\n\n\t\tif (isTelemetryEnabled) {\n\t\t\ttry {\n\t\t\t\tthis._trackStart();\n\t\t\t} catch (error) {\n\t\t\t\t// noop - We don't want to stop the user from using Slice Machine\n\t\t\t\t// because of failed start event tracking.\n\n\t\t\t\tif (import.meta.env.DEV) {\n\t\t\t\t\tconsole.error(\"Error tracking start event:\", error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst app = await createSliceMachineExpressApp({\n\t\t\tsliceMachineManager: this._sliceMachineManager,\n\t\t});\n\n\t\tconst server = app.listen(this.port);\n\t\tserver.on(\"error\", (error: NodeJS.ErrnoException) => {\n\t\t\tif (error.code === \"EADDRINUSE\") {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error starting Slice Machine: Port ${this.port} is already in use. Please try a different port.`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconsole.error(\"Error starting Slice Machine:\", error);\n\t\t\t}\n\t\t\tprocess.exit(1);\n\t\t});\n\n\t\tconst address = server.address() as AddressInfo;\n\t\tconst url = `http://localhost:${address.port}`;\n\n\t\tif (this.open) {\n\t\t\tawait open(url);\n\t\t}\n\n\t\tconsole.log();\n\t\tconsole.log(\n\t\t\tawait this._buildSliceMachineRunningLine(\n\t\t\t\t`Running at ${chalk.magenta(url)}`,\n\t\t\t),\n\t\t);\n\t\tconsole.log();\n\n\t\tconst profile = await this._fetchProfile();\n\n\t\tif (profile) {\n\t\t\tthis._sliceMachineManager.telemetry.identify({\n\t\t\t\tuserID: profile.shortId,\n\t\t\t\tintercomHash: profile.intercomHash,\n\t\t\t});\n\n\t\t\tawait Promise.allSettled([\n\t\t\t\t// noop - We'll try again when needed.\n\t\t\t\tthis._sliceMachineManager.user.refreshAuthenticationToken(),\n\t\t\t\t// noop - We'll try again before uploading a screenshot.\n\t\t\t\tthis._sliceMachineManager.screenshots.initS3ACL(),\n\t\t\t]);\n\t\t}\n\t}\n\n\t/**\n\t * Returns a string with Slice Machine info formatted for the console.\n\t *\n\t * @param value - Info to display.\n\t *\n\t * @returns String to pass to the console.\n\t */\n\tprivate async _buildSliceMachineRunningLine(value: string): Promise<string> {\n\t\tconst currentVersion =\n\t\t\tawait this._sliceMachineManager.versions.getRunningSliceMachineVersion();\n\n\t\treturn `${chalk.bgBlack(\n\t\t\t` ${chalk.bold.white(\"Slice Machine\")} ${chalk.magenta(\n\t\t\t\t`v${currentVersion}`,\n\t\t\t)} `,\n\t\t)} ${chalk.dim(\"→\")} ${value}`;\n\t}\n\n\t/**\n\t * Validates the project's config and content models.\n\t *\n\t * @throws Throws if a Library name is invalid.\n\t * @throws Throws if a Slice model is invalid.\n\t * @throws Throws if a Custom Type model is invalid.\n\t */\n\tprivate async _validateProject(): Promise<void> {\n\t\t// Validate Slice Machine config.\n\t\tconst config =\n\t\t\tawait this._sliceMachineManager.project.loadSliceMachineConfig();\n\n\t\t// Validate Library IDs\n\t\tconst invalidLibraries =\n\t\t\tconfig.libraries?.filter(\n\t\t\t\t(library) => library.startsWith(\"@\") || library.startsWith(\"~\"),\n\t\t\t) || [];\n\t\tif (invalidLibraries.length > 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`The following Slice libraries have invalid names: ${invalidLibraries.join(\n\t\t\t\t\t\", \",\n\t\t\t\t)}. Slice library names must not start with \"@\" nor \"~\".`,\n\t\t\t);\n\t\t}\n\n\t\t// Validate Slice models.\n\t\tconst allSlices = await this._sliceMachineManager.slices.readAllSlices();\n\t\tif (allSlices.errors.length > 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`Errors occurred while validating your project's slices.\\n\\n${allSlices.errors.join(\n\t\t\t\t\t\"\\n\\n\",\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\n\t\t// Validate Custom Type models.\n\t\tconst allCustomTypes =\n\t\t\tawait this._sliceMachineManager.customTypes.readAllCustomTypes();\n\t\tif (allCustomTypes.errors.length > 0) {\n\t\t\t// TODO: Provide better error message.\n\t\t\tthrow new Error(allCustomTypes.errors.join(\", \"));\n\t\t}\n\t}\n\n\t/**\n\t * Fetches the logged in Prismic user's profile. If the user is not logged in,\n\t * `undefined` is returned.\n\t *\n\t * @returns The logged in Prismic user's profile, or `undefined` if not logged\n\t * in.\n\t */\n\tprivate async _fetchProfile(): Promise<PrismicUserProfile | undefined> {\n\t\tconst isLoggedIn = await this._sliceMachineManager.user.checkIsLoggedIn();\n\n\t\tif (isLoggedIn) {\n\t\t\treturn await this._sliceMachineManager.user.getProfile();\n\t\t}\n\t}\n\n\t/**\n\t * Tracks the start of Slice Machine.\n\t *\n\t * This method is called after Slice Machine has started and so it will not\n\t * cause the process to wait for the tracking to complete.\n\t */\n\tprivate async _trackStart(): Promise<void> {\n\t\tconst [\n\t\t\tadapter,\n\t\t\tadapterVersion,\n\t\t\tcustomTypes,\n\t\t\tgitProvider,\n\t\t\tisAdapterUpdateAvailable,\n\t\t\tisLoggedIn,\n\t\t\tisSliceMachineUpdateAvailable,\n\t\t\tisTypeScriptProject,\n\t\t\tpackageManager,\n\t\t\tsimulatorUrl,\n\t\t\tsliceMachineVersion,\n\t\t\tslices,\n\t\t\tversionControlSystem,\n\t\t] = await Promise.all([\n\t\t\tsafelyExecute(() => this._sliceMachineManager.project.getAdapterName()),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.versions.getRunningAdapterVersion(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.customTypes.readAllCustomTypes(),\n\t\t\t),\n\t\t\tsafelyExecute(() => this._sliceMachineManager.git.detectGitProvider()),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.versions.checkIsAdapterUpdateAvailable(),\n\t\t\t),\n\t\t\tsafelyExecute(() => this._sliceMachineManager.user.checkIsLoggedIn()),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.versions.checkIsSliceMachineUpdateAvailable(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.project.checkIsTypeScript(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.project.detectPackageManager(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.simulator.getLocalSliceSimulatorURL(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.versions.getRunningSliceMachineVersion(),\n\t\t\t),\n\t\t\tsafelyExecute(() => this._sliceMachineManager.slices.readAllSlices()),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.project.detectVersionControlSystem(),\n\t\t\t),\n\t\t]);\n\n\t\tthis._sliceMachineManager.telemetry.track({\n\t\t\tevent: \"slice-machine:start\",\n\t\t\t_includeEnvironmentKind: true,\n\t\t\tadapter,\n\t\t\tadapterVersion,\n\t\t\tgitProvider,\n\t\t\tisAdapterUpdateAvailable,\n\t\t\tisLoggedIn,\n\t\t\tisSliceMachineUpdateAvailable,\n\t\t\tisTypeScriptProject,\n\t\t\tnodeVersion: process.versions.node,\n\t\t\tnumberOfCustomTypes: customTypes?.models.length,\n\t\t\tnumberOfSlices: slices?.models.length,\n\t\t\tosPlatform: os.platform(),\n\t\t\t// Ensure we escape the \"@\" character to prevent it from being interpreted\n\t\t\t// as an email address and being considered sensitive and stripped off.\n\t\t\tpackageManager: packageManager?.replace(\"@\", \"[at]\"),\n\t\t\tprojectPort: simulatorUrl ? new URL(simulatorUrl).port : undefined,\n\t\t\tsliceMachineVersion,\n\t\t\tversionControlSystem,\n\t\t});\n\t}\n}\n"],"names":["createSliceMachineManager","migrateSMJSON","SLICE_MACHINE_NPM_PACKAGE_NAME","setupSentry","migrateAssets","createSliceMachineExpressApp","safelyExecute"],"mappings":"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"}
1
+ {"version":3,"file":"StartSliceMachineProcess.cjs","sources":["../../src/StartSliceMachineProcess.ts"],"sourcesContent":["/* eslint-disable no-console */\n\nimport type { AddressInfo } from \"node:net\";\nimport chalk from \"chalk\";\nimport open from \"open\";\nimport os from \"node:os\";\n\nimport {\n\tPrismicUserProfile,\n\tSliceMachineManager,\n\tcreateSliceMachineManager,\n} from \"@slicemachine/manager\";\n\nimport { createSliceMachineExpressApp } from \"./lib/createSliceMachineExpressApp\";\nimport { setupSentry } from \"./lib/setupSentry\";\nimport { migrateSMJSON } from \"./legacyMigrations/migrateSMJSON\";\nimport { migrateAssets } from \"./legacyMigrations/migrateAssets\";\nimport { SLICE_MACHINE_NPM_PACKAGE_NAME } from \"./constants\";\nimport { safelyExecute } from \"./lib/safelyExecute\";\n\nconst DEFAULT_SERVER_PORT = 9999;\n\ntype CreateStartSliceMachineProcessArgs = ConstructorParameters<\n\ttypeof StartSliceMachineProcess\n>;\n\nexport const createStartSliceMachineProcess = (\n\t...args: CreateStartSliceMachineProcessArgs\n): StartSliceMachineProcess => {\n\treturn new StartSliceMachineProcess(...args);\n};\n\nexport type StartSliceMachineProcessConstructorArgs = {\n\topen: boolean;\n\tport?: number;\n};\n\n/**\n * Manages the process that runs Slice Machine's server.\n */\nexport class StartSliceMachineProcess {\n\t/**\n\t * Determines if Slice Machine should automatically be opened once the server\n\t * starts.\n\t *\n\t * @defaultValue `false`\n\t */\n\topen: boolean;\n\n\t/**\n\t * The port on which to start the Slice Machine server.\n\t *\n\t * @defaultValue `9999`\n\t */\n\tport: number;\n\n\t/**\n\t * The Slice Machine manager used for the process.\n\t */\n\tprivate _sliceMachineManager: SliceMachineManager;\n\n\tconstructor(args: StartSliceMachineProcessConstructorArgs) {\n\t\tthis._sliceMachineManager = createSliceMachineManager();\n\n\t\tthis.open = args.open ?? false;\n\t\tthis.port = args.port ?? DEFAULT_SERVER_PORT;\n\t}\n\n\t/**\n\t * Runs the process.\n\t */\n\tasync run(): Promise<void> {\n\t\t// This migration needs to run before the plugins are initialised\n\t\t// Nothing can start without the config file\n\t\tawait migrateSMJSON(this._sliceMachineManager);\n\n\t\t// Initialize Segment and Sentry\n\t\tconst appVersion =\n\t\t\tawait this._sliceMachineManager.versions.getRunningSliceMachineVersion();\n\t\tawait this._sliceMachineManager.telemetry.initTelemetry({\n\t\t\tappName: SLICE_MACHINE_NPM_PACKAGE_NAME,\n\t\t\tappVersion,\n\t\t});\n\t\tconst isTelemetryEnabled =\n\t\t\tawait this._sliceMachineManager.telemetry.checkIsTelemetryEnabled();\n\t\tif (isTelemetryEnabled) {\n\t\t\ttry {\n\t\t\t\tawait setupSentry(this._sliceMachineManager);\n\t\t\t} catch (error) {\n\t\t\t\t// noop - We don't want to stop the user from using Slice Machine\n\t\t\t\t// because of failed tracking set up. We probably couldn't determine the\n\t\t\t\t// Sentry environment.\n\n\t\t\t\tif (import.meta.env.DEV) {\n\t\t\t\t\tconsole.error(\"Error setting up Sentry:\", error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tawait this._sliceMachineManager.plugins.initPlugins();\n\n\t\t// TODO: MIGRATION - Move this to the Migration Manager\n\t\tawait migrateAssets(this._sliceMachineManager);\n\n\t\tawait this._validateProject();\n\n\t\tif (isTelemetryEnabled) {\n\t\t\ttry {\n\t\t\t\tthis._trackStart();\n\t\t\t} catch (error) {\n\t\t\t\t// noop - We don't want to stop the user from using Slice Machine\n\t\t\t\t// because of failed start event tracking.\n\n\t\t\t\tif (import.meta.env.DEV) {\n\t\t\t\t\tconsole.error(\"Error tracking start event:\", error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst app = await createSliceMachineExpressApp({\n\t\t\tsliceMachineManager: this._sliceMachineManager,\n\t\t});\n\n\t\tconst server = app.listen(this.port);\n\t\tserver.on(\"error\", (error: NodeJS.ErrnoException) => {\n\t\t\tif (error.code === \"EADDRINUSE\") {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error starting Slice Machine: Port ${this.port} is already in use. Please try a different port.`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconsole.error(\"Error starting Slice Machine:\", error);\n\t\t\t}\n\t\t\tprocess.exit(1);\n\t\t});\n\n\t\tconst address = server.address() as AddressInfo;\n\t\tconst url = `http://localhost:${address.port}`;\n\n\t\tif (this.open) {\n\t\t\tawait open(url);\n\t\t}\n\n\t\tconsole.log();\n\t\tconsole.log(\n\t\t\tawait this._buildSliceMachineRunningLine(\n\t\t\t\t`Running at ${chalk.magenta(url)}`,\n\t\t\t),\n\t\t);\n\t\tconsole.log();\n\n\t\tconst profile = await this._fetchProfile();\n\n\t\tif (profile) {\n\t\t\tthis._sliceMachineManager.telemetry.identify({\n\t\t\t\tuserID: profile.shortId,\n\t\t\t\tintercomHash: profile.intercomHash,\n\t\t\t});\n\n\t\t\tawait Promise.allSettled([\n\t\t\t\t// noop - We'll try again when needed.\n\t\t\t\tthis._sliceMachineManager.user.refreshAuthenticationToken(),\n\t\t\t\t// noop - We'll try again before uploading a screenshot.\n\t\t\t\tthis._sliceMachineManager.screenshots.initS3ACL(),\n\t\t\t]);\n\t\t}\n\t}\n\n\t/**\n\t * Returns a string with Slice Machine info formatted for the console.\n\t *\n\t * @param value - Info to display.\n\t *\n\t * @returns String to pass to the console.\n\t */\n\tprivate async _buildSliceMachineRunningLine(value: string): Promise<string> {\n\t\tconst currentVersion =\n\t\t\tawait this._sliceMachineManager.versions.getRunningSliceMachineVersion();\n\n\t\treturn `${chalk.bgBlack(\n\t\t\t` ${chalk.bold.white(\"Slice Machine\")} ${chalk.magenta(\n\t\t\t\t`v${currentVersion}`,\n\t\t\t)} `,\n\t\t)} ${chalk.dim(\"→\")} ${value}`;\n\t}\n\n\t/**\n\t * Validates the project's config and content models.\n\t *\n\t * @throws Throws if a Library name is invalid.\n\t * @throws Throws if a Slice model is invalid.\n\t * @throws Throws if a Custom Type model is invalid.\n\t */\n\tprivate async _validateProject(): Promise<void> {\n\t\t// Validate Slice Machine config.\n\t\tconst config =\n\t\t\tawait this._sliceMachineManager.project.loadSliceMachineConfig();\n\n\t\t// Validate Library IDs\n\t\tconst invalidLibraries =\n\t\t\tconfig.libraries?.filter(\n\t\t\t\t(library) => library.startsWith(\"@\") || library.startsWith(\"~\"),\n\t\t\t) || [];\n\t\tif (invalidLibraries.length > 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`The following Slice libraries have invalid names: ${invalidLibraries.join(\n\t\t\t\t\t\", \",\n\t\t\t\t)}. Slice library names must not start with \"@\" nor \"~\".`,\n\t\t\t);\n\t\t}\n\n\t\t// Validate Slice models.\n\t\tconst allSlices = await this._sliceMachineManager.slices.readAllSlices();\n\t\tif (allSlices.errors.length > 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`Errors occurred while validating your project's slices.\\n\\n${allSlices.errors.join(\n\t\t\t\t\t\"\\n\\n\",\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\n\t\t// Validate Custom Type models.\n\t\tconst allCustomTypes =\n\t\t\tawait this._sliceMachineManager.customTypes.readAllCustomTypes();\n\t\tif (allCustomTypes.errors.length > 0) {\n\t\t\t// TODO: Provide better error message.\n\t\t\tthrow new Error(allCustomTypes.errors.join(\", \"));\n\t\t}\n\t}\n\n\t/**\n\t * Fetches the logged in Prismic user's profile. If the user is not logged in,\n\t * `undefined` is returned.\n\t *\n\t * @returns The logged in Prismic user's profile, or `undefined` if not logged\n\t * in.\n\t */\n\tprivate async _fetchProfile(): Promise<PrismicUserProfile | undefined> {\n\t\tconst isLoggedIn = await this._sliceMachineManager.user.checkIsLoggedIn();\n\n\t\tif (isLoggedIn) {\n\t\t\treturn await this._sliceMachineManager.user.getProfile();\n\t\t}\n\t}\n\n\t/**\n\t * Tracks the start of Slice Machine.\n\t *\n\t * This method is called after Slice Machine has started and so it will not\n\t * cause the process to wait for the tracking to complete.\n\t */\n\tprivate async _trackStart(): Promise<void> {\n\t\tconst [\n\t\t\tadapter,\n\t\t\tadapterVersion,\n\t\t\tcustomTypes,\n\t\t\tisAdapterUpdateAvailable,\n\t\t\tisLoggedIn,\n\t\t\tisSliceMachineUpdateAvailable,\n\t\t\tisTypeScriptProject,\n\t\t\tpackageManager,\n\t\t\tsimulatorUrl,\n\t\t\tsliceMachineVersion,\n\t\t\tslices,\n\t\t\tversionControlSystem,\n\t\t] = await Promise.all([\n\t\t\tsafelyExecute(() => this._sliceMachineManager.project.getAdapterName()),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.versions.getRunningAdapterVersion(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.customTypes.readAllCustomTypes(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.versions.checkIsAdapterUpdateAvailable(),\n\t\t\t),\n\t\t\tsafelyExecute(() => this._sliceMachineManager.user.checkIsLoggedIn()),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.versions.checkIsSliceMachineUpdateAvailable(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.project.checkIsTypeScript(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.project.detectPackageManager(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.simulator.getLocalSliceSimulatorURL(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.versions.getRunningSliceMachineVersion(),\n\t\t\t),\n\t\t\tsafelyExecute(() => this._sliceMachineManager.slices.readAllSlices()),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.project.detectVersionControlSystem(),\n\t\t\t),\n\t\t]);\n\n\t\tthis._sliceMachineManager.telemetry.track({\n\t\t\tevent: \"slice-machine:start\",\n\t\t\t_includeEnvironmentKind: true,\n\t\t\tadapter,\n\t\t\tadapterVersion,\n\t\t\tisAdapterUpdateAvailable,\n\t\t\tisLoggedIn,\n\t\t\tisSliceMachineUpdateAvailable,\n\t\t\tisTypeScriptProject,\n\t\t\tnodeVersion: process.versions.node,\n\t\t\tnumberOfCustomTypes: customTypes?.models.length,\n\t\t\tnumberOfSlices: slices?.models.length,\n\t\t\tosPlatform: os.platform(),\n\t\t\t// Ensure we escape the \"@\" character to prevent it from being interpreted\n\t\t\t// as an email address and being considered sensitive and stripped off.\n\t\t\tpackageManager: packageManager?.replace(\"@\", \"[at]\"),\n\t\t\tprojectPort: simulatorUrl ? new URL(simulatorUrl).port : undefined,\n\t\t\tsliceMachineVersion,\n\t\t\tversionControlSystem,\n\t\t});\n\t}\n}\n"],"names":["createSliceMachineManager","migrateSMJSON","SLICE_MACHINE_NPM_PACKAGE_NAME","setupSentry","migrateAssets","createSliceMachineExpressApp","safelyExecute"],"mappings":"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"}
@@ -157,11 +157,10 @@ ${allSlices.errors.join("\n\n")}`);
157
157
  * cause the process to wait for the tracking to complete.
158
158
  */
159
159
  async _trackStart() {
160
- const [adapter, adapterVersion, customTypes, gitProvider, isAdapterUpdateAvailable, isLoggedIn, isSliceMachineUpdateAvailable, isTypeScriptProject, packageManager, simulatorUrl, sliceMachineVersion, slices, versionControlSystem] = await Promise.all([
160
+ const [adapter, adapterVersion, customTypes, isAdapterUpdateAvailable, isLoggedIn, isSliceMachineUpdateAvailable, isTypeScriptProject, packageManager, simulatorUrl, sliceMachineVersion, slices, versionControlSystem] = await Promise.all([
161
161
  safelyExecute(() => this._sliceMachineManager.project.getAdapterName()),
162
162
  safelyExecute(() => this._sliceMachineManager.versions.getRunningAdapterVersion()),
163
163
  safelyExecute(() => this._sliceMachineManager.customTypes.readAllCustomTypes()),
164
- safelyExecute(() => this._sliceMachineManager.git.detectGitProvider()),
165
164
  safelyExecute(() => this._sliceMachineManager.versions.checkIsAdapterUpdateAvailable()),
166
165
  safelyExecute(() => this._sliceMachineManager.user.checkIsLoggedIn()),
167
166
  safelyExecute(() => this._sliceMachineManager.versions.checkIsSliceMachineUpdateAvailable()),
@@ -177,7 +176,6 @@ ${allSlices.errors.join("\n\n")}`);
177
176
  _includeEnvironmentKind: true,
178
177
  adapter,
179
178
  adapterVersion,
180
- gitProvider,
181
179
  isAdapterUpdateAvailable,
182
180
  isLoggedIn,
183
181
  isSliceMachineUpdateAvailable,
@@ -1 +1 @@
1
- {"version":3,"file":"StartSliceMachineProcess.js","sources":["../../src/StartSliceMachineProcess.ts"],"sourcesContent":["/* eslint-disable no-console */\n\nimport type { AddressInfo } from \"node:net\";\nimport chalk from \"chalk\";\nimport open from \"open\";\nimport os from \"node:os\";\n\nimport {\n\tPrismicUserProfile,\n\tSliceMachineManager,\n\tcreateSliceMachineManager,\n} from \"@slicemachine/manager\";\n\nimport { createSliceMachineExpressApp } from \"./lib/createSliceMachineExpressApp\";\nimport { setupSentry } from \"./lib/setupSentry\";\nimport { migrateSMJSON } from \"./legacyMigrations/migrateSMJSON\";\nimport { migrateAssets } from \"./legacyMigrations/migrateAssets\";\nimport { SLICE_MACHINE_NPM_PACKAGE_NAME } from \"./constants\";\nimport { safelyExecute } from \"./lib/safelyExecute\";\n\nconst DEFAULT_SERVER_PORT = 9999;\n\ntype CreateStartSliceMachineProcessArgs = ConstructorParameters<\n\ttypeof StartSliceMachineProcess\n>;\n\nexport const createStartSliceMachineProcess = (\n\t...args: CreateStartSliceMachineProcessArgs\n): StartSliceMachineProcess => {\n\treturn new StartSliceMachineProcess(...args);\n};\n\nexport type StartSliceMachineProcessConstructorArgs = {\n\topen: boolean;\n\tport?: number;\n};\n\n/**\n * Manages the process that runs Slice Machine's server.\n */\nexport class StartSliceMachineProcess {\n\t/**\n\t * Determines if Slice Machine should automatically be opened once the server\n\t * starts.\n\t *\n\t * @defaultValue `false`\n\t */\n\topen: boolean;\n\n\t/**\n\t * The port on which to start the Slice Machine server.\n\t *\n\t * @defaultValue `9999`\n\t */\n\tport: number;\n\n\t/**\n\t * The Slice Machine manager used for the process.\n\t */\n\tprivate _sliceMachineManager: SliceMachineManager;\n\n\tconstructor(args: StartSliceMachineProcessConstructorArgs) {\n\t\tthis._sliceMachineManager = createSliceMachineManager();\n\n\t\tthis.open = args.open ?? false;\n\t\tthis.port = args.port ?? DEFAULT_SERVER_PORT;\n\t}\n\n\t/**\n\t * Runs the process.\n\t */\n\tasync run(): Promise<void> {\n\t\t// This migration needs to run before the plugins are initialised\n\t\t// Nothing can start without the config file\n\t\tawait migrateSMJSON(this._sliceMachineManager);\n\n\t\t// Initialize Segment and Sentry\n\t\tconst appVersion =\n\t\t\tawait this._sliceMachineManager.versions.getRunningSliceMachineVersion();\n\t\tawait this._sliceMachineManager.telemetry.initTelemetry({\n\t\t\tappName: SLICE_MACHINE_NPM_PACKAGE_NAME,\n\t\t\tappVersion,\n\t\t});\n\t\tconst isTelemetryEnabled =\n\t\t\tawait this._sliceMachineManager.telemetry.checkIsTelemetryEnabled();\n\t\tif (isTelemetryEnabled) {\n\t\t\ttry {\n\t\t\t\tawait setupSentry(this._sliceMachineManager);\n\t\t\t} catch (error) {\n\t\t\t\t// noop - We don't want to stop the user from using Slice Machine\n\t\t\t\t// because of failed tracking set up. We probably couldn't determine the\n\t\t\t\t// Sentry environment.\n\n\t\t\t\tif (import.meta.env.DEV) {\n\t\t\t\t\tconsole.error(\"Error setting up Sentry:\", error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tawait this._sliceMachineManager.plugins.initPlugins();\n\n\t\t// TODO: MIGRATION - Move this to the Migration Manager\n\t\tawait migrateAssets(this._sliceMachineManager);\n\n\t\tawait this._validateProject();\n\n\t\tif (isTelemetryEnabled) {\n\t\t\ttry {\n\t\t\t\tthis._trackStart();\n\t\t\t} catch (error) {\n\t\t\t\t// noop - We don't want to stop the user from using Slice Machine\n\t\t\t\t// because of failed start event tracking.\n\n\t\t\t\tif (import.meta.env.DEV) {\n\t\t\t\t\tconsole.error(\"Error tracking start event:\", error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst app = await createSliceMachineExpressApp({\n\t\t\tsliceMachineManager: this._sliceMachineManager,\n\t\t});\n\n\t\tconst server = app.listen(this.port);\n\t\tserver.on(\"error\", (error: NodeJS.ErrnoException) => {\n\t\t\tif (error.code === \"EADDRINUSE\") {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error starting Slice Machine: Port ${this.port} is already in use. Please try a different port.`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconsole.error(\"Error starting Slice Machine:\", error);\n\t\t\t}\n\t\t\tprocess.exit(1);\n\t\t});\n\n\t\tconst address = server.address() as AddressInfo;\n\t\tconst url = `http://localhost:${address.port}`;\n\n\t\tif (this.open) {\n\t\t\tawait open(url);\n\t\t}\n\n\t\tconsole.log();\n\t\tconsole.log(\n\t\t\tawait this._buildSliceMachineRunningLine(\n\t\t\t\t`Running at ${chalk.magenta(url)}`,\n\t\t\t),\n\t\t);\n\t\tconsole.log();\n\n\t\tconst profile = await this._fetchProfile();\n\n\t\tif (profile) {\n\t\t\tthis._sliceMachineManager.telemetry.identify({\n\t\t\t\tuserID: profile.shortId,\n\t\t\t\tintercomHash: profile.intercomHash,\n\t\t\t});\n\n\t\t\tawait Promise.allSettled([\n\t\t\t\t// noop - We'll try again when needed.\n\t\t\t\tthis._sliceMachineManager.user.refreshAuthenticationToken(),\n\t\t\t\t// noop - We'll try again before uploading a screenshot.\n\t\t\t\tthis._sliceMachineManager.screenshots.initS3ACL(),\n\t\t\t]);\n\t\t}\n\t}\n\n\t/**\n\t * Returns a string with Slice Machine info formatted for the console.\n\t *\n\t * @param value - Info to display.\n\t *\n\t * @returns String to pass to the console.\n\t */\n\tprivate async _buildSliceMachineRunningLine(value: string): Promise<string> {\n\t\tconst currentVersion =\n\t\t\tawait this._sliceMachineManager.versions.getRunningSliceMachineVersion();\n\n\t\treturn `${chalk.bgBlack(\n\t\t\t` ${chalk.bold.white(\"Slice Machine\")} ${chalk.magenta(\n\t\t\t\t`v${currentVersion}`,\n\t\t\t)} `,\n\t\t)} ${chalk.dim(\"→\")} ${value}`;\n\t}\n\n\t/**\n\t * Validates the project's config and content models.\n\t *\n\t * @throws Throws if a Library name is invalid.\n\t * @throws Throws if a Slice model is invalid.\n\t * @throws Throws if a Custom Type model is invalid.\n\t */\n\tprivate async _validateProject(): Promise<void> {\n\t\t// Validate Slice Machine config.\n\t\tconst config =\n\t\t\tawait this._sliceMachineManager.project.loadSliceMachineConfig();\n\n\t\t// Validate Library IDs\n\t\tconst invalidLibraries =\n\t\t\tconfig.libraries?.filter(\n\t\t\t\t(library) => library.startsWith(\"@\") || library.startsWith(\"~\"),\n\t\t\t) || [];\n\t\tif (invalidLibraries.length > 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`The following Slice libraries have invalid names: ${invalidLibraries.join(\n\t\t\t\t\t\", \",\n\t\t\t\t)}. Slice library names must not start with \"@\" nor \"~\".`,\n\t\t\t);\n\t\t}\n\n\t\t// Validate Slice models.\n\t\tconst allSlices = await this._sliceMachineManager.slices.readAllSlices();\n\t\tif (allSlices.errors.length > 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`Errors occurred while validating your project's slices.\\n\\n${allSlices.errors.join(\n\t\t\t\t\t\"\\n\\n\",\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\n\t\t// Validate Custom Type models.\n\t\tconst allCustomTypes =\n\t\t\tawait this._sliceMachineManager.customTypes.readAllCustomTypes();\n\t\tif (allCustomTypes.errors.length > 0) {\n\t\t\t// TODO: Provide better error message.\n\t\t\tthrow new Error(allCustomTypes.errors.join(\", \"));\n\t\t}\n\t}\n\n\t/**\n\t * Fetches the logged in Prismic user's profile. If the user is not logged in,\n\t * `undefined` is returned.\n\t *\n\t * @returns The logged in Prismic user's profile, or `undefined` if not logged\n\t * in.\n\t */\n\tprivate async _fetchProfile(): Promise<PrismicUserProfile | undefined> {\n\t\tconst isLoggedIn = await this._sliceMachineManager.user.checkIsLoggedIn();\n\n\t\tif (isLoggedIn) {\n\t\t\treturn await this._sliceMachineManager.user.getProfile();\n\t\t}\n\t}\n\n\t/**\n\t * Tracks the start of Slice Machine.\n\t *\n\t * This method is called after Slice Machine has started and so it will not\n\t * cause the process to wait for the tracking to complete.\n\t */\n\tprivate async _trackStart(): Promise<void> {\n\t\tconst [\n\t\t\tadapter,\n\t\t\tadapterVersion,\n\t\t\tcustomTypes,\n\t\t\tgitProvider,\n\t\t\tisAdapterUpdateAvailable,\n\t\t\tisLoggedIn,\n\t\t\tisSliceMachineUpdateAvailable,\n\t\t\tisTypeScriptProject,\n\t\t\tpackageManager,\n\t\t\tsimulatorUrl,\n\t\t\tsliceMachineVersion,\n\t\t\tslices,\n\t\t\tversionControlSystem,\n\t\t] = await Promise.all([\n\t\t\tsafelyExecute(() => this._sliceMachineManager.project.getAdapterName()),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.versions.getRunningAdapterVersion(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.customTypes.readAllCustomTypes(),\n\t\t\t),\n\t\t\tsafelyExecute(() => this._sliceMachineManager.git.detectGitProvider()),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.versions.checkIsAdapterUpdateAvailable(),\n\t\t\t),\n\t\t\tsafelyExecute(() => this._sliceMachineManager.user.checkIsLoggedIn()),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.versions.checkIsSliceMachineUpdateAvailable(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.project.checkIsTypeScript(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.project.detectPackageManager(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.simulator.getLocalSliceSimulatorURL(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.versions.getRunningSliceMachineVersion(),\n\t\t\t),\n\t\t\tsafelyExecute(() => this._sliceMachineManager.slices.readAllSlices()),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.project.detectVersionControlSystem(),\n\t\t\t),\n\t\t]);\n\n\t\tthis._sliceMachineManager.telemetry.track({\n\t\t\tevent: \"slice-machine:start\",\n\t\t\t_includeEnvironmentKind: true,\n\t\t\tadapter,\n\t\t\tadapterVersion,\n\t\t\tgitProvider,\n\t\t\tisAdapterUpdateAvailable,\n\t\t\tisLoggedIn,\n\t\t\tisSliceMachineUpdateAvailable,\n\t\t\tisTypeScriptProject,\n\t\t\tnodeVersion: process.versions.node,\n\t\t\tnumberOfCustomTypes: customTypes?.models.length,\n\t\t\tnumberOfSlices: slices?.models.length,\n\t\t\tosPlatform: os.platform(),\n\t\t\t// Ensure we escape the \"@\" character to prevent it from being interpreted\n\t\t\t// as an email address and being considered sensitive and stripped off.\n\t\t\tpackageManager: packageManager?.replace(\"@\", \"[at]\"),\n\t\t\tprojectPort: simulatorUrl ? new URL(simulatorUrl).port : undefined,\n\t\t\tsliceMachineVersion,\n\t\t\tversionControlSystem,\n\t\t});\n\t}\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"StartSliceMachineProcess.js","sources":["../../src/StartSliceMachineProcess.ts"],"sourcesContent":["/* eslint-disable no-console */\n\nimport type { AddressInfo } from \"node:net\";\nimport chalk from \"chalk\";\nimport open from \"open\";\nimport os from \"node:os\";\n\nimport {\n\tPrismicUserProfile,\n\tSliceMachineManager,\n\tcreateSliceMachineManager,\n} from \"@slicemachine/manager\";\n\nimport { createSliceMachineExpressApp } from \"./lib/createSliceMachineExpressApp\";\nimport { setupSentry } from \"./lib/setupSentry\";\nimport { migrateSMJSON } from \"./legacyMigrations/migrateSMJSON\";\nimport { migrateAssets } from \"./legacyMigrations/migrateAssets\";\nimport { SLICE_MACHINE_NPM_PACKAGE_NAME } from \"./constants\";\nimport { safelyExecute } from \"./lib/safelyExecute\";\n\nconst DEFAULT_SERVER_PORT = 9999;\n\ntype CreateStartSliceMachineProcessArgs = ConstructorParameters<\n\ttypeof StartSliceMachineProcess\n>;\n\nexport const createStartSliceMachineProcess = (\n\t...args: CreateStartSliceMachineProcessArgs\n): StartSliceMachineProcess => {\n\treturn new StartSliceMachineProcess(...args);\n};\n\nexport type StartSliceMachineProcessConstructorArgs = {\n\topen: boolean;\n\tport?: number;\n};\n\n/**\n * Manages the process that runs Slice Machine's server.\n */\nexport class StartSliceMachineProcess {\n\t/**\n\t * Determines if Slice Machine should automatically be opened once the server\n\t * starts.\n\t *\n\t * @defaultValue `false`\n\t */\n\topen: boolean;\n\n\t/**\n\t * The port on which to start the Slice Machine server.\n\t *\n\t * @defaultValue `9999`\n\t */\n\tport: number;\n\n\t/**\n\t * The Slice Machine manager used for the process.\n\t */\n\tprivate _sliceMachineManager: SliceMachineManager;\n\n\tconstructor(args: StartSliceMachineProcessConstructorArgs) {\n\t\tthis._sliceMachineManager = createSliceMachineManager();\n\n\t\tthis.open = args.open ?? false;\n\t\tthis.port = args.port ?? DEFAULT_SERVER_PORT;\n\t}\n\n\t/**\n\t * Runs the process.\n\t */\n\tasync run(): Promise<void> {\n\t\t// This migration needs to run before the plugins are initialised\n\t\t// Nothing can start without the config file\n\t\tawait migrateSMJSON(this._sliceMachineManager);\n\n\t\t// Initialize Segment and Sentry\n\t\tconst appVersion =\n\t\t\tawait this._sliceMachineManager.versions.getRunningSliceMachineVersion();\n\t\tawait this._sliceMachineManager.telemetry.initTelemetry({\n\t\t\tappName: SLICE_MACHINE_NPM_PACKAGE_NAME,\n\t\t\tappVersion,\n\t\t});\n\t\tconst isTelemetryEnabled =\n\t\t\tawait this._sliceMachineManager.telemetry.checkIsTelemetryEnabled();\n\t\tif (isTelemetryEnabled) {\n\t\t\ttry {\n\t\t\t\tawait setupSentry(this._sliceMachineManager);\n\t\t\t} catch (error) {\n\t\t\t\t// noop - We don't want to stop the user from using Slice Machine\n\t\t\t\t// because of failed tracking set up. We probably couldn't determine the\n\t\t\t\t// Sentry environment.\n\n\t\t\t\tif (import.meta.env.DEV) {\n\t\t\t\t\tconsole.error(\"Error setting up Sentry:\", error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tawait this._sliceMachineManager.plugins.initPlugins();\n\n\t\t// TODO: MIGRATION - Move this to the Migration Manager\n\t\tawait migrateAssets(this._sliceMachineManager);\n\n\t\tawait this._validateProject();\n\n\t\tif (isTelemetryEnabled) {\n\t\t\ttry {\n\t\t\t\tthis._trackStart();\n\t\t\t} catch (error) {\n\t\t\t\t// noop - We don't want to stop the user from using Slice Machine\n\t\t\t\t// because of failed start event tracking.\n\n\t\t\t\tif (import.meta.env.DEV) {\n\t\t\t\t\tconsole.error(\"Error tracking start event:\", error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst app = await createSliceMachineExpressApp({\n\t\t\tsliceMachineManager: this._sliceMachineManager,\n\t\t});\n\n\t\tconst server = app.listen(this.port);\n\t\tserver.on(\"error\", (error: NodeJS.ErrnoException) => {\n\t\t\tif (error.code === \"EADDRINUSE\") {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error starting Slice Machine: Port ${this.port} is already in use. Please try a different port.`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconsole.error(\"Error starting Slice Machine:\", error);\n\t\t\t}\n\t\t\tprocess.exit(1);\n\t\t});\n\n\t\tconst address = server.address() as AddressInfo;\n\t\tconst url = `http://localhost:${address.port}`;\n\n\t\tif (this.open) {\n\t\t\tawait open(url);\n\t\t}\n\n\t\tconsole.log();\n\t\tconsole.log(\n\t\t\tawait this._buildSliceMachineRunningLine(\n\t\t\t\t`Running at ${chalk.magenta(url)}`,\n\t\t\t),\n\t\t);\n\t\tconsole.log();\n\n\t\tconst profile = await this._fetchProfile();\n\n\t\tif (profile) {\n\t\t\tthis._sliceMachineManager.telemetry.identify({\n\t\t\t\tuserID: profile.shortId,\n\t\t\t\tintercomHash: profile.intercomHash,\n\t\t\t});\n\n\t\t\tawait Promise.allSettled([\n\t\t\t\t// noop - We'll try again when needed.\n\t\t\t\tthis._sliceMachineManager.user.refreshAuthenticationToken(),\n\t\t\t\t// noop - We'll try again before uploading a screenshot.\n\t\t\t\tthis._sliceMachineManager.screenshots.initS3ACL(),\n\t\t\t]);\n\t\t}\n\t}\n\n\t/**\n\t * Returns a string with Slice Machine info formatted for the console.\n\t *\n\t * @param value - Info to display.\n\t *\n\t * @returns String to pass to the console.\n\t */\n\tprivate async _buildSliceMachineRunningLine(value: string): Promise<string> {\n\t\tconst currentVersion =\n\t\t\tawait this._sliceMachineManager.versions.getRunningSliceMachineVersion();\n\n\t\treturn `${chalk.bgBlack(\n\t\t\t` ${chalk.bold.white(\"Slice Machine\")} ${chalk.magenta(\n\t\t\t\t`v${currentVersion}`,\n\t\t\t)} `,\n\t\t)} ${chalk.dim(\"→\")} ${value}`;\n\t}\n\n\t/**\n\t * Validates the project's config and content models.\n\t *\n\t * @throws Throws if a Library name is invalid.\n\t * @throws Throws if a Slice model is invalid.\n\t * @throws Throws if a Custom Type model is invalid.\n\t */\n\tprivate async _validateProject(): Promise<void> {\n\t\t// Validate Slice Machine config.\n\t\tconst config =\n\t\t\tawait this._sliceMachineManager.project.loadSliceMachineConfig();\n\n\t\t// Validate Library IDs\n\t\tconst invalidLibraries =\n\t\t\tconfig.libraries?.filter(\n\t\t\t\t(library) => library.startsWith(\"@\") || library.startsWith(\"~\"),\n\t\t\t) || [];\n\t\tif (invalidLibraries.length > 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`The following Slice libraries have invalid names: ${invalidLibraries.join(\n\t\t\t\t\t\", \",\n\t\t\t\t)}. Slice library names must not start with \"@\" nor \"~\".`,\n\t\t\t);\n\t\t}\n\n\t\t// Validate Slice models.\n\t\tconst allSlices = await this._sliceMachineManager.slices.readAllSlices();\n\t\tif (allSlices.errors.length > 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`Errors occurred while validating your project's slices.\\n\\n${allSlices.errors.join(\n\t\t\t\t\t\"\\n\\n\",\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\n\t\t// Validate Custom Type models.\n\t\tconst allCustomTypes =\n\t\t\tawait this._sliceMachineManager.customTypes.readAllCustomTypes();\n\t\tif (allCustomTypes.errors.length > 0) {\n\t\t\t// TODO: Provide better error message.\n\t\t\tthrow new Error(allCustomTypes.errors.join(\", \"));\n\t\t}\n\t}\n\n\t/**\n\t * Fetches the logged in Prismic user's profile. If the user is not logged in,\n\t * `undefined` is returned.\n\t *\n\t * @returns The logged in Prismic user's profile, or `undefined` if not logged\n\t * in.\n\t */\n\tprivate async _fetchProfile(): Promise<PrismicUserProfile | undefined> {\n\t\tconst isLoggedIn = await this._sliceMachineManager.user.checkIsLoggedIn();\n\n\t\tif (isLoggedIn) {\n\t\t\treturn await this._sliceMachineManager.user.getProfile();\n\t\t}\n\t}\n\n\t/**\n\t * Tracks the start of Slice Machine.\n\t *\n\t * This method is called after Slice Machine has started and so it will not\n\t * cause the process to wait for the tracking to complete.\n\t */\n\tprivate async _trackStart(): Promise<void> {\n\t\tconst [\n\t\t\tadapter,\n\t\t\tadapterVersion,\n\t\t\tcustomTypes,\n\t\t\tisAdapterUpdateAvailable,\n\t\t\tisLoggedIn,\n\t\t\tisSliceMachineUpdateAvailable,\n\t\t\tisTypeScriptProject,\n\t\t\tpackageManager,\n\t\t\tsimulatorUrl,\n\t\t\tsliceMachineVersion,\n\t\t\tslices,\n\t\t\tversionControlSystem,\n\t\t] = await Promise.all([\n\t\t\tsafelyExecute(() => this._sliceMachineManager.project.getAdapterName()),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.versions.getRunningAdapterVersion(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.customTypes.readAllCustomTypes(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.versions.checkIsAdapterUpdateAvailable(),\n\t\t\t),\n\t\t\tsafelyExecute(() => this._sliceMachineManager.user.checkIsLoggedIn()),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.versions.checkIsSliceMachineUpdateAvailable(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.project.checkIsTypeScript(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.project.detectPackageManager(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.simulator.getLocalSliceSimulatorURL(),\n\t\t\t),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.versions.getRunningSliceMachineVersion(),\n\t\t\t),\n\t\t\tsafelyExecute(() => this._sliceMachineManager.slices.readAllSlices()),\n\t\t\tsafelyExecute(() =>\n\t\t\t\tthis._sliceMachineManager.project.detectVersionControlSystem(),\n\t\t\t),\n\t\t]);\n\n\t\tthis._sliceMachineManager.telemetry.track({\n\t\t\tevent: \"slice-machine:start\",\n\t\t\t_includeEnvironmentKind: true,\n\t\t\tadapter,\n\t\t\tadapterVersion,\n\t\t\tisAdapterUpdateAvailable,\n\t\t\tisLoggedIn,\n\t\t\tisSliceMachineUpdateAvailable,\n\t\t\tisTypeScriptProject,\n\t\t\tnodeVersion: process.versions.node,\n\t\t\tnumberOfCustomTypes: customTypes?.models.length,\n\t\t\tnumberOfSlices: slices?.models.length,\n\t\t\tosPlatform: os.platform(),\n\t\t\t// Ensure we escape the \"@\" character to prevent it from being interpreted\n\t\t\t// as an email address and being considered sensitive and stripped off.\n\t\t\tpackageManager: packageManager?.replace(\"@\", \"[at]\"),\n\t\t\tprojectPort: simulatorUrl ? new URL(simulatorUrl).port : undefined,\n\t\t\tsliceMachineVersion,\n\t\t\tversionControlSystem,\n\t\t});\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -64,9 +64,6 @@ const createSliceMachineExpressApp = async (args) => {
64
64
  app.get("/labs", (_req, res) => {
65
65
  res.sendFile(path__namespace.join(sliceMachineOutDir, "labs.html"));
66
66
  });
67
- app.get("/settings", (_req, res) => {
68
- res.sendFile(path__namespace.join(sliceMachineOutDir, "settings.html"));
69
- });
70
67
  app.get("/slices", (_req, res) => {
71
68
  res.sendFile(path__namespace.join(sliceMachineOutDir, "slices.html"));
72
69
  });
@@ -1 +1 @@
1
- {"version":3,"file":"createSliceMachineExpressApp.cjs","sources":["../../../src/lib/createSliceMachineExpressApp.ts"],"sourcesContent":["import * as path from \"node:path\";\n\nimport * as Sentry from \"@sentry/node\";\nimport express, { Express } from \"express\";\nimport bodyParser from \"body-parser\";\nimport { createProxyMiddleware } from \"http-proxy-middleware\";\nimport serveStatic from \"serve-static\";\nimport cors from \"cors\";\n\nimport {\n\tSliceMachineManager,\n\tcreatePrismicAuthManagerMiddleware,\n\tcreateSliceMachineManagerMiddleware,\n} from \"@slicemachine/manager\";\n\nimport * as sentryErrorHandlers from \"./sentryErrorHandlers\";\nimport { sentryFrontendTunnel } from \"./sentryFrontendTunnel\";\nimport { checkIsSentryEnabled } from \"./checkIsSentryEnabled\";\n\ntype CreateSliceMachineExpressAppArgs = {\n\tsliceMachineManager: SliceMachineManager;\n};\n\n/**\n * Creates an Express app to handle the following:\n *\n * - Serve the Slice Machine app.\n * - Expose a given Slice Machine manager to non-Node.js environments, like the\n * browser.\n *\n * The Slice Machine app is served from the project's Slice Machine module\n * installation.\n *\n * If `NODE_ENV` is `development`, the Slice Machine app is served via a proxy\n * to Next.js's development server. Slice Machine must be running on port 3000.\n *\n * @param args - Configuration for the server.\n *\n * @returns A standard Express app.\n */\nexport const createSliceMachineExpressApp = async (\n\targs: CreateSliceMachineExpressAppArgs,\n): Promise<Express> => {\n\tconst isTelemetryEnabled =\n\t\tawait args.sliceMachineManager.telemetry.checkIsTelemetryEnabled();\n\n\tconst app = express();\n\n\tapp.use(cors());\n\n\tapp.use(\n\t\t\"/_manager\",\n\t\tcreateSliceMachineManagerMiddleware({\n\t\t\tsliceMachineManager: args.sliceMachineManager,\n\t\t\tonError: isTelemetryEnabled ? sentryErrorHandlers.rpc : undefined,\n\t\t}),\n\t);\n\n\tapp.use(\n\t\t\"/api/auth\",\n\t\tcreatePrismicAuthManagerMiddleware({\n\t\t\tprismicAuthManager: args.sliceMachineManager.getPrismicAuthManager(),\n\t\t\tonLoginCallback: async () => {\n\t\t\t\tconst profile = await args.sliceMachineManager.user.getProfile();\n\t\t\t\tawait args.sliceMachineManager.telemetry.identify({\n\t\t\t\t\tuserID: profile.shortId,\n\t\t\t\t\tintercomHash: profile.intercomHash,\n\t\t\t\t});\n\t\t\t\tif (checkIsSentryEnabled()) {\n\t\t\t\t\tSentry.setUser({ id: profile.shortId });\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait args.sliceMachineManager.screenshots.initS3ACL();\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// noop - We'll try again before uploading a screenshot.\n\t\t\t\t}\n\t\t\t},\n\t\t}),\n\t);\n\n\tapp.use(\"/api/t\", bodyParser.text({ type: \"*/*\" }), sentryFrontendTunnel);\n\n\tif (import.meta.env.DEV) {\n\t\tapp.use(\n\t\t\t\"/\",\n\t\t\tcreateProxyMiddleware({\n\t\t\t\ttarget: \"http://localhost:3000\",\n\t\t\t\tchangeOrigin: true,\n\t\t\t\tws: true,\n\t\t\t}),\n\t\t);\n\t} else {\n\t\tconst sliceMachineDir =\n\t\t\tawait args.sliceMachineManager.project.locateSliceMachineUIDir();\n\t\tconst sliceMachineOutDir = path.resolve(sliceMachineDir, \"out\");\n\n\t\tapp.use(serveStatic(sliceMachineOutDir));\n\n\t\tapp.get(\"/changelog\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"changelog.html\"));\n\t\t});\n\n\t\tapp.get(\"/labs\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"labs.html\"));\n\t\t});\n\n\t\tapp.get(\"/settings\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"settings.html\"));\n\t\t});\n\n\t\tapp.get(\"/slices\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"slices.html\"));\n\t\t});\n\n\t\tapp.get(\"/changes\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"changes.html\"));\n\t\t});\n\n\t\tapp.get(\"/page-types/:id\", (_req, res) => {\n\t\t\tres.sendFile(\n\t\t\t\tpath.join(sliceMachineOutDir, \"page-types/[pageTypeId].html\"),\n\t\t\t);\n\t\t});\n\n\t\tapp.get(\"/custom-types\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"custom-types.html\"));\n\t\t});\n\n\t\tapp.get(\"/custom-types/:id\", (_req, res) => {\n\t\t\tres.sendFile(\n\t\t\t\tpath.join(sliceMachineOutDir, \"custom-types/[customTypeId].html\"),\n\t\t\t);\n\t\t});\n\n\t\tapp.get(\"/slices/:lib/:sliceID/:variation\", (_req, res) => {\n\t\t\tres.sendFile(\n\t\t\t\tpath.join(\n\t\t\t\t\tsliceMachineOutDir,\n\t\t\t\t\t\"slices/[lib]/[sliceName]/[variation].html\",\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\n\t\tapp.get(\"/slices/:lib/:sliceID/:variation/simulator\", (_req, res) => {\n\t\t\tres.sendFile(\n\t\t\t\tpath.join(\n\t\t\t\t\tsliceMachineOutDir,\n\t\t\t\t\t\"slices/[lib]/[sliceName]/[variation]/simulator.html\",\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\t}\n\n\tif (isTelemetryEnabled) {\n\t\tapp.use(sentryErrorHandlers.server);\n\t}\n\n\treturn app;\n};\n"],"names":["createSliceMachineManagerMiddleware","sentryErrorHandlers.rpc","createPrismicAuthManagerMiddleware","checkIsSentryEnabled","Sentry.setUser","sentryFrontendTunnel","path","sentryErrorHandlers.server"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCa,MAAA,+BAA+B,OAC3C,SACqB;AACrB,QAAM,qBACL,MAAM,KAAK,oBAAoB,UAAU,wBAAuB;AAEjE,QAAM,MAAM;AAER,MAAA,IAAI,MAAM;AAEV,MAAA,IACH,aACAA,4CAAoC;AAAA,IACnC,qBAAqB,KAAK;AAAA,IAC1B,SAAS,qBAAqBC,oBAA0B,MAAA;AAAA,EACxD,CAAA,CAAC;AAGC,MAAA,IACH,aACAC,2CAAmC;AAAA,IAClC,oBAAoB,KAAK,oBAAoB,sBAAuB;AAAA,IACpE,iBAAiB,YAAW;AAC3B,YAAM,UAAU,MAAM,KAAK,oBAAoB,KAAK,WAAU;AACxD,YAAA,KAAK,oBAAoB,UAAU,SAAS;AAAA,QACjD,QAAQ,QAAQ;AAAA,QAChB,cAAc,QAAQ;AAAA,MAAA,CACtB;AACD,UAAIC,6CAAwB;AAC3BC,kBAAAA,QAAe,EAAE,IAAI,QAAQ,QAAS,CAAA;AAAA,MACvC;AAEI,UAAA;AACG,cAAA,KAAK,oBAAoB,YAAY;eACnC,OAAO;AAAA,MAEhB;AAAA,IACD;AAAA,EACA,CAAA,CAAC;AAGC,MAAA,IAAI,UAAU,WAAW,KAAK,EAAE,MAAM,MAAA,CAAO,GAAGC,qBAAAA,oBAAoB;AAWjE;AACN,UAAM,kBACL,MAAM,KAAK,oBAAoB,QAAQ,wBAAuB;AAC/D,UAAM,qBAAqBC,gBAAK,QAAQ,iBAAiB,KAAK;AAE1D,QAAA,IAAI,YAAY,kBAAkB,CAAC;AAEvC,QAAI,IAAI,cAAc,CAAC,MAAM,QAAO;AACnC,UAAI,SAASA,gBAAK,KAAK,oBAAoB,gBAAgB,CAAC;AAAA,IAAA,CAC5D;AAED,QAAI,IAAI,SAAS,CAAC,MAAM,QAAO;AAC9B,UAAI,SAASA,gBAAK,KAAK,oBAAoB,WAAW,CAAC;AAAA,IAAA,CACvD;AAED,QAAI,IAAI,aAAa,CAAC,MAAM,QAAO;AAClC,UAAI,SAASA,gBAAK,KAAK,oBAAoB,eAAe,CAAC;AAAA,IAAA,CAC3D;AAED,QAAI,IAAI,WAAW,CAAC,MAAM,QAAO;AAChC,UAAI,SAASA,gBAAK,KAAK,oBAAoB,aAAa,CAAC;AAAA,IAAA,CACzD;AAED,QAAI,IAAI,YAAY,CAAC,MAAM,QAAO;AACjC,UAAI,SAASA,gBAAK,KAAK,oBAAoB,cAAc,CAAC;AAAA,IAAA,CAC1D;AAED,QAAI,IAAI,mBAAmB,CAAC,MAAM,QAAO;AACxC,UAAI,SACHA,gBAAK,KAAK,oBAAoB,8BAA8B,CAAC;AAAA,IAAA,CAE9D;AAED,QAAI,IAAI,iBAAiB,CAAC,MAAM,QAAO;AACtC,UAAI,SAASA,gBAAK,KAAK,oBAAoB,mBAAmB,CAAC;AAAA,IAAA,CAC/D;AAED,QAAI,IAAI,qBAAqB,CAAC,MAAM,QAAO;AAC1C,UAAI,SACHA,gBAAK,KAAK,oBAAoB,kCAAkC,CAAC;AAAA,IAAA,CAElE;AAED,QAAI,IAAI,oCAAoC,CAAC,MAAM,QAAO;AACzD,UAAI,SACHA,gBAAK,KACJ,oBACA,2CAA2C,CAC3C;AAAA,IAAA,CAEF;AAED,QAAI,IAAI,8CAA8C,CAAC,MAAM,QAAO;AACnE,UAAI,SACHA,gBAAK,KACJ,oBACA,qDAAqD,CACrD;AAAA,IAAA,CAEF;AAAA,EACF;AAEA,MAAI,oBAAoB;AACnB,QAAA,IAAIC,oBAAAA,MAA0B;AAAA,EACnC;AAEO,SAAA;AACR;;"}
1
+ {"version":3,"file":"createSliceMachineExpressApp.cjs","sources":["../../../src/lib/createSliceMachineExpressApp.ts"],"sourcesContent":["import * as path from \"node:path\";\n\nimport * as Sentry from \"@sentry/node\";\nimport express, { Express } from \"express\";\nimport bodyParser from \"body-parser\";\nimport { createProxyMiddleware } from \"http-proxy-middleware\";\nimport serveStatic from \"serve-static\";\nimport cors from \"cors\";\n\nimport {\n\tSliceMachineManager,\n\tcreatePrismicAuthManagerMiddleware,\n\tcreateSliceMachineManagerMiddleware,\n} from \"@slicemachine/manager\";\n\nimport * as sentryErrorHandlers from \"./sentryErrorHandlers\";\nimport { sentryFrontendTunnel } from \"./sentryFrontendTunnel\";\nimport { checkIsSentryEnabled } from \"./checkIsSentryEnabled\";\n\ntype CreateSliceMachineExpressAppArgs = {\n\tsliceMachineManager: SliceMachineManager;\n};\n\n/**\n * Creates an Express app to handle the following:\n *\n * - Serve the Slice Machine app.\n * - Expose a given Slice Machine manager to non-Node.js environments, like the\n * browser.\n *\n * The Slice Machine app is served from the project's Slice Machine module\n * installation.\n *\n * If `NODE_ENV` is `development`, the Slice Machine app is served via a proxy\n * to Next.js's development server. Slice Machine must be running on port 3000.\n *\n * @param args - Configuration for the server.\n *\n * @returns A standard Express app.\n */\nexport const createSliceMachineExpressApp = async (\n\targs: CreateSliceMachineExpressAppArgs,\n): Promise<Express> => {\n\tconst isTelemetryEnabled =\n\t\tawait args.sliceMachineManager.telemetry.checkIsTelemetryEnabled();\n\n\tconst app = express();\n\n\tapp.use(cors());\n\n\tapp.use(\n\t\t\"/_manager\",\n\t\tcreateSliceMachineManagerMiddleware({\n\t\t\tsliceMachineManager: args.sliceMachineManager,\n\t\t\tonError: isTelemetryEnabled ? sentryErrorHandlers.rpc : undefined,\n\t\t}),\n\t);\n\n\tapp.use(\n\t\t\"/api/auth\",\n\t\tcreatePrismicAuthManagerMiddleware({\n\t\t\tprismicAuthManager: args.sliceMachineManager.getPrismicAuthManager(),\n\t\t\tonLoginCallback: async () => {\n\t\t\t\tconst profile = await args.sliceMachineManager.user.getProfile();\n\t\t\t\tawait args.sliceMachineManager.telemetry.identify({\n\t\t\t\t\tuserID: profile.shortId,\n\t\t\t\t\tintercomHash: profile.intercomHash,\n\t\t\t\t});\n\t\t\t\tif (checkIsSentryEnabled()) {\n\t\t\t\t\tSentry.setUser({ id: profile.shortId });\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait args.sliceMachineManager.screenshots.initS3ACL();\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// noop - We'll try again before uploading a screenshot.\n\t\t\t\t}\n\t\t\t},\n\t\t}),\n\t);\n\n\tapp.use(\"/api/t\", bodyParser.text({ type: \"*/*\" }), sentryFrontendTunnel);\n\n\tif (import.meta.env.DEV) {\n\t\tapp.use(\n\t\t\t\"/\",\n\t\t\tcreateProxyMiddleware({\n\t\t\t\ttarget: \"http://localhost:3000\",\n\t\t\t\tchangeOrigin: true,\n\t\t\t\tws: true,\n\t\t\t}),\n\t\t);\n\t} else {\n\t\tconst sliceMachineDir =\n\t\t\tawait args.sliceMachineManager.project.locateSliceMachineUIDir();\n\t\tconst sliceMachineOutDir = path.resolve(sliceMachineDir, \"out\");\n\n\t\tapp.use(serveStatic(sliceMachineOutDir));\n\n\t\tapp.get(\"/changelog\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"changelog.html\"));\n\t\t});\n\n\t\tapp.get(\"/labs\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"labs.html\"));\n\t\t});\n\n\t\tapp.get(\"/slices\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"slices.html\"));\n\t\t});\n\n\t\tapp.get(\"/changes\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"changes.html\"));\n\t\t});\n\n\t\tapp.get(\"/page-types/:id\", (_req, res) => {\n\t\t\tres.sendFile(\n\t\t\t\tpath.join(sliceMachineOutDir, \"page-types/[pageTypeId].html\"),\n\t\t\t);\n\t\t});\n\n\t\tapp.get(\"/custom-types\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"custom-types.html\"));\n\t\t});\n\n\t\tapp.get(\"/custom-types/:id\", (_req, res) => {\n\t\t\tres.sendFile(\n\t\t\t\tpath.join(sliceMachineOutDir, \"custom-types/[customTypeId].html\"),\n\t\t\t);\n\t\t});\n\n\t\tapp.get(\"/slices/:lib/:sliceID/:variation\", (_req, res) => {\n\t\t\tres.sendFile(\n\t\t\t\tpath.join(\n\t\t\t\t\tsliceMachineOutDir,\n\t\t\t\t\t\"slices/[lib]/[sliceName]/[variation].html\",\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\n\t\tapp.get(\"/slices/:lib/:sliceID/:variation/simulator\", (_req, res) => {\n\t\t\tres.sendFile(\n\t\t\t\tpath.join(\n\t\t\t\t\tsliceMachineOutDir,\n\t\t\t\t\t\"slices/[lib]/[sliceName]/[variation]/simulator.html\",\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\t}\n\n\tif (isTelemetryEnabled) {\n\t\tapp.use(sentryErrorHandlers.server);\n\t}\n\n\treturn app;\n};\n"],"names":["createSliceMachineManagerMiddleware","sentryErrorHandlers.rpc","createPrismicAuthManagerMiddleware","checkIsSentryEnabled","Sentry.setUser","sentryFrontendTunnel","path","sentryErrorHandlers.server"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCa,MAAA,+BAA+B,OAC3C,SACqB;AACrB,QAAM,qBACL,MAAM,KAAK,oBAAoB,UAAU,wBAAuB;AAEjE,QAAM,MAAM;AAER,MAAA,IAAI,MAAM;AAEV,MAAA,IACH,aACAA,4CAAoC;AAAA,IACnC,qBAAqB,KAAK;AAAA,IAC1B,SAAS,qBAAqBC,oBAA0B,MAAA;AAAA,EACxD,CAAA,CAAC;AAGC,MAAA,IACH,aACAC,2CAAmC;AAAA,IAClC,oBAAoB,KAAK,oBAAoB,sBAAuB;AAAA,IACpE,iBAAiB,YAAW;AAC3B,YAAM,UAAU,MAAM,KAAK,oBAAoB,KAAK,WAAU;AACxD,YAAA,KAAK,oBAAoB,UAAU,SAAS;AAAA,QACjD,QAAQ,QAAQ;AAAA,QAChB,cAAc,QAAQ;AAAA,MAAA,CACtB;AACD,UAAIC,6CAAwB;AAC3BC,kBAAAA,QAAe,EAAE,IAAI,QAAQ,QAAS,CAAA;AAAA,MACvC;AAEI,UAAA;AACG,cAAA,KAAK,oBAAoB,YAAY;eACnC,OAAO;AAAA,MAEhB;AAAA,IACD;AAAA,EACA,CAAA,CAAC;AAGC,MAAA,IAAI,UAAU,WAAW,KAAK,EAAE,MAAM,MAAA,CAAO,GAAGC,qBAAAA,oBAAoB;AAWjE;AACN,UAAM,kBACL,MAAM,KAAK,oBAAoB,QAAQ,wBAAuB;AAC/D,UAAM,qBAAqBC,gBAAK,QAAQ,iBAAiB,KAAK;AAE1D,QAAA,IAAI,YAAY,kBAAkB,CAAC;AAEvC,QAAI,IAAI,cAAc,CAAC,MAAM,QAAO;AACnC,UAAI,SAASA,gBAAK,KAAK,oBAAoB,gBAAgB,CAAC;AAAA,IAAA,CAC5D;AAED,QAAI,IAAI,SAAS,CAAC,MAAM,QAAO;AAC9B,UAAI,SAASA,gBAAK,KAAK,oBAAoB,WAAW,CAAC;AAAA,IAAA,CACvD;AAED,QAAI,IAAI,WAAW,CAAC,MAAM,QAAO;AAChC,UAAI,SAASA,gBAAK,KAAK,oBAAoB,aAAa,CAAC;AAAA,IAAA,CACzD;AAED,QAAI,IAAI,YAAY,CAAC,MAAM,QAAO;AACjC,UAAI,SAASA,gBAAK,KAAK,oBAAoB,cAAc,CAAC;AAAA,IAAA,CAC1D;AAED,QAAI,IAAI,mBAAmB,CAAC,MAAM,QAAO;AACxC,UAAI,SACHA,gBAAK,KAAK,oBAAoB,8BAA8B,CAAC;AAAA,IAAA,CAE9D;AAED,QAAI,IAAI,iBAAiB,CAAC,MAAM,QAAO;AACtC,UAAI,SAASA,gBAAK,KAAK,oBAAoB,mBAAmB,CAAC;AAAA,IAAA,CAC/D;AAED,QAAI,IAAI,qBAAqB,CAAC,MAAM,QAAO;AAC1C,UAAI,SACHA,gBAAK,KAAK,oBAAoB,kCAAkC,CAAC;AAAA,IAAA,CAElE;AAED,QAAI,IAAI,oCAAoC,CAAC,MAAM,QAAO;AACzD,UAAI,SACHA,gBAAK,KACJ,oBACA,2CAA2C,CAC3C;AAAA,IAAA,CAEF;AAED,QAAI,IAAI,8CAA8C,CAAC,MAAM,QAAO;AACnE,UAAI,SACHA,gBAAK,KACJ,oBACA,qDAAqD,CACrD;AAAA,IAAA,CAEF;AAAA,EACF;AAEA,MAAI,oBAAoB;AACnB,QAAA,IAAIC,oBAAAA,MAA0B;AAAA,EACnC;AAEO,SAAA;AACR;;"}
@@ -45,9 +45,6 @@ const createSliceMachineExpressApp = async (args) => {
45
45
  app.get("/labs", (_req, res) => {
46
46
  res.sendFile(path.join(sliceMachineOutDir, "labs.html"));
47
47
  });
48
- app.get("/settings", (_req, res) => {
49
- res.sendFile(path.join(sliceMachineOutDir, "settings.html"));
50
- });
51
48
  app.get("/slices", (_req, res) => {
52
49
  res.sendFile(path.join(sliceMachineOutDir, "slices.html"));
53
50
  });
@@ -1 +1 @@
1
- {"version":3,"file":"createSliceMachineExpressApp.js","sources":["../../../src/lib/createSliceMachineExpressApp.ts"],"sourcesContent":["import * as path from \"node:path\";\n\nimport * as Sentry from \"@sentry/node\";\nimport express, { Express } from \"express\";\nimport bodyParser from \"body-parser\";\nimport { createProxyMiddleware } from \"http-proxy-middleware\";\nimport serveStatic from \"serve-static\";\nimport cors from \"cors\";\n\nimport {\n\tSliceMachineManager,\n\tcreatePrismicAuthManagerMiddleware,\n\tcreateSliceMachineManagerMiddleware,\n} from \"@slicemachine/manager\";\n\nimport * as sentryErrorHandlers from \"./sentryErrorHandlers\";\nimport { sentryFrontendTunnel } from \"./sentryFrontendTunnel\";\nimport { checkIsSentryEnabled } from \"./checkIsSentryEnabled\";\n\ntype CreateSliceMachineExpressAppArgs = {\n\tsliceMachineManager: SliceMachineManager;\n};\n\n/**\n * Creates an Express app to handle the following:\n *\n * - Serve the Slice Machine app.\n * - Expose a given Slice Machine manager to non-Node.js environments, like the\n * browser.\n *\n * The Slice Machine app is served from the project's Slice Machine module\n * installation.\n *\n * If `NODE_ENV` is `development`, the Slice Machine app is served via a proxy\n * to Next.js's development server. Slice Machine must be running on port 3000.\n *\n * @param args - Configuration for the server.\n *\n * @returns A standard Express app.\n */\nexport const createSliceMachineExpressApp = async (\n\targs: CreateSliceMachineExpressAppArgs,\n): Promise<Express> => {\n\tconst isTelemetryEnabled =\n\t\tawait args.sliceMachineManager.telemetry.checkIsTelemetryEnabled();\n\n\tconst app = express();\n\n\tapp.use(cors());\n\n\tapp.use(\n\t\t\"/_manager\",\n\t\tcreateSliceMachineManagerMiddleware({\n\t\t\tsliceMachineManager: args.sliceMachineManager,\n\t\t\tonError: isTelemetryEnabled ? sentryErrorHandlers.rpc : undefined,\n\t\t}),\n\t);\n\n\tapp.use(\n\t\t\"/api/auth\",\n\t\tcreatePrismicAuthManagerMiddleware({\n\t\t\tprismicAuthManager: args.sliceMachineManager.getPrismicAuthManager(),\n\t\t\tonLoginCallback: async () => {\n\t\t\t\tconst profile = await args.sliceMachineManager.user.getProfile();\n\t\t\t\tawait args.sliceMachineManager.telemetry.identify({\n\t\t\t\t\tuserID: profile.shortId,\n\t\t\t\t\tintercomHash: profile.intercomHash,\n\t\t\t\t});\n\t\t\t\tif (checkIsSentryEnabled()) {\n\t\t\t\t\tSentry.setUser({ id: profile.shortId });\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait args.sliceMachineManager.screenshots.initS3ACL();\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// noop - We'll try again before uploading a screenshot.\n\t\t\t\t}\n\t\t\t},\n\t\t}),\n\t);\n\n\tapp.use(\"/api/t\", bodyParser.text({ type: \"*/*\" }), sentryFrontendTunnel);\n\n\tif (import.meta.env.DEV) {\n\t\tapp.use(\n\t\t\t\"/\",\n\t\t\tcreateProxyMiddleware({\n\t\t\t\ttarget: \"http://localhost:3000\",\n\t\t\t\tchangeOrigin: true,\n\t\t\t\tws: true,\n\t\t\t}),\n\t\t);\n\t} else {\n\t\tconst sliceMachineDir =\n\t\t\tawait args.sliceMachineManager.project.locateSliceMachineUIDir();\n\t\tconst sliceMachineOutDir = path.resolve(sliceMachineDir, \"out\");\n\n\t\tapp.use(serveStatic(sliceMachineOutDir));\n\n\t\tapp.get(\"/changelog\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"changelog.html\"));\n\t\t});\n\n\t\tapp.get(\"/labs\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"labs.html\"));\n\t\t});\n\n\t\tapp.get(\"/settings\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"settings.html\"));\n\t\t});\n\n\t\tapp.get(\"/slices\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"slices.html\"));\n\t\t});\n\n\t\tapp.get(\"/changes\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"changes.html\"));\n\t\t});\n\n\t\tapp.get(\"/page-types/:id\", (_req, res) => {\n\t\t\tres.sendFile(\n\t\t\t\tpath.join(sliceMachineOutDir, \"page-types/[pageTypeId].html\"),\n\t\t\t);\n\t\t});\n\n\t\tapp.get(\"/custom-types\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"custom-types.html\"));\n\t\t});\n\n\t\tapp.get(\"/custom-types/:id\", (_req, res) => {\n\t\t\tres.sendFile(\n\t\t\t\tpath.join(sliceMachineOutDir, \"custom-types/[customTypeId].html\"),\n\t\t\t);\n\t\t});\n\n\t\tapp.get(\"/slices/:lib/:sliceID/:variation\", (_req, res) => {\n\t\t\tres.sendFile(\n\t\t\t\tpath.join(\n\t\t\t\t\tsliceMachineOutDir,\n\t\t\t\t\t\"slices/[lib]/[sliceName]/[variation].html\",\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\n\t\tapp.get(\"/slices/:lib/:sliceID/:variation/simulator\", (_req, res) => {\n\t\t\tres.sendFile(\n\t\t\t\tpath.join(\n\t\t\t\t\tsliceMachineOutDir,\n\t\t\t\t\t\"slices/[lib]/[sliceName]/[variation]/simulator.html\",\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\t}\n\n\tif (isTelemetryEnabled) {\n\t\tapp.use(sentryErrorHandlers.server);\n\t}\n\n\treturn app;\n};\n"],"names":["sentryErrorHandlers.rpc","Sentry.setUser","sentryErrorHandlers.server"],"mappings":";;;;;;;;;;;AAwCa,MAAA,+BAA+B,OAC3C,SACqB;AACrB,QAAM,qBACL,MAAM,KAAK,oBAAoB,UAAU,wBAAuB;AAEjE,QAAM,MAAM;AAER,MAAA,IAAI,MAAM;AAEV,MAAA,IACH,aACA,oCAAoC;AAAA,IACnC,qBAAqB,KAAK;AAAA,IAC1B,SAAS,qBAAqBA,MAA0B;AAAA,EACxD,CAAA,CAAC;AAGC,MAAA,IACH,aACA,mCAAmC;AAAA,IAClC,oBAAoB,KAAK,oBAAoB,sBAAuB;AAAA,IACpE,iBAAiB,YAAW;AAC3B,YAAM,UAAU,MAAM,KAAK,oBAAoB,KAAK,WAAU;AACxD,YAAA,KAAK,oBAAoB,UAAU,SAAS;AAAA,QACjD,QAAQ,QAAQ;AAAA,QAChB,cAAc,QAAQ;AAAA,MAAA,CACtB;AACD,UAAI,wBAAwB;AAC3BC,gBAAe,EAAE,IAAI,QAAQ,QAAS,CAAA;AAAA,MACvC;AAEI,UAAA;AACG,cAAA,KAAK,oBAAoB,YAAY;eACnC,OAAO;AAAA,MAEhB;AAAA,IACD;AAAA,EACA,CAAA,CAAC;AAGC,MAAA,IAAI,UAAU,WAAW,KAAK,EAAE,MAAM,MAAA,CAAO,GAAG,oBAAoB;AAWjE;AACN,UAAM,kBACL,MAAM,KAAK,oBAAoB,QAAQ,wBAAuB;AAC/D,UAAM,qBAAqB,KAAK,QAAQ,iBAAiB,KAAK;AAE1D,QAAA,IAAI,YAAY,kBAAkB,CAAC;AAEvC,QAAI,IAAI,cAAc,CAAC,MAAM,QAAO;AACnC,UAAI,SAAS,KAAK,KAAK,oBAAoB,gBAAgB,CAAC;AAAA,IAAA,CAC5D;AAED,QAAI,IAAI,SAAS,CAAC,MAAM,QAAO;AAC9B,UAAI,SAAS,KAAK,KAAK,oBAAoB,WAAW,CAAC;AAAA,IAAA,CACvD;AAED,QAAI,IAAI,aAAa,CAAC,MAAM,QAAO;AAClC,UAAI,SAAS,KAAK,KAAK,oBAAoB,eAAe,CAAC;AAAA,IAAA,CAC3D;AAED,QAAI,IAAI,WAAW,CAAC,MAAM,QAAO;AAChC,UAAI,SAAS,KAAK,KAAK,oBAAoB,aAAa,CAAC;AAAA,IAAA,CACzD;AAED,QAAI,IAAI,YAAY,CAAC,MAAM,QAAO;AACjC,UAAI,SAAS,KAAK,KAAK,oBAAoB,cAAc,CAAC;AAAA,IAAA,CAC1D;AAED,QAAI,IAAI,mBAAmB,CAAC,MAAM,QAAO;AACxC,UAAI,SACH,KAAK,KAAK,oBAAoB,8BAA8B,CAAC;AAAA,IAAA,CAE9D;AAED,QAAI,IAAI,iBAAiB,CAAC,MAAM,QAAO;AACtC,UAAI,SAAS,KAAK,KAAK,oBAAoB,mBAAmB,CAAC;AAAA,IAAA,CAC/D;AAED,QAAI,IAAI,qBAAqB,CAAC,MAAM,QAAO;AAC1C,UAAI,SACH,KAAK,KAAK,oBAAoB,kCAAkC,CAAC;AAAA,IAAA,CAElE;AAED,QAAI,IAAI,oCAAoC,CAAC,MAAM,QAAO;AACzD,UAAI,SACH,KAAK,KACJ,oBACA,2CAA2C,CAC3C;AAAA,IAAA,CAEF;AAED,QAAI,IAAI,8CAA8C,CAAC,MAAM,QAAO;AACnE,UAAI,SACH,KAAK,KACJ,oBACA,qDAAqD,CACrD;AAAA,IAAA,CAEF;AAAA,EACF;AAEA,MAAI,oBAAoB;AACnB,QAAA,IAAIC,MAA0B;AAAA,EACnC;AAEO,SAAA;AACR;"}
1
+ {"version":3,"file":"createSliceMachineExpressApp.js","sources":["../../../src/lib/createSliceMachineExpressApp.ts"],"sourcesContent":["import * as path from \"node:path\";\n\nimport * as Sentry from \"@sentry/node\";\nimport express, { Express } from \"express\";\nimport bodyParser from \"body-parser\";\nimport { createProxyMiddleware } from \"http-proxy-middleware\";\nimport serveStatic from \"serve-static\";\nimport cors from \"cors\";\n\nimport {\n\tSliceMachineManager,\n\tcreatePrismicAuthManagerMiddleware,\n\tcreateSliceMachineManagerMiddleware,\n} from \"@slicemachine/manager\";\n\nimport * as sentryErrorHandlers from \"./sentryErrorHandlers\";\nimport { sentryFrontendTunnel } from \"./sentryFrontendTunnel\";\nimport { checkIsSentryEnabled } from \"./checkIsSentryEnabled\";\n\ntype CreateSliceMachineExpressAppArgs = {\n\tsliceMachineManager: SliceMachineManager;\n};\n\n/**\n * Creates an Express app to handle the following:\n *\n * - Serve the Slice Machine app.\n * - Expose a given Slice Machine manager to non-Node.js environments, like the\n * browser.\n *\n * The Slice Machine app is served from the project's Slice Machine module\n * installation.\n *\n * If `NODE_ENV` is `development`, the Slice Machine app is served via a proxy\n * to Next.js's development server. Slice Machine must be running on port 3000.\n *\n * @param args - Configuration for the server.\n *\n * @returns A standard Express app.\n */\nexport const createSliceMachineExpressApp = async (\n\targs: CreateSliceMachineExpressAppArgs,\n): Promise<Express> => {\n\tconst isTelemetryEnabled =\n\t\tawait args.sliceMachineManager.telemetry.checkIsTelemetryEnabled();\n\n\tconst app = express();\n\n\tapp.use(cors());\n\n\tapp.use(\n\t\t\"/_manager\",\n\t\tcreateSliceMachineManagerMiddleware({\n\t\t\tsliceMachineManager: args.sliceMachineManager,\n\t\t\tonError: isTelemetryEnabled ? sentryErrorHandlers.rpc : undefined,\n\t\t}),\n\t);\n\n\tapp.use(\n\t\t\"/api/auth\",\n\t\tcreatePrismicAuthManagerMiddleware({\n\t\t\tprismicAuthManager: args.sliceMachineManager.getPrismicAuthManager(),\n\t\t\tonLoginCallback: async () => {\n\t\t\t\tconst profile = await args.sliceMachineManager.user.getProfile();\n\t\t\t\tawait args.sliceMachineManager.telemetry.identify({\n\t\t\t\t\tuserID: profile.shortId,\n\t\t\t\t\tintercomHash: profile.intercomHash,\n\t\t\t\t});\n\t\t\t\tif (checkIsSentryEnabled()) {\n\t\t\t\t\tSentry.setUser({ id: profile.shortId });\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait args.sliceMachineManager.screenshots.initS3ACL();\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// noop - We'll try again before uploading a screenshot.\n\t\t\t\t}\n\t\t\t},\n\t\t}),\n\t);\n\n\tapp.use(\"/api/t\", bodyParser.text({ type: \"*/*\" }), sentryFrontendTunnel);\n\n\tif (import.meta.env.DEV) {\n\t\tapp.use(\n\t\t\t\"/\",\n\t\t\tcreateProxyMiddleware({\n\t\t\t\ttarget: \"http://localhost:3000\",\n\t\t\t\tchangeOrigin: true,\n\t\t\t\tws: true,\n\t\t\t}),\n\t\t);\n\t} else {\n\t\tconst sliceMachineDir =\n\t\t\tawait args.sliceMachineManager.project.locateSliceMachineUIDir();\n\t\tconst sliceMachineOutDir = path.resolve(sliceMachineDir, \"out\");\n\n\t\tapp.use(serveStatic(sliceMachineOutDir));\n\n\t\tapp.get(\"/changelog\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"changelog.html\"));\n\t\t});\n\n\t\tapp.get(\"/labs\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"labs.html\"));\n\t\t});\n\n\t\tapp.get(\"/slices\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"slices.html\"));\n\t\t});\n\n\t\tapp.get(\"/changes\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"changes.html\"));\n\t\t});\n\n\t\tapp.get(\"/page-types/:id\", (_req, res) => {\n\t\t\tres.sendFile(\n\t\t\t\tpath.join(sliceMachineOutDir, \"page-types/[pageTypeId].html\"),\n\t\t\t);\n\t\t});\n\n\t\tapp.get(\"/custom-types\", (_req, res) => {\n\t\t\tres.sendFile(path.join(sliceMachineOutDir, \"custom-types.html\"));\n\t\t});\n\n\t\tapp.get(\"/custom-types/:id\", (_req, res) => {\n\t\t\tres.sendFile(\n\t\t\t\tpath.join(sliceMachineOutDir, \"custom-types/[customTypeId].html\"),\n\t\t\t);\n\t\t});\n\n\t\tapp.get(\"/slices/:lib/:sliceID/:variation\", (_req, res) => {\n\t\t\tres.sendFile(\n\t\t\t\tpath.join(\n\t\t\t\t\tsliceMachineOutDir,\n\t\t\t\t\t\"slices/[lib]/[sliceName]/[variation].html\",\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\n\t\tapp.get(\"/slices/:lib/:sliceID/:variation/simulator\", (_req, res) => {\n\t\t\tres.sendFile(\n\t\t\t\tpath.join(\n\t\t\t\t\tsliceMachineOutDir,\n\t\t\t\t\t\"slices/[lib]/[sliceName]/[variation]/simulator.html\",\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\t}\n\n\tif (isTelemetryEnabled) {\n\t\tapp.use(sentryErrorHandlers.server);\n\t}\n\n\treturn app;\n};\n"],"names":["sentryErrorHandlers.rpc","Sentry.setUser","sentryErrorHandlers.server"],"mappings":";;;;;;;;;;;AAwCa,MAAA,+BAA+B,OAC3C,SACqB;AACrB,QAAM,qBACL,MAAM,KAAK,oBAAoB,UAAU,wBAAuB;AAEjE,QAAM,MAAM;AAER,MAAA,IAAI,MAAM;AAEV,MAAA,IACH,aACA,oCAAoC;AAAA,IACnC,qBAAqB,KAAK;AAAA,IAC1B,SAAS,qBAAqBA,MAA0B;AAAA,EACxD,CAAA,CAAC;AAGC,MAAA,IACH,aACA,mCAAmC;AAAA,IAClC,oBAAoB,KAAK,oBAAoB,sBAAuB;AAAA,IACpE,iBAAiB,YAAW;AAC3B,YAAM,UAAU,MAAM,KAAK,oBAAoB,KAAK,WAAU;AACxD,YAAA,KAAK,oBAAoB,UAAU,SAAS;AAAA,QACjD,QAAQ,QAAQ;AAAA,QAChB,cAAc,QAAQ;AAAA,MAAA,CACtB;AACD,UAAI,wBAAwB;AAC3BC,gBAAe,EAAE,IAAI,QAAQ,QAAS,CAAA;AAAA,MACvC;AAEI,UAAA;AACG,cAAA,KAAK,oBAAoB,YAAY;eACnC,OAAO;AAAA,MAEhB;AAAA,IACD;AAAA,EACA,CAAA,CAAC;AAGC,MAAA,IAAI,UAAU,WAAW,KAAK,EAAE,MAAM,MAAA,CAAO,GAAG,oBAAoB;AAWjE;AACN,UAAM,kBACL,MAAM,KAAK,oBAAoB,QAAQ,wBAAuB;AAC/D,UAAM,qBAAqB,KAAK,QAAQ,iBAAiB,KAAK;AAE1D,QAAA,IAAI,YAAY,kBAAkB,CAAC;AAEvC,QAAI,IAAI,cAAc,CAAC,MAAM,QAAO;AACnC,UAAI,SAAS,KAAK,KAAK,oBAAoB,gBAAgB,CAAC;AAAA,IAAA,CAC5D;AAED,QAAI,IAAI,SAAS,CAAC,MAAM,QAAO;AAC9B,UAAI,SAAS,KAAK,KAAK,oBAAoB,WAAW,CAAC;AAAA,IAAA,CACvD;AAED,QAAI,IAAI,WAAW,CAAC,MAAM,QAAO;AAChC,UAAI,SAAS,KAAK,KAAK,oBAAoB,aAAa,CAAC;AAAA,IAAA,CACzD;AAED,QAAI,IAAI,YAAY,CAAC,MAAM,QAAO;AACjC,UAAI,SAAS,KAAK,KAAK,oBAAoB,cAAc,CAAC;AAAA,IAAA,CAC1D;AAED,QAAI,IAAI,mBAAmB,CAAC,MAAM,QAAO;AACxC,UAAI,SACH,KAAK,KAAK,oBAAoB,8BAA8B,CAAC;AAAA,IAAA,CAE9D;AAED,QAAI,IAAI,iBAAiB,CAAC,MAAM,QAAO;AACtC,UAAI,SAAS,KAAK,KAAK,oBAAoB,mBAAmB,CAAC;AAAA,IAAA,CAC/D;AAED,QAAI,IAAI,qBAAqB,CAAC,MAAM,QAAO;AAC1C,UAAI,SACH,KAAK,KAAK,oBAAoB,kCAAkC,CAAC;AAAA,IAAA,CAElE;AAED,QAAI,IAAI,oCAAoC,CAAC,MAAM,QAAO;AACzD,UAAI,SACH,KAAK,KACJ,oBACA,2CAA2C,CAC3C;AAAA,IAAA,CAEF;AAED,QAAI,IAAI,8CAA8C,CAAC,MAAM,QAAO;AACnE,UAAI,SACH,KAAK,KACJ,oBACA,qDAAqD,CACrD;AAAA,IAAA,CAEF;AAAA,EACF;AAEA,MAAI,oBAAoB;AACnB,QAAA,IAAIC,MAA0B;AAAA,EACnC;AAEO,SAAA;AACR;"}
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const version = "0.12.60-beta.9";
3
+ const version = "0.12.60";
4
4
  exports.version = version;
5
5
  //# sourceMappingURL=package.json.cjs.map
@@ -1,4 +1,4 @@
1
- const version = "0.12.60-beta.9";
1
+ const version = "0.12.60";
2
2
  export {
3
3
  version
4
4
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "start-slicemachine",
3
- "version": "0.12.60-beta.9",
3
+ "version": "0.12.60",
4
4
  "description": "Start Slice Machine from within a project.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -57,7 +57,7 @@
57
57
  "dependencies": {
58
58
  "@prismicio/mocks": "2.14.0",
59
59
  "@prismicio/types-internal": "3.11.2",
60
- "@slicemachine/manager": "0.25.2-beta.9",
60
+ "@slicemachine/manager": "0.25.2",
61
61
  "body-parser": "^1.20.3",
62
62
  "chalk": "^4.1.2",
63
63
  "cors": "^2.8.5",
@@ -99,6 +99,5 @@
99
99
  },
100
100
  "engines": {
101
101
  "node": ">=14.15.0"
102
- },
103
- "stableVersion": "0.12.59"
102
+ }
104
103
  }
@@ -253,7 +253,6 @@ export class StartSliceMachineProcess {
253
253
  adapter,
254
254
  adapterVersion,
255
255
  customTypes,
256
- gitProvider,
257
256
  isAdapterUpdateAvailable,
258
257
  isLoggedIn,
259
258
  isSliceMachineUpdateAvailable,
@@ -271,7 +270,6 @@ export class StartSliceMachineProcess {
271
270
  safelyExecute(() =>
272
271
  this._sliceMachineManager.customTypes.readAllCustomTypes(),
273
272
  ),
274
- safelyExecute(() => this._sliceMachineManager.git.detectGitProvider()),
275
273
  safelyExecute(() =>
276
274
  this._sliceMachineManager.versions.checkIsAdapterUpdateAvailable(),
277
275
  ),
@@ -302,7 +300,6 @@ export class StartSliceMachineProcess {
302
300
  _includeEnvironmentKind: true,
303
301
  adapter,
304
302
  adapterVersion,
305
- gitProvider,
306
303
  isAdapterUpdateAvailable,
307
304
  isLoggedIn,
308
305
  isSliceMachineUpdateAvailable,
@@ -105,10 +105,6 @@ export const createSliceMachineExpressApp = async (
105
105
  res.sendFile(path.join(sliceMachineOutDir, "labs.html"));
106
106
  });
107
107
 
108
- app.get("/settings", (_req, res) => {
109
- res.sendFile(path.join(sliceMachineOutDir, "settings.html"));
110
- });
111
-
112
108
  app.get("/slices", (_req, res) => {
113
109
  res.sendFile(path.join(sliceMachineOutDir, "slices.html"));
114
110
  });