bonescript-compiler 0.2.1 → 0.3.0
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.
- package/LICENSE +21 -21
- package/dist/algorithm_catalog.js +166 -166
- package/dist/cli.d.ts +2 -1
- package/dist/cli.js +75 -543
- package/dist/cli.js.map +1 -1
- package/dist/commands/check.d.ts +5 -0
- package/dist/commands/check.js +34 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/compile.d.ts +5 -0
- package/dist/commands/compile.js +183 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/debug.d.ts +5 -0
- package/dist/commands/debug.js +59 -0
- package/dist/commands/debug.js.map +1 -0
- package/dist/commands/diff.d.ts +5 -0
- package/dist/commands/diff.js +125 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/fmt.d.ts +5 -0
- package/dist/commands/fmt.js +49 -0
- package/dist/commands/fmt.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.js +69 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/ir.d.ts +5 -0
- package/dist/commands/ir.js +27 -0
- package/dist/commands/ir.js.map +1 -0
- package/dist/commands/lex.d.ts +5 -0
- package/dist/commands/lex.js +21 -0
- package/dist/commands/lex.js.map +1 -0
- package/dist/commands/parse.d.ts +5 -0
- package/dist/commands/parse.js +30 -0
- package/dist/commands/parse.js.map +1 -0
- package/dist/commands/test.d.ts +5 -0
- package/dist/commands/test.js +61 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/verify_determinism.d.ts +5 -0
- package/dist/commands/verify_determinism.js +64 -0
- package/dist/commands/verify_determinism.js.map +1 -0
- package/dist/commands/watch.d.ts +5 -0
- package/dist/commands/watch.js +50 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/emit_auth.d.ts +6 -0
- package/dist/emit_auth.js +69 -0
- package/dist/emit_auth.js.map +1 -0
- package/dist/emit_capability.d.ts +13 -0
- package/dist/emit_capability.js +235 -125
- package/dist/emit_capability.js.map +1 -1
- package/dist/emit_database.d.ts +7 -0
- package/dist/emit_database.js +74 -0
- package/dist/emit_database.js.map +1 -0
- package/dist/emit_deploy.js +162 -162
- package/dist/emit_events.js +274 -274
- package/dist/emit_full.js +102 -95
- package/dist/emit_full.js.map +1 -1
- package/dist/emit_index.d.ts +6 -0
- package/dist/emit_index.js +157 -0
- package/dist/emit_index.js.map +1 -0
- package/dist/emit_maintenance.js +249 -249
- package/dist/emit_package.d.ts +7 -0
- package/dist/emit_package.js +70 -0
- package/dist/emit_package.js.map +1 -0
- package/dist/emit_router.d.ts +12 -0
- package/dist/emit_router.js +375 -0
- package/dist/emit_router.js.map +1 -0
- package/dist/emit_runtime.d.ts +17 -11
- package/dist/emit_runtime.js +29 -686
- package/dist/emit_runtime.js.map +1 -1
- package/dist/emit_sourcemap.js +66 -66
- package/dist/extension_manager.d.ts +2 -2
- package/dist/extension_manager.js +6 -3
- package/dist/extension_manager.js.map +1 -1
- package/dist/lowering.d.ts +5 -14
- package/dist/lowering.js +32 -417
- package/dist/lowering.js.map +1 -1
- package/dist/lowering_channels.d.ts +11 -0
- package/dist/lowering_channels.js +102 -0
- package/dist/lowering_channels.js.map +1 -0
- package/dist/lowering_entities.d.ts +11 -0
- package/dist/lowering_entities.js +222 -0
- package/dist/lowering_entities.js.map +1 -0
- package/dist/lowering_helpers.d.ts +13 -0
- package/dist/lowering_helpers.js +76 -0
- package/dist/lowering_helpers.js.map +1 -0
- package/dist/module_loader.d.ts +2 -2
- package/dist/module_loader.js +20 -23
- package/dist/module_loader.js.map +1 -1
- package/dist/scaffold.d.ts +2 -2
- package/dist/scaffold.js +316 -319
- package/dist/scaffold.js.map +1 -1
- package/package.json +62 -52
- package/src/algorithm_catalog.ts +345 -345
- package/src/ast.ts +334 -334
- package/src/cli.ts +98 -624
- package/src/commands/check.ts +33 -0
- package/src/commands/compile.ts +160 -0
- package/src/commands/debug.ts +33 -0
- package/src/commands/diff.ts +108 -0
- package/src/commands/fmt.ts +22 -0
- package/src/commands/init.ts +46 -0
- package/src/commands/ir.ts +23 -0
- package/src/commands/lex.ts +17 -0
- package/src/commands/parse.ts +24 -0
- package/src/commands/test.ts +36 -0
- package/src/commands/verify_determinism.ts +66 -0
- package/src/commands/watch.ts +25 -0
- package/src/emit_auth.ts +67 -0
- package/src/emit_batch.ts +140 -140
- package/src/emit_capability.ts +562 -436
- package/src/emit_composition.ts +196 -196
- package/src/emit_database.ts +75 -0
- package/src/emit_deploy.ts +190 -190
- package/src/emit_events.ts +307 -307
- package/src/emit_extras.ts +240 -240
- package/src/emit_full.ts +316 -309
- package/src/emit_index.ts +161 -0
- package/src/emit_maintenance.ts +459 -459
- package/src/emit_package.ts +69 -0
- package/src/emit_router.ts +395 -0
- package/src/emit_runtime.ts +17 -728
- package/src/emit_sourcemap.ts +140 -140
- package/src/emit_tests.ts +205 -205
- package/src/emit_websocket.ts +229 -229
- package/src/emitter.ts +566 -566
- package/src/extension_manager.ts +189 -187
- package/src/formatter.ts +297 -297
- package/src/index.ts +88 -88
- package/src/ir.ts +215 -215
- package/src/lexer.ts +630 -630
- package/src/lowering.ts +124 -556
- package/src/lowering_channels.ts +107 -0
- package/src/lowering_entities.ts +248 -0
- package/src/lowering_helpers.ts +75 -0
- package/src/module_loader.ts +112 -114
- package/src/optimizer.ts +196 -196
- package/src/parse_decls.ts +409 -409
- package/src/parse_decls2.ts +244 -244
- package/src/parse_expr.ts +197 -197
- package/src/parse_types.ts +54 -54
- package/src/parser.ts +1 -1
- package/src/parser_base.ts +57 -57
- package/src/parser_recovery.ts +153 -153
- package/src/scaffold.ts +372 -375
- package/src/solver.ts +330 -330
- package/src/typechecker.ts +591 -591
- package/src/types.ts +122 -122
- package/src/verifier.ts +348 -348
package/src/emit_deploy.ts
CHANGED
|
@@ -1,190 +1,190 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BoneScript Deploy Target Emitter
|
|
3
|
-
* Generates Dockerfile, k8s manifests, and GitHub Actions CI/CD.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import * as IR from "./ir";
|
|
7
|
-
|
|
8
|
-
function toSnakeCase(s: string): string {
|
|
9
|
-
return s.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase();
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function emitDockerfile(system: IR.IRSystem): string {
|
|
13
|
-
return `# Generated by BoneScript compiler.
|
|
14
|
-
FROM node:20-alpine AS builder
|
|
15
|
-
WORKDIR /app
|
|
16
|
-
COPY package*.json ./
|
|
17
|
-
RUN npm ci --only=production
|
|
18
|
-
COPY . .
|
|
19
|
-
RUN npm run build
|
|
20
|
-
|
|
21
|
-
FROM node:20-alpine AS runtime
|
|
22
|
-
WORKDIR /app
|
|
23
|
-
ENV NODE_ENV=production
|
|
24
|
-
COPY --from=builder /app/dist ./dist
|
|
25
|
-
COPY --from=builder /app/node_modules ./node_modules
|
|
26
|
-
COPY --from=builder /app/package.json ./
|
|
27
|
-
|
|
28
|
-
# Health check
|
|
29
|
-
HEALTHCHECK --interval=10s --timeout=5s --start-period=30s --retries=3 \\
|
|
30
|
-
CMD wget -qO- http://localhost:3000/health/live || exit 1
|
|
31
|
-
|
|
32
|
-
EXPOSE 3000
|
|
33
|
-
USER node
|
|
34
|
-
CMD ["node", "dist/index.js"]
|
|
35
|
-
`;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export function emitDockerignore(): string {
|
|
39
|
-
return `node_modules
|
|
40
|
-
dist
|
|
41
|
-
.env
|
|
42
|
-
*.log
|
|
43
|
-
.git
|
|
44
|
-
*.bone
|
|
45
|
-
*.bone.map
|
|
46
|
-
`;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export function emitK8sDeployment(system: IR.IRSystem): string {
|
|
50
|
-
const name = toSnakeCase(system.name).replace(/_/g, "-");
|
|
51
|
-
return `# Generated by BoneScript compiler.
|
|
52
|
-
apiVersion: apps/v1
|
|
53
|
-
kind: Deployment
|
|
54
|
-
metadata:
|
|
55
|
-
name: ${name}
|
|
56
|
-
labels:
|
|
57
|
-
app: ${name}
|
|
58
|
-
version: "${system.version}"
|
|
59
|
-
spec:
|
|
60
|
-
replicas: 2
|
|
61
|
-
selector:
|
|
62
|
-
matchLabels:
|
|
63
|
-
app: ${name}
|
|
64
|
-
template:
|
|
65
|
-
metadata:
|
|
66
|
-
labels:
|
|
67
|
-
app: ${name}
|
|
68
|
-
spec:
|
|
69
|
-
containers:
|
|
70
|
-
- name: ${name}
|
|
71
|
-
image: ${name}:${system.version}
|
|
72
|
-
ports:
|
|
73
|
-
- containerPort: 3000
|
|
74
|
-
env:
|
|
75
|
-
- name: NODE_ENV
|
|
76
|
-
value: production
|
|
77
|
-
- name: PORT
|
|
78
|
-
value: "3000"
|
|
79
|
-
- name: DATABASE_URL
|
|
80
|
-
valueFrom:
|
|
81
|
-
secretKeyRef:
|
|
82
|
-
name: ${name}-secrets
|
|
83
|
-
key: database-url
|
|
84
|
-
- name: JWT_SECRET
|
|
85
|
-
valueFrom:
|
|
86
|
-
secretKeyRef:
|
|
87
|
-
name: ${name}-secrets
|
|
88
|
-
key: jwt-secret
|
|
89
|
-
- name: REDIS_URL
|
|
90
|
-
valueFrom:
|
|
91
|
-
secretKeyRef:
|
|
92
|
-
name: ${name}-secrets
|
|
93
|
-
key: redis-url
|
|
94
|
-
optional: true
|
|
95
|
-
livenessProbe:
|
|
96
|
-
httpGet:
|
|
97
|
-
path: /health/live
|
|
98
|
-
port: 3000
|
|
99
|
-
initialDelaySeconds: 10
|
|
100
|
-
periodSeconds: 10
|
|
101
|
-
readinessProbe:
|
|
102
|
-
httpGet:
|
|
103
|
-
path: /health/ready
|
|
104
|
-
port: 3000
|
|
105
|
-
initialDelaySeconds: 5
|
|
106
|
-
periodSeconds: 5
|
|
107
|
-
resources:
|
|
108
|
-
requests:
|
|
109
|
-
memory: "128Mi"
|
|
110
|
-
cpu: "100m"
|
|
111
|
-
limits:
|
|
112
|
-
memory: "512Mi"
|
|
113
|
-
cpu: "500m"
|
|
114
|
-
---
|
|
115
|
-
apiVersion: v1
|
|
116
|
-
kind: Service
|
|
117
|
-
metadata:
|
|
118
|
-
name: ${name}
|
|
119
|
-
spec:
|
|
120
|
-
selector:
|
|
121
|
-
app: ${name}
|
|
122
|
-
ports:
|
|
123
|
-
- port: 80
|
|
124
|
-
targetPort: 3000
|
|
125
|
-
type: ClusterIP
|
|
126
|
-
`;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
export function emitGithubActions(system: IR.IRSystem): string {
|
|
130
|
-
const name = toSnakeCase(system.name).replace(/_/g, "-");
|
|
131
|
-
return `# Generated by BoneScript compiler.
|
|
132
|
-
name: CI/CD
|
|
133
|
-
|
|
134
|
-
on:
|
|
135
|
-
push:
|
|
136
|
-
branches: [main]
|
|
137
|
-
pull_request:
|
|
138
|
-
branches: [main]
|
|
139
|
-
|
|
140
|
-
jobs:
|
|
141
|
-
test:
|
|
142
|
-
runs-on: ubuntu-latest
|
|
143
|
-
services:
|
|
144
|
-
postgres:
|
|
145
|
-
image: postgres:16
|
|
146
|
-
env:
|
|
147
|
-
POSTGRES_DB: ${toSnakeCase(system.name)}_test
|
|
148
|
-
POSTGRES_USER: postgres
|
|
149
|
-
POSTGRES_PASSWORD: postgres
|
|
150
|
-
ports:
|
|
151
|
-
- 5432:5432
|
|
152
|
-
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
|
|
153
|
-
|
|
154
|
-
steps:
|
|
155
|
-
- uses: actions/checkout@v4
|
|
156
|
-
- uses: actions/setup-node@v4
|
|
157
|
-
with:
|
|
158
|
-
node-version: 20
|
|
159
|
-
cache: npm
|
|
160
|
-
|
|
161
|
-
- name: Install dependencies
|
|
162
|
-
run: npm ci
|
|
163
|
-
|
|
164
|
-
- name: Type check
|
|
165
|
-
run: npx tsc --noEmit
|
|
166
|
-
|
|
167
|
-
- name: Run migrations
|
|
168
|
-
run: npm run migrate
|
|
169
|
-
env:
|
|
170
|
-
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/${toSnakeCase(system.name)}_test
|
|
171
|
-
|
|
172
|
-
- name: Run tests
|
|
173
|
-
run: npx ts-node src/tests.ts
|
|
174
|
-
env:
|
|
175
|
-
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/${toSnakeCase(system.name)}_test
|
|
176
|
-
JWT_SECRET: test-secret
|
|
177
|
-
TEST_BASE_URL: http://localhost:3000
|
|
178
|
-
|
|
179
|
-
build:
|
|
180
|
-
needs: test
|
|
181
|
-
runs-on: ubuntu-latest
|
|
182
|
-
if: github.ref == 'refs/heads/main'
|
|
183
|
-
steps:
|
|
184
|
-
- uses: actions/checkout@v4
|
|
185
|
-
- name: Build Docker image
|
|
186
|
-
run: docker build -t ${name}:\${{ github.sha }} .
|
|
187
|
-
- name: Tag as latest
|
|
188
|
-
run: docker tag ${name}:\${{ github.sha }} ${name}:latest
|
|
189
|
-
`;
|
|
190
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* BoneScript Deploy Target Emitter
|
|
3
|
+
* Generates Dockerfile, k8s manifests, and GitHub Actions CI/CD.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import * as IR from "./ir";
|
|
7
|
+
|
|
8
|
+
function toSnakeCase(s: string): string {
|
|
9
|
+
return s.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase();
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function emitDockerfile(system: IR.IRSystem): string {
|
|
13
|
+
return `# Generated by BoneScript compiler.
|
|
14
|
+
FROM node:20-alpine AS builder
|
|
15
|
+
WORKDIR /app
|
|
16
|
+
COPY package*.json ./
|
|
17
|
+
RUN npm ci --only=production
|
|
18
|
+
COPY . .
|
|
19
|
+
RUN npm run build
|
|
20
|
+
|
|
21
|
+
FROM node:20-alpine AS runtime
|
|
22
|
+
WORKDIR /app
|
|
23
|
+
ENV NODE_ENV=production
|
|
24
|
+
COPY --from=builder /app/dist ./dist
|
|
25
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
26
|
+
COPY --from=builder /app/package.json ./
|
|
27
|
+
|
|
28
|
+
# Health check
|
|
29
|
+
HEALTHCHECK --interval=10s --timeout=5s --start-period=30s --retries=3 \\
|
|
30
|
+
CMD wget -qO- http://localhost:3000/health/live || exit 1
|
|
31
|
+
|
|
32
|
+
EXPOSE 3000
|
|
33
|
+
USER node
|
|
34
|
+
CMD ["node", "dist/index.js"]
|
|
35
|
+
`;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function emitDockerignore(): string {
|
|
39
|
+
return `node_modules
|
|
40
|
+
dist
|
|
41
|
+
.env
|
|
42
|
+
*.log
|
|
43
|
+
.git
|
|
44
|
+
*.bone
|
|
45
|
+
*.bone.map
|
|
46
|
+
`;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function emitK8sDeployment(system: IR.IRSystem): string {
|
|
50
|
+
const name = toSnakeCase(system.name).replace(/_/g, "-");
|
|
51
|
+
return `# Generated by BoneScript compiler.
|
|
52
|
+
apiVersion: apps/v1
|
|
53
|
+
kind: Deployment
|
|
54
|
+
metadata:
|
|
55
|
+
name: ${name}
|
|
56
|
+
labels:
|
|
57
|
+
app: ${name}
|
|
58
|
+
version: "${system.version}"
|
|
59
|
+
spec:
|
|
60
|
+
replicas: 2
|
|
61
|
+
selector:
|
|
62
|
+
matchLabels:
|
|
63
|
+
app: ${name}
|
|
64
|
+
template:
|
|
65
|
+
metadata:
|
|
66
|
+
labels:
|
|
67
|
+
app: ${name}
|
|
68
|
+
spec:
|
|
69
|
+
containers:
|
|
70
|
+
- name: ${name}
|
|
71
|
+
image: ${name}:${system.version}
|
|
72
|
+
ports:
|
|
73
|
+
- containerPort: 3000
|
|
74
|
+
env:
|
|
75
|
+
- name: NODE_ENV
|
|
76
|
+
value: production
|
|
77
|
+
- name: PORT
|
|
78
|
+
value: "3000"
|
|
79
|
+
- name: DATABASE_URL
|
|
80
|
+
valueFrom:
|
|
81
|
+
secretKeyRef:
|
|
82
|
+
name: ${name}-secrets
|
|
83
|
+
key: database-url
|
|
84
|
+
- name: JWT_SECRET
|
|
85
|
+
valueFrom:
|
|
86
|
+
secretKeyRef:
|
|
87
|
+
name: ${name}-secrets
|
|
88
|
+
key: jwt-secret
|
|
89
|
+
- name: REDIS_URL
|
|
90
|
+
valueFrom:
|
|
91
|
+
secretKeyRef:
|
|
92
|
+
name: ${name}-secrets
|
|
93
|
+
key: redis-url
|
|
94
|
+
optional: true
|
|
95
|
+
livenessProbe:
|
|
96
|
+
httpGet:
|
|
97
|
+
path: /health/live
|
|
98
|
+
port: 3000
|
|
99
|
+
initialDelaySeconds: 10
|
|
100
|
+
periodSeconds: 10
|
|
101
|
+
readinessProbe:
|
|
102
|
+
httpGet:
|
|
103
|
+
path: /health/ready
|
|
104
|
+
port: 3000
|
|
105
|
+
initialDelaySeconds: 5
|
|
106
|
+
periodSeconds: 5
|
|
107
|
+
resources:
|
|
108
|
+
requests:
|
|
109
|
+
memory: "128Mi"
|
|
110
|
+
cpu: "100m"
|
|
111
|
+
limits:
|
|
112
|
+
memory: "512Mi"
|
|
113
|
+
cpu: "500m"
|
|
114
|
+
---
|
|
115
|
+
apiVersion: v1
|
|
116
|
+
kind: Service
|
|
117
|
+
metadata:
|
|
118
|
+
name: ${name}
|
|
119
|
+
spec:
|
|
120
|
+
selector:
|
|
121
|
+
app: ${name}
|
|
122
|
+
ports:
|
|
123
|
+
- port: 80
|
|
124
|
+
targetPort: 3000
|
|
125
|
+
type: ClusterIP
|
|
126
|
+
`;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export function emitGithubActions(system: IR.IRSystem): string {
|
|
130
|
+
const name = toSnakeCase(system.name).replace(/_/g, "-");
|
|
131
|
+
return `# Generated by BoneScript compiler.
|
|
132
|
+
name: CI/CD
|
|
133
|
+
|
|
134
|
+
on:
|
|
135
|
+
push:
|
|
136
|
+
branches: [main]
|
|
137
|
+
pull_request:
|
|
138
|
+
branches: [main]
|
|
139
|
+
|
|
140
|
+
jobs:
|
|
141
|
+
test:
|
|
142
|
+
runs-on: ubuntu-latest
|
|
143
|
+
services:
|
|
144
|
+
postgres:
|
|
145
|
+
image: postgres:16
|
|
146
|
+
env:
|
|
147
|
+
POSTGRES_DB: ${toSnakeCase(system.name)}_test
|
|
148
|
+
POSTGRES_USER: postgres
|
|
149
|
+
POSTGRES_PASSWORD: postgres
|
|
150
|
+
ports:
|
|
151
|
+
- 5432:5432
|
|
152
|
+
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
|
|
153
|
+
|
|
154
|
+
steps:
|
|
155
|
+
- uses: actions/checkout@v4
|
|
156
|
+
- uses: actions/setup-node@v4
|
|
157
|
+
with:
|
|
158
|
+
node-version: 20
|
|
159
|
+
cache: npm
|
|
160
|
+
|
|
161
|
+
- name: Install dependencies
|
|
162
|
+
run: npm ci
|
|
163
|
+
|
|
164
|
+
- name: Type check
|
|
165
|
+
run: npx tsc --noEmit
|
|
166
|
+
|
|
167
|
+
- name: Run migrations
|
|
168
|
+
run: npm run migrate
|
|
169
|
+
env:
|
|
170
|
+
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/${toSnakeCase(system.name)}_test
|
|
171
|
+
|
|
172
|
+
- name: Run tests
|
|
173
|
+
run: npx ts-node src/tests.ts
|
|
174
|
+
env:
|
|
175
|
+
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/${toSnakeCase(system.name)}_test
|
|
176
|
+
JWT_SECRET: test-secret
|
|
177
|
+
TEST_BASE_URL: http://localhost:3000
|
|
178
|
+
|
|
179
|
+
build:
|
|
180
|
+
needs: test
|
|
181
|
+
runs-on: ubuntu-latest
|
|
182
|
+
if: github.ref == 'refs/heads/main'
|
|
183
|
+
steps:
|
|
184
|
+
- uses: actions/checkout@v4
|
|
185
|
+
- name: Build Docker image
|
|
186
|
+
run: docker build -t ${name}:\${{ github.sha }} .
|
|
187
|
+
- name: Tag as latest
|
|
188
|
+
run: docker tag ${name}:\${{ github.sha }} ${name}:latest
|
|
189
|
+
`;
|
|
190
|
+
}
|