codify-plugin-test 0.0.53-beta16 → 0.0.53-beta18

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.
@@ -4,7 +4,7 @@ import { nanoid } from 'nanoid';
4
4
  import { fork } from 'node:child_process';
5
5
  import path from 'node:path';
6
6
  import { spawnSafe } from './spawn.js';
7
- import { CodifyTestUtils } from './test-utils.js';
7
+ import { TestUtils } from './test-utils.js';
8
8
  const ajv = new Ajv.default({
9
9
  strict: true
10
10
  });
@@ -34,35 +34,35 @@ export class PluginProcess {
34
34
  this.handleIncomingRequests(this.childProcess);
35
35
  }
36
36
  async initialize() {
37
- return CodifyTestUtils.sendMessageAndAwaitResponse(this.childProcess, {
37
+ return TestUtils.sendMessageAndAwaitResponse(this.childProcess, {
38
38
  cmd: 'initialize',
39
39
  data: { verbosityLevel: 3 },
40
40
  requestId: nanoid(6),
41
41
  });
42
42
  }
43
43
  async validate(data) {
44
- return CodifyTestUtils.sendMessageAndAwaitResponse(this.childProcess, {
44
+ return TestUtils.sendMessageAndAwaitResponse(this.childProcess, {
45
45
  cmd: 'validate',
46
46
  data,
47
47
  requestId: nanoid(6),
48
48
  });
49
49
  }
50
50
  async plan(data) {
51
- return CodifyTestUtils.sendMessageAndAwaitResponse(this.childProcess, {
51
+ return TestUtils.sendMessageAndAwaitResponse(this.childProcess, {
52
52
  cmd: 'plan',
53
53
  data,
54
54
  requestId: nanoid(6),
55
55
  });
56
56
  }
57
57
  async apply(data) {
58
- return CodifyTestUtils.sendMessageAndAwaitResponse(this.childProcess, {
58
+ return TestUtils.sendMessageAndAwaitResponse(this.childProcess, {
59
59
  cmd: 'apply',
60
60
  data,
61
61
  requestId: nanoid(6),
62
62
  });
63
63
  }
64
64
  async import(data) {
65
- return CodifyTestUtils.sendMessageAndAwaitResponse(this.childProcess, {
65
+ return TestUtils.sendMessageAndAwaitResponse(this.childProcess, {
66
66
  cmd: 'import',
67
67
  data,
68
68
  requestId: nanoid(6),
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-process.js","sourceRoot":"","sources":["../src/plugin-process.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAGL,wBAAwB,EAIxB,gBAAgB,EAEhB,UAAU,EAKX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAgB,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAGxD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;IAC1B,MAAM,EAAE,IAAI;CACb,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAC1D,MAAM,uBAAuB,GAAG,GAAG,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;AAEtE,MAAM,OAAO,aAAa;IACxB,YAAY,CAAc;IAE1B;;;;OAIG;IACH,YAAY,UAAkB;QAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEhE,IAAI,CAAC,YAAY,GAAG,IAAI,CACtB,UAAU,EACV,EAAE,EACF;YACE,qFAAqF;YACrF,kBAAkB;YAClB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;YACvB,QAAQ,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;YAC3C,KAAK,EAAE,MAAM;SACd,CACF,CAAA;QAED,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE/C,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,eAAe,CAAC,2BAA2B,CAAC,IAAI,CAAC,YAAY,EAAE;YACpE,GAAG,EAAE,YAAY;YACjB,IAAI,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE;YAC3B,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;SACrB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAyB;QACtC,OAAO,eAAe,CAAC,2BAA2B,CAAC,IAAI,CAAC,YAAY,EAAE;YACpE,GAAG,EAAE,UAAU;YACf,IAAI;YACJ,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;SACrB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAqB;QAC9B,OAAO,eAAe,CAAC,2BAA2B,CAAC,IAAI,CAAC,YAAY,EAAE;YACpE,GAAG,EAAE,MAAM;YACX,IAAI;YACJ,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;SACrB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAsB;QAChC,OAAO,eAAe,CAAC,2BAA2B,CAAC,IAAI,CAAC,YAAY,EAAE;YACpE,GAAG,EAAE,OAAO;YACZ,IAAI;YACJ,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;SACrB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAuB;QAClC,OAAO,eAAe,CAAC,2BAA2B,CAAC,IAAI,CAAC,YAAY,EAAE;YACpE,GAAG,EAAE,QAAQ;YACb,IAAI;YACJ,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;SACrB,CAAC,CAAC;IACL,CAAC;IAED,IAAI;QACF,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAEO,sBAAsB,CAAC,EAAgB;QAC7C,kDAAkD;QAClD,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACjC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACtF,CAAC;YAED,IAAI,OAAO,CAAC,GAAG,KAAK,UAAU,CAAC,eAAe,EAAE,CAAC;gBAC/C,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;gBACpC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnC,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAClH,CAAC;gBAED,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAqC,CAAC;gBACnE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAEjD,EAAE,CAAC,IAAI,CAAe;oBACpB,GAAG,EAAE,UAAU,CAAC,eAAe,GAAG,WAAW;oBAC7C,IAAI,EAAE,MAAM;oBACZ,SAAS;iBACV,CAAC,CAAA;YACJ,CAAC;YAED,IAAI,OAAO,CAAC,GAAG,KAAK,UAAU,CAAC,6BAA6B,EAAE,CAAC;gBAC7D,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;gBACpC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnC,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAClH,CAAC;gBAED,EAAE,CAAC,IAAI,CAAe;oBACpB,GAAG,EAAE,UAAU,CAAC,6BAA6B,GAAG,WAAW;oBAC3D,IAAI,EAAE,EAAE;oBACR,SAAS;iBACV,CAAC,CAAA;YACJ,CAAC;YAED,IAAI,OAAO,CAAC,GAAG,KAAK,UAAU,CAAC,0BAA0B,EAAE,CAAC;gBAC1D,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;gBAE9B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;gBACjD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,IAAI,KAAK,CAAC,+FAA+F,CAAC,CAAC;gBACnH,CAAC;gBAED,EAAE,CAAC,IAAI,CAAe;oBACpB,GAAG,EAAE,UAAU,CAAC,0BAA0B,GAAG,WAAW;oBACxD,IAAI,EAAE,OAAO;oBACb,SAAS;iBACV,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;CAEF"}
1
+ {"version":3,"file":"plugin-process.js","sourceRoot":"","sources":["../src/plugin-process.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,43 @@
1
1
  import { IpcMessageV2 } from 'codify-schemas';
2
2
  import { ChildProcess } from 'node:child_process';
3
- export declare const CodifyTestUtils: {
3
+ export declare const TestUtils: {
4
4
  sendMessageAndAwaitResponse(process: ChildProcess, message: IpcMessageV2): Promise<any>;
5
- ensureHomebrewInstalled(pluginPath: string): Promise<void>;
5
+ ensureHomebrewInstalledOnMacOS(pluginPath: string): Promise<void>;
6
+ ensureXcodeInstalledOnMacOS(pluginPath: string): Promise<void>;
7
+ getShell(): "bash" | "zsh";
8
+ /**
9
+ * Get the primary shell rc file path
10
+ */
11
+ getPrimaryShellRc(): string;
12
+ /**
13
+ * Get the source command for the shell rc file
14
+ * Usage: execSync(TestUtils.getSourceCommand())
15
+ */
16
+ getSourceCommand(): string;
17
+ /**
18
+ * Get shell-specific command to run with sourced environment
19
+ * Usage: execSync(TestUtils.getShellCommand('which brew'))
20
+ */
21
+ getShellCommand(command: string): string;
22
+ /**
23
+ * Get shell name for execSync shell option
24
+ */
25
+ getShellName(): string;
26
+ /**
27
+ * Get interactive shell command
28
+ * Usage: execSync(TestUtils.getInteractiveCommand('my-alias'))
29
+ */
30
+ getInteractiveCommand(command: string): string;
31
+ /**
32
+ * Get which command output format based on shell
33
+ */
34
+ getAliasWhichCommand(aliasName: string): string;
35
+ /**
36
+ * Check if running on macOS
37
+ */
38
+ isMacOS(): boolean;
39
+ /**
40
+ * Check if running on Linux
41
+ */
42
+ isLinux(): boolean;
6
43
  };
@@ -1,12 +1,14 @@
1
1
  import Ajv from 'ajv';
2
- import { IpcMessageSchema, MessageStatus, SpawnStatus } from 'codify-schemas';
3
- import { testSpawn } from './spawn.js';
2
+ import { IpcMessageSchema, MessageStatus, ResourceOs, SpawnStatus } from 'codify-schemas';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
4
5
  import { PluginTester } from './plugin-tester.js';
6
+ import { testSpawn } from './spawn.js';
5
7
  const ajv = new Ajv.default({
6
8
  strict: true
7
9
  });
8
10
  const ipcMessageValidator = ajv.compile(IpcMessageSchema);
9
- export const CodifyTestUtils = {
11
+ export const TestUtils = {
10
12
  sendMessageAndAwaitResponse(process, message) {
11
13
  return new Promise((resolve, reject) => {
12
14
  process.on('message', (response) => {
@@ -27,11 +29,95 @@ export const CodifyTestUtils = {
27
29
  process.send(message);
28
30
  });
29
31
  },
30
- async ensureHomebrewInstalled(pluginPath) {
32
+ async ensureHomebrewInstalledOnMacOS(pluginPath) {
33
+ const homebrewQuery = await testSpawn('which homebrew');
34
+ if (homebrewQuery.status !== SpawnStatus.SUCCESS) {
35
+ await PluginTester.install(pluginPath, [{ type: 'homebrew', os: [ResourceOs.MACOS] }]);
36
+ }
37
+ },
38
+ async ensureXcodeInstalledOnMacOS(pluginPath) {
31
39
  const homebrewQuery = await testSpawn('which homebrew');
32
40
  if (homebrewQuery.status !== SpawnStatus.SUCCESS) {
33
- await PluginTester.install(pluginPath, [{ type: 'homebrew' }]);
41
+ await PluginTester.install(pluginPath, [{ type: 'xcode', os: [ResourceOs.MACOS] }]);
42
+ }
43
+ },
44
+ getShell() {
45
+ const shell = process.env.SHELL || '';
46
+ if (shell.includes('bash')) {
47
+ return 'bash';
48
+ }
49
+ if (shell.includes('zsh')) {
50
+ return 'zsh';
51
+ }
52
+ // Default to bash for tests
53
+ return 'bash';
54
+ },
55
+ /**
56
+ * Get the primary shell rc file path
57
+ */
58
+ getPrimaryShellRc() {
59
+ const shell = TestUtils.getShell();
60
+ const homeDir = os.homedir();
61
+ if (shell === 'bash') {
62
+ return path.join(homeDir, '.bashrc');
63
+ }
64
+ if (shell === 'zsh') {
65
+ return path.join(homeDir, '.zshrc');
34
66
  }
35
- }
67
+ throw new Error('Unsupported shell');
68
+ },
69
+ /**
70
+ * Get the source command for the shell rc file
71
+ * Usage: execSync(TestUtils.getSourceCommand())
72
+ */
73
+ getSourceCommand() {
74
+ return `source ${TestUtils.getPrimaryShellRc()}`;
75
+ },
76
+ /**
77
+ * Get shell-specific command to run with sourced environment
78
+ * Usage: execSync(TestUtils.getShellCommand('which brew'))
79
+ */
80
+ getShellCommand(command) {
81
+ return `${TestUtils.getSourceCommand()}; ${command}`;
82
+ },
83
+ /**
84
+ * Get shell name for execSync shell option
85
+ */
86
+ getShellName() {
87
+ return TestUtils.getShell();
88
+ },
89
+ /**
90
+ * Get interactive shell command
91
+ * Usage: execSync(TestUtils.getInteractiveCommand('my-alias'))
92
+ */
93
+ getInteractiveCommand(command) {
94
+ const shell = TestUtils.getShell();
95
+ return shell === 'bash'
96
+ ? `bash -i -c "${command}"`
97
+ : `zsh -i -c "${command}"`;
98
+ },
99
+ /**
100
+ * Get which command output format based on shell
101
+ */
102
+ getAliasWhichCommand(aliasName) {
103
+ const shell = TestUtils.getShell();
104
+ // zsh outputs: "alias_name: aliased to command"
105
+ // bash outputs: "alias alias_name='command'"
106
+ return shell === 'bash'
107
+ ? `${TestUtils.getShellCommand(`alias ${aliasName}`)}`
108
+ : `${TestUtils.getShellCommand(`which ${aliasName}`)}`;
109
+ },
110
+ /**
111
+ * Check if running on macOS
112
+ */
113
+ isMacOS() {
114
+ return os.platform() === 'darwin';
115
+ },
116
+ /**
117
+ * Check if running on Linux
118
+ */
119
+ isLinux() {
120
+ return os.platform() === 'linux';
121
+ },
36
122
  };
37
123
  //# sourceMappingURL=test-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../src/test-utils.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAgB,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE5F,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;IAC1B,MAAM,EAAE,IAAI;CACb,CAAC,CAAC;AACH,MAAM,mBAAmB,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAE1D,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,2BAA2B,CAAC,OAAqB,EAAE,OAAqB;QACtE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,QAAsB,EAAE,EAAE;gBAC/C,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACnC,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBACtF,CAAC;gBAED,4GAA4G;gBAC5G,IAAI,QAAQ,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;oBAC7C,IAAI,QAAQ,CAAC,MAAM,KAAK,aAAa,CAAC,OAAO,EAAE,CAAC;wBAC9C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;oBACxB,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;oBAC1C,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,2DAA2D;YAC3D,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,UAAkB;QAC9C,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACxD,IAAI,aAAa,CAAC,MAAM,KAAK,WAAW,CAAC,OAAO,EAAE,CAAC;YACjD,MAAM,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;CAEF,CAAC"}
1
+ {"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../src/test-utils.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAgB,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAExG,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;IAC1B,MAAM,EAAE,IAAI;CACb,CAAC,CAAC;AACH,MAAM,mBAAmB,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAE1D,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,2BAA2B,CAAC,OAAqB,EAAE,OAAqB;QACtE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,QAAsB,EAAE,EAAE;gBAC/C,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACnC,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBACtF,CAAC;gBAED,4GAA4G;gBAC5G,IAAI,QAAQ,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;oBAC7C,IAAI,QAAQ,CAAC,MAAM,KAAK,aAAa,CAAC,OAAO,EAAE,CAAC;wBAC9C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;oBACxB,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;oBAC1C,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,2DAA2D;YAC3D,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,8BAA8B,CAAC,UAAkB;QACrD,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACxD,IAAI,aAAa,CAAC,MAAM,KAAK,WAAW,CAAC,OAAO,EAAE,CAAC;YACjD,MAAM,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;QACxF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,2BAA2B,CAAC,UAAkB;QAClD,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACxD,IAAI,aAAa,CAAC,MAAM,KAAK,WAAW,CAAC,OAAO,EAAE,CAAC;YACjD,MAAM,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;QACrF,CAAC;IACH,CAAC;IAGD,QAAQ;QACN,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QAEtC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,4BAA4B;QAC5B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAE7B,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;QACtC,CAAC;QAED,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;IACtC,CAAC;IAED;;;OAGG;IACH,gBAAgB;QACd,OAAO,UAAU,SAAS,CAAC,iBAAiB,EAAE,EAAE,CAAC;IACnD,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,OAAe;QAC7B,OAAO,GAAG,SAAS,CAAC,gBAAgB,EAAE,KAAK,OAAO,EAAE,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,qBAAqB,CAAC,OAAe;QACnC,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;QAEnC,OAAO,KAAK,KAAK,MAAM;YACrB,CAAC,CAAC,eAAe,OAAO,GAAG;YAC3B,CAAC,CAAC,cAAc,OAAO,GAAG,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,SAAiB;QACpC,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;QAEnC,gDAAgD;QAChD,6CAA6C;QAC7C,OAAO,KAAK,KAAK,MAAM;YACrB,CAAC,CAAC,GAAG,SAAS,CAAC,eAAe,CAAC,SAAS,SAAS,EAAE,CAAC,EAAE;YACtD,CAAC,CAAC,GAAG,SAAS,CAAC,eAAe,CAAC,SAAS,SAAS,EAAE,CAAC,EAAE,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,QAAQ,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC;IACnC,CAAC;CACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codify-plugin-test",
3
- "version": "0.0.53-beta16",
3
+ "version": "0.0.53-beta18",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -21,7 +21,7 @@ import * as os from 'node:os';
21
21
  import path from 'node:path';
22
22
 
23
23
  import { spawnSafe } from './spawn.js';
24
- import { CodifyTestUtils } from './test-utils.js';
24
+ import { TestUtils } from './test-utils.js';
25
25
 
26
26
  const ajv = new Ajv.default({
27
27
  strict: true
@@ -64,7 +64,7 @@ export class PluginProcess {
64
64
  }
65
65
 
66
66
  async initialize(): Promise<InitializeResponseData> {
67
- return CodifyTestUtils.sendMessageAndAwaitResponse(this.childProcess, {
67
+ return TestUtils.sendMessageAndAwaitResponse(this.childProcess, {
68
68
  cmd: 'initialize',
69
69
  data: { verbosityLevel: 3 },
70
70
  requestId: nanoid(6),
@@ -72,7 +72,7 @@ export class PluginProcess {
72
72
  }
73
73
 
74
74
  async validate(data: ValidateRequestData): Promise<ValidateResponseData> {
75
- return CodifyTestUtils.sendMessageAndAwaitResponse(this.childProcess, {
75
+ return TestUtils.sendMessageAndAwaitResponse(this.childProcess, {
76
76
  cmd: 'validate',
77
77
  data,
78
78
  requestId: nanoid(6),
@@ -80,7 +80,7 @@ export class PluginProcess {
80
80
  }
81
81
 
82
82
  async plan(data: PlanRequestData): Promise<PlanResponseData> {
83
- return CodifyTestUtils.sendMessageAndAwaitResponse(this.childProcess, {
83
+ return TestUtils.sendMessageAndAwaitResponse(this.childProcess, {
84
84
  cmd: 'plan',
85
85
  data,
86
86
  requestId: nanoid(6),
@@ -88,7 +88,7 @@ export class PluginProcess {
88
88
  }
89
89
 
90
90
  async apply(data: ApplyRequestData): Promise<void> {
91
- return CodifyTestUtils.sendMessageAndAwaitResponse(this.childProcess, {
91
+ return TestUtils.sendMessageAndAwaitResponse(this.childProcess, {
92
92
  cmd: 'apply',
93
93
  data,
94
94
  requestId: nanoid(6),
@@ -96,7 +96,7 @@ export class PluginProcess {
96
96
  }
97
97
 
98
98
  async import(data: ImportRequestData): Promise<ImportResponseData> {
99
- return CodifyTestUtils.sendMessageAndAwaitResponse(this.childProcess, {
99
+ return TestUtils.sendMessageAndAwaitResponse(this.childProcess, {
100
100
  cmd: 'import',
101
101
  data,
102
102
  requestId: nanoid(6),
@@ -1,7 +1,7 @@
1
1
  import { EventEmitter } from 'node:events';
2
2
  import { ChildProcess } from 'node:child_process';
3
3
  import { Readable } from 'stream';
4
- import { CodifyTestUtils } from './test-utils.js';
4
+ import { TestUtils } from './test-utils.js';
5
5
  import { describe, expect, it, vi } from 'vitest';
6
6
  import { MessageStatus } from 'codify-schemas';
7
7
  import { nanoid } from 'nanoid';
@@ -22,7 +22,7 @@ describe('Test Utils tests', async () => {
22
22
  const sendMock = vi.spyOn(process, 'send');
23
23
  const requestId = nanoid(6);
24
24
 
25
- CodifyTestUtils.sendMessageAndAwaitResponse(process, { cmd: 'message', data: 'data', requestId })
25
+ TestUtils.sendMessageAndAwaitResponse(process, { cmd: 'message', data: 'data', requestId })
26
26
 
27
27
  expect(sendMock.mock.calls.length).to.eq(1);
28
28
  expect(sendMock.mock.calls[0][0]).to.deep.eq({ cmd: 'message', data: 'data', requestId });
@@ -38,7 +38,7 @@ describe('Test Utils tests', async () => {
38
38
  // Note that the response must end in _Response. In accordance to the message schema rules.
39
39
  process.emit('message', { cmd: 'message_Response', status: MessageStatus.SUCCESS, data: 'data', requestId })
40
40
  })(),
41
- CodifyTestUtils.sendMessageAndAwaitResponse(process, { cmd: 'message', data: 'data', requestId }),
41
+ TestUtils.sendMessageAndAwaitResponse(process, { cmd: 'message', data: 'data', requestId }),
42
42
  ]);
43
43
 
44
44
  expect(result[1]).to.eq('data')
@@ -54,7 +54,7 @@ describe('Test Utils tests', async () => {
54
54
  // Note that the response must end in _Response. In accordance to the message schema rules.
55
55
  process.emit('message', { cmd: 'message_Response', status: MessageStatus.ERROR, data: 'error message', requestId })
56
56
  })(),
57
- CodifyTestUtils.sendMessageAndAwaitResponse(process, { cmd: 'message', data: 'data', requestId }),
57
+ TestUtils.sendMessageAndAwaitResponse(process, { cmd: 'message', data: 'data', requestId }),
58
58
  ])).rejects.toThrowError(new Error('error message'))
59
59
  });
60
60
 
@@ -70,7 +70,7 @@ describe('Test Utils tests', async () => {
70
70
  process.emit('message', { cmd: 'randomMessage2', status: MessageStatus.SUCCESS, data: 'message2', requestId: nanoid(6) })
71
71
  process.emit('message', { cmd: 'message_Response', status: MessageStatus.SUCCESS, data: 'data', requestId })
72
72
  })(),
73
- CodifyTestUtils.sendMessageAndAwaitResponse(process, { cmd: 'message', data: 'data', requestId }),
73
+ TestUtils.sendMessageAndAwaitResponse(process, { cmd: 'message', data: 'data', requestId }),
74
74
  ]);
75
75
 
76
76
  // Only the final _Response message should be returned.
package/src/test-utils.ts CHANGED
@@ -1,15 +1,18 @@
1
1
  import Ajv from 'ajv';
2
- import { IpcMessageSchema, IpcMessageV2, MessageStatus, SpawnStatus } from 'codify-schemas';
2
+ import { IpcMessageSchema, IpcMessageV2, MessageStatus, ResourceOs, SpawnStatus } from 'codify-schemas';
3
3
  import { ChildProcess } from 'node:child_process';
4
- import { testSpawn } from './spawn.js';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+
5
7
  import { PluginTester } from './plugin-tester.js';
8
+ import { testSpawn } from './spawn.js';
6
9
 
7
10
  const ajv = new Ajv.default({
8
11
  strict: true
9
12
  });
10
13
  const ipcMessageValidator = ajv.compile(IpcMessageSchema);
11
14
 
12
- export const CodifyTestUtils = {
15
+ export const TestUtils = {
13
16
  sendMessageAndAwaitResponse(process: ChildProcess, message: IpcMessageV2): Promise<any> {
14
17
  return new Promise((resolve, reject) => {
15
18
  process.on('message', (response: IpcMessageV2) => {
@@ -32,11 +35,113 @@ export const CodifyTestUtils = {
32
35
  });
33
36
  },
34
37
 
35
- async ensureHomebrewInstalled(pluginPath: string) {
38
+ async ensureHomebrewInstalledOnMacOS(pluginPath: string) {
39
+ const homebrewQuery = await testSpawn('which homebrew');
40
+ if (homebrewQuery.status !== SpawnStatus.SUCCESS) {
41
+ await PluginTester.install(pluginPath, [{ type: 'homebrew', os: [ResourceOs.MACOS] }])
42
+ }
43
+ },
44
+
45
+ async ensureXcodeInstalledOnMacOS(pluginPath: string) {
36
46
  const homebrewQuery = await testSpawn('which homebrew');
37
47
  if (homebrewQuery.status !== SpawnStatus.SUCCESS) {
38
- await PluginTester.install(pluginPath, [{ type: 'homebrew' }])
48
+ await PluginTester.install(pluginPath, [{ type: 'xcode', os: [ResourceOs.MACOS] }])
49
+ }
50
+ },
51
+
52
+
53
+ getShell(): 'bash' | 'zsh' {
54
+ const shell = process.env.SHELL || '';
55
+
56
+ if (shell.includes('bash')) {
57
+ return 'bash';
58
+ }
59
+
60
+ if (shell.includes('zsh')) {
61
+ return 'zsh';
62
+ }
63
+
64
+ // Default to bash for tests
65
+ return 'bash';
66
+ },
67
+
68
+ /**
69
+ * Get the primary shell rc file path
70
+ */
71
+ getPrimaryShellRc(): string {
72
+ const shell = TestUtils.getShell();
73
+ const homeDir = os.homedir();
74
+
75
+ if (shell === 'bash') {
76
+ return path.join(homeDir, '.bashrc')
39
77
  }
40
- }
41
78
 
79
+ if (shell === 'zsh') {
80
+ return path.join(homeDir, '.zshrc');
81
+ }
82
+
83
+ throw new Error('Unsupported shell')
84
+ },
85
+
86
+ /**
87
+ * Get the source command for the shell rc file
88
+ * Usage: execSync(TestUtils.getSourceCommand())
89
+ */
90
+ getSourceCommand(): string {
91
+ return `source ${TestUtils.getPrimaryShellRc()}`;
92
+ },
93
+
94
+ /**
95
+ * Get shell-specific command to run with sourced environment
96
+ * Usage: execSync(TestUtils.getShellCommand('which brew'))
97
+ */
98
+ getShellCommand(command: string): string {
99
+ return `${TestUtils.getSourceCommand()}; ${command}`;
100
+ },
101
+
102
+ /**
103
+ * Get shell name for execSync shell option
104
+ */
105
+ getShellName(): string {
106
+ return TestUtils.getShell();
107
+ },
108
+
109
+ /**
110
+ * Get interactive shell command
111
+ * Usage: execSync(TestUtils.getInteractiveCommand('my-alias'))
112
+ */
113
+ getInteractiveCommand(command: string): string {
114
+ const shell = TestUtils.getShell();
115
+
116
+ return shell === 'bash'
117
+ ? `bash -i -c "${command}"`
118
+ : `zsh -i -c "${command}"`;
119
+ },
120
+
121
+ /**
122
+ * Get which command output format based on shell
123
+ */
124
+ getAliasWhichCommand(aliasName: string): string {
125
+ const shell = TestUtils.getShell();
126
+
127
+ // zsh outputs: "alias_name: aliased to command"
128
+ // bash outputs: "alias alias_name='command'"
129
+ return shell === 'bash'
130
+ ? `${TestUtils.getShellCommand(`alias ${aliasName}`)}`
131
+ : `${TestUtils.getShellCommand(`which ${aliasName}`)}`;
132
+ },
133
+
134
+ /**
135
+ * Check if running on macOS
136
+ */
137
+ isMacOS(): boolean {
138
+ return os.platform() === 'darwin';
139
+ },
140
+
141
+ /**
142
+ * Check if running on Linux
143
+ */
144
+ isLinux(): boolean {
145
+ return os.platform() === 'linux';
146
+ },
42
147
  };