/
verify.js
133 lines (121 loc) · 3.71 KB
/
verify.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import { createTask, transitionTo } from '../lib/tasks';
import listingStories from '../ui/messages/info/listingStories';
import storybookPublished from '../ui/messages/info/storybookPublished';
import buildLimited from '../ui/messages/warnings/buildLimited';
import paymentRequired from '../ui/messages/warnings/paymentRequired';
import snapshotQuotaReached from '../ui/messages/warnings/snapshotQuotaReached';
import { initial, pending, runOnly, success } from '../ui/tasks/verify';
const TesterCreateBuildMutation = `
mutation TesterCreateBuildMutation($input: CreateBuildInput!, $isolatorUrl: String!) {
createBuild(input: $input, isolatorUrl: $isolatorUrl) {
id
number
specCount
testCount
componentCount
webUrl
cachedUrl
reportToken
features {
uiTests
uiReview
}
wasLimited
app {
account {
exceededThreshold
paymentRequired
billingUrl
}
repository {
provider
}
setupUrl
}
tests {
spec {
name
component {
name
displayName
}
}
parameters {
viewport
viewportIsDefault
}
}
}
}
`;
export const setEnvironment = async (ctx) => {
// We send up all environment variables provided by these complicated systems.
// We don't want to send up *all* environment vars as they could include sensitive information
// about the user's build environment
ctx.environment = JSON.stringify(
Object.entries(process.env).reduce((acc, [key, value]) => {
if (ctx.env.ENVIRONMENT_WHITELIST.find((regex) => key.match(regex))) {
acc[key] = value;
}
return acc;
}, {})
);
ctx.log.debug(`Got environment ${ctx.environment}`);
};
export const createBuild = async (ctx, task) => {
const { client, environment, git, log, pkg, cachedUrl, isolatorUrl, options } = ctx;
const { list, only, patchBaseRef, patchHeadRef, preserveMissingSpecs } = options;
const { version, matchesBranch, ...commitInfo } = git; // omit some fields
const autoAcceptChanges = matchesBranch(options.autoAcceptChanges);
if (only) {
transitionTo(runOnly)(ctx, task);
}
const { createBuild: build } = await client.runQuery(TesterCreateBuildMutation, {
input: {
...commitInfo,
...(only && { only }),
autoAcceptChanges,
cachedUrl,
environment,
patchBaseRef,
patchHeadRef,
preserveMissingSpecs,
packageVersion: pkg.version,
storybookVersion: ctx.storybook.version,
viewLayer: ctx.storybook.viewLayer,
addons: ctx.storybook.addons,
},
isolatorUrl,
});
ctx.build = build;
ctx.isPublishOnly = !build.features.uiReview && !build.features.uiTests;
ctx.isOnboarding = build.number === 1 || (build.autoAcceptChanges && !autoAcceptChanges);
if (list) {
log.info(listingStories(build.tests));
}
if (build.wasLimited) {
const { account } = build.app;
if (account.exceededThreshold) {
log.warn(snapshotQuotaReached(account));
ctx.exitCode = 101;
} else if (account.paymentRequired) {
log.warn(paymentRequired(account));
ctx.exitCode = 102;
} else {
// Future proofing for reasons we aren't aware of
log.warn(buildLimited(account));
ctx.exitCode = 100;
}
}
transitionTo(success, true)(ctx, task);
if (list || ctx.isPublishOnly || matchesBranch(options.exitOnceUploaded)) {
ctx.exitCode = 0;
ctx.skipSnapshots = true;
ctx.log.info(storybookPublished(ctx));
}
};
export default createTask({
title: initial.title,
skip: (ctx) => ctx.skip,
steps: [transitionTo(pending), setEnvironment, createBuild],
});