-
Notifications
You must be signed in to change notification settings - Fork 61
/
site.cue
367 lines (325 loc) · 11.3 KB
/
site.cue
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
package site
import (
"list"
"strings"
"encoding/yaml"
"github.com/cue-lang/cuelang.org/internal/ci"
"github.com/cue-lang/cuelang.org/internal/ci/base"
"github.com/cue-lang/cuelang.org/content/docs/reference/command"
)
versions: {
go: "go1.23.2"
bareGoVersion: strings.TrimPrefix(go, "go")
cue: {
[x=string]: var: "CUELANG_CUE_\(strings.ToUpper(x))"
latest: {
v: *"v0.10.0" | _
majorDotMinor: strings.Join(list.Take(strings.Split(v, "."), 2), ".")
}
prerelease: v: *"v0.11.0-alpha.3" | _
tip: v: prerelease.v
default: v: latest.v
playground: v: latest.v
}
let versionSet = {for _, v in cue {"\(v.v)": true}}
_cueVersionList: list.SortStrings([
for k, _ in versionSet {k},
])
testscript: "v1.13.1"
libcue: "1c861cc9cdc5584f5d26b0a7112aa2afee74d4cf" // https://github.com/cue-lang/libcue
cueApiJava: "3c12bb9e9ea203d4de8308b4145e876e4b60207e" // https://github.com/cue-lang/cue-api-java
// Container image pinning: specify a tag with a ":" prefix, or pin to a
// specific digest by using a "@" prefix.
// cf. https://docs.docker.com/reference/dockerfile/#from
java: {
image: "docker.io/library/eclipse-temurin"
pin: ":22-jdk"
}
maven: {
image: "docker.io/library/maven"
pin: ":3.9.8-eclipse-temurin-11"
}
}
// _contentDefaults is a recursive template for setting defaults
// on pages declared under 'content'. They are, in effect, site
// defaults, templated to each page.
_contentDefaults: {
// See execute_doc.go for a refresher on how the site is structured
// underneath the top level 'content' field. Wherever a page root if found,
// there can be page configuration. That page configuration should be placed
// at the point in the 'content' configuration tree that corresponds to the
// path of the page (remembering that hugo supports node and leaf pages).
// The page configuration itself for that path is placed in a field called
// 'page'. The implication therefore is that we cannot, in our site, have a
// directory called 'page' under the content directory, otherwise there
// would a conflict in terms of the structure. But this is reasonable (for
// now).
//
// We need _contentDefaults to apply to any page defined under the top level
// 'content' field. Therefore we need to express the template recursively
// taking advantage of the fact that any field that exists that is not named
// page represents part of a path to a more nested page.
[!="page"]: _contentDefaults
page?: {
leftDelim: *"{{{" | _
rightDelim: *"}}}" | _
comparators: *[
{
kind: "patternComparator"
command: "go test"
pattern: expr: #"(?m)^ok .*\t(\d(\.\d+)?)s"#
},
] | _
sanitisers: *[
{
kind: "patternSanitiser"
command: "go version"
pattern: expr: #"(?m)linux\/.+$"#
replacement: "linux/amd64"
},
{
kind: "patternSanitiser"
command: "cue version"
pattern: expr: #"(?m)GOARCH .+$"#
replacement: "GOARCH amd64"
},
{
kind: "patternSanitiser"
command: "cue version"
pattern: expr: #"(?m)GOOS .+$"#
replacement: "GOOS linux"
},
{
kind: "patternSanitiser"
command: "cue version"
pattern: expr: #"(?m)^\s*GOAMD64 .*\n"#
replacement: ""
},
{
kind: "patternSanitiser"
command: "cue version"
pattern: expr: #"(?m)^\s*GOARM64 .*\n"#
replacement: ""
},
] | _
}
}
content: _contentDefaults
let donotedit = base.doNotEditMessage & {#generatedBy: "site_tool.cue", _}
// template is an io/fs.FS-like map of files that are templated
// by site_tool.cue:gen for the working of cuelang.org
template: ci.#writefs & {
Tool: "site_tool.cue"
Remove: [
// The generated artefacts from the CLI auto-generation. Do not remove
// the cache files, because otherwise on a Preprocessor-No-Write-Cache
// they will not get added back, a change that would, ironically, create
// noise in a commit where we are intending there to be less noise.
// TODO(jcm): figure out how to express "only remove auto-generated files",
// so that a manually-added "cue-help-foo" page (which *could* exist)
// wouldn't break the build.
"content/docs/reference/command/cue-help*/*.md",
]
Create: {
"internal/cmd/preprocessor/cmd/_docker/Dockerfile": {
Contents: #"""
# syntax=docker/dockerfile:1
# \#(donotedit)
FROM golang:\#(versions.bareGoVersion) AS build
ENV CGO_ENABLED=0
# TODO: mount the caches from the host system, having first established and
# switched to a user with the same UID and GID as the caller.
RUN \
--mount=type=cache,target=/cache/gocache \
--mount=type=cache,target=/cache/gomodcache \
export GOCACHE=/cache/gocache GOMODCACHE=/cache/gomodcache && \
go install -trimpath github.com/rogpeppe/go-internal/cmd/testscript@\#(versions.testscript)
RUN mkdir /cues
\#(strings.Join([for _, version in versions._cueVersionList {
#"""
RUN \
--mount=type=cache,target=/cache/gocache \
--mount=type=cache,target=/cache/gomodcache \
export GOCACHE=/cache/gocache GOMODCACHE=/cache/gomodcache && \
GOBIN=/cues/\#(version) go install -trimpath cuelang.org/go/cmd/cue@\#(version)
"""#
}], "\n\n"))
RUN git clone https://github.com/cue-lang/libcue.git /libcue
RUN git -C /libcue reset --hard \#(versions.libcue)
RUN \
--mount=type=cache,target=/cache/gocache \
--mount=type=cache,target=/cache/gomodcache \
export GOCACHE=/cache/gocache GOMODCACHE=/cache/gomodcache CGO_ENABLED=1 && \
go build -C /libcue -o libcue.so -buildmode=c-shared
FROM golang:\#(versions.bareGoVersion)
RUN apt-get update && apt-get install -y tree
RUN mkdir -p /go/bin
ENV LC_ALL=C.UTF-8
# Default to the default value of CUE. Guides can fix to a different
# version explicitly
ENV PATH="/cues/\#(versions.cue.default.v):${PATH}"
ENV PATH="/go/bin:/usr/local/go/bin:${PATH}"
\#(
strings.Join([for _, version in versions.cue {
"""
ENV \(version.var)="\(version.v)"
"""
},
], "\n"))
WORKDIR /
COPY ./testscript.sh /usr/bin/testscript.sh
RUN chmod 755 /usr/bin/testscript.sh
COPY ./entrypoint.sh /usr/bin/entrypoint.sh
RUN chown root:root /usr/bin/entrypoint.sh
RUN chmod 755 /usr/bin/entrypoint.sh
RUN chown root:root /usr/bin/entrypoint.sh
COPY --from=build /go/bin/testscript /go/bin
\#(
strings.Join([for _, version in versions._cueVersionList {
"""
COPY --from=build /cues/\(version)/cue /cues/\(version)/cue
"""
},
], "\n"))
COPY --from=build /libcue/libcue.so /usr/local/lib/
ENV LD_LIBRARY_PATH="/usr/local/lib"
ENV JAVA_HOME=/opt/java/openjdk
COPY --from=\#(versions.java.image)\#(versions.java.pin) $JAVA_HOME $JAVA_HOME
# Extending PATH here is insufficient; see the TODO in
# ./internal/cmd/preprocessor/cmd.buildMultistepScript
ENV PATH="${JAVA_HOME}/bin:${PATH}"
ENV MAVEN_HOME=/usr/share/maven
COPY --from=\#(versions.maven.image)\#(versions.maven.pin) $MAVEN_HOME $MAVEN_HOME
COPY --from=\#(versions.maven.image)\#(versions.maven.pin) /usr/local/bin/mvn-entrypoint.sh /usr/local/bin/mvn-entrypoint.sh
COPY --from=\#(versions.maven.image)\#(versions.maven.pin) $MAVEN_HOME/ref/settings-docker.xml $MAVEN_HOME/ref/settings-docker.xml
# Extending PATH here is insufficient; see the TODO in
# ./internal/cmd/preprocessor/cmd.buildMultistepScript
ENV PATH="${MAVEN_HOME}/bin:${PATH}"
# Building the CUE Java API (to make it available to content authors) is
# done here, in the context of the runtime container image, because it
# requires Maven and Java. We /could/ do this in the "build" container,
# above, but that would require us to make Maven available in that
# context. Given that Maven /also/ needs to be available to content
# authors, we opt to perform the build here. To avoid polluting the
# runtime container image with build artifacts we perform the build in a
# tmpfs, and provide a cache mount for the default location of Maven's
# download cache.
RUN --mount=type=tmpfs,target=/tmpfs/ \
--mount=type=cache,target=/root/.m2/ \
git clone https://github.com/cue-lang/cue-api-java.git /tmpfs/cue-api-java/ \
&& cd /tmpfs/cue-api-java \
&& git reset --hard \#(versions.cueApiJava) \
&& mvn package \
&& mkdir -p /usr/local/share/java/ \
&& cp target/CUE*.jar /usr/local/share/java/CUE.jar
ENTRYPOINT ["/usr/bin/entrypoint.sh"]
"""#
}
// Hugo site-wide params.
"hugo/config/_default/params.toml": {
Contents: {
// Fallback Twitter card image (if not set on page).
images: ["img/social.png"]
// Base URL for on-page links for reporting issues.
github_repo: "https://github.com/cue-lang/cuelang.org"
// Google Custom Search Engine ID. GCS is disabled if not present.
gcs_engine_id: "004591905419617723008:8rmik2a7xb3"
// Which logo to use in the main header.
logo: "svg/logo.svg"
// Site-wide notification-bar.
notification: {
type: "cue-minor-release-\(versions.cue.latest.majorDotMinor)"
// Omitting the button field removes the bar's button entirely.
button: {
link: "/docs/introduction/installation/"
icon: "download"
text: "Install CUE"
}
// Markdown is permitted in the content field.
content: "**CUE \(versions.cue.latest.majorDotMinor) is now available** -- learn more about its [new features and improvements](https://github.com/cue-lang/cue/releases/tag/\(versions.cue.latest.majorDotMinor).0)"
}
// The tag order in this file determines their relative positions at
// the top and bottom of all rendered pages.
#tag: {
name: string
color: "red" | "orange" | "green" | "pink" | "purple" | "lilac" | "blue" | "lavender"
}
tags: [...#tag] & [{
name: "ecosystem"
color: "red"
}, {
name: "encodings"
color: "green"
}, {
name: "cue command"
color: "purple"
}, {
name: "language"
color: "blue"
}, {
name: "validation"
color: "lilac"
}, {
name: "tooling"
color: "orange"
}, {
name: "commented cue"
color: "pink"
}, {
name: "user question"
color: "red"
}, {
name: "modules"
color: "red"
}, {
name: "go api"
color: "lavender"
}, {
name: "java api"
color: "blue"
}, {
name: "workflow command"
color: "blue"
}]
}
}
"playground/src/config/gen_cuelang_org_go_version.ts": {
Contents: #"""
// \#(donotedit)
export const CUEVersion = '\#(versions.cue.playground.v)';
"""#
}
for _, cmd in command.cue {
"\(command.contentRoot)/\(cmd.dir)/page.cue": {
Contents: #"""
// \#(donotedit)
package site
\#(cmd.cuePath)
"""#
}
"\(command.contentRoot)/\(cmd.dir)/en.md": {
Contents: #"""
---
WARNING: "\#(donotedit)"
title: "\#(cmd.title)"
aliases: ["/docs/reference/cli/\#(cmd.oldDir)/"]
weight: 1000
tags:
\#(strings.TrimSuffix(yaml.Marshal(cmd.tagList), "\n"))
---
{{{with script "en" "cue cli help text"}}}
\#(cmd.execCmd)
{{{end}}}
\#( strings.Join([if len(cmd.relatedCommands) > 0 for e in [
"", "## Related content", "",
for c in cmd.relatedCommands
let path = strings.Replace(c, " ", "-", -1) {
#"- {{< linkto/related/reference "command/\#(path)" >}}"#
},
] {e},
], "\n"))
"""#
}
}
}
}