Skip to content
Last updated

Experience review 48

What made you smile?

We created a rule for missed outputs for Arazzo files, which we wouldn't have done this issue.

export default () => ({
  id: "x-security",
  rules: {
    arazzo1: {
      "step-outputs": () => {
        let steps = {};
        return {
          Workflow: {
            enter: () => {
              steps = {};
            },
            Step: {
              enter: (step, ctx) => {
                steps[step.stepId] = step;
              },
              leave: (step, ctx) => {
                step["x-security"].forEach((security, index) => {
                  const { values, scheme } = security;

                  for (const key in values) {
                    const value = values[key];
                    if (value.startsWith("$steps.")) {
                      const [, stepName, maybeOutputs, outputName] =
                        value.split(".");

                      if (
                        maybeOutputs === "outputs" &&
                        steps[stepName].outputs?.[outputName] === undefined
                      ) {
                        ctx.report({
                          message: `"${outputName}" output is not defined at step "${stepName}".`,
                          location: ctx.location
                            .child("x-security")
                            .child(index)
                            .child("values")
                            .child(key),
                        });
                      }
                    }
                  }

                  for (const key in scheme) {
                    const value = scheme[key];
                    if (value.startsWith("$steps.")) {
                      const [, stepName, maybeOutputs, outputName] =
                        value.split(".");

                      if (
                        maybeOutputs === "outputs" &&
                        steps[stepName].outputs?.[outputName] === undefined
                      ) {
                        ctx.report({
                          message: `"${outputName}" output is not defined at step "${stepName}".`,
                          location: ctx.location
                            .child("x-security")
                            .child(index)
                            .child("scheme")
                            .child(key),
                        });
                      }
                    }
                  }
                });
              },
            },
          },
        };
      },
    },
  },
});
extends:
  - recommended
plugins:
  - x-security.mjs
rules:
  x-security/step-outputs: error

But overall, the features work wonderfully. Good job!

What did you find confusing?

  1. Missed validation for outputs in Arazzo. We forgot to add outputs to the previous step, and we didn't receive an error about that. Instead, we received a missed required value error.
image copy 13.pngimage copy 14.png