@shopify/cli 3.0.17 → 3.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @shopify/cli
2
2
 
3
+ ## 3.0.18
4
+
5
+ ### Patch Changes
6
+
7
+ - 84438079: Add logging to file and command to access logs
8
+ - fa518a0d: Report events with the analytics helper from cli-kit
9
+ - Updated dependencies [84438079]
10
+ - Updated dependencies [fa518a0d]
11
+ - Updated dependencies [fd10fc01]
12
+ - Updated dependencies [0243890b]
13
+ - Updated dependencies [cb1caa7c]
14
+ - @shopify/cli-kit@3.0.18
15
+
3
16
  ## 3.0.17
4
17
 
5
18
  ### Patch Changes
@@ -0,0 +1,12 @@
1
+ import { Command } from '@oclif/core';
2
+ import { output } from '@shopify/cli-kit';
3
+
4
+ class Logs extends Command {
5
+ async run() {
6
+ await output.pageLogs();
7
+ }
8
+ }
9
+ Logs.description = "View full debug logs from the Shopify CLI";
10
+
11
+ export { Logs as default };
12
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sources":["../../src/cli/commands/logs.ts"],"sourcesContent":["import {Command} from '@oclif/core'\nimport {output} from '@shopify/cli-kit'\n\nexport default class Logs extends Command {\n static description = 'View full debug logs from the Shopify CLI'\n\n async run(): Promise<void> {\n await output.pageLogs()\n }\n}\n"],"names":[],"mappings":";;;AAGA,MAAqB,aAAa,OAAQ,CAAA;AAAA,EAGxC,MAAM,GAAqB,GAAA;AACzB,IAAA,MAAM,OAAO,QAAS,EAAA,CAAA;AAAA,GACxB;AACF,CAAA;AANqB,KACZ,WAAc,GAAA,2CAAA;;;;"}
@@ -1,9 +1,8 @@
1
- import { reportEvent } from '../services/monorail.js';
2
- import '@shopify/cli-kit';
1
+ import { analytics } from '@shopify/cli-kit';
3
2
 
4
3
  const hook = async (options) => {
5
4
  const command = options.Command.id.replace(/:/g, " ");
6
- await reportEvent(command, options.argv);
5
+ await analytics.reportEvent(command, options.argv);
7
6
  };
8
7
 
9
8
  export { hook };
@@ -1 +1 @@
1
- {"version":3,"file":"postrun.js","sources":["../../src/hooks/postrun.ts"],"sourcesContent":["import {reportEvent} from '../services/monorail'\nimport {Hook} from '@oclif/core'\n\n// This hook is called after each successful command run. More info: https://oclif.io/docs/hooks\nexport const hook: Hook.Postrun = async (options) => {\n const command = options.Command.id.replace(/:/g, ' ')\n await reportEvent(command, options.argv)\n}\n"],"names":[],"mappings":";;;AAIa,MAAA,IAAA,GAAqB,OAAO,OAAY,KAAA;AACnD,EAAA,MAAM,UAAU,OAAQ,CAAA,OAAA,CAAQ,EAAG,CAAA,OAAA,CAAQ,MAAM,GAAG,CAAA,CAAA;AACpD,EAAM,MAAA,WAAA,CAAY,OAAS,EAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AACzC;;;;"}
1
+ {"version":3,"file":"postrun.js","sources":["../../src/hooks/postrun.ts"],"sourcesContent":["import {analytics} from '@shopify/cli-kit'\nimport {Hook} from '@oclif/core'\n\n// This hook is called after each successful command run. More info: https://oclif.io/docs/hooks\nexport const hook: Hook.Postrun = async (options) => {\n const command = options.Command.id.replace(/:/g, ' ')\n await analytics.reportEvent(command, options.argv)\n}\n"],"names":[],"mappings":";;AAIa,MAAA,IAAA,GAAqB,OAAO,OAAY,KAAA;AACnD,EAAA,MAAM,UAAU,OAAQ,CAAA,OAAA,CAAQ,EAAG,CAAA,OAAA,CAAQ,MAAM,GAAG,CAAA,CAAA;AACpD,EAAA,MAAM,SAAU,CAAA,WAAA,CAAY,OAAS,EAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AACnD;;;;"}
package/dist/index.js CHANGED
@@ -1,10 +1,11 @@
1
1
  import { settings, run, flush } from '@oclif/core';
2
2
  import Bugsnag from '@bugsnag/js';
3
- import { environment, error } from '@shopify/cli-kit';
3
+ import { output, environment, error } from '@shopify/cli-kit';
4
4
 
5
- var version = "3.0.17";
5
+ var version = "3.0.18";
6
6
 
7
7
  function runCLI() {
8
+ output.initiateLogging({ filename: "shopify.cli.log" });
8
9
  if (environment.local.isDebug()) {
9
10
  settings.debug = true;
10
11
  } else {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["// CLI\nimport {version as cliVersion} from '../package.json'\nimport {run, settings, flush} from '@oclif/core'\nimport Bugsnag from '@bugsnag/js'\nimport {error as kitError, environment} from '@shopify/cli-kit'\n\nfunction runCLI() {\n if (environment.local.isDebug()) {\n settings.debug = true\n } else {\n Bugsnag.start({\n apiKey: '9e1e6889176fd0c795d5c659225e0fae',\n logger: null,\n appVersion: cliVersion,\n autoTrackSessions: false,\n })\n }\n\n run(undefined, import.meta.url)\n .then(flush)\n .catch((error: Error): Promise<void | Error> => {\n if (error instanceof kitError.AbortSilent) {\n process.exit(1)\n }\n const kitMapper = kitError.mapper\n const kitHandle = kitError.handler\n // eslint-disable-next-line promise/no-nesting\n return kitMapper(error)\n .then(bugsnagHandle)\n .then((error: Error) => {\n return kitHandle(error)\n })\n .then(() => {\n process.exit(1)\n })\n })\n}\n\nconst bugsnagHandle = async (errorToReport: Error): Promise<Error> => {\n if (!settings.debug && kitError.shouldReport(errorToReport)) {\n const reportedError = Object.assign(Object.create(errorToReport), {})\n if (reportedError.stack) reportedError.stack = reportedError.stack.replace(new RegExp('file:///', 'g'), '/')\n await new Promise((resolve, reject) => {\n Bugsnag.notify(reportedError, undefined, resolve)\n })\n }\n return Promise.resolve(errorToReport)\n}\n\nexport default runCLI\n"],"names":["cliVersion","error","kitError"],"mappings":";;;;;;AAMA,SAAkB,MAAA,GAAA;AAChB,EAAI,IAAA,WAAA,CAAY,KAAM,CAAA,OAAA,EAAW,EAAA;AAC/B,IAAA,QAAA,CAAS,KAAQ,GAAA,IAAA,CAAA;AAAA,GACZ,MAAA;AACL,IAAA,OAAA,CAAQ,KAAM,CAAA;AAAA,MACZ,MAAQ,EAAA,kCAAA;AAAA,MACR,MAAQ,EAAA,IAAA;AAAA,MACR,UAAY,EAAAA,OAAA;AAAA,MACZ,iBAAmB,EAAA,KAAA;AAAA,KACpB,CAAA,CAAA;AAAA,GACH;AAEA,EAAI,GAAA,CAAA,KAAA,CAAA,EAAW,YAAY,GAAG,CAAA,CAC3B,KAAK,KAAK,CAAA,CACV,KAAM,CAAA,CAACC,OAAwC,KAAA;AAC9C,IAAI,IAAAA,OAAA,YAAiBC,MAAS,WAAa,EAAA;AACzC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA;AAAA,KAChB;AACA,IAAA,MAAM,YAAYA,KAAS,CAAA,MAAA,CAAA;AAC3B,IAAA,MAAM,YAAYA,KAAS,CAAA,OAAA,CAAA;AAE3B,IAAO,OAAA,SAAA,CAAUD,OAAK,CACnB,CAAA,IAAA,CAAK,aAAa,CAClB,CAAA,IAAA,CAAK,CAAC,MAAiB,KAAA;AACtB,MAAA,OAAO,UAAU,MAAK,CAAA,CAAA;AAAA,KACvB,CACA,CAAA,IAAA,CAAK,MAAM;AACV,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA;AAAA,KACf,CAAA,CAAA;AAAA,GACJ,CAAA,CAAA;AACL,CAAA;AAEA,MAAM,aAAA,GAAgB,OAAO,aAAyC,KAAA;AACpE,EAAA,IAAI,CAAC,QAAS,CAAA,KAAA,IAASC,KAAS,CAAA,YAAA,CAAa,aAAa,CAAG,EAAA;AAC3D,IAAM,MAAA,aAAA,GAAgB,OAAO,MAAO,CAAA,MAAA,CAAO,OAAO,aAAa,CAAA,EAAG,EAAE,CAAA,CAAA;AACpE,IAAA,IAAI,aAAc,CAAA,KAAA;AAAO,MAAc,aAAA,CAAA,KAAA,GAAQ,cAAc,KAAM,CAAA,OAAA,CAAQ,IAAI,MAAO,CAAA,UAAA,EAAY,GAAG,CAAA,EAAG,GAAG,CAAA,CAAA;AAC3G,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACrC,MAAQ,OAAA,CAAA,MAAA,CAAO,aAAe,EAAA,KAAA,CAAA,EAAW,OAAO,CAAA,CAAA;AAAA,KACjD,CAAA,CAAA;AAAA,GACH;AACA,EAAO,OAAA,OAAA,CAAQ,QAAQ,aAAa,CAAA,CAAA;AACtC,CAAA;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["// CLI\nimport {version as cliVersion} from '../package.json'\nimport {run, settings, flush} from '@oclif/core'\nimport Bugsnag from '@bugsnag/js'\nimport {error as kitError, environment, output} from '@shopify/cli-kit'\n\nfunction runCLI() {\n output.initiateLogging({filename: 'shopify.cli.log'})\n if (environment.local.isDebug()) {\n settings.debug = true\n } else {\n Bugsnag.start({\n apiKey: '9e1e6889176fd0c795d5c659225e0fae',\n logger: null,\n appVersion: cliVersion,\n autoTrackSessions: false,\n })\n }\n\n run(undefined, import.meta.url)\n .then(flush)\n .catch((error: Error): Promise<void | Error> => {\n if (error instanceof kitError.AbortSilent) {\n process.exit(1)\n }\n const kitMapper = kitError.mapper\n const kitHandle = kitError.handler\n // eslint-disable-next-line promise/no-nesting\n return kitMapper(error)\n .then(bugsnagHandle)\n .then((error: Error) => {\n return kitHandle(error)\n })\n .then(() => {\n process.exit(1)\n })\n })\n}\n\nconst bugsnagHandle = async (errorToReport: Error): Promise<Error> => {\n if (!settings.debug && kitError.shouldReport(errorToReport)) {\n const reportedError = Object.assign(Object.create(errorToReport), {})\n if (reportedError.stack) reportedError.stack = reportedError.stack.replace(new RegExp('file:///', 'g'), '/')\n await new Promise((resolve, reject) => {\n Bugsnag.notify(reportedError, undefined, resolve)\n })\n }\n return Promise.resolve(errorToReport)\n}\n\nexport default runCLI\n"],"names":["cliVersion","error","kitError"],"mappings":";;;;;;AAMA,SAAkB,MAAA,GAAA;AAChB,EAAA,MAAA,CAAO,eAAgB,CAAA,EAAC,QAAU,EAAA,iBAAA,EAAkB,CAAA,CAAA;AACpD,EAAI,IAAA,WAAA,CAAY,KAAM,CAAA,OAAA,EAAW,EAAA;AAC/B,IAAA,QAAA,CAAS,KAAQ,GAAA,IAAA,CAAA;AAAA,GACZ,MAAA;AACL,IAAA,OAAA,CAAQ,KAAM,CAAA;AAAA,MACZ,MAAQ,EAAA,kCAAA;AAAA,MACR,MAAQ,EAAA,IAAA;AAAA,MACR,UAAY,EAAAA,OAAA;AAAA,MACZ,iBAAmB,EAAA,KAAA;AAAA,KACpB,CAAA,CAAA;AAAA,GACH;AAEA,EAAI,GAAA,CAAA,KAAA,CAAA,EAAW,YAAY,GAAG,CAAA,CAC3B,KAAK,KAAK,CAAA,CACV,KAAM,CAAA,CAACC,OAAwC,KAAA;AAC9C,IAAI,IAAAA,OAAA,YAAiBC,MAAS,WAAa,EAAA;AACzC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA;AAAA,KAChB;AACA,IAAA,MAAM,YAAYA,KAAS,CAAA,MAAA,CAAA;AAC3B,IAAA,MAAM,YAAYA,KAAS,CAAA,OAAA,CAAA;AAE3B,IAAO,OAAA,SAAA,CAAUD,OAAK,CACnB,CAAA,IAAA,CAAK,aAAa,CAClB,CAAA,IAAA,CAAK,CAAC,MAAiB,KAAA;AACtB,MAAA,OAAO,UAAU,MAAK,CAAA,CAAA;AAAA,KACvB,CACA,CAAA,IAAA,CAAK,MAAM;AACV,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA;AAAA,KACf,CAAA,CAAA;AAAA,GACJ,CAAA,CAAA;AACL,CAAA;AAEA,MAAM,aAAA,GAAgB,OAAO,aAAyC,KAAA;AACpE,EAAA,IAAI,CAAC,QAAS,CAAA,KAAA,IAASC,KAAS,CAAA,YAAA,CAAa,aAAa,CAAG,EAAA;AAC3D,IAAM,MAAA,aAAA,GAAgB,OAAO,MAAO,CAAA,MAAA,CAAO,OAAO,aAAa,CAAA,EAAG,EAAE,CAAA,CAAA;AACpE,IAAA,IAAI,aAAc,CAAA,KAAA;AAAO,MAAc,aAAA,CAAA,KAAA,GAAQ,cAAc,KAAM,CAAA,OAAA,CAAQ,IAAI,MAAO,CAAA,UAAA,EAAY,GAAG,CAAA,EAAG,GAAG,CAAA,CAAA;AAC3G,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACrC,MAAQ,OAAA,CAAA,MAAA,CAAO,aAAe,EAAA,KAAA,CAAA,EAAW,OAAO,CAAA,CAAA;AAAA,KACjD,CAAA,CAAA;AAAA,GACH;AACA,EAAO,OAAA,OAAA,CAAQ,QAAQ,aAAa,CAAA,CAAA;AACtC,CAAA;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shopify/cli",
3
- "version": "3.0.17",
3
+ "version": "3.0.18",
4
4
  "private": false,
5
5
  "description": "A CLI tool to build for the Shopify platform",
6
6
  "type": "module",
@@ -52,7 +52,7 @@
52
52
  "@oclif/plugin-help": "^5.1.12",
53
53
  "@oclif/plugin-plugins": "^2.1.0",
54
54
  "@shopify/plugin-ngrok": "^0.2.9",
55
- "@shopify/cli-kit": "^3.0.17"
55
+ "@shopify/cli-kit": "^3.0.18"
56
56
  },
57
57
  "devDependencies": {
58
58
  "vitest": "0.13.1"
@@ -96,8 +96,7 @@
96
96
  "-h"
97
97
  ],
98
98
  "hooks": {
99
- "postrun": "dist/hooks/postrun",
100
- "monorail": "dist/hooks/monorail"
99
+ "postrun": "dist/hooks/postrun"
101
100
  }
102
101
  }
103
102
  }
@@ -1,12 +0,0 @@
1
- import { reportEvent } from '../services/monorail.js';
2
- import '@shopify/cli-kit';
3
-
4
- const monorail = async (options) => {
5
- const command = options.id.split(" ").pop() || "";
6
- const commandIndex = process.argv.indexOf(command);
7
- const args = process.argv.slice(commandIndex + 1);
8
- await reportEvent(options.id, args);
9
- };
10
-
11
- export { monorail };
12
- //# sourceMappingURL=monorail.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"monorail.js","sources":["../../src/hooks/monorail.ts"],"sourcesContent":["import {reportEvent} from '../services/monorail'\n\n// This hook is called manually from the code. More info: https://oclif.io/docs/hooks#custom-events\nexport const monorail = async (options: {id: string}) => {\n const command = options.id.split(' ').pop() || ''\n const commandIndex = process.argv.indexOf(command)\n const args = process.argv.slice(commandIndex + 1)\n await reportEvent(options.id, args)\n}\n"],"names":[],"mappings":";;;AAGa,MAAA,QAAA,GAAW,OAAO,OAA0B,KAAA;AACvD,EAAA,MAAM,UAAU,OAAQ,CAAA,EAAA,CAAG,MAAM,GAAG,CAAA,CAAE,KAAS,IAAA,EAAA,CAAA;AAC/C,EAAA,MAAM,YAAe,GAAA,OAAA,CAAQ,IAAK,CAAA,OAAA,CAAQ,OAAO,CAAA,CAAA;AACjD,EAAA,MAAM,IAAO,GAAA,OAAA,CAAQ,IAAK,CAAA,KAAA,CAAM,eAAe,CAAC,CAAA,CAAA;AAChD,EAAM,MAAA,WAAA,CAAY,OAAQ,CAAA,EAAA,EAAI,IAAI,CAAA,CAAA;AACpC;;;;"}
@@ -1,74 +0,0 @@
1
- import { environment, http, output, path, store, os, ruby } from '@shopify/cli-kit';
2
-
3
- var version = "3.0.17";
4
-
5
- const url = "https://monorail-edge.shopifysvc.com/v1/produce";
6
- const reportEvent = async (command, args) => {
7
- if (environment.local.isDebug() || environment.local.analyticsDisabled()) {
8
- return;
9
- }
10
- try {
11
- const currentTime = new Date().getTime();
12
- const payload = await buildPayload(command, args, currentTime);
13
- const body = JSON.stringify(payload);
14
- const headers = buildHeaders(currentTime);
15
- const response = await http.fetch(url, { method: "POST", body, headers });
16
- if (response.status === 200) {
17
- output.debug(`Analytics event sent: ${body}`);
18
- } else {
19
- output.debug(`Failed to report usage analytics: ${response.statusText}`);
20
- }
21
- } catch (error) {
22
- let message = "Failed to report usage analytics";
23
- if (error instanceof Error) {
24
- message = message.concat(`: ${error.message}`);
25
- }
26
- output.debug(message);
27
- }
28
- };
29
- const buildHeaders = (currentTime) => {
30
- return {
31
- "Content-Type": "application/json; charset=utf-8",
32
- "X-Monorail-Edge-Event-Created-At-Ms": currentTime.toString(),
33
- "X-Monorail-Edge-Event-Sent-At-Ms": currentTime.toString()
34
- };
35
- };
36
- const buildPayload = async (command, args = [], currentTime) => {
37
- let directory = process.cwd();
38
- const pathFlagIndex = args.indexOf("--path");
39
- if (pathFlagIndex >= 0) {
40
- directory = path.resolve(args[pathFlagIndex + 1]);
41
- }
42
- const appInfo = store.getAppInfo(directory);
43
- const { platform, arch } = os.platformAndArch();
44
- const rawPartnerId = appInfo?.orgId;
45
- let partnerIdAsInt;
46
- if (rawPartnerId !== void 0) {
47
- partnerIdAsInt = parseInt(rawPartnerId, 10);
48
- if (isNaN(partnerIdAsInt)) {
49
- partnerIdAsInt = void 0;
50
- }
51
- }
52
- return {
53
- schema_id: "app_cli3_command/1.0",
54
- payload: {
55
- project_type: "node",
56
- command,
57
- args: args.join(" "),
58
- time_start: currentTime,
59
- time_end: currentTime,
60
- total_time: 0,
61
- success: true,
62
- uname: `${platform} ${arch}`,
63
- cli_version: version,
64
- ruby_version: await ruby.version() || "",
65
- node_version: process.version.replace("v", ""),
66
- is_employee: await environment.local.isShopify(),
67
- api_key: appInfo?.appId,
68
- partner_id: partnerIdAsInt
69
- }
70
- };
71
- };
72
-
73
- export { reportEvent, url };
74
- //# sourceMappingURL=monorail.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"monorail.js","sources":["../../src/services/monorail.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\nimport {version} from '../../package.json'\nimport {environment, http, os, output, path, ruby, store} from '@shopify/cli-kit'\n\nexport const url = 'https://monorail-edge.shopifysvc.com/v1/produce'\n\nexport const reportEvent = async (command: string, args: string[]) => {\n if (environment.local.isDebug() || environment.local.analyticsDisabled()) {\n return\n }\n try {\n const currentTime = new Date().getTime()\n const payload = await buildPayload(command, args, currentTime)\n const body = JSON.stringify(payload)\n const headers = buildHeaders(currentTime)\n\n const response = await http.fetch(url, {method: 'POST', body, headers})\n if (response.status === 200) {\n output.debug(`Analytics event sent: ${body}`)\n } else {\n output.debug(`Failed to report usage analytics: ${response.statusText}`)\n }\n // eslint-disable-next-line no-catch-all/no-catch-all\n } catch (error) {\n let message = 'Failed to report usage analytics'\n if (error instanceof Error) {\n message = message.concat(`: ${error.message}`)\n }\n output.debug(message)\n }\n}\n\nconst buildHeaders = (currentTime: number) => {\n return {\n 'Content-Type': 'application/json; charset=utf-8',\n 'X-Monorail-Edge-Event-Created-At-Ms': currentTime.toString(),\n 'X-Monorail-Edge-Event-Sent-At-Ms': currentTime.toString(),\n }\n}\n\nconst buildPayload = async (command: string, args: string[] = [], currentTime: number) => {\n let directory = process.cwd()\n const pathFlagIndex = args.indexOf('--path')\n if (pathFlagIndex >= 0) {\n directory = path.resolve(args[pathFlagIndex + 1])\n }\n const appInfo = store.getAppInfo(directory)\n const {platform, arch} = os.platformAndArch()\n\n const rawPartnerId = appInfo?.orgId\n let partnerIdAsInt: number | undefined\n if (rawPartnerId !== undefined) {\n partnerIdAsInt = parseInt(rawPartnerId, 10)\n if (isNaN(partnerIdAsInt)) {\n partnerIdAsInt = undefined\n }\n }\n\n return {\n schema_id: 'app_cli3_command/1.0',\n payload: {\n project_type: 'node',\n command,\n args: args.join(' '),\n time_start: currentTime,\n time_end: currentTime,\n total_time: 0,\n success: true,\n uname: `${platform} ${arch}`,\n cli_version: version,\n ruby_version: (await ruby.version()) || '',\n node_version: process.version.replace('v', ''),\n is_employee: await environment.local.isShopify(),\n api_key: appInfo?.appId,\n partner_id: partnerIdAsInt,\n },\n }\n}\n"],"names":[],"mappings":"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"}