hammerkit 1.5.0-alpha.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/Dockerfile +1 -1
  2. package/build.schema.json +338 -161
  3. package/dist/executer/docker-service.js +1 -1
  4. package/dist/executer/environment-mock.js +6 -3
  5. package/dist/executer/event-cache.js +2 -6
  6. package/dist/executer/execute-docker.js +1 -1
  7. package/dist/executer/execute.spec.js +1 -1
  8. package/dist/executer/execution-steps.js +10 -1
  9. package/dist/executer/get-docker-executor.js +34 -7
  10. package/dist/executer/schedule.js +4 -6
  11. package/dist/executer/start-node.js +11 -3
  12. package/dist/executer/watch-node.js +0 -1
  13. package/dist/index.js +5 -2
  14. package/dist/log.js +35 -30
  15. package/dist/logging/grouped-logger.js +2 -2
  16. package/dist/logging/interactive-logger.js +3 -3
  17. package/dist/logging/live-logger.js +1 -1
  18. package/dist/optimizer/get-work-node-cache-stats.js +8 -2
  19. package/dist/optimizer/work-node-cache-description.js +1 -1
  20. package/dist/parser/default-build-file.js +22 -0
  21. package/dist/parser/parse-build-file-references.js +13 -2
  22. package/dist/parser/parse-build-file.js +37 -3
  23. package/dist/planner/utils/parse-work-service-volume.js +2 -0
  24. package/dist/planner/utils/plan-work-dependency.js +5 -8
  25. package/dist/planner/utils/plan-work-node.js +29 -8
  26. package/dist/planner/utils/plan-work-volume.js +7 -1
  27. package/dist/planner/work-node-status.js +2 -1
  28. package/dist/program.js +23 -22
  29. package/dist/testing/example-test-suite.js +17 -6
  30. package/dist/testing/expect.js +5 -0
  31. package/dist/testing/integration/cache.spec.js +3 -3
  32. package/dist/testing/integration/cancellation.spec.js +1 -1
  33. package/dist/testing/integration/clean.spec.js +1 -1
  34. package/dist/testing/integration/cmd.spec.js +1 -1
  35. package/dist/testing/integration/concurrency.spec.js +1 -1
  36. package/dist/testing/integration/docker.spec.js +1 -1
  37. package/dist/testing/integration/env.spec.js +1 -1
  38. package/dist/testing/integration/error.spec.js +1 -1
  39. package/dist/testing/integration/extend.spec.js +2 -2
  40. package/dist/testing/integration/glob.spec.js +1 -1
  41. package/dist/testing/integration/include.spec.js +1 -1
  42. package/dist/testing/integration/invalid.spec.js +1 -1
  43. package/dist/testing/integration/invalid_loop.spec.js +1 -1
  44. package/dist/testing/integration/kubernetes.spec.js +1 -1
  45. package/dist/testing/integration/labels.spec.js +1 -1
  46. package/dist/testing/integration/local.spec.js +1 -1
  47. package/dist/testing/integration/monorepo.spec.js +1 -1
  48. package/dist/testing/integration/multi-line.spec.js +1 -1
  49. package/dist/testing/integration/reference.spec.js +1 -1
  50. package/dist/testing/integration/services.spec.js +7 -1
  51. package/dist/testing/integration/store.spec.js +2 -2
  52. package/dist/testing/integration/unknown.spec.js +1 -1
  53. package/dist/testing/integration/validate.spec.js +1 -1
  54. package/dist/testing/integration/watch-dependency.spec.js +30 -0
  55. package/dist/testing/integration/watch.spec.js +1 -1
  56. package/dist/utils/empty-writable.js +13 -0
  57. package/logs/cache-console.log +0 -0
  58. package/logs/cache-status.log +6 -0
  59. package/logs/cache-stout.log +0 -0
  60. package/logs/cancellation-console.log +0 -0
  61. package/logs/cancellation-status.log +3 -0
  62. package/logs/cancellation-stout.log +3 -0
  63. package/logs/clean-console.log +0 -0
  64. package/logs/clean-status.log +37 -0
  65. package/logs/clean-stout.log +95 -0
  66. package/logs/cmd-console.log +0 -0
  67. package/logs/cmd-status.log +8 -0
  68. package/logs/cmd-stout.log +9 -0
  69. package/logs/concurrency-console.log +0 -0
  70. package/logs/concurrency-status.log +14 -0
  71. package/logs/concurrency-stout.log +88 -0
  72. package/logs/docker-console.log +0 -0
  73. package/logs/docker-status.log +14 -0
  74. package/logs/docker-stout.log +39 -0
  75. package/logs/env-console.log +1 -0
  76. package/logs/env-status.log +1 -0
  77. package/logs/env-stout.log +0 -0
  78. package/logs/error-console.log +0 -0
  79. package/logs/error-status.log +10 -0
  80. package/logs/error-stout.log +36 -0
  81. package/logs/extend-console.log +0 -0
  82. package/logs/extend-status.log +1 -0
  83. package/logs/extend-stout.log +0 -0
  84. package/logs/glob-console.log +28 -0
  85. package/logs/glob-status.log +23 -0
  86. package/logs/glob-stout.log +52 -0
  87. package/logs/hello-world-node-console.log +0 -0
  88. package/logs/hello-world-node-status.log +37 -0
  89. package/logs/hello-world-node-stout.log +41 -0
  90. package/logs/include-console.log +0 -0
  91. package/logs/include-status.log +3 -0
  92. package/logs/include-stout.log +0 -0
  93. package/logs/invalid-console.log +0 -0
  94. package/logs/invalid-status.log +1 -0
  95. package/logs/invalid-stout.log +0 -0
  96. package/logs/invalid_loop-console.log +0 -0
  97. package/logs/invalid_loop-status.log +1 -0
  98. package/logs/invalid_loop-stout.log +11 -0
  99. package/logs/labels-console.log +0 -0
  100. package/logs/labels-status.log +1 -0
  101. package/logs/labels-stout.log +0 -0
  102. package/logs/local-console.log +0 -0
  103. package/logs/local-status.log +7 -0
  104. package/logs/local-stout.log +8 -0
  105. package/logs/monorepo-console.log +0 -0
  106. package/logs/monorepo-status.log +152 -0
  107. package/logs/monorepo-stout.log +2354 -0
  108. package/logs/multi-line-console.log +0 -0
  109. package/logs/multi-line-status.log +1 -0
  110. package/logs/multi-line-stout.log +0 -0
  111. package/logs/reference-console.log +0 -0
  112. package/logs/reference-status.log +5 -0
  113. package/logs/reference-stout.log +0 -0
  114. package/logs/services-console.log +0 -0
  115. package/logs/services-status.log +129 -0
  116. package/logs/services-stout.log +639 -0
  117. package/logs/store-restore-console.log +0 -0
  118. package/logs/store-restore-status.log +40 -0
  119. package/logs/store-restore-stout.log +97 -0
  120. package/logs/unknown-console.log +3 -0
  121. package/logs/unknown-status.log +1 -0
  122. package/logs/unknown-stout.log +0 -0
  123. package/logs/validate-console.log +0 -0
  124. package/logs/validate-status.log +2 -0
  125. package/logs/validate-stout.log +0 -0
  126. package/logs/watch-console.log +0 -0
  127. package/logs/watch-dependency-console.log +0 -0
  128. package/logs/watch-dependency-status.log +176 -0
  129. package/logs/watch-dependency-stout.log +779 -0
  130. package/logs/watch-status.log +100 -0
  131. package/logs/watch-stout.log +349 -0
  132. package/package.json +1 -1
@@ -15,6 +15,7 @@ const os_1 = require("os");
15
15
  const parse_work_service_volume_1 = require("./parse-work-service-volume");
16
16
  const plan_work_volume_1 = require("./plan-work-volume");
17
17
  const get_container_mounts_1 = require("./get-container-mounts");
18
+ const normalize_path_1 = require("./normalize-path");
18
19
  function planTask(workContext, buildTaskResult) {
19
20
  let extendedTask = null;
20
21
  if (buildTaskResult.task.extend) {
@@ -55,7 +56,7 @@ function planTask(workContext, buildTaskResult) {
55
56
  image: buildTaskResult.task.image ?? extendedTask?.task?.image ?? null,
56
57
  platform: buildTaskResult.task.platform ?? extendedTask?.task?.platform ?? null,
57
58
  mounts: buildTaskResult.task.mounts || extendedTask?.task?.mounts || [],
58
- generates: buildTaskResult.task.generates || extendedTask?.task?.generates || [],
59
+ generates: (buildTaskResult.task.generates || extendedTask?.task?.generates || []).map((g) => mapGenerate(g)),
59
60
  shell: buildTaskResult.task.shell ?? extendedTask?.task?.shell ?? null,
60
61
  ports: buildTaskResult.task.ports || extendedTask?.task?.ports || [],
61
62
  src: buildTaskResult.task.src || extendedTask?.task?.src || [],
@@ -71,6 +72,14 @@ function planTask(workContext, buildTaskResult) {
71
72
  };
72
73
  }
73
74
  exports.planTask = planTask;
75
+ function mapGenerate(generate) {
76
+ if (typeof generate === 'string') {
77
+ return { path: generate, resetOnChange: false };
78
+ }
79
+ else {
80
+ return { path: generate.path, resetOnChange: generate.resetOnChange ?? false };
81
+ }
82
+ }
74
83
  function findBuildTask(context, selector) {
75
84
  if (context.build.tasks[selector.taskName]) {
76
85
  return { task: context.build.tasks[selector.taskName], context, name: selector.taskName };
@@ -147,16 +156,16 @@ function parseWorkNode(id, task, context) {
147
156
  caching: task.cache ?? null,
148
157
  };
149
158
  if (task.image) {
150
- const mounts = parseContainerWorkNodeMount(task, context, task.envs);
159
+ const mounts = (0, get_container_mounts_1.getContainerMounts)(baseWorkNode, parseContainerWorkNodeMount(task, context, task.envs));
151
160
  return {
152
161
  ...baseWorkNode,
153
162
  type: 'container',
154
163
  user: getContainerUser(),
155
164
  image: (0, template_value_1.templateValue)(task.image, task.envs),
156
165
  shell: (0, template_value_1.templateValue)(task.shell, task.envs) || '/bin/sh',
157
- mounts: (0, get_container_mounts_1.getContainerMounts)(baseWorkNode, mounts),
166
+ mounts,
158
167
  ports: parseContainerWorkNodePorts(task, context, task.envs),
159
- volumes: (0, plan_work_volume_1.getContainerVolumes)(baseWorkNode),
168
+ volumes: (0, plan_work_volume_1.getContainerVolumes)(baseWorkNode, mounts),
160
169
  };
161
170
  }
162
171
  else {
@@ -171,12 +180,24 @@ function parseContainerWorkNodePorts(task, context, envs) {
171
180
  }
172
181
  exports.parseContainerWorkNodePorts = parseContainerWorkNodePorts;
173
182
  function parseContainerWorkNodeMount(task, context, envs) {
174
- return task.mounts.map((m) => (0, template_value_1.templateValue)(m, envs)).map((m) => (0, parse_work_node_mount_1.parseWorkNodeMount)(context.cwd, m));
183
+ const mounts = task.mounts.map((m) => (0, template_value_1.templateValue)(m, envs)).map((m) => (0, parse_work_node_mount_1.parseWorkNodeMount)(context.cwd, m));
184
+ const fileGenerates = task.generates
185
+ .filter((g) => (0, path_1.extname)(g.path).length > 1)
186
+ .map((g) => {
187
+ const path = (0, normalize_path_1.normalizePath)(context.cwd, context.cwd, (0, template_value_1.templateValue)(g.path, envs));
188
+ return {
189
+ localPath: path,
190
+ containerPath: path,
191
+ };
192
+ });
193
+ return [...mounts, ...fileGenerates];
175
194
  }
176
195
  function parseLocalWorkNodeGenerate(task, context, envs) {
177
- return getAbsolutePaths(task.generates, context.cwd)
178
- .map((g) => (0, template_value_1.templateValue)(g, envs))
179
- .map((path) => ({ path, inherited: false }));
196
+ return task.generates.map((g) => ({
197
+ path: (0, path_1.join)(context.cwd, (0, template_value_1.templateValue)(g.path, envs)),
198
+ resetOnChange: g.resetOnChange ?? false,
199
+ inherited: false,
200
+ }));
180
201
  }
181
202
  function parseLocalWorkNodeSource(task, context, envs) {
182
203
  return task.src
@@ -10,13 +10,19 @@ function getVolumeName(generate) {
10
10
  return `hammerkit-${generateId(generate)}`;
11
11
  }
12
12
  exports.getVolumeName = getVolumeName;
13
- function getContainerVolumes(task) {
13
+ function getContainerVolumes(task, mounts) {
14
14
  const volumes = [];
15
15
  for (const generate of task.generates) {
16
+ const hasMount = mounts.some((m) => m.containerPath === generate.path);
17
+ if (hasMount) {
18
+ continue;
19
+ }
16
20
  const name = getVolumeName(generate.path);
17
21
  volumes.push({
22
+ resetOnChange: generate.resetOnChange,
18
23
  name,
19
24
  containerPath: generate.path,
25
+ inherited: generate.inherited,
20
26
  });
21
27
  }
22
28
  return volumes;
@@ -54,12 +54,13 @@ class BufferContext {
54
54
  }
55
55
  }
56
56
  }
57
- function statusConsole() {
57
+ function statusConsole(writable) {
58
58
  const statusBuffer = new BufferContext(StatusBufferMax);
59
59
  const consoleBuffer = new BufferContext(ConsoleBufferMax);
60
60
  const emit = (0, emitter_1.emitter)();
61
61
  function addMessage(context, message) {
62
62
  emit.emit(message);
63
+ writable.write(JSON.stringify({ context, message }) + '\n');
63
64
  if (message.type === 'console') {
64
65
  consoleBuffer.add(context.id, message);
65
66
  }
package/dist/program.js CHANGED
@@ -11,6 +11,7 @@ const work_scope_1 = require("./executer/work-scope");
11
11
  const get_work_context_1 = require("./get-work-context");
12
12
  const log_1 = require("./log");
13
13
  const label_values_1 = require("./executer/label-values");
14
+ const default_build_file_1 = require("./parser/default-build-file");
14
15
  async function createCli(fileName, environment, workScope) {
15
16
  const buildFile = await (0, get_build_file_1.getBuildFile)(fileName, environment);
16
17
  const workTree = (0, get_work_context_1.getWorkScope)(buildFile, workScope, environment);
@@ -39,7 +40,7 @@ async function getProgram(environment, argv) {
39
40
  const program = new commander_1.Command();
40
41
  const args = [...argv];
41
42
  const fileIndex = args.indexOf('--file');
42
- const fileName = (0, path_1.join)(environment.cwd, fileIndex >= 0 ? args[fileIndex + 1] : 'build.yaml');
43
+ const fileName = (0, path_1.join)(environment.cwd, fileIndex >= 0 ? args[fileIndex + 1] : await (0, default_build_file_1.getDefaultBuildFilename)(environment.cwd, environment));
43
44
  if (fileIndex >= 0) {
44
45
  args.splice(fileIndex, 2);
45
46
  }
@@ -55,52 +56,52 @@ async function getProgram(environment, argv) {
55
56
  const tasks = items.filter(cli_1.isCliTask);
56
57
  const services = items.filter(cli_1.isCliService);
57
58
  if (services.length > 0) {
58
- (0, log_1.printTitle)('Services');
59
+ (0, log_1.printTitle)(environment, 'Services');
59
60
  for (const node of services) {
60
- (0, log_1.printItem)(node.item);
61
- (0, log_1.printProperty)('ports', node.item.ports.map((p) => `127.0.0.1:${p.hostPort} -> ${p.containerPort}`).join(', '));
61
+ (0, log_1.printItem)(environment, node.item);
62
+ (0, log_1.printProperty)(environment, 'ports', node.item.ports.map((p) => `127.0.0.1:${p.hostPort} -> ${p.containerPort}`).join(', '));
62
63
  if (node.item.type === 'kubernetes-service') {
63
- (0, log_1.printProperty)('context', node.item.context);
64
- (0, log_1.printProperty)('selector', `${node.item.selector.type}/${node.item.selector.name}`);
64
+ (0, log_1.printProperty)(environment, 'context', node.item.context);
65
+ (0, log_1.printProperty)(environment, 'selector', `${node.item.selector.type}/${node.item.selector.name}`);
65
66
  }
66
67
  else {
67
- (0, log_1.printProperty)('image', node.item.image);
68
+ (0, log_1.printProperty)(environment, 'image', node.item.image);
68
69
  }
69
70
  }
70
71
  }
71
72
  if (tasks.length > 0 && services.length > 0) {
72
- process.stdout.write('\n');
73
+ environment.stdout.write('\n');
73
74
  }
74
75
  if (tasks.length > 0) {
75
- (0, log_1.printTitle)('Tasks');
76
+ (0, log_1.printTitle)(environment, 'Tasks');
76
77
  for (const node of tasks) {
77
- (0, log_1.printItem)(node.item);
78
+ (0, log_1.printItem)(environment, node.item);
78
79
  if (node.item.needs.length > 0) {
79
- (0, log_1.printProperty)('needs', node.item.needs.map((d) => d.name).join(', '));
80
+ (0, log_1.printProperty)(environment, 'needs', node.item.needs.map((d) => d.name).join(', '));
80
81
  }
81
82
  if (node.item.deps.length > 0) {
82
- (0, log_1.printProperty)('deps', node.item.deps.map((d) => d.name).join(', '));
83
+ (0, log_1.printProperty)(environment, 'deps', node.item.deps.map((d) => d.name).join(', '));
83
84
  }
84
85
  if (node.item.type === 'container') {
85
- (0, log_1.printProperty)('image', node.item.image);
86
+ (0, log_1.printProperty)(environment, 'image', node.item.image);
86
87
  }
87
88
  if (node.item.caching) {
88
- (0, log_1.printProperty)('caching', node.item.caching);
89
+ (0, log_1.printProperty)(environment, 'caching', node.item.caching);
89
90
  }
90
91
  if ((0, label_values_1.hasLabels)(node.item.labels)) {
91
- (0, log_1.printProperty)('labels', `${Object.keys(node.item.labels)
92
+ (0, log_1.printProperty)(environment, 'labels', `${Object.keys(node.item.labels)
92
93
  .map((key) => `${key}=${node.item.labels[key].join(',')}`)
93
94
  .join(' ')}`);
94
95
  }
95
96
  if (node.item.src.length > 0) {
96
- (0, log_1.printProperty)('src', node.item.src.map((d) => (0, path_1.relative)(node.item.cwd, d.absolutePath)).join(' '));
97
+ (0, log_1.printProperty)(environment, 'src', node.item.src.map((d) => (0, path_1.relative)(node.item.cwd, d.absolutePath)).join(' '));
97
98
  }
98
99
  if (node.item.generates.length > 0) {
99
- (0, log_1.printProperty)('generates', node.item.generates.map((d) => (0, path_1.relative)(node.item.cwd, d.path)).join(' '));
100
+ (0, log_1.printProperty)(environment, 'generates', node.item.generates.map((d) => (0, path_1.relative)(node.item.cwd, d.path)).join(' '));
100
101
  }
101
102
  }
102
103
  }
103
- process.stdout.write('\n');
104
+ environment.stdout.write('\n');
104
105
  });
105
106
  program
106
107
  .command('clean')
@@ -134,7 +135,7 @@ async function getProgram(environment, argv) {
134
135
  });
135
136
  program
136
137
  .command('validate')
137
- .description('validate build.yaml')
138
+ .description('validate hammerkit configurations')
138
139
  .addOption(new commander_1.Option('-f, --filter <labels...>', 'filter task and services with labels'))
139
140
  .addOption(new commander_1.Option('-e, --exclude <labels...>', 'exclude task and services with labels'))
140
141
  .action(async (options) => {
@@ -150,7 +151,7 @@ async function getProgram(environment, argv) {
150
151
  }
151
152
  }
152
153
  if (errors !== 0) {
153
- program.error('Detected errors in your build.yaml', { exitCode: 1 });
154
+ program.error('Detected errors in the hammerkit configuration', { exitCode: 1 });
154
155
  }
155
156
  });
156
157
  program
@@ -196,7 +197,7 @@ async function getProgram(environment, argv) {
196
197
  }
197
198
  program
198
199
  .command('init')
199
- .description('creates default build.yaml')
200
+ .description('creates default .hammerkit.yaml')
200
201
  .action(async () => {
201
202
  const content = `envs: {}
202
203
 
@@ -213,7 +214,7 @@ tasks:
213
214
  // eslint-disable-next-line @typescript-eslint/no-var-requires
214
215
  program.version(require('../package.json').version);
215
216
  program.option('--verbose', 'log debugging information', false);
216
- program.option('--file', 'set build file', 'build.yaml');
217
+ program.option('--file', 'set build file', '.hammerkit.yaml');
217
218
  program.configureOutput({
218
219
  writeOut: (str) => environment.console.info(str),
219
220
  writeErr: (str) => environment.console.error(str),
@@ -3,12 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ExampleTestSuite = void 0;
4
4
  const path_1 = require("path");
5
5
  const get_file_context_1 = require("../file/get-file-context");
6
- const console_context_mock_1 = require("../console/console-context-mock");
7
6
  const work_node_status_1 = require("../planner/work-node-status");
8
7
  const program_1 = require("../program");
9
8
  const execute_docker_1 = require("../executer/execute-docker");
9
+ const fs_1 = require("fs");
10
+ const log_1 = require("../log");
10
11
  class ExampleTestSuite {
11
12
  constructor(exampleName, files) {
13
+ this.exampleName = exampleName;
12
14
  this.files = files;
13
15
  this.tests = [];
14
16
  this.exampleDirectory = (0, path_1.join)(__dirname, '../../examples/', exampleName);
@@ -23,27 +25,36 @@ class ExampleTestSuite {
23
25
  async setup(scope) {
24
26
  await this.file.remove(this.path);
25
27
  await this.file.createDirectory(this.path);
28
+ const logPath = (0, path_1.join)(process.cwd(), 'logs');
29
+ const stdoutFile = (0, path_1.join)(logPath, this.exampleName + '-stout.log');
30
+ const statusFile = (0, path_1.join)(logPath, this.exampleName + '-status.log');
31
+ const consoleFile = (0, path_1.join)(logPath, this.exampleName + '-console.log');
32
+ await this.file.createDirectory(logPath);
33
+ await this.file.remove(stdoutFile);
34
+ await this.file.remove(statusFile);
35
+ await this.file.remove(consoleFile);
26
36
  const environment = {
27
37
  processEnvs: { ...process.env, ...(scope.envs ?? {}) },
28
38
  abortCtrl: new AbortController(),
29
39
  cwd: this.path,
30
40
  file: this.file,
31
- console: (0, console_context_mock_1.consoleContextMock)(),
32
- status: (0, work_node_status_1.statusConsole)(),
41
+ console: (0, log_1.consoleContext)((0, fs_1.createWriteStream)(consoleFile)),
42
+ status: (0, work_node_status_1.statusConsole)((0, fs_1.createWriteStream)(statusFile)),
33
43
  docker: (0, execute_docker_1.getContainerCli)(),
44
+ stdout: (0, fs_1.createWriteStream)(stdoutFile),
45
+ stdoutColumns: 80,
34
46
  };
35
47
  for (const file of this.files) {
36
48
  await this.file.copy((0, path_1.join)(this.exampleDirectory, file), (0, path_1.join)(this.path, file));
37
49
  }
38
- const fileName = (0, path_1.join)(this.path, 'build.yaml');
50
+ const fileName = (0, path_1.join)(this.path, '.hammerkit.yaml');
39
51
  this.tests.push({
40
52
  cwd: this.path,
41
53
  });
42
54
  const cli = await (0, program_1.createCli)(fileName, environment, scope);
43
55
  await cli.clean({ service: true });
44
56
  // reset cli clean stats
45
- environment.console = (0, console_context_mock_1.consoleContextMock)();
46
- environment.status = (0, work_node_status_1.statusConsole)();
57
+ environment.status = (0, work_node_status_1.statusConsole)((0, fs_1.createWriteStream)(statusFile, { flags: 'a' }));
47
58
  return {
48
59
  cli,
49
60
  environment,
@@ -24,6 +24,11 @@ async function expectSuccessfulResult(result, env) {
24
24
  }
25
25
  }
26
26
  }
27
+ const status = Array.from(env.status.read());
28
+ const errorStatus = status
29
+ .filter((s) => s.level === 'warn' || s.level === 'error')
30
+ .map((s) => `${s.context.type}:${s.context.name} - ${s.level} ${s.message}`);
31
+ expect(errorStatus).toEqual([]);
27
32
  }
28
33
  exports.expectSuccessfulResult = expectSuccessfulResult;
29
34
  function getNodeState(state, name) {
@@ -8,7 +8,7 @@ const path_1 = require("path");
8
8
  const enqueue_next_1 = require("../../executer/scheduler/enqueue-next");
9
9
  const read_build_file_1 = require("../../parser/read-build-file");
10
10
  describe('cache', () => {
11
- const suite = (0, get_test_suite_1.getTestSuite)('cache', ['build.yaml', 'package.json', 'package-lock.json']);
11
+ const suite = (0, get_test_suite_1.getTestSuite)('cache', ['.hammerkit.yaml', 'package.json', 'package-lock.json']);
12
12
  afterAll(() => suite.close());
13
13
  async function testCache(action, expectInvalidate) {
14
14
  const setupBefore = await suite.setup({ taskName: 'example' });
@@ -41,9 +41,9 @@ describe('cache', () => {
41
41
  });
42
42
  it('should invalid cache on image change', async () => {
43
43
  await testCache(async (environment) => {
44
- const buildFile = await (0, read_build_file_1.read)('build.yaml', environment);
44
+ const buildFile = await (0, read_build_file_1.read)('.hammerkit.yaml', environment);
45
45
  buildFile.tasks['example'].image = '15.0.0';
46
- await (0, read_build_file_1.write)('build.yaml', buildFile, environment);
46
+ await (0, read_build_file_1.write)('.hammerkit.yaml', buildFile, environment);
47
47
  }, true);
48
48
  });
49
49
  });
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const path_1 = require("path");
4
4
  const get_test_suite_1 = require("../get-test-suite");
5
5
  describe('cancellation', () => {
6
- const suite = (0, get_test_suite_1.getTestSuite)('cancellation', ['build.yaml']);
6
+ const suite = (0, get_test_suite_1.getTestSuite)('cancellation', ['.hammerkit.yaml']);
7
7
  afterAll(() => suite.close());
8
8
  async function testAbort(taskName, expectedState) {
9
9
  const { cli, environment } = await suite.setup({ taskName });
@@ -7,7 +7,7 @@ const get_test_suite_1 = require("../get-test-suite");
7
7
  const get_docker_executor_1 = require("../../executer/get-docker-executor");
8
8
  const plan_work_volume_1 = require("../../planner/utils/plan-work-volume");
9
9
  describe('clean', () => {
10
- const suite = (0, get_test_suite_1.getTestSuite)('clean', ['build.yaml', 'package.json']);
10
+ const suite = (0, get_test_suite_1.getTestSuite)('clean', ['.hammerkit.yaml', 'package.json']);
11
11
  afterAll(() => suite.close());
12
12
  it('should clean generated outputs locally', async () => {
13
13
  const { cli, environment } = await suite.setup({ taskName: 'example' });
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const expect_1 = require("../expect");
4
4
  const get_test_suite_1 = require("../get-test-suite");
5
5
  describe('cmd', () => {
6
- const suite = (0, get_test_suite_1.getTestSuite)('cmd', ['build.yaml', 'sub/README.md']);
6
+ const suite = (0, get_test_suite_1.getTestSuite)('cmd', ['.hammerkit.yaml', 'sub/README.md']);
7
7
  afterAll(() => suite.close());
8
8
  it('should run with path arg', async () => {
9
9
  const { cli, environment } = await suite.setup({ taskName: 'example' });
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const expect_1 = require("../expect");
4
4
  const get_test_suite_1 = require("../get-test-suite");
5
5
  describe('concurrency', () => {
6
- const suite = (0, get_test_suite_1.getTestSuite)('concurrency', ['build.yaml']);
6
+ const suite = (0, get_test_suite_1.getTestSuite)('concurrency', ['.hammerkit.yaml']);
7
7
  afterAll(() => suite.close());
8
8
  it('should run with concurrency lower than total tasks', async () => {
9
9
  const { cli, environment } = await suite.setup({ taskName: 'example' });
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const expect_1 = require("../expect");
4
4
  const get_test_suite_1 = require("../get-test-suite");
5
5
  describe('docker', () => {
6
- const suite = (0, get_test_suite_1.getTestSuite)('docker', ['build.yaml']);
6
+ const suite = (0, get_test_suite_1.getTestSuite)('docker', ['.hammerkit.yaml']);
7
7
  afterAll(() => suite.close());
8
8
  it('should pull docker image', async () => {
9
9
  const { cli, environment } = await suite.setup({ taskName: 'example' });
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const expect_1 = require("../expect");
4
4
  const get_test_suite_1 = require("../get-test-suite");
5
5
  describe('env', () => {
6
- const suite = (0, get_test_suite_1.getTestSuite)('env', ['build.yaml', '.env']);
6
+ const suite = (0, get_test_suite_1.getTestSuite)('env', ['.hammerkit.yaml', '.env']);
7
7
  afterAll(() => suite.close());
8
8
  it('should use env from build file', async () => {
9
9
  const { cli, environment } = await suite.setup({ taskName: 'example' });
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const get_test_suite_1 = require("../get-test-suite");
4
4
  describe('error', () => {
5
- const suite = (0, get_test_suite_1.getTestSuite)('error', ['build.yaml']);
5
+ const suite = (0, get_test_suite_1.getTestSuite)('error', ['.hammerkit.yaml']);
6
6
  afterAll(() => suite.close());
7
7
  it('should return error when local task failed', async () => {
8
8
  const { cli } = await suite.setup({ taskName: 'local_error' });
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const get_test_suite_1 = require("../get-test-suite");
4
4
  describe('extend', () => {
5
- const suite = (0, get_test_suite_1.getTestSuite)('extend', ['build.yaml']);
5
+ const suite = (0, get_test_suite_1.getTestSuite)('extend', ['.hammerkit.yaml']);
6
6
  afterAll(() => suite.close());
7
7
  it('should merge env variables', async () => {
8
8
  const { cli } = await suite.setup({ taskName: 'extend_env' });
@@ -20,7 +20,7 @@ describe('extend', () => {
20
20
  });
21
21
  expect(node.type).toBe('container');
22
22
  if (node.type === 'container') {
23
- expect(node.image).toBe('alpine');
23
+ expect(node.image).toBe('alpine:latest');
24
24
  }
25
25
  });
26
26
  it('should merge deps', async () => {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const get_test_suite_1 = require("../get-test-suite");
4
4
  const expect_1 = require("../expect");
5
5
  describe('glob', () => {
6
- const suite = (0, get_test_suite_1.getTestSuite)('glob', ['build.yaml', 'test.md', 'test.txt']);
6
+ const suite = (0, get_test_suite_1.getTestSuite)('glob', ['.hammerkit.yaml', 'test.md', 'test.txt']);
7
7
  afterAll(() => suite.close());
8
8
  async function testCache(expectInvalidate, action) {
9
9
  const { cli, environment } = await suite.setup({ taskName: 'example' });
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const expect_1 = require("../expect");
4
4
  const get_test_suite_1 = require("../get-test-suite");
5
5
  describe('include', () => {
6
- const suite = (0, get_test_suite_1.getTestSuite)('include', ['build.yaml', 'foo', 'foobar.txt']);
6
+ const suite = (0, get_test_suite_1.getTestSuite)('include', ['.hammerkit.yaml', 'foo', 'foobar.txt']);
7
7
  afterAll(() => suite.close());
8
8
  it('should run included task', async () => {
9
9
  const { cli, environment } = await suite.setup({ taskName: 'example' });
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const get_test_suite_1 = require("../get-test-suite");
4
4
  const work_scope_1 = require("../../executer/work-scope");
5
5
  describe('invalid', () => {
6
- const suite = (0, get_test_suite_1.getTestSuite)('invalid', ['build.yaml']);
6
+ const suite = (0, get_test_suite_1.getTestSuite)('invalid', ['.hammerkit.yaml']);
7
7
  afterAll(() => suite.close());
8
8
  it('should throw on invalid yaml', async () => {
9
9
  try {
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const get_test_suite_1 = require("../get-test-suite");
4
4
  describe('invalid', () => {
5
- const suite = (0, get_test_suite_1.getTestSuite)('invalid_loop', ['build.yaml']);
5
+ const suite = (0, get_test_suite_1.getTestSuite)('invalid_loop', ['.hammerkit.yaml']);
6
6
  afterAll(() => suite.close());
7
7
  it('should detect loop in execution', async () => {
8
8
  const { cli } = await suite.setup({ taskName: 'foo' });
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const get_test_suite_1 = require("../get-test-suite");
4
4
  const expect_1 = require("../expect");
5
5
  describe('kubernetes', () => {
6
- const suite = (0, get_test_suite_1.getTestSuite)('kubernetes', ['index.js', 'package.json', 'package-lock.json', 'build.yaml']);
6
+ const suite = (0, get_test_suite_1.getTestSuite)('kubernetes', ['index.js', 'package.json', 'package-lock.json', '.hammerkit.yaml']);
7
7
  afterAll(() => suite.close());
8
8
  // CI setup missing
9
9
  xit('should forward deployment', async () => {
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const get_test_suite_1 = require("../get-test-suite");
4
4
  describe('local', () => {
5
- const suite = (0, get_test_suite_1.getTestSuite)('labels', ['build.yaml']);
5
+ const suite = (0, get_test_suite_1.getTestSuite)('labels', ['.hammerkit.yaml']);
6
6
  afterAll(() => suite.close());
7
7
  it('should run only run labeled task with app=bar and dependencies', async () => {
8
8
  const { cli } = await suite.setup({
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const expect_1 = require("../expect");
4
4
  const get_test_suite_1 = require("../get-test-suite");
5
5
  describe('local', () => {
6
- const suite = (0, get_test_suite_1.getTestSuite)('local', ['build.yaml']);
6
+ const suite = (0, get_test_suite_1.getTestSuite)('local', ['.hammerkit.yaml']);
7
7
  afterAll(() => suite.close());
8
8
  it('should run local task', async () => {
9
9
  const { cli, environment } = await suite.setup({ taskName: 'example' });
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const expect_1 = require("../expect");
4
4
  const get_test_suite_1 = require("../get-test-suite");
5
5
  describe('monorepo', () => {
6
- const suite = (0, get_test_suite_1.getTestSuite)('monorepo', ['build.yaml', 'projects', 'build.npm.yaml', 'build.tsc.yaml']);
6
+ const suite = (0, get_test_suite_1.getTestSuite)('monorepo', ['.hammerkit.yaml', 'projects', 'build.npm.yaml', 'build.tsc.yaml']);
7
7
  afterAll(() => suite.close());
8
8
  it('should build and clean monorepo', async () => {
9
9
  const { cli, environment } = await suite.setup({ taskName: 'build' });
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const get_test_suite_1 = require("../get-test-suite");
4
4
  describe('multi-line', () => {
5
- const suite = (0, get_test_suite_1.getTestSuite)('multi-line', ['build.yaml']);
5
+ const suite = (0, get_test_suite_1.getTestSuite)('multi-line', ['.hammerkit.yaml']);
6
6
  afterAll(() => suite.close());
7
7
  it('should get multi lines', async () => {
8
8
  const { cli } = await suite.setup({ taskName: 'example' });
@@ -4,7 +4,7 @@ const expect_1 = require("../expect");
4
4
  const get_test_suite_1 = require("../get-test-suite");
5
5
  const work_scope_1 = require("../../executer/work-scope");
6
6
  describe('reference', () => {
7
- const suite = (0, get_test_suite_1.getTestSuite)('reference', ['build.yaml', 'foo']);
7
+ const suite = (0, get_test_suite_1.getTestSuite)('reference', ['.hammerkit.yaml', 'foo']);
8
8
  afterAll(() => suite.close());
9
9
  it('should run included task', async () => {
10
10
  const { cli, environment } = await suite.setup({ taskName: 'example' });
@@ -3,7 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const get_test_suite_1 = require("../get-test-suite");
4
4
  const expect_1 = require("../expect");
5
5
  describe('services', () => {
6
- const suite = (0, get_test_suite_1.getTestSuite)('services', ['index.js', 'config.json', 'package.json', 'package-lock.json', 'build.yaml']);
6
+ const suite = (0, get_test_suite_1.getTestSuite)('services', [
7
+ 'index.js',
8
+ 'config.json',
9
+ 'package.json',
10
+ 'package-lock.json',
11
+ '.hammerkit.yaml',
12
+ ]);
7
13
  afterAll(() => suite.close());
8
14
  it('should run service', async () => {
9
15
  const { cli, environment } = await suite.setup({ taskName: 'api' });
@@ -5,7 +5,7 @@ const get_test_suite_1 = require("../get-test-suite");
5
5
  const fs_1 = require("fs");
6
6
  const expect_1 = require("../expect");
7
7
  describe('store/restore', () => {
8
- const suite = (0, get_test_suite_1.getTestSuite)('store-restore', ['build.yaml', 'package.json']);
8
+ const suite = (0, get_test_suite_1.getTestSuite)('store-restore', ['.hammerkit.yaml', 'package.json']);
9
9
  afterAll(() => suite.close());
10
10
  it('should clean and restore created outputs locally', async () => {
11
11
  const { cli, environment } = await suite.setup({ taskName: 'example' });
@@ -48,6 +48,6 @@ describe('store/restore', () => {
48
48
  if (nodeState.type === 'completed') {
49
49
  expect(nodeState.cached).toBeTruthy();
50
50
  }
51
- });
51
+ }, 90000);
52
52
  });
53
53
  //# sourceMappingURL=store.spec.js.map
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  require("jest-extended");
4
4
  const get_test_suite_1 = require("../get-test-suite");
5
5
  describe('unknown', () => {
6
- const suite = (0, get_test_suite_1.getTestSuite)('unknown', ['build.yaml']);
6
+ const suite = (0, get_test_suite_1.getTestSuite)('unknown', ['.hammerkit.yaml']);
7
7
  afterAll(() => suite.close());
8
8
  async function validateTask(name, expectedErrors) {
9
9
  const { cli } = await suite.setup({ taskName: name });
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  require("jest-extended");
4
4
  const get_test_suite_1 = require("../get-test-suite");
5
5
  describe('validate', () => {
6
- const suite = (0, get_test_suite_1.getTestSuite)('validate', ['build.yaml', 'build-loop.yaml']);
6
+ const suite = (0, get_test_suite_1.getTestSuite)('validate', ['.hammerkit.yaml', 'build-loop.yaml']);
7
7
  async function validateTask(name, expectedErrors) {
8
8
  const { cli } = await suite.setup({ taskName: name });
9
9
  let i = 0;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const get_test_suite_1 = require("../get-test-suite");
4
+ describe('watch-dependency', () => {
5
+ const suite = (0, get_test_suite_1.getTestSuite)('watch-dependency', ['.hammerkit.yaml', 'source.txt']);
6
+ afterAll(() => suite.close());
7
+ it('should run watch task', async () => {
8
+ const { cli, environment } = await suite.setup({ taskName: 'third' });
9
+ const thirdNode = cli.node('third');
10
+ const exec = cli.execWatch({ watch: true });
11
+ let content = '';
12
+ let changed = false;
13
+ exec.processManager.on(async (evt) => {
14
+ if (evt.type === 'ended' && evt.context.id === thirdNode.id) {
15
+ if (changed) {
16
+ content = await environment.file.read('third.txt');
17
+ environment.abortCtrl.abort();
18
+ }
19
+ else {
20
+ await environment.file.appendFile('source.txt', 'world\n');
21
+ changed = true;
22
+ }
23
+ }
24
+ });
25
+ const result = await exec.start();
26
+ expect(result.success).toBeTruthy();
27
+ expect(content).toEqual('hello\nworld\nfirst step\nsecond step\nthird step\n');
28
+ });
29
+ });
30
+ //# sourceMappingURL=watch-dependency.spec.js.map
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const get_test_suite_1 = require("../get-test-suite");
4
4
  const path_1 = require("path");
5
5
  describe('watch', () => {
6
- const suite = (0, get_test_suite_1.getTestSuite)('watch', ['build.yaml', 'src', 'package.json', 'package-lock.json', 'tsconfig.json']);
6
+ const suite = (0, get_test_suite_1.getTestSuite)('watch', ['.hammerkit.yaml', 'src', 'package.json', 'package-lock.json', 'tsconfig.json']);
7
7
  afterAll(() => suite.close());
8
8
  it('should run watch task and cancel', async () => {
9
9
  const { cli, environment } = await suite.setup({ taskName: 'api' });