@shopify/oxygen-cli 3.1.4-unstable.202312131421.0 → 3.1.4-unstable.202312131452.0

Sign up to get free protection for your applications and to get access to all the features.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,7 @@
5
5
  ### Patch Changes
6
6
 
7
7
  - 3c9f36d: Update vitest from 0.34.6 to 1.0.0
8
+ - e8a5a58: Update @shopify/eslint-plugin from 43.0.0 to 44.0.0
8
9
  - 2ef909e: Update tsup from 7.3.0 to 8.0.1
9
10
 
10
11
  ## 3.1.2
@@ -17,12 +17,8 @@ declare class MetricsExporter {
17
17
  private readonly defaultTags;
18
18
  private readonly exportUrl;
19
19
  constructor(options: MetricsExporterOptions);
20
- add(name: MetricName, value: number, tags?: {
21
- [key: string]: string;
22
- }): void;
23
- formatTags(tags: {
24
- [key: string]: string;
25
- }): string[];
20
+ add(name: MetricName, value: number, tags?: Record<string, string>): void;
21
+ formatTags(tags: Record<string, string>): string[];
26
22
  export(): Promise<void>;
27
23
  }
28
24
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/metrics-exporter.ts"],"names":["MetricName"],"mappings":"AACA,SAAQ,aAAY;AAEpB,SAAQ,kBAAiB;AACzB,SAAQ,uBAAsB;AAkBvB,IAAK,aAAL,kBAAKA,gBAAL;AACL,EAAAA,YAAA,eAAY;AACZ,EAAAA,YAAA,uBAAoB;AACpB,EAAAA,YAAA,sBAAmB;AACnB,EAAAA,YAAA,uBAAoB;AACpB,EAAAA,YAAA,wBAAqB;AACrB,EAAAA,YAAA,eAAY;AACZ,EAAAA,YAAA,gBAAa;AAPH,SAAAA;AAAA,GAAA;AAUL,MAAM,gBAAgB;AAAA,EACnB,UAA4B,CAAC;AAAA,EACpB,eAAuB;AAAA,EACvB;AAAA,EACA;AAAA,EAEjB,YAAY,SAAiC;AAC3C,UAAM,EAAC,SAAS,WAAU,IAAI,gBAAgB;AAC9C,UAAM,EAAC,SAAS,gBAAe,IAAI;AAAA,MACjC,GAAG,QAAQ,QAAQ;AAAA,IACrB;AACA,SAAK,cAAc;AAAA,MACjB,aAAa,QAAQ;AAAA,MACrB,aAAa,cAAc,cAAc,SAAS;AAAA,MAClD,kBAAkB,mBAAmB;AAAA,IACvC;AACA,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,IACE,MACA,OACA,OAAgC,CAAC,GAC3B;AACN,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ,IAAI,GAAG;AACtB,WAAK,QAAQ,IAAI,EAAG,KAAK,MAAM;AAAA,IACjC,OAAO;AACL,WAAK,QAAQ,IAAI,IAAI,CAAC,MAAM;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,WAAW,MAAyC;AAClD,WAAO,OAAO,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;AAAA,EACrE;AAAA,EAEA,MAAM,SAAwB;AAC5B,UAAM,kBAAgC,OAAO,QAAQ,KAAK,OAAO,EAC9D,IAAI,CAAC,CAAC,YAAY,MAAM,MAAM;AAC7B,YAAM,OAAO,GAAG,KAAK,YAAY,IAAI,UAAU;AAE/C,aAAO,OAAO,IAAI,CAAC,EAAC,OAAO,KAAI,MAAM;AACnC,eAAO;AAAA,UACL;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA,MAAM,KAAK,WAAW,EAAC,GAAG,MAAM,GAAG,KAAK,YAAW,CAAC;AAAA,QACtD;AAAA,MACF,CAAC;AAAA,IACH,CAAC,EACA,KAAK;AAER,QAAI;AACF,YAAM,MAAM,KAAK,WAAW;AAAA,QAC1B,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAC,QAAQ,gBAAe,CAAC;AAAA,MAChD,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,UAAU,WAAW;AAC3B,UAAI,YAAY,iBAAiB,SAAS,OAAO,UAAU,WAAW;AACpE,gBAAQ,OAAO,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\nimport {fetch} from '@shopify/cli-kit/node/http';\n\nimport {getBugsnag} from './bugsnag.js';\nimport {loadPackageJson} from './utils.js';\n\ninterface GodogEvent {\n name: string;\n type: string;\n value: number;\n tags: string[];\n}\n\ninterface MetricCollection {\n [metricName: string]: [{value: number; tags: {[key: string]: string}}];\n}\n\ninterface MetricsExporterOptions {\n ciProvider: string;\n rootPath: string;\n}\n\nexport enum MetricName {\n BuildTime = 'build_time',\n NumFilesRequested = 'num_files_requested',\n NumFilesUploaded = 'num_files_uploaded',\n TotalSizeUploaded = 'total_size_uploaded',\n TotalSizeRequested = 'total_size_requested',\n TotalTime = 'total_time',\n UploadTime = 'upload_time',\n}\n\nexport class MetricsExporter {\n private metrics: MetricCollection = {};\n private readonly metricPrefix: string = 'oxygen.cli';\n private readonly defaultTags: {[key: string]: string};\n private readonly exportUrl: string;\n\n constructor(options: MetricsExporterOptions) {\n const {version: cliVersion} = loadPackageJson();\n const {version: hydrogenVersion} = loadPackageJson(\n `${options.rootPath}/node_modules/@shopify/hydrogen`,\n );\n this.defaultTags = {\n ci_provider: options.ciProvider,\n cli_version: `oxygen-cli@${cliVersion || 'unknown'}`,\n hydrogen_version: hydrogenVersion || 'unknown',\n };\n this.exportUrl = 'https://metrics.myshopify.dev';\n }\n\n add(\n name: MetricName,\n value: number,\n tags: {[key: string]: string} = {},\n ): void {\n const metric = {\n value,\n tags,\n };\n\n if (this.metrics[name]) {\n this.metrics[name]!.push(metric);\n } else {\n this.metrics[name] = [metric];\n }\n }\n\n formatTags(tags: {[key: string]: string}): string[] {\n return Object.entries(tags).map(([key, value]) => `${key}:${value}`);\n }\n\n async export(): Promise<void> {\n const metricsToExport: GodogEvent[] = Object.entries(this.metrics)\n .map(([metricName, values]) => {\n const name = `${this.metricPrefix}.${metricName}`;\n\n return values.map(({value, tags}) => {\n return {\n name,\n type: 'gauge',\n value,\n tags: this.formatTags({...tags, ...this.defaultTags}),\n };\n });\n })\n .flat();\n\n try {\n await fetch(this.exportUrl, {\n method: 'POST',\n body: JSON.stringify({events: metricsToExport}),\n });\n } catch (error) {\n const Bugsnag = getBugsnag();\n if (Bugsnag && (error instanceof Error || typeof error === 'string')) {\n Bugsnag.notify(error);\n }\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/utils/metrics-exporter.ts"],"names":["MetricName"],"mappings":"AACA,SAAQ,aAAY;AAEpB,SAAQ,kBAAiB;AACzB,SAAQ,uBAAsB;AAmBvB,IAAK,aAAL,kBAAKA,gBAAL;AACL,EAAAA,YAAA,eAAY;AACZ,EAAAA,YAAA,uBAAoB;AACpB,EAAAA,YAAA,sBAAmB;AACnB,EAAAA,YAAA,uBAAoB;AACpB,EAAAA,YAAA,wBAAqB;AACrB,EAAAA,YAAA,eAAY;AACZ,EAAAA,YAAA,gBAAa;AAPH,SAAAA;AAAA,GAAA;AAUL,MAAM,gBAAgB;AAAA,EACnB,UAA4B,CAAC;AAAA,EACpB,eAAuB;AAAA,EACvB;AAAA,EACA;AAAA,EAEjB,YAAY,SAAiC;AAC3C,UAAM,EAAC,SAAS,WAAU,IAAI,gBAAgB;AAC9C,UAAM,EAAC,SAAS,gBAAe,IAAI;AAAA,MACjC,GAAG,QAAQ,QAAQ;AAAA,IACrB;AACA,SAAK,cAAc;AAAA,MACjB,aAAa,QAAQ;AAAA,MACrB,aAAa,cAAc,cAAc,SAAS;AAAA,MAClD,kBAAkB,mBAAmB;AAAA,IACvC;AACA,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,IACE,MACA,OACA,OAA+B,CAAC,GAC1B;AACN,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ,IAAI,GAAG;AACtB,WAAK,QAAQ,IAAI,EAAG,KAAK,MAAM;AAAA,IACjC,OAAO;AACL,WAAK,QAAQ,IAAI,IAAI,CAAC,MAAM;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,WAAW,MAAwC;AACjD,WAAO,OAAO,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;AAAA,EACrE;AAAA,EAEA,MAAM,SAAwB;AAC5B,UAAM,kBAAgC,OAAO,QAAQ,KAAK,OAAO,EAC9D,IAAI,CAAC,CAAC,YAAY,MAAM,MAAM;AAC7B,YAAM,OAAO,GAAG,KAAK,YAAY,IAAI,UAAU;AAE/C,aAAO,OAAO,IAAI,CAAC,EAAC,OAAO,KAAI,MAAM;AACnC,eAAO;AAAA,UACL;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA,MAAM,KAAK,WAAW,EAAC,GAAG,MAAM,GAAG,KAAK,YAAW,CAAC;AAAA,QACtD;AAAA,MACF,CAAC;AAAA,IACH,CAAC,EACA,KAAK;AAER,QAAI;AACF,YAAM,MAAM,KAAK,WAAW;AAAA,QAC1B,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAC,QAAQ,gBAAe,CAAC;AAAA,MAChD,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,UAAU,WAAW;AAC3B,UAAI,YAAY,iBAAiB,SAAS,OAAO,UAAU,WAAW;AACpE,gBAAQ,OAAO,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\nimport {fetch} from '@shopify/cli-kit/node/http';\n\nimport {getBugsnag} from './bugsnag.js';\nimport {loadPackageJson} from './utils.js';\n\ninterface GodogEvent {\n name: string;\n type: string;\n value: number;\n tags: string[];\n}\n\ntype MetricCollection = Record<\n string,\n [{value: number; tags: Record<string, string>}]\n>;\n\ninterface MetricsExporterOptions {\n ciProvider: string;\n rootPath: string;\n}\n\nexport enum MetricName {\n BuildTime = 'build_time',\n NumFilesRequested = 'num_files_requested',\n NumFilesUploaded = 'num_files_uploaded',\n TotalSizeUploaded = 'total_size_uploaded',\n TotalSizeRequested = 'total_size_requested',\n TotalTime = 'total_time',\n UploadTime = 'upload_time',\n}\n\nexport class MetricsExporter {\n private metrics: MetricCollection = {};\n private readonly metricPrefix: string = 'oxygen.cli';\n private readonly defaultTags: Record<string, string>;\n private readonly exportUrl: string;\n\n constructor(options: MetricsExporterOptions) {\n const {version: cliVersion} = loadPackageJson();\n const {version: hydrogenVersion} = loadPackageJson(\n `${options.rootPath}/node_modules/@shopify/hydrogen`,\n );\n this.defaultTags = {\n ci_provider: options.ciProvider,\n cli_version: `oxygen-cli@${cliVersion || 'unknown'}`,\n hydrogen_version: hydrogenVersion || 'unknown',\n };\n this.exportUrl = 'https://metrics.myshopify.dev';\n }\n\n add(\n name: MetricName,\n value: number,\n tags: Record<string, string> = {},\n ): void {\n const metric = {\n value,\n tags,\n };\n\n if (this.metrics[name]) {\n this.metrics[name]!.push(metric);\n } else {\n this.metrics[name] = [metric];\n }\n }\n\n formatTags(tags: Record<string, string>): string[] {\n return Object.entries(tags).map(([key, value]) => `${key}:${value}`);\n }\n\n async export(): Promise<void> {\n const metricsToExport: GodogEvent[] = Object.entries(this.metrics)\n .map(([metricName, values]) => {\n const name = `${this.metricPrefix}.${metricName}`;\n\n return values.map(({value, tags}) => {\n return {\n name,\n type: 'gauge',\n value,\n tags: this.formatTags({...tags, ...this.defaultTags}),\n };\n });\n })\n .flat();\n\n try {\n await fetch(this.exportUrl, {\n method: 'POST',\n body: JSON.stringify({events: metricsToExport}),\n });\n } catch (error) {\n const Bugsnag = getBugsnag();\n if (Bugsnag && (error instanceof Error || typeof error === 'string')) {\n Bugsnag.notify(error);\n }\n }\n }\n}\n"]}
@@ -1,9 +1,7 @@
1
1
  import { DeploymentConfig, ClientError, DeploymentToken } from '../deploy/types.js';
2
2
  import '../deploy/graphql/deployment-verification-details.js';
3
3
 
4
- declare const deployDefaults: {
5
- [key: string]: string | number;
6
- };
4
+ declare const deployDefaults: Record<string, string | number>;
7
5
  declare function errorHandler(error: any): void;
8
6
  declare function getBuildCommandFromLockFile(config: DeploymentConfig): string;
9
7
  declare enum Header {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/utils.ts"],"names":["Header","path"],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport path, {dirname} from 'path';\nimport {fileURLToPath} from 'url';\n\nimport {fileExists, fileExistsSync} from '@shopify/cli-kit/node/fs';\nimport {outputInfo, outputWarn} from '@shopify/cli-kit/node/output';\nimport {joinPath} from '@shopify/cli-kit/node/path';\nimport {AbortError} from '@shopify/cli-kit/node/error';\n\nimport {\n ClientError,\n DeploymentConfig,\n DeploymentToken,\n} from '../deploy/types.js';\n\nexport const deployDefaults: {[key: string]: string | number} = {\n assetsDirDefault: 'dist/client/',\n buildCommandDefault: 'yarn build',\n verificationDurationDefault: 180,\n maxUploadAttempts: 3,\n maxResumabeUploadAttempts: 9,\n workerDirDefault: 'dist/worker/',\n};\n\nexport function errorHandler(error: any) {\n if (isClientError(error)) {\n if (error.statusCode === 401) {\n throw new AbortError(\n 'You are not authorized to perform this action. Please check your deployment token.',\n );\n }\n\n if (error.statusCode === 429) {\n throw new AbortError(\n \"You've made too many requests. Please try again later\",\n );\n }\n }\n\n if (error instanceof AbortError && error.message.includes('503')) {\n throw new AbortError(\n 'The server is currently unavailable. Please try again later.',\n );\n }\n}\n\nexport function getBuildCommandFromLockFile(config: DeploymentConfig): string {\n const lockFileBuildCommands = new Map([\n ['package-lock.json', 'npm run build'],\n ['pnpm-lock.yaml', 'pnpm run build'],\n ['yarn.lock', 'yarn build'],\n ]);\n\n const foundLockFiles = [];\n\n for (const [lockFileName, buildCommand] of lockFileBuildCommands) {\n if (fileExistsSync(joinPath(config.rootPath!, lockFileName))) {\n foundLockFiles.push({lockFileName, buildCommand});\n }\n }\n\n if (foundLockFiles.length > 1) {\n const lockFilesList = foundLockFiles\n .map(({lockFileName}) => lockFileName)\n .join(', ');\n outputWarn(\n `Warning: Multiple lock files found: (${lockFilesList}).`,\n stderrLogger,\n );\n }\n\n if (foundLockFiles.length > 0) {\n const {lockFileName, buildCommand} = foundLockFiles[0] as {\n lockFileName: string;\n buildCommand: string;\n };\n\n const infoMsg = foundLockFiles.length > 1 ? '' : `Found: ${lockFileName}. `;\n\n outputInfo(\n `${infoMsg}Assuming \"${buildCommand}\" as build command. Use the buildCommand flag to override.`,\n stderrLogger,\n );\n return buildCommand;\n }\n\n return String(deployDefaults.buildCommandDefault);\n}\n\nexport enum Header {\n OxygenNamespaceHandle = 'X-Oxygen-Namespace-Handle',\n}\n\nexport function isClientError(error: unknown): error is ClientError {\n return typeof error === 'object' && error !== null && 'statusCode' in error;\n}\n\nexport function loadPackageJson(projectFolder?: string) {\n let jsonPath;\n if (projectFolder) {\n jsonPath = path.join(projectFolder, 'package.json');\n } else {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n jsonPath = path.join(__dirname, '../../package.json');\n }\n\n if (!fs.existsSync(jsonPath)) {\n return {};\n }\n const packageJsonData = fs.readFileSync(jsonPath, 'utf8');\n return JSON.parse(packageJsonData);\n}\n\nexport function stderrLogger(log: string): void {\n process.stderr.write(`${log}\\n`);\n}\n\nexport const maxLabelLength = 375;\n\nexport function parseToken(inputToken: string): DeploymentToken {\n try {\n const decodedToken = Buffer.from(inputToken, 'base64').toString('utf-8');\n const rawToken = JSON.parse(decodedToken);\n return convertKeysToCamelCase(rawToken) as DeploymentToken;\n } catch (error) {\n throw new Error(\n `Error processing deployment token. Please check your token and try again.`,\n );\n }\n}\n\ninterface VerifyConfigParams {\n config: DeploymentConfig;\n performedBuild?: boolean;\n}\n\nexport async function verifyConfig({\n config,\n performedBuild = false,\n}: VerifyConfigParams) {\n const {rootPath, workerDir, assetsDir, skipBuild, workerOnly} = config;\n const checkPaths: {[pathType: string]: string} = {\n root: rootPath!,\n };\n\n if (skipBuild || performedBuild) {\n checkPaths.worker = joinPath(rootPath!, workerDir!);\n if (!workerOnly) {\n checkPaths.assets = joinPath(rootPath!, assetsDir!);\n }\n }\n\n for (const pathType of Object.keys(checkPaths)) {\n await checkPath(checkPaths[pathType]!, pathType);\n }\n\n const addressRegex =\n /^https:\\/\\/(?:[\\w-]+\\.)*[\\w-]+|^https:\\/\\/\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}/;\n if (!addressRegex.test(config.deploymentUrl)) {\n throw new Error(`Invalid deployment service URL: ${config.deploymentUrl}`);\n }\n}\n\nasync function checkPath(path: string, pathType: string) {\n if (!(await fileExists(path))) {\n if (pathType === 'assets') {\n outputWarn(\n `Use the \"workerOnly\" flag to perform a worker-only deployment.`,\n stderrLogger,\n );\n }\n throw new Error(`Path not found: ${path}`);\n }\n}\n\ninterface TokenType {\n [x: string]: string | TokenType;\n}\n\nfunction convertKeysToCamelCase(\n obj: TokenType | string,\n): DeploymentToken | string {\n if (typeof obj === 'object') {\n return Object.keys(obj).reduce((result: any, key: string) => {\n const camelCaseKey = key.replace(/([-_][a-z])/gi, ($1) =>\n $1.toUpperCase().replace('-', '').replace('_', ''),\n );\n if (obj[key] === undefined) {\n throw new Error(`Invalid token: ${key} is undefined`);\n }\n result[camelCaseKey] = convertKeysToCamelCase(obj[key] as TokenType);\n return result;\n }, {} as DeploymentToken);\n }\n return obj;\n}\n"]}
1
+ {"version":3,"sources":["../../src/utils/utils.ts"],"names":["Header","path"],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport path, {dirname} from 'path';\nimport {fileURLToPath} from 'url';\n\nimport {fileExists, fileExistsSync} from '@shopify/cli-kit/node/fs';\nimport {outputInfo, outputWarn} from '@shopify/cli-kit/node/output';\nimport {joinPath} from '@shopify/cli-kit/node/path';\nimport {AbortError} from '@shopify/cli-kit/node/error';\n\nimport {\n ClientError,\n DeploymentConfig,\n DeploymentToken,\n} from '../deploy/types.js';\n\nexport const deployDefaults: Record<string, string | number> = {\n assetsDirDefault: 'dist/client/',\n buildCommandDefault: 'yarn build',\n verificationDurationDefault: 180,\n maxUploadAttempts: 3,\n maxResumabeUploadAttempts: 9,\n workerDirDefault: 'dist/worker/',\n};\n\nexport function errorHandler(error: any) {\n if (isClientError(error)) {\n if (error.statusCode === 401) {\n throw new AbortError(\n 'You are not authorized to perform this action. Please check your deployment token.',\n );\n }\n\n if (error.statusCode === 429) {\n throw new AbortError(\n \"You've made too many requests. Please try again later\",\n );\n }\n }\n\n if (error instanceof AbortError && error.message.includes('503')) {\n throw new AbortError(\n 'The server is currently unavailable. Please try again later.',\n );\n }\n}\n\nexport function getBuildCommandFromLockFile(config: DeploymentConfig): string {\n const lockFileBuildCommands = new Map([\n ['package-lock.json', 'npm run build'],\n ['pnpm-lock.yaml', 'pnpm run build'],\n ['yarn.lock', 'yarn build'],\n ]);\n\n const foundLockFiles = [];\n\n for (const [lockFileName, buildCommand] of lockFileBuildCommands) {\n if (fileExistsSync(joinPath(config.rootPath!, lockFileName))) {\n foundLockFiles.push({lockFileName, buildCommand});\n }\n }\n\n if (foundLockFiles.length > 1) {\n const lockFilesList = foundLockFiles\n .map(({lockFileName}) => lockFileName)\n .join(', ');\n outputWarn(\n `Warning: Multiple lock files found: (${lockFilesList}).`,\n stderrLogger,\n );\n }\n\n if (foundLockFiles.length > 0) {\n const {lockFileName, buildCommand} = foundLockFiles[0] as {\n lockFileName: string;\n buildCommand: string;\n };\n\n const infoMsg = foundLockFiles.length > 1 ? '' : `Found: ${lockFileName}. `;\n\n outputInfo(\n `${infoMsg}Assuming \"${buildCommand}\" as build command. Use the buildCommand flag to override.`,\n stderrLogger,\n );\n return buildCommand;\n }\n\n return String(deployDefaults.buildCommandDefault);\n}\n\nexport enum Header {\n OxygenNamespaceHandle = 'X-Oxygen-Namespace-Handle',\n}\n\nexport function isClientError(error: unknown): error is ClientError {\n return typeof error === 'object' && error !== null && 'statusCode' in error;\n}\n\nexport function loadPackageJson(projectFolder?: string) {\n let jsonPath;\n if (projectFolder) {\n jsonPath = path.join(projectFolder, 'package.json');\n } else {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n jsonPath = path.join(__dirname, '../../package.json');\n }\n\n if (!fs.existsSync(jsonPath)) {\n return {};\n }\n const packageJsonData = fs.readFileSync(jsonPath, 'utf8');\n return JSON.parse(packageJsonData);\n}\n\nexport function stderrLogger(log: string): void {\n process.stderr.write(`${log}\\n`);\n}\n\nexport const maxLabelLength = 375;\n\nexport function parseToken(inputToken: string): DeploymentToken {\n try {\n const decodedToken = Buffer.from(inputToken, 'base64').toString('utf-8');\n const rawToken = JSON.parse(decodedToken);\n return convertKeysToCamelCase(rawToken) as DeploymentToken;\n } catch (error) {\n throw new Error(\n `Error processing deployment token. Please check your token and try again.`,\n );\n }\n}\n\ninterface VerifyConfigParams {\n config: DeploymentConfig;\n performedBuild?: boolean;\n}\n\nexport async function verifyConfig({\n config,\n performedBuild = false,\n}: VerifyConfigParams) {\n const {rootPath, workerDir, assetsDir, skipBuild, workerOnly} = config;\n const checkPaths: Record<string, string> = {\n root: rootPath!,\n };\n\n if (skipBuild || performedBuild) {\n checkPaths.worker = joinPath(rootPath!, workerDir!);\n if (!workerOnly) {\n checkPaths.assets = joinPath(rootPath!, assetsDir!);\n }\n }\n\n for (const pathType of Object.keys(checkPaths)) {\n await checkPath(checkPaths[pathType]!, pathType);\n }\n\n const addressRegex =\n /^https:\\/\\/(?:[\\w-]+\\.)*[\\w-]+|^https:\\/\\/\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}/;\n if (!addressRegex.test(config.deploymentUrl)) {\n throw new Error(`Invalid deployment service URL: ${config.deploymentUrl}`);\n }\n}\n\nasync function checkPath(path: string, pathType: string) {\n if (!(await fileExists(path))) {\n if (pathType === 'assets') {\n outputWarn(\n `Use the \"workerOnly\" flag to perform a worker-only deployment.`,\n stderrLogger,\n );\n }\n throw new Error(`Path not found: ${path}`);\n }\n}\n\ninterface TokenType {\n [x: string]: string | TokenType;\n}\n\nfunction convertKeysToCamelCase(\n obj: TokenType | string,\n): DeploymentToken | string {\n if (typeof obj === 'object') {\n return Object.keys(obj).reduce((result: any, key: string) => {\n const camelCaseKey = key.replace(/([-_][a-z])/gi, ($1) =>\n $1.toUpperCase().replace('-', '').replace('_', ''),\n );\n if (obj[key] === undefined) {\n throw new Error(`Invalid token: ${key} is undefined`);\n }\n result[camelCaseKey] = convertKeysToCamelCase(obj[key] as TokenType);\n return result;\n }, {} as DeploymentToken);\n }\n return obj;\n}\n"]}
@@ -174,5 +174,5 @@
174
174
  ]
175
175
  }
176
176
  },
177
- "version": "3.1.4-unstable.202312131421.0"
177
+ "version": "3.1.4-unstable.202312131452.0"
178
178
  }
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "@shopify:registry": "https://registry.npmjs.org"
6
6
  },
7
7
  "license": "MIT",
8
- "version": "3.1.4-unstable.202312131421.0",
8
+ "version": "3.1.4-unstable.202312131452.0",
9
9
  "type": "module",
10
10
  "scripts": {
11
11
  "build": "tsup --sourcemap --clean --config ./tsup.config.ts && oclif manifest",
@@ -46,7 +46,7 @@
46
46
  "devDependencies": {
47
47
  "@bugsnag/source-maps": "^2.3.1",
48
48
  "@changesets/cli": "^2.27.1",
49
- "@shopify/eslint-plugin": "^43.0.0",
49
+ "@shopify/eslint-plugin": "^44.0.0",
50
50
  "@shopify/prettier-config": "^1.1.2",
51
51
  "@types/async": "^3.2.24",
52
52
  "@types/node": "^20.10.4",