/
verify.js
142 lines (130 loc) · 4.05 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
134
135
136
137
138
139
140
141
142
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, runOnlyFiles, success } from '../ui/tasks/verify';
const TesterCreateBuildMutation = `
mutation TesterCreateBuildMutation($input: CreateBuildInput!, $isolatorUrl: String!) {
createBuild(input: $input, isolatorUrl: $isolatorUrl) {
id
number
specCount
componentCount
testCount
actualTestCount: testCount(statuses: [IN_PROGRESS])
actualCaptureCount
webUrl
cachedUrl
reportToken
browsers {
browser
}
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, git, log, isolatorUrl, options, onlyStoryFiles } = ctx;
const { list, only, patchBaseRef, patchHeadRef, preserveMissingSpecs } = options;
const { version, matchesBranch, changedFiles, ...commitInfo } = git; // omit some fields
const autoAcceptChanges = matchesBranch(options.autoAcceptChanges);
// It's not possible to set both --only and --only-changed
if (only) {
transitionTo(runOnly)(ctx, task);
}
if (onlyStoryFiles) {
transitionTo(runOnlyFiles)(ctx, task);
}
const { createBuild: build } = await client.runQuery(TesterCreateBuildMutation, {
input: {
...commitInfo,
...(only && { only }),
...(onlyStoryFiles && { onlyStoryFiles: Object.keys(onlyStoryFiles) }),
autoAcceptChanges,
cachedUrl: ctx.cachedUrl,
environment: ctx.environment,
patchBaseRef,
patchHeadRef,
preserveMissingSpecs,
packageVersion: ctx.pkg.version,
storybookVersion: ctx.storybook.version,
viewLayer: ctx.storybook.viewLayer,
},
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],
});