@decohere/create 0.0.1-dev.48 → 0.0.1-dev.5
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/commonjs/src/cli.js +9 -3
- package/commonjs/src/scaffold.js +48 -0
- package/commonjs/src/templates.js +64 -0
- package/es6/src/cli.js +9 -3
- package/es6/src/scaffold.js +38 -0
- package/es6/src/templates.js +40 -0
- package/package.json +3 -8
- package/types/src/scaffold.d.ts +4 -0
- package/types/src/templates.d.ts +4 -0
- package/commonjs/src/domain/prompt.js +0 -64
- package/commonjs/src/models/compose.model.js +0 -138
- package/commonjs/src/models/config-yaml.model.js +0 -88
- package/commonjs/src/models/const.js +0 -31
- package/commonjs/src/models/dev-container.model.js +0 -100
- package/commonjs/src/models/docker-image.model.js +0 -221
- package/commonjs/src/models/env-file.model.js +0 -47
- package/commonjs/src/models/gitignore.model.js +0 -31
- package/commonjs/src/models/launch-json.model.js +0 -74
- package/commonjs/src/models/package-json.model.js +0 -133
- package/commonjs/src/models/project.model.js +0 -134
- package/commonjs/src/models/source-file.js +0 -6
- package/commonjs/src/models/tsconfig.model.js +0 -34
- package/commonjs/src/models/vscode-settings.model.js +0 -31
- package/commonjs/src/program.js +0 -135
- package/commonjs/src/resolve-target-dir.js +0 -19
- package/commonjs/src/runner.js +0 -144
- package/commonjs/src/services/scaffold.service.js +0 -62
- package/commonjs/src/version.js +0 -50
- package/commonjs/src/webapi/api-name.js +0 -95
- package/commonjs/src/webapi/const.js +0 -50
- package/commonjs/src/webapi/create-api.js +0 -285
- package/commonjs/src/webapi/features/auth.feature.js +0 -463
- package/commonjs/src/webapi/features/auth0-cli.js +0 -406
- package/commonjs/src/webapi/features/biome-format.js +0 -49
- package/commonjs/src/webapi/features/database.feature.js +0 -273
- package/commonjs/src/webapi/features/finalize.feature.js +0 -91
- package/commonjs/src/webapi/features/postman.feature.js +0 -319
- package/commonjs/src/webapi/models/api-package-json.model.js +0 -63
- package/commonjs/src/webapi/models/auth-config.model.js +0 -26
- package/commonjs/src/webapi/models/controller-source-file.model.js +0 -188
- package/commonjs/src/webapi/models/github-ci.model.js +0 -193
- package/commonjs/src/webapi/models/main-source-file.model.js +0 -165
- package/commonjs/src/webapi/models/production-dockerfile.model.js +0 -138
- package/commonjs/src/webapi/models/sample-files.model.js +0 -60
- package/commonjs/src/webapi/models/webapi-image.model.js +0 -22
- package/commonjs/src/webapi/postman/hello-openapi.js +0 -175
- package/commonjs/src/webapi/postman/local-view.js +0 -184
- package/commonjs/src/webapi/postman/openapi-to-postman.js +0 -202
- package/es6/src/domain/prompt.js +0 -43
- package/es6/src/models/compose.model.js +0 -132
- package/es6/src/models/config-yaml.model.js +0 -76
- package/es6/src/models/const.js +0 -21
- package/es6/src/models/dev-container.model.js +0 -90
- package/es6/src/models/docker-image.model.js +0 -185
- package/es6/src/models/env-file.model.js +0 -43
- package/es6/src/models/gitignore.model.js +0 -21
- package/es6/src/models/launch-json.model.js +0 -64
- package/es6/src/models/package-json.model.js +0 -129
- package/es6/src/models/project.model.js +0 -119
- package/es6/src/models/source-file.js +0 -3
- package/es6/src/models/tsconfig.model.js +0 -24
- package/es6/src/models/vscode-settings.model.js +0 -21
- package/es6/src/program.js +0 -76
- package/es6/src/resolve-target-dir.js +0 -9
- package/es6/src/runner.js +0 -146
- package/es6/src/services/scaffold.service.js +0 -52
- package/es6/src/version.js +0 -32
- package/es6/src/webapi/api-name.js +0 -59
- package/es6/src/webapi/const.js +0 -20
- package/es6/src/webapi/create-api.js +0 -265
- package/es6/src/webapi/features/auth.feature.js +0 -412
- package/es6/src/webapi/features/auth0-cli.js +0 -348
- package/es6/src/webapi/features/biome-format.js +0 -42
- package/es6/src/webapi/features/database.feature.js +0 -263
- package/es6/src/webapi/features/finalize.feature.js +0 -81
- package/es6/src/webapi/features/postman.feature.js +0 -253
- package/es6/src/webapi/models/api-package-json.model.js +0 -58
- package/es6/src/webapi/models/auth-config.model.js +0 -22
- package/es6/src/webapi/models/controller-source-file.model.js +0 -179
- package/es6/src/webapi/models/github-ci.model.js +0 -186
- package/es6/src/webapi/models/main-source-file.model.js +0 -161
- package/es6/src/webapi/models/production-dockerfile.model.js +0 -126
- package/es6/src/webapi/models/sample-files.model.js +0 -42
- package/es6/src/webapi/models/webapi-image.model.js +0 -12
- package/es6/src/webapi/postman/hello-openapi.js +0 -168
- package/es6/src/webapi/postman/local-view.js +0 -169
- package/es6/src/webapi/postman/openapi-to-postman.js +0 -179
- package/pack-builder-tgz.mjs +0 -177
- package/types/src/domain/prompt.d.ts +0 -4
- package/types/src/models/compose.model.d.ts +0 -59
- package/types/src/models/config-yaml.model.d.ts +0 -27
- package/types/src/models/const.d.ts +0 -19
- package/types/src/models/dev-container.model.d.ts +0 -33
- package/types/src/models/docker-image.model.d.ts +0 -56
- package/types/src/models/env-file.model.d.ts +0 -15
- package/types/src/models/gitignore.model.d.ts +0 -6
- package/types/src/models/launch-json.model.d.ts +0 -7
- package/types/src/models/package-json.model.d.ts +0 -32
- package/types/src/models/project.model.d.ts +0 -60
- package/types/src/models/source-file.d.ts +0 -11
- package/types/src/models/tsconfig.model.d.ts +0 -5
- package/types/src/models/vscode-settings.model.d.ts +0 -7
- package/types/src/program.d.ts +0 -3
- package/types/src/resolve-target-dir.d.ts +0 -5
- package/types/src/runner.d.ts +0 -15
- package/types/src/services/scaffold.service.d.ts +0 -22
- package/types/src/version.d.ts +0 -4
- package/types/src/webapi/api-name.d.ts +0 -14
- package/types/src/webapi/const.d.ts +0 -17
- package/types/src/webapi/create-api.d.ts +0 -15
- package/types/src/webapi/features/auth.feature.d.ts +0 -10
- package/types/src/webapi/features/auth0-cli.d.ts +0 -72
- package/types/src/webapi/features/biome-format.d.ts +0 -5
- package/types/src/webapi/features/database.feature.d.ts +0 -5
- package/types/src/webapi/features/finalize.feature.d.ts +0 -2
- package/types/src/webapi/features/postman.feature.d.ts +0 -16
- package/types/src/webapi/models/api-package-json.model.d.ts +0 -18
- package/types/src/webapi/models/auth-config.model.d.ts +0 -26
- package/types/src/webapi/models/controller-source-file.model.d.ts +0 -45
- package/types/src/webapi/models/github-ci.model.d.ts +0 -9
- package/types/src/webapi/models/main-source-file.model.d.ts +0 -54
- package/types/src/webapi/models/production-dockerfile.model.d.ts +0 -20
- package/types/src/webapi/models/sample-files.model.d.ts +0 -7
- package/types/src/webapi/models/webapi-image.model.d.ts +0 -5
- package/types/src/webapi/postman/hello-openapi.d.ts +0 -19
- package/types/src/webapi/postman/local-view.d.ts +0 -17
- package/types/src/webapi/postman/openapi-to-postman.d.ts +0 -62
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
import { WELL_KNOWN_FILES } from "../../models/const.js";
|
|
2
|
-
/**
|
|
3
|
-
* Minimal GitHub Actions for scaffolded apps: lint ∥ test, build gate on default branch,
|
|
4
|
-
* npm publish after CI (skips private packages). No default forge docker --push.
|
|
5
|
-
*/ export class GithubCiWorkflows {
|
|
6
|
-
key = WELL_KNOWN_FILES.GITHUB_CI;
|
|
7
|
-
files() {
|
|
8
|
-
return [
|
|
9
|
-
{
|
|
10
|
-
filePath: ".github/actions/setup-node-pnpm/action.yml",
|
|
11
|
-
content: `name: Setup Node + pnpm
|
|
12
|
-
description: Install pnpm and Node, configure npm registry auth, install deps
|
|
13
|
-
inputs:
|
|
14
|
-
node-version:
|
|
15
|
-
description: Node.js version
|
|
16
|
-
required: false
|
|
17
|
-
default: "24"
|
|
18
|
-
pnpm-version:
|
|
19
|
-
description: pnpm version
|
|
20
|
-
required: false
|
|
21
|
-
default: "10"
|
|
22
|
-
install:
|
|
23
|
-
description: Run pnpm install --frozen-lockfile
|
|
24
|
-
required: false
|
|
25
|
-
default: "true"
|
|
26
|
-
|
|
27
|
-
runs:
|
|
28
|
-
using: composite
|
|
29
|
-
steps:
|
|
30
|
-
- uses: pnpm/action-setup@v4
|
|
31
|
-
with:
|
|
32
|
-
version: \${{ inputs.pnpm-version }}
|
|
33
|
-
|
|
34
|
-
- uses: actions/setup-node@v4
|
|
35
|
-
with:
|
|
36
|
-
node-version: \${{ inputs.node-version }}
|
|
37
|
-
cache: pnpm
|
|
38
|
-
cache-dependency-path: pnpm-lock.yaml
|
|
39
|
-
|
|
40
|
-
- name: Configure npm auth
|
|
41
|
-
shell: bash
|
|
42
|
-
run: |
|
|
43
|
-
if [[ -n "\${NODE_AUTH_TOKEN:-}" ]]; then
|
|
44
|
-
echo "//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN}" >> .npmrc
|
|
45
|
-
fi
|
|
46
|
-
|
|
47
|
-
- name: Install dependencies
|
|
48
|
-
if: inputs.install == 'true'
|
|
49
|
-
shell: bash
|
|
50
|
-
run: |
|
|
51
|
-
if [[ -f pnpm-lock.yaml ]]; then
|
|
52
|
-
pnpm install --frozen-lockfile
|
|
53
|
-
else
|
|
54
|
-
pnpm install
|
|
55
|
-
fi
|
|
56
|
-
`
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
filePath: ".github/workflows/ci.yml",
|
|
60
|
-
content: `name: CI
|
|
61
|
-
on:
|
|
62
|
-
push:
|
|
63
|
-
branches:
|
|
64
|
-
- "*"
|
|
65
|
-
pull_request:
|
|
66
|
-
workflow_dispatch:
|
|
67
|
-
concurrency:
|
|
68
|
-
group: ci-\${{ github.ref }}
|
|
69
|
-
cancel-in-progress: true
|
|
70
|
-
env:
|
|
71
|
-
NODE_AUTH_TOKEN: \${{ secrets.NODE_AUTH_TOKEN }}
|
|
72
|
-
SCRIBE_LOG_LEVEL: info
|
|
73
|
-
|
|
74
|
-
jobs:
|
|
75
|
-
lint:
|
|
76
|
-
runs-on: ubuntu-latest
|
|
77
|
-
timeout-minutes: 15
|
|
78
|
-
permissions:
|
|
79
|
-
contents: read
|
|
80
|
-
steps:
|
|
81
|
-
- uses: actions/checkout@v4
|
|
82
|
-
with:
|
|
83
|
-
fetch-depth: 1
|
|
84
|
-
|
|
85
|
-
- uses: ./.github/actions/setup-node-pnpm
|
|
86
|
-
|
|
87
|
-
- name: Lint and typecheck
|
|
88
|
-
run: |
|
|
89
|
-
set +e
|
|
90
|
-
pnpm run lint:check &
|
|
91
|
-
lint_pid=$!
|
|
92
|
-
pnpm run typecheck &
|
|
93
|
-
tsc_pid=$!
|
|
94
|
-
wait "$lint_pid"
|
|
95
|
-
lint_code=$?
|
|
96
|
-
wait "$tsc_pid"
|
|
97
|
-
tsc_code=$?
|
|
98
|
-
set -e
|
|
99
|
-
if [[ "$lint_code" -ne 0 || "$tsc_code" -ne 0 ]]; then
|
|
100
|
-
exit 1
|
|
101
|
-
fi
|
|
102
|
-
|
|
103
|
-
test:
|
|
104
|
-
runs-on: ubuntu-latest
|
|
105
|
-
timeout-minutes: 20
|
|
106
|
-
permissions:
|
|
107
|
-
contents: read
|
|
108
|
-
steps:
|
|
109
|
-
- uses: actions/checkout@v4
|
|
110
|
-
with:
|
|
111
|
-
fetch-depth: 1
|
|
112
|
-
|
|
113
|
-
- uses: ./.github/actions/setup-node-pnpm
|
|
114
|
-
|
|
115
|
-
- name: Test
|
|
116
|
-
run: pnpm test
|
|
117
|
-
|
|
118
|
-
- name: Build (default branch)
|
|
119
|
-
if: github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
|
|
120
|
-
run: pnpm run build
|
|
121
|
-
|
|
122
|
-
ci:
|
|
123
|
-
needs: [lint, test]
|
|
124
|
-
if: always()
|
|
125
|
-
runs-on: ubuntu-latest
|
|
126
|
-
timeout-minutes: 5
|
|
127
|
-
steps:
|
|
128
|
-
- name: Aggregate
|
|
129
|
-
run: |
|
|
130
|
-
if [[ "\${{ needs.lint.result }}" != "success" || "\${{ needs.test.result }}" != "success" ]]; then
|
|
131
|
-
echo "CI failed (lint=\${{ needs.lint.result }} test=\${{ needs.test.result }})"
|
|
132
|
-
exit 1
|
|
133
|
-
fi
|
|
134
|
-
echo "CI passed"
|
|
135
|
-
`
|
|
136
|
-
},
|
|
137
|
-
{
|
|
138
|
-
filePath: ".github/workflows/publish.yml",
|
|
139
|
-
content: `name: Publish
|
|
140
|
-
|
|
141
|
-
on:
|
|
142
|
-
workflow_run:
|
|
143
|
-
workflows: ["CI"]
|
|
144
|
-
types: [completed]
|
|
145
|
-
|
|
146
|
-
concurrency:
|
|
147
|
-
group: publish-\${{ github.event.workflow_run.head_branch }}
|
|
148
|
-
cancel-in-progress: false
|
|
149
|
-
|
|
150
|
-
env:
|
|
151
|
-
NODE_AUTH_TOKEN: \${{ secrets.NODE_AUTH_TOKEN }}
|
|
152
|
-
SCRIBE_LOG_LEVEL: info
|
|
153
|
-
|
|
154
|
-
jobs:
|
|
155
|
-
publish:
|
|
156
|
-
if: >
|
|
157
|
-
github.event.workflow_run.conclusion == 'success' &&
|
|
158
|
-
github.event.workflow_run.head_branch == github.event.repository.default_branch
|
|
159
|
-
runs-on: ubuntu-latest
|
|
160
|
-
timeout-minutes: 30
|
|
161
|
-
permissions:
|
|
162
|
-
contents: read
|
|
163
|
-
id-token: write
|
|
164
|
-
steps:
|
|
165
|
-
- uses: actions/checkout@v4
|
|
166
|
-
with:
|
|
167
|
-
ref: \${{ github.event.workflow_run.head_sha }}
|
|
168
|
-
fetch-depth: 1
|
|
169
|
-
|
|
170
|
-
- uses: ./.github/actions/setup-node-pnpm
|
|
171
|
-
|
|
172
|
-
- name: Build release
|
|
173
|
-
run: pnpm run build
|
|
174
|
-
|
|
175
|
-
- name: Publish packages
|
|
176
|
-
run: pnpm exec forge publish --configuration release
|
|
177
|
-
# Skips packages with "private": true (e.g. the webapi app).
|
|
178
|
-
# Optional registry images: add \`pnpm exec forge docker --configuration release --push\`
|
|
179
|
-
# after configuring GHCR/OIDC — not enabled by default (PaaS builds the Dockerfile).
|
|
180
|
-
`
|
|
181
|
-
}
|
|
182
|
-
];
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9naXRodWItY2kubW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvc291cmNlLWZpbGUuanNcIjtcblxuLyoqXG4gKiBNaW5pbWFsIEdpdEh1YiBBY3Rpb25zIGZvciBzY2FmZm9sZGVkIGFwcHM6IGxpbnQg4oilIHRlc3QsIGJ1aWxkIGdhdGUgb24gZGVmYXVsdCBicmFuY2gsXG4gKiBucG0gcHVibGlzaCBhZnRlciBDSSAoc2tpcHMgcHJpdmF0ZSBwYWNrYWdlcykuIE5vIGRlZmF1bHQgZm9yZ2UgZG9ja2VyIC0tcHVzaC5cbiAqL1xuZXhwb3J0IGNsYXNzIEdpdGh1YkNpV29ya2Zsb3dzIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHB1YmxpYyByZWFkb25seSBrZXkgPSBXRUxMX0tOT1dOX0ZJTEVTLkdJVEhVQl9DSTtcblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCIuZ2l0aHViL2FjdGlvbnMvc2V0dXAtbm9kZS1wbnBtL2FjdGlvbi55bWxcIixcblx0XHRcdFx0Y29udGVudDogYG5hbWU6IFNldHVwIE5vZGUgKyBwbnBtXG5kZXNjcmlwdGlvbjogSW5zdGFsbCBwbnBtIGFuZCBOb2RlLCBjb25maWd1cmUgbnBtIHJlZ2lzdHJ5IGF1dGgsIGluc3RhbGwgZGVwc1xuaW5wdXRzOlxuICBub2RlLXZlcnNpb246XG4gICAgZGVzY3JpcHRpb246IE5vZGUuanMgdmVyc2lvblxuICAgIHJlcXVpcmVkOiBmYWxzZVxuICAgIGRlZmF1bHQ6IFwiMjRcIlxuICBwbnBtLXZlcnNpb246XG4gICAgZGVzY3JpcHRpb246IHBucG0gdmVyc2lvblxuICAgIHJlcXVpcmVkOiBmYWxzZVxuICAgIGRlZmF1bHQ6IFwiMTBcIlxuICBpbnN0YWxsOlxuICAgIGRlc2NyaXB0aW9uOiBSdW4gcG5wbSBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlXG4gICAgcmVxdWlyZWQ6IGZhbHNlXG4gICAgZGVmYXVsdDogXCJ0cnVlXCJcblxucnVuczpcbiAgdXNpbmc6IGNvbXBvc2l0ZVxuICBzdGVwczpcbiAgICAtIHVzZXM6IHBucG0vYWN0aW9uLXNldHVwQHY0XG4gICAgICB3aXRoOlxuICAgICAgICB2ZXJzaW9uOiBcXCR7eyBpbnB1dHMucG5wbS12ZXJzaW9uIH19XG5cbiAgICAtIHVzZXM6IGFjdGlvbnMvc2V0dXAtbm9kZUB2NFxuICAgICAgd2l0aDpcbiAgICAgICAgbm9kZS12ZXJzaW9uOiBcXCR7eyBpbnB1dHMubm9kZS12ZXJzaW9uIH19XG4gICAgICAgIGNhY2hlOiBwbnBtXG4gICAgICAgIGNhY2hlLWRlcGVuZGVuY3ktcGF0aDogcG5wbS1sb2NrLnlhbWxcblxuICAgIC0gbmFtZTogQ29uZmlndXJlIG5wbSBhdXRoXG4gICAgICBzaGVsbDogYmFzaFxuICAgICAgcnVuOiB8XG4gICAgICAgIGlmIFtbIC1uIFwiXFwke05PREVfQVVUSF9UT0tFTjotfVwiIF1dOyB0aGVuXG4gICAgICAgICAgZWNobyBcIi8vcmVnaXN0cnkubnBtanMub3JnLzpfYXV0aFRva2VuPVxcJHtOT0RFX0FVVEhfVE9LRU59XCIgPj4gLm5wbXJjXG4gICAgICAgIGZpXG5cbiAgICAtIG5hbWU6IEluc3RhbGwgZGVwZW5kZW5jaWVzXG4gICAgICBpZjogaW5wdXRzLmluc3RhbGwgPT0gJ3RydWUnXG4gICAgICBzaGVsbDogYmFzaFxuICAgICAgcnVuOiB8XG4gICAgICAgIGlmIFtbIC1mIHBucG0tbG9jay55YW1sIF1dOyB0aGVuXG4gICAgICAgICAgcG5wbSBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBwbnBtIGluc3RhbGxcbiAgICAgICAgZmlcbmAsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCIuZ2l0aHViL3dvcmtmbG93cy9jaS55bWxcIixcblx0XHRcdFx0Y29udGVudDogYG5hbWU6IENJXG5vbjpcbiAgcHVzaDpcbiAgICBicmFuY2hlczpcbiAgICAgIC0gXCIqXCJcbiAgcHVsbF9yZXF1ZXN0OlxuICB3b3JrZmxvd19kaXNwYXRjaDpcbmNvbmN1cnJlbmN5OlxuICBncm91cDogY2ktXFwke3sgZ2l0aHViLnJlZiB9fVxuICBjYW5jZWwtaW4tcHJvZ3Jlc3M6IHRydWVcbmVudjpcbiAgTk9ERV9BVVRIX1RPS0VOOiBcXCR7eyBzZWNyZXRzLk5PREVfQVVUSF9UT0tFTiB9fVxuICBTQ1JJQkVfTE9HX0xFVkVMOiBpbmZvXG5cbmpvYnM6XG4gIGxpbnQ6XG4gICAgcnVucy1vbjogdWJ1bnR1LWxhdGVzdFxuICAgIHRpbWVvdXQtbWludXRlczogMTVcbiAgICBwZXJtaXNzaW9uczpcbiAgICAgIGNvbnRlbnRzOiByZWFkXG4gICAgc3RlcHM6XG4gICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjRcbiAgICAgICAgd2l0aDpcbiAgICAgICAgICBmZXRjaC1kZXB0aDogMVxuXG4gICAgICAtIHVzZXM6IC4vLmdpdGh1Yi9hY3Rpb25zL3NldHVwLW5vZGUtcG5wbVxuXG4gICAgICAtIG5hbWU6IExpbnQgYW5kIHR5cGVjaGVja1xuICAgICAgICBydW46IHxcbiAgICAgICAgICBzZXQgK2VcbiAgICAgICAgICBwbnBtIHJ1biBsaW50OmNoZWNrICZcbiAgICAgICAgICBsaW50X3BpZD0kIVxuICAgICAgICAgIHBucG0gcnVuIHR5cGVjaGVjayAmXG4gICAgICAgICAgdHNjX3BpZD0kIVxuICAgICAgICAgIHdhaXQgXCIkbGludF9waWRcIlxuICAgICAgICAgIGxpbnRfY29kZT0kP1xuICAgICAgICAgIHdhaXQgXCIkdHNjX3BpZFwiXG4gICAgICAgICAgdHNjX2NvZGU9JD9cbiAgICAgICAgICBzZXQgLWVcbiAgICAgICAgICBpZiBbWyBcIiRsaW50X2NvZGVcIiAtbmUgMCB8fCBcIiR0c2NfY29kZVwiIC1uZSAwIF1dOyB0aGVuXG4gICAgICAgICAgICBleGl0IDFcbiAgICAgICAgICBmaVxuXG4gIHRlc3Q6XG4gICAgcnVucy1vbjogdWJ1bnR1LWxhdGVzdFxuICAgIHRpbWVvdXQtbWludXRlczogMjBcbiAgICBwZXJtaXNzaW9uczpcbiAgICAgIGNvbnRlbnRzOiByZWFkXG4gICAgc3RlcHM6XG4gICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjRcbiAgICAgICAgd2l0aDpcbiAgICAgICAgICBmZXRjaC1kZXB0aDogMVxuXG4gICAgICAtIHVzZXM6IC4vLmdpdGh1Yi9hY3Rpb25zL3NldHVwLW5vZGUtcG5wbVxuXG4gICAgICAtIG5hbWU6IFRlc3RcbiAgICAgICAgcnVuOiBwbnBtIHRlc3RcblxuICAgICAgLSBuYW1lOiBCdWlsZCAoZGVmYXVsdCBicmFuY2gpXG4gICAgICAgIGlmOiBnaXRodWIucmVmID09IGZvcm1hdCgncmVmcy9oZWFkcy97MH0nLCBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5kZWZhdWx0X2JyYW5jaClcbiAgICAgICAgcnVuOiBwbnBtIHJ1biBidWlsZFxuXG4gIGNpOlxuICAgIG5lZWRzOiBbbGludCwgdGVzdF1cbiAgICBpZjogYWx3YXlzKClcbiAgICBydW5zLW9uOiB1YnVudHUtbGF0ZXN0XG4gICAgdGltZW91dC1taW51dGVzOiA1XG4gICAgc3RlcHM6XG4gICAgICAtIG5hbWU6IEFnZ3JlZ2F0ZVxuICAgICAgICBydW46IHxcbiAgICAgICAgICBpZiBbWyBcIlxcJHt7IG5lZWRzLmxpbnQucmVzdWx0IH19XCIgIT0gXCJzdWNjZXNzXCIgfHwgXCJcXCR7eyBuZWVkcy50ZXN0LnJlc3VsdCB9fVwiICE9IFwic3VjY2Vzc1wiIF1dOyB0aGVuXG4gICAgICAgICAgICBlY2hvIFwiQ0kgZmFpbGVkIChsaW50PVxcJHt7IG5lZWRzLmxpbnQucmVzdWx0IH19IHRlc3Q9XFwke3sgbmVlZHMudGVzdC5yZXN1bHQgfX0pXCJcbiAgICAgICAgICAgIGV4aXQgMVxuICAgICAgICAgIGZpXG4gICAgICAgICAgZWNobyBcIkNJIHBhc3NlZFwiXG5gLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLmdpdGh1Yi93b3JrZmxvd3MvcHVibGlzaC55bWxcIixcblx0XHRcdFx0Y29udGVudDogYG5hbWU6IFB1Ymxpc2hcblxub246XG4gIHdvcmtmbG93X3J1bjpcbiAgICB3b3JrZmxvd3M6IFtcIkNJXCJdXG4gICAgdHlwZXM6IFtjb21wbGV0ZWRdXG5cbmNvbmN1cnJlbmN5OlxuICBncm91cDogcHVibGlzaC1cXCR7eyBnaXRodWIuZXZlbnQud29ya2Zsb3dfcnVuLmhlYWRfYnJhbmNoIH19XG4gIGNhbmNlbC1pbi1wcm9ncmVzczogZmFsc2VcblxuZW52OlxuICBOT0RFX0FVVEhfVE9LRU46IFxcJHt7IHNlY3JldHMuTk9ERV9BVVRIX1RPS0VOIH19XG4gIFNDUklCRV9MT0dfTEVWRUw6IGluZm9cblxuam9iczpcbiAgcHVibGlzaDpcbiAgICBpZjogPlxuICAgICAgZ2l0aHViLmV2ZW50LndvcmtmbG93X3J1bi5jb25jbHVzaW9uID09ICdzdWNjZXNzJyAmJlxuICAgICAgZ2l0aHViLmV2ZW50LndvcmtmbG93X3J1bi5oZWFkX2JyYW5jaCA9PSBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5kZWZhdWx0X2JyYW5jaFxuICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3RcbiAgICB0aW1lb3V0LW1pbnV0ZXM6IDMwXG4gICAgcGVybWlzc2lvbnM6XG4gICAgICBjb250ZW50czogcmVhZFxuICAgICAgaWQtdG9rZW46IHdyaXRlXG4gICAgc3RlcHM6XG4gICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjRcbiAgICAgICAgd2l0aDpcbiAgICAgICAgICByZWY6IFxcJHt7IGdpdGh1Yi5ldmVudC53b3JrZmxvd19ydW4uaGVhZF9zaGEgfX1cbiAgICAgICAgICBmZXRjaC1kZXB0aDogMVxuXG4gICAgICAtIHVzZXM6IC4vLmdpdGh1Yi9hY3Rpb25zL3NldHVwLW5vZGUtcG5wbVxuXG4gICAgICAtIG5hbWU6IEJ1aWxkIHJlbGVhc2VcbiAgICAgICAgcnVuOiBwbnBtIHJ1biBidWlsZFxuXG4gICAgICAtIG5hbWU6IFB1Ymxpc2ggcGFja2FnZXNcbiAgICAgICAgcnVuOiBwbnBtIGV4ZWMgZm9yZ2UgcHVibGlzaCAtLWNvbmZpZ3VyYXRpb24gcmVsZWFzZVxuICAgICAgICAjIFNraXBzIHBhY2thZ2VzIHdpdGggXCJwcml2YXRlXCI6IHRydWUgKGUuZy4gdGhlIHdlYmFwaSBhcHApLlxuICAgICAgICAjIE9wdGlvbmFsIHJlZ2lzdHJ5IGltYWdlczogYWRkIFxcYHBucG0gZXhlYyBmb3JnZSBkb2NrZXIgLS1jb25maWd1cmF0aW9uIHJlbGVhc2UgLS1wdXNoXFxgXG4gICAgICAgICMgYWZ0ZXIgY29uZmlndXJpbmcgR0hDUi9PSURDIOKAlCBub3QgZW5hYmxlZCBieSBkZWZhdWx0IChQYWFTIGJ1aWxkcyB0aGUgRG9ja2VyZmlsZSkuXG5gLFxuXHRcdFx0fSxcblx0XHRdO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiV0VMTF9LTk9XTl9GSUxFUyIsIkdpdGh1YkNpV29ya2Zsb3dzIiwia2V5IiwiR0lUSFVCX0NJIiwiZmlsZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGdCQUFnQixRQUFRLHdCQUF3QjtBQUd6RDs7O0NBR0MsR0FDRCxPQUFPLE1BQU1DO0lBQ0lDLE1BQU1GLGlCQUFpQkcsU0FBUyxDQUFDO0lBRTFDQyxRQUFzQjtRQUM1QixPQUFPO1lBQ047Z0JBQ0NDLFVBQVU7Z0JBQ1ZDLFNBQVMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkNkLENBQUM7WUFDRTtZQUNBO2dCQUNDRCxVQUFVO2dCQUNWQyxTQUFTLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTJFZCxDQUFDO1lBQ0U7WUFDQTtnQkFDQ0QsVUFBVTtnQkFDVkMsU0FBUyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlDZCxDQUFDO1lBQ0U7U0FDQTtJQUNGO0FBQ0QifQ==
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
import { WELL_KNOWN_FILES } from "../../models/const.js";
|
|
2
|
-
/** Tracks named imports from a single module path, split into values and types. */ class ImportGroup {
|
|
3
|
-
_values = [];
|
|
4
|
-
_types = [];
|
|
5
|
-
add(name, typeOnly = false) {
|
|
6
|
-
if (typeOnly) {
|
|
7
|
-
// Value import already present — value wins, skip
|
|
8
|
-
if (!this._values.includes(name) && !this._types.includes(name)) {
|
|
9
|
-
this._types.push(name);
|
|
10
|
-
}
|
|
11
|
-
} else {
|
|
12
|
-
// Promote: remove from types if it was previously type-only
|
|
13
|
-
const typeIdx = this._types.indexOf(name);
|
|
14
|
-
if (typeIdx !== -1) this._types.splice(typeIdx, 1);
|
|
15
|
-
if (!this._values.includes(name)) this._values.push(name);
|
|
16
|
-
}
|
|
17
|
-
return this;
|
|
18
|
-
}
|
|
19
|
-
render(from) {
|
|
20
|
-
const values = [
|
|
21
|
-
...this._values
|
|
22
|
-
].sort();
|
|
23
|
-
const types = [
|
|
24
|
-
...this._types
|
|
25
|
-
].sort().map((n)=>`type ${n}`);
|
|
26
|
-
return `import { ${[
|
|
27
|
-
...values,
|
|
28
|
-
...types
|
|
29
|
-
].join(", ")} } from "${from}";`;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Model for `projects/api/src/main.ts`.
|
|
34
|
-
*
|
|
35
|
-
* Starts with the minimal HTTP + YAML config setup. Features mutate the model
|
|
36
|
-
* by calling addSideEffectImport / addImport / addBuilderCall / addEntity /
|
|
37
|
-
* addRepository. files() renders whatever has been accumulated.
|
|
38
|
-
*/ export class MainSourceFile {
|
|
39
|
-
appName;
|
|
40
|
-
key = WELL_KNOWN_FILES.MAIN_TS;
|
|
41
|
-
_sideEffectImports = [];
|
|
42
|
-
_extraImports = new Map();
|
|
43
|
-
_builderCalls = [];
|
|
44
|
-
_entities = [];
|
|
45
|
-
_repositories = [];
|
|
46
|
-
_services = [];
|
|
47
|
-
_dataSourceName;
|
|
48
|
-
_typeOrmSeed;
|
|
49
|
-
constructor(appName){
|
|
50
|
-
this.appName = appName;
|
|
51
|
-
}
|
|
52
|
-
/** Adds a bare side-effect import, e.g. `@decohere/cortex/auth`. */ addSideEffectImport(path) {
|
|
53
|
-
if (!this._sideEffectImports.includes(path)) this._sideEffectImports.push(path);
|
|
54
|
-
return this;
|
|
55
|
-
}
|
|
56
|
-
/** Adds a named import, e.g. `import { Foo } from "bar"`. */ addImport(name, from, typeOnly = false) {
|
|
57
|
-
const group = this._extraImports.get(from) ?? new ImportGroup();
|
|
58
|
-
group.add(name, typeOnly);
|
|
59
|
-
this._extraImports.set(from, group);
|
|
60
|
-
return this;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Adds a builder call inserted after `.withConfiguration()` and before
|
|
64
|
-
* `.withServices()`. Pass the call without leading dot, e.g. `.withAuth()`.
|
|
65
|
-
*/ addBuilderCall(call) {
|
|
66
|
-
this._builderCalls.push(call);
|
|
67
|
-
return this;
|
|
68
|
-
}
|
|
69
|
-
/** Adds a TypeORM entity — import and entry in `withTypeOrm({ entities })`. */ addEntity(entity) {
|
|
70
|
-
this._entities.push(entity);
|
|
71
|
-
return this;
|
|
72
|
-
}
|
|
73
|
-
/** Adds a TypeORM repository — import and entry in `withTypeOrm({ repositories })`. */ addRepository(repo) {
|
|
74
|
-
this._repositories.push(repo);
|
|
75
|
-
return this;
|
|
76
|
-
}
|
|
77
|
-
/** Adds a service registered in `.withServices()`. */ addService(service) {
|
|
78
|
-
this._services.push(service);
|
|
79
|
-
return this;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Datasource name passed to `withTypeOrm({ name })`. Must match
|
|
83
|
-
* `database.dataSources[].name` in config.yaml.
|
|
84
|
-
*/ setDataSourceName(name) {
|
|
85
|
-
this._dataSourceName = name;
|
|
86
|
-
return this;
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Inline seed callback body for `withTypeOrm({ seed })`.
|
|
90
|
-
* Receives `dataSource` in scope. Example: `await dataSource.getRepository(User).save(...)`.
|
|
91
|
-
*/ setTypeOrmSeed(seedBody) {
|
|
92
|
-
this._typeOrmSeed = seedBody;
|
|
93
|
-
return this;
|
|
94
|
-
}
|
|
95
|
-
files() {
|
|
96
|
-
const imports = [
|
|
97
|
-
'import "@decohere/scribe-pino";',
|
|
98
|
-
'import "@decohere/cortex/http";'
|
|
99
|
-
];
|
|
100
|
-
for (const path of this._sideEffectImports){
|
|
101
|
-
imports.push(`import "${path}";`);
|
|
102
|
-
}
|
|
103
|
-
imports.push('import "@decohere/protocol";', 'import { YamlDataSource } from "@decohere/protocol";', 'import { Builder } from "@decohere/cortex";', 'import { FastifyProvider } from "@decohere/cortex/providers";', 'import { scribe } from "@decohere/scribe";', 'import { SampleService } from "./services/sample.service.js";');
|
|
104
|
-
for (const e of this._entities){
|
|
105
|
-
imports.push(`import { ${e.className} } from "${e.importPath}";`);
|
|
106
|
-
}
|
|
107
|
-
for (const r of this._repositories){
|
|
108
|
-
imports.push(`import { ${r.className} } from "${r.importPath}";`);
|
|
109
|
-
}
|
|
110
|
-
for (const s of this._services){
|
|
111
|
-
imports.push(`import { ${s.className} } from "${s.importPath}";`);
|
|
112
|
-
}
|
|
113
|
-
for (const [from, group] of this._extraImports){
|
|
114
|
-
imports.push(group.render(from));
|
|
115
|
-
}
|
|
116
|
-
imports.push('import { HelloController } from "./controllers/hello.controller.js";');
|
|
117
|
-
const serviceRegs = [
|
|
118
|
-
"cb.registerSingleton(SampleService);",
|
|
119
|
-
...this._services.map((s)=>s.scope === "request" ? `cb.registerRequestScoped(${s.className});` : `cb.registerSingleton(${s.className});`)
|
|
120
|
-
].join(" ");
|
|
121
|
-
const builderCalls = [
|
|
122
|
-
`\t.withHttpProvider(FastifyProvider)`,
|
|
123
|
-
`\t.withConfiguration(YamlDataSource)`,
|
|
124
|
-
...this._builderCalls.map((c)=>`\t${c}`),
|
|
125
|
-
`\t.withServices((cb) => { ${serviceRegs} })`
|
|
126
|
-
];
|
|
127
|
-
if (this._entities.length > 0) {
|
|
128
|
-
const entities = this._entities.map((e)=>e.className).join(", ");
|
|
129
|
-
const repos = this._repositories.map((r)=>r.className).join(", ");
|
|
130
|
-
const named = this._dataSourceName != null ? `name: "${this._dataSourceName}", ` : "";
|
|
131
|
-
if (this._typeOrmSeed) {
|
|
132
|
-
builderCalls.push(`\t.withTypeOrm({ ${named}entities: [${entities}], repositories: [${repos}], seed: async (dataSource) => { ${this._typeOrmSeed} } })`);
|
|
133
|
-
} else {
|
|
134
|
-
builderCalls.push(`\t.withTypeOrm({ ${named}entities: [${entities}], repositories: [${repos}] })`);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
builderCalls.push(`\t.withControllers(HelloController)`);
|
|
138
|
-
const content = [
|
|
139
|
-
...imports,
|
|
140
|
-
"",
|
|
141
|
-
"scribe.extend.withPinoPretty();",
|
|
142
|
-
"",
|
|
143
|
-
`const app = await Builder.create({ applicationName: "${this.appName}" })`,
|
|
144
|
-
...builderCalls,
|
|
145
|
-
`\t.build();`,
|
|
146
|
-
"",
|
|
147
|
-
"await app.start({ port: Number(process.env.PORT) || 3000 });",
|
|
148
|
-
"",
|
|
149
|
-
"export default app;",
|
|
150
|
-
""
|
|
151
|
-
].join("\n");
|
|
152
|
-
return [
|
|
153
|
-
{
|
|
154
|
-
filePath: "src/main.ts",
|
|
155
|
-
content
|
|
156
|
-
}
|
|
157
|
-
];
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9tYWluLXNvdXJjZS1maWxlLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFR5cGVPcm1JbXBvcnQgPSB7IGNsYXNzTmFtZTogc3RyaW5nOyBpbXBvcnRQYXRoOiBzdHJpbmcgfTtcbmV4cG9ydCB0eXBlIFNlcnZpY2VJbXBvcnQgPSBUeXBlT3JtSW1wb3J0ICYgeyBzY29wZT86IFwic2luZ2xldG9uXCIgfCBcInJlcXVlc3RcIiB9O1xuXG4vKiogVHJhY2tzIG5hbWVkIGltcG9ydHMgZnJvbSBhIHNpbmdsZSBtb2R1bGUgcGF0aCwgc3BsaXQgaW50byB2YWx1ZXMgYW5kIHR5cGVzLiAqL1xuY2xhc3MgSW1wb3J0R3JvdXAge1xuXHRwcml2YXRlIHJlYWRvbmx5IF92YWx1ZXM6IHN0cmluZ1tdID0gW107XG5cdHByaXZhdGUgcmVhZG9ubHkgX3R5cGVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdHB1YmxpYyBhZGQobmFtZTogc3RyaW5nLCB0eXBlT25seSA9IGZhbHNlKTogdGhpcyB7XG5cdFx0aWYgKHR5cGVPbmx5KSB7XG5cdFx0XHQvLyBWYWx1ZSBpbXBvcnQgYWxyZWFkeSBwcmVzZW50IOKAlCB2YWx1ZSB3aW5zLCBza2lwXG5cdFx0XHRpZiAoIXRoaXMuX3ZhbHVlcy5pbmNsdWRlcyhuYW1lKSAmJiAhdGhpcy5fdHlwZXMuaW5jbHVkZXMobmFtZSkpIHtcblx0XHRcdFx0dGhpcy5fdHlwZXMucHVzaChuYW1lKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gUHJvbW90ZTogcmVtb3ZlIGZyb20gdHlwZXMgaWYgaXQgd2FzIHByZXZpb3VzbHkgdHlwZS1vbmx5XG5cdFx0XHRjb25zdCB0eXBlSWR4ID0gdGhpcy5fdHlwZXMuaW5kZXhPZihuYW1lKTtcblx0XHRcdGlmICh0eXBlSWR4ICE9PSAtMSkgdGhpcy5fdHlwZXMuc3BsaWNlKHR5cGVJZHgsIDEpO1xuXHRcdFx0aWYgKCF0aGlzLl92YWx1ZXMuaW5jbHVkZXMobmFtZSkpIHRoaXMuX3ZhbHVlcy5wdXNoKG5hbWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyByZW5kZXIoZnJvbTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCB2YWx1ZXMgPSBbLi4udGhpcy5fdmFsdWVzXS5zb3J0KCk7XG5cdFx0Y29uc3QgdHlwZXMgPSBbLi4udGhpcy5fdHlwZXNdLnNvcnQoKS5tYXAoKG4pID0+IGB0eXBlICR7bn1gKTtcblx0XHRyZXR1cm4gYGltcG9ydCB7ICR7Wy4uLnZhbHVlcywgLi4udHlwZXNdLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwiJHtmcm9tfVwiO2A7XG5cdH1cbn1cblxuLyoqXG4gKiBNb2RlbCBmb3IgYHByb2plY3RzL2FwaS9zcmMvbWFpbi50c2AuXG4gKlxuICogU3RhcnRzIHdpdGggdGhlIG1pbmltYWwgSFRUUCArIFlBTUwgY29uZmlnIHNldHVwLiBGZWF0dXJlcyBtdXRhdGUgdGhlIG1vZGVsXG4gKiBieSBjYWxsaW5nIGFkZFNpZGVFZmZlY3RJbXBvcnQgLyBhZGRJbXBvcnQgLyBhZGRCdWlsZGVyQ2FsbCAvIGFkZEVudGl0eSAvXG4gKiBhZGRSZXBvc2l0b3J5LiBmaWxlcygpIHJlbmRlcnMgd2hhdGV2ZXIgaGFzIGJlZW4gYWNjdW11bGF0ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYWluU291cmNlRmlsZSBpbXBsZW1lbnRzIEtleWVkTW9kZWwge1xuXHRwdWJsaWMgcmVhZG9ubHkga2V5ID0gV0VMTF9LTk9XTl9GSUxFUy5NQUlOX1RTO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX3NpZGVFZmZlY3RJbXBvcnRzOiBzdHJpbmdbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9leHRyYUltcG9ydHMgPSBuZXcgTWFwPHN0cmluZywgSW1wb3J0R3JvdXA+KCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2J1aWxkZXJDYWxsczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSBfZW50aXRpZXM6IFR5cGVPcm1JbXBvcnRbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9yZXBvc2l0b3JpZXM6IFR5cGVPcm1JbXBvcnRbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9zZXJ2aWNlczogU2VydmljZUltcG9ydFtdID0gW107XG5cdHByaXZhdGUgX2RhdGFTb3VyY2VOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHByaXZhdGUgX3R5cGVPcm1TZWVkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXBwTmFtZTogc3RyaW5nKSB7fVxuXG5cdC8qKiBBZGRzIGEgYmFyZSBzaWRlLWVmZmVjdCBpbXBvcnQsIGUuZy4gYEBkZWNvaGVyZS9jb3J0ZXgvYXV0aGAuICovXG5cdHB1YmxpYyBhZGRTaWRlRWZmZWN0SW1wb3J0KHBhdGg6IHN0cmluZyk6IHRoaXMge1xuXHRcdGlmICghdGhpcy5fc2lkZUVmZmVjdEltcG9ydHMuaW5jbHVkZXMocGF0aCkpIHRoaXMuX3NpZGVFZmZlY3RJbXBvcnRzLnB1c2gocGF0aCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKiogQWRkcyBhIG5hbWVkIGltcG9ydCwgZS5nLiBgaW1wb3J0IHsgRm9vIH0gZnJvbSBcImJhclwiYC4gKi9cblx0cHVibGljIGFkZEltcG9ydChuYW1lOiBzdHJpbmcsIGZyb206IHN0cmluZywgdHlwZU9ubHkgPSBmYWxzZSk6IHRoaXMge1xuXHRcdGNvbnN0IGdyb3VwID0gdGhpcy5fZXh0cmFJbXBvcnRzLmdldChmcm9tKSA/PyBuZXcgSW1wb3J0R3JvdXAoKTtcblx0XHRncm91cC5hZGQobmFtZSwgdHlwZU9ubHkpO1xuXHRcdHRoaXMuX2V4dHJhSW1wb3J0cy5zZXQoZnJvbSwgZ3JvdXApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBidWlsZGVyIGNhbGwgaW5zZXJ0ZWQgYWZ0ZXIgYC53aXRoQ29uZmlndXJhdGlvbigpYCBhbmQgYmVmb3JlXG5cdCAqIGAud2l0aFNlcnZpY2VzKClgLiBQYXNzIHRoZSBjYWxsIHdpdGhvdXQgbGVhZGluZyBkb3QsIGUuZy4gYC53aXRoQXV0aCgpYC5cblx0ICovXG5cdHB1YmxpYyBhZGRCdWlsZGVyQ2FsbChjYWxsOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9idWlsZGVyQ2FsbHMucHVzaChjYWxsKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGRzIGEgVHlwZU9STSBlbnRpdHkg4oCUIGltcG9ydCBhbmQgZW50cnkgaW4gYHdpdGhUeXBlT3JtKHsgZW50aXRpZXMgfSlgLiAqL1xuXHRwdWJsaWMgYWRkRW50aXR5KGVudGl0eTogVHlwZU9ybUltcG9ydCk6IHRoaXMge1xuXHRcdHRoaXMuX2VudGl0aWVzLnB1c2goZW50aXR5KTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGRzIGEgVHlwZU9STSByZXBvc2l0b3J5IOKAlCBpbXBvcnQgYW5kIGVudHJ5IGluIGB3aXRoVHlwZU9ybSh7IHJlcG9zaXRvcmllcyB9KWAuICovXG5cdHB1YmxpYyBhZGRSZXBvc2l0b3J5KHJlcG86IFR5cGVPcm1JbXBvcnQpOiB0aGlzIHtcblx0XHR0aGlzLl9yZXBvc2l0b3JpZXMucHVzaChyZXBvKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGRzIGEgc2VydmljZSByZWdpc3RlcmVkIGluIGAud2l0aFNlcnZpY2VzKClgLiAqL1xuXHRwdWJsaWMgYWRkU2VydmljZShzZXJ2aWNlOiBTZXJ2aWNlSW1wb3J0KTogdGhpcyB7XG5cdFx0dGhpcy5fc2VydmljZXMucHVzaChzZXJ2aWNlKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBEYXRhc291cmNlIG5hbWUgcGFzc2VkIHRvIGB3aXRoVHlwZU9ybSh7IG5hbWUgfSlgLiBNdXN0IG1hdGNoXG5cdCAqIGBkYXRhYmFzZS5kYXRhU291cmNlc1tdLm5hbWVgIGluIGNvbmZpZy55YW1sLlxuXHQgKi9cblx0cHVibGljIHNldERhdGFTb3VyY2VOYW1lKG5hbWU6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2RhdGFTb3VyY2VOYW1lID0gbmFtZTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmxpbmUgc2VlZCBjYWxsYmFjayBib2R5IGZvciBgd2l0aFR5cGVPcm0oeyBzZWVkIH0pYC5cblx0ICogUmVjZWl2ZXMgYGRhdGFTb3VyY2VgIGluIHNjb3BlLiBFeGFtcGxlOiBgYXdhaXQgZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFVzZXIpLnNhdmUoLi4uKWAuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VHlwZU9ybVNlZWQoc2VlZEJvZHk6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX3R5cGVPcm1TZWVkID0gc2VlZEJvZHk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtcblx0XHRcdCdpbXBvcnQgXCJAZGVjb2hlcmUvc2NyaWJlLXBpbm9cIjsnLFxuXHRcdFx0J2ltcG9ydCBcIkBkZWNvaGVyZS9jb3J0ZXgvaHR0cFwiOycsXG5cdFx0XTtcblxuXHRcdGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLl9zaWRlRWZmZWN0SW1wb3J0cykge1xuXHRcdFx0aW1wb3J0cy5wdXNoKGBpbXBvcnQgXCIke3BhdGh9XCI7YCk7XG5cdFx0fVxuXG5cdFx0aW1wb3J0cy5wdXNoKFxuXHRcdFx0J2ltcG9ydCBcIkBkZWNvaGVyZS9wcm90b2NvbFwiOycsXG5cdFx0XHQnaW1wb3J0IHsgWWFtbERhdGFTb3VyY2UgfSBmcm9tIFwiQGRlY29oZXJlL3Byb3RvY29sXCI7Jyxcblx0XHRcdCdpbXBvcnQgeyBCdWlsZGVyIH0gZnJvbSBcIkBkZWNvaGVyZS9jb3J0ZXhcIjsnLFxuXHRcdFx0J2ltcG9ydCB7IEZhc3RpZnlQcm92aWRlciB9IGZyb20gXCJAZGVjb2hlcmUvY29ydGV4L3Byb3ZpZGVyc1wiOycsXG5cdFx0XHQnaW1wb3J0IHsgc2NyaWJlIH0gZnJvbSBcIkBkZWNvaGVyZS9zY3JpYmVcIjsnLFxuXHRcdFx0J2ltcG9ydCB7IFNhbXBsZVNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlcy9zYW1wbGUuc2VydmljZS5qc1wiOycsXG5cdFx0KTtcblxuXHRcdGZvciAoY29uc3QgZSBvZiB0aGlzLl9lbnRpdGllcykge1xuXHRcdFx0aW1wb3J0cy5wdXNoKGBpbXBvcnQgeyAke2UuY2xhc3NOYW1lfSB9IGZyb20gXCIke2UuaW1wb3J0UGF0aH1cIjtgKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IHIgb2YgdGhpcy5fcmVwb3NpdG9yaWVzKSB7XG5cdFx0XHRpbXBvcnRzLnB1c2goYGltcG9ydCB7ICR7ci5jbGFzc05hbWV9IH0gZnJvbSBcIiR7ci5pbXBvcnRQYXRofVwiO2ApO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgcyBvZiB0aGlzLl9zZXJ2aWNlcykge1xuXHRcdFx0aW1wb3J0cy5wdXNoKGBpbXBvcnQgeyAke3MuY2xhc3NOYW1lfSB9IGZyb20gXCIke3MuaW1wb3J0UGF0aH1cIjtgKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IFtmcm9tLCBncm91cF0gb2YgdGhpcy5fZXh0cmFJbXBvcnRzKSB7XG5cdFx0XHRpbXBvcnRzLnB1c2goZ3JvdXAucmVuZGVyKGZyb20pKTtcblx0XHR9XG5cblx0XHRpbXBvcnRzLnB1c2goJ2ltcG9ydCB7IEhlbGxvQ29udHJvbGxlciB9IGZyb20gXCIuL2NvbnRyb2xsZXJzL2hlbGxvLmNvbnRyb2xsZXIuanNcIjsnKTtcblxuXHRcdGNvbnN0IHNlcnZpY2VSZWdzID0gW1xuXHRcdFx0XCJjYi5yZWdpc3RlclNpbmdsZXRvbihTYW1wbGVTZXJ2aWNlKTtcIixcblx0XHRcdC4uLnRoaXMuX3NlcnZpY2VzLm1hcCgocykgPT5cblx0XHRcdFx0cy5zY29wZSA9PT0gXCJyZXF1ZXN0XCJcblx0XHRcdFx0XHQ/IGBjYi5yZWdpc3RlclJlcXVlc3RTY29wZWQoJHtzLmNsYXNzTmFtZX0pO2Bcblx0XHRcdFx0XHQ6IGBjYi5yZWdpc3RlclNpbmdsZXRvbigke3MuY2xhc3NOYW1lfSk7YCxcblx0XHRcdCksXG5cdFx0XS5qb2luKFwiIFwiKTtcblxuXHRcdGNvbnN0IGJ1aWxkZXJDYWxsczogc3RyaW5nW10gPSBbXG5cdFx0XHRgXFx0LndpdGhIdHRwUHJvdmlkZXIoRmFzdGlmeVByb3ZpZGVyKWAsXG5cdFx0XHRgXFx0LndpdGhDb25maWd1cmF0aW9uKFlhbWxEYXRhU291cmNlKWAsXG5cdFx0XHQuLi50aGlzLl9idWlsZGVyQ2FsbHMubWFwKChjKSA9PiBgXFx0JHtjfWApLFxuXHRcdFx0YFxcdC53aXRoU2VydmljZXMoKGNiKSA9PiB7ICR7c2VydmljZVJlZ3N9IH0pYCxcblx0XHRdO1xuXG5cdFx0aWYgKHRoaXMuX2VudGl0aWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IGVudGl0aWVzID0gdGhpcy5fZW50aXRpZXMubWFwKChlKSA9PiBlLmNsYXNzTmFtZSkuam9pbihcIiwgXCIpO1xuXHRcdFx0Y29uc3QgcmVwb3MgPSB0aGlzLl9yZXBvc2l0b3JpZXMubWFwKChyKSA9PiByLmNsYXNzTmFtZSkuam9pbihcIiwgXCIpO1xuXHRcdFx0Y29uc3QgbmFtZWQgPSB0aGlzLl9kYXRhU291cmNlTmFtZSAhPSBudWxsID8gYG5hbWU6IFwiJHt0aGlzLl9kYXRhU291cmNlTmFtZX1cIiwgYCA6IFwiXCI7XG5cdFx0XHRpZiAodGhpcy5fdHlwZU9ybVNlZWQpIHtcblx0XHRcdFx0YnVpbGRlckNhbGxzLnB1c2goXG5cdFx0XHRcdFx0YFxcdC53aXRoVHlwZU9ybSh7ICR7bmFtZWR9ZW50aXRpZXM6IFske2VudGl0aWVzfV0sIHJlcG9zaXRvcmllczogWyR7cmVwb3N9XSwgc2VlZDogYXN5bmMgKGRhdGFTb3VyY2UpID0+IHsgJHt0aGlzLl90eXBlT3JtU2VlZH0gfSB9KWAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidWlsZGVyQ2FsbHMucHVzaChcblx0XHRcdFx0XHRgXFx0LndpdGhUeXBlT3JtKHsgJHtuYW1lZH1lbnRpdGllczogWyR7ZW50aXRpZXN9XSwgcmVwb3NpdG9yaWVzOiBbJHtyZXBvc31dIH0pYCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRidWlsZGVyQ2FsbHMucHVzaChgXFx0LndpdGhDb250cm9sbGVycyhIZWxsb0NvbnRyb2xsZXIpYCk7XG5cblx0XHRjb25zdCBjb250ZW50ID0gW1xuXHRcdFx0Li4uaW1wb3J0cyxcblx0XHRcdFwiXCIsXG5cdFx0XHRcInNjcmliZS5leHRlbmQud2l0aFBpbm9QcmV0dHkoKTtcIixcblx0XHRcdFwiXCIsXG5cdFx0XHRgY29uc3QgYXBwID0gYXdhaXQgQnVpbGRlci5jcmVhdGUoeyBhcHBsaWNhdGlvbk5hbWU6IFwiJHt0aGlzLmFwcE5hbWV9XCIgfSlgLFxuXHRcdFx0Li4uYnVpbGRlckNhbGxzLFxuXHRcdFx0YFxcdC5idWlsZCgpO2AsXG5cdFx0XHRcIlwiLFxuXHRcdFx0XCJhd2FpdCBhcHAuc3RhcnQoeyBwb3J0OiBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMCB9KTtcIixcblx0XHRcdFwiXCIsXG5cdFx0XHRcImV4cG9ydCBkZWZhdWx0IGFwcDtcIixcblx0XHRcdFwiXCIsXG5cdFx0XS5qb2luKFwiXFxuXCIpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwic3JjL21haW4udHNcIixcblx0XHRcdFx0Y29udGVudCxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIldFTExfS05PV05fRklMRVMiLCJJbXBvcnRHcm91cCIsIl92YWx1ZXMiLCJfdHlwZXMiLCJhZGQiLCJuYW1lIiwidHlwZU9ubHkiLCJpbmNsdWRlcyIsInB1c2giLCJ0eXBlSWR4IiwiaW5kZXhPZiIsInNwbGljZSIsInJlbmRlciIsImZyb20iLCJ2YWx1ZXMiLCJzb3J0IiwidHlwZXMiLCJtYXAiLCJuIiwiam9pbiIsIk1haW5Tb3VyY2VGaWxlIiwia2V5IiwiTUFJTl9UUyIsIl9zaWRlRWZmZWN0SW1wb3J0cyIsIl9leHRyYUltcG9ydHMiLCJNYXAiLCJfYnVpbGRlckNhbGxzIiwiX2VudGl0aWVzIiwiX3JlcG9zaXRvcmllcyIsIl9zZXJ2aWNlcyIsIl9kYXRhU291cmNlTmFtZSIsIl90eXBlT3JtU2VlZCIsImFwcE5hbWUiLCJhZGRTaWRlRWZmZWN0SW1wb3J0IiwicGF0aCIsImFkZEltcG9ydCIsImdyb3VwIiwiZ2V0Iiwic2V0IiwiYWRkQnVpbGRlckNhbGwiLCJjYWxsIiwiYWRkRW50aXR5IiwiZW50aXR5IiwiYWRkUmVwb3NpdG9yeSIsInJlcG8iLCJhZGRTZXJ2aWNlIiwic2VydmljZSIsInNldERhdGFTb3VyY2VOYW1lIiwic2V0VHlwZU9ybVNlZWQiLCJzZWVkQm9keSIsImZpbGVzIiwiaW1wb3J0cyIsImUiLCJjbGFzc05hbWUiLCJpbXBvcnRQYXRoIiwiciIsInMiLCJzZXJ2aWNlUmVncyIsInNjb3BlIiwiYnVpbGRlckNhbGxzIiwiYyIsImxlbmd0aCIsImVudGl0aWVzIiwicmVwb3MiLCJuYW1lZCIsImNvbnRlbnQiLCJmaWxlUGF0aCJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsZ0JBQWdCLFFBQVEsd0JBQXdCO0FBTXpELGlGQUFpRixHQUNqRixNQUFNQztJQUNZQyxVQUFvQixFQUFFLENBQUM7SUFDdkJDLFNBQW1CLEVBQUUsQ0FBQztJQUVoQ0Ms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
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import { WELL_KNOWN_FILES } from "../../models/const.js";
|
|
2
|
-
import { DEFAULT_WEBAPI_NAME, webapiProjectDir, webapiReleaseEntry } from "../const.js";
|
|
3
|
-
/**
|
|
4
|
-
* Production Dockerfiles for PaaS (Railway/Fly) and local `docker build`.
|
|
5
|
-
*
|
|
6
|
-
* Context is always the **repo root** (`docker build -f Dockerfile.billing .`).
|
|
7
|
-
* Root `Dockerfile` is the first API (`pnpm start`). Extra or custom-named APIs
|
|
8
|
-
* also get `Dockerfile.<name>` so each service can be deployed on its own.
|
|
9
|
-
*/ export class WebapiProductionDockerfile {
|
|
10
|
-
apiNames;
|
|
11
|
-
options;
|
|
12
|
-
key = WELL_KNOWN_FILES.PRODUCTION_DOCKERFILE;
|
|
13
|
-
constructor(apiNames = [
|
|
14
|
-
DEFAULT_WEBAPI_NAME
|
|
15
|
-
], options = {}){
|
|
16
|
-
this.apiNames = apiNames;
|
|
17
|
-
this.options = options;
|
|
18
|
-
}
|
|
19
|
-
files() {
|
|
20
|
-
const names = this.apiNames.length > 0 ? this.apiNames : [
|
|
21
|
-
DEFAULT_WEBAPI_NAME
|
|
22
|
-
];
|
|
23
|
-
const first = names[0] ?? DEFAULT_WEBAPI_NAME;
|
|
24
|
-
const files = [];
|
|
25
|
-
if (!this.options.namedOnly) {
|
|
26
|
-
files.push({
|
|
27
|
-
filePath: ".dockerignore",
|
|
28
|
-
content: dockerignoreContent()
|
|
29
|
-
});
|
|
30
|
-
files.push({
|
|
31
|
-
filePath: "Dockerfile",
|
|
32
|
-
content: renderProductionDockerfile(first, "start")
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
const emitNamed = this.options.namedOnly || names.length > 1 || first !== DEFAULT_WEBAPI_NAME;
|
|
36
|
-
if (emitNamed) {
|
|
37
|
-
for (const name of names){
|
|
38
|
-
files.push({
|
|
39
|
-
filePath: `Dockerfile.${name}`,
|
|
40
|
-
content: renderProductionDockerfile(name, `start:${name}`)
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return files;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
export function renderProductionDockerfile(apiName, startScript) {
|
|
48
|
-
const projectDir = webapiProjectDir(apiName);
|
|
49
|
-
const startCmd = startScript === "start" ? 'CMD ["pnpm", "start"]' : `CMD ["pnpm", "run", "${startScript}"]`;
|
|
50
|
-
const startEntry = webapiReleaseEntry(apiName);
|
|
51
|
-
return `# syntax=docker/dockerfile:1
|
|
52
|
-
# Self-contained production image: install + forge build happen inside docker build.
|
|
53
|
-
# Hosts (Railway/Fly/etc.) clone git and run \`docker build\` — they do not receive CI dist/.
|
|
54
|
-
# Build from the repo root: docker build -f Dockerfile${startScript === "start" ? "" : `.${apiName}`} .
|
|
55
|
-
#
|
|
56
|
-
# Private @decohere/* packages: pass a BuildKit secret named npm_token (npm auth token), e.g.
|
|
57
|
-
# docker build --secret id=npm_token,env=NODE_AUTH_TOKEN .
|
|
58
|
-
# Or set NODE_AUTH_TOKEN as a build-arg on hosts that only support build-args.
|
|
59
|
-
|
|
60
|
-
FROM node:24-bookworm AS build
|
|
61
|
-
WORKDIR /app
|
|
62
|
-
RUN corepack enable && corepack prepare pnpm@10 --activate
|
|
63
|
-
|
|
64
|
-
COPY package.json ./
|
|
65
|
-
COPY pnpm-lock.yaml* ./
|
|
66
|
-
COPY tsconfig.json biome.json ./
|
|
67
|
-
COPY config ./config
|
|
68
|
-
COPY ${projectDir} ./${projectDir}
|
|
69
|
-
|
|
70
|
-
ARG NODE_AUTH_TOKEN=
|
|
71
|
-
RUN --mount=type=secret,id=npm_token,required=false \\
|
|
72
|
-
if [ -f /run/secrets/npm_token ]; then \\
|
|
73
|
-
TOKEN="$(cat /run/secrets/npm_token)"; \\
|
|
74
|
-
else \\
|
|
75
|
-
TOKEN="\${NODE_AUTH_TOKEN}"; \\
|
|
76
|
-
fi; \\
|
|
77
|
-
if [ -n "$TOKEN" ]; then \\
|
|
78
|
-
echo "//registry.npmjs.org/:_authToken=\${TOKEN}" > .npmrc; \\
|
|
79
|
-
fi; \\
|
|
80
|
-
if [ -f pnpm-lock.yaml ]; then \\
|
|
81
|
-
pnpm install --frozen-lockfile; \\
|
|
82
|
-
else \\
|
|
83
|
-
pnpm install; \\
|
|
84
|
-
fi; \\
|
|
85
|
-
rm -f .npmrc
|
|
86
|
-
|
|
87
|
-
RUN pnpm run build
|
|
88
|
-
|
|
89
|
-
FROM node:24-bookworm-slim AS run
|
|
90
|
-
WORKDIR /app
|
|
91
|
-
ENV NODE_ENV=production
|
|
92
|
-
RUN corepack enable && corepack prepare pnpm@10 --activate
|
|
93
|
-
|
|
94
|
-
COPY --from=build /app/package.json ./
|
|
95
|
-
COPY --from=build /app/pnpm-lock.yaml* ./
|
|
96
|
-
COPY --from=build /app/config ./config
|
|
97
|
-
COPY --from=build /app/dist ./dist
|
|
98
|
-
COPY --from=build /app/node_modules ./node_modules
|
|
99
|
-
COPY --from=build /app/${projectDir}/package.json ./${projectDir}/package.json
|
|
100
|
-
|
|
101
|
-
EXPOSE 3000
|
|
102
|
-
${startCmd}
|
|
103
|
-
# Entry resolved by package.json "${startScript}" → node ${startEntry}
|
|
104
|
-
`;
|
|
105
|
-
}
|
|
106
|
-
function dockerignoreContent() {
|
|
107
|
-
return [
|
|
108
|
-
"node_modules",
|
|
109
|
-
"dist",
|
|
110
|
-
".git",
|
|
111
|
-
".devcontainer",
|
|
112
|
-
".vscode",
|
|
113
|
-
".github",
|
|
114
|
-
"postman",
|
|
115
|
-
".postman",
|
|
116
|
-
".env",
|
|
117
|
-
".env.*",
|
|
118
|
-
"!.env.example",
|
|
119
|
-
"coverage",
|
|
120
|
-
"**/*.spec.ts",
|
|
121
|
-
"**/*.test.ts",
|
|
122
|
-
""
|
|
123
|
-
].join("\n");
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9wcm9kdWN0aW9uLWRvY2tlcmZpbGUubW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvc291cmNlLWZpbGUuanNcIjtcbmltcG9ydCB7IERFRkFVTFRfV0VCQVBJX05BTUUsIHdlYmFwaVByb2plY3REaXIsIHdlYmFwaVJlbGVhc2VFbnRyeSB9IGZyb20gXCIuLi9jb25zdC5qc1wiO1xuXG5leHBvcnQgdHlwZSBQcm9kdWN0aW9uRG9ja2VyZmlsZU9wdGlvbnMgPSB7XG5cdC8qKiBXaGVuIHRydWUsIG9ubHkgd3JpdGUgYERvY2tlcmZpbGUuPG5hbWU+YCAoZXhpc3Rpbmcgd29ya3NwYWNlIOKAlCBkbyBub3QgcmVwbGFjZSByb290IERvY2tlcmZpbGUpLiAqL1xuXHRuYW1lZE9ubHk/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBQcm9kdWN0aW9uIERvY2tlcmZpbGVzIGZvciBQYWFTIChSYWlsd2F5L0ZseSkgYW5kIGxvY2FsIGBkb2NrZXIgYnVpbGRgLlxuICpcbiAqIENvbnRleHQgaXMgYWx3YXlzIHRoZSAqKnJlcG8gcm9vdCoqIChgZG9ja2VyIGJ1aWxkIC1mIERvY2tlcmZpbGUuYmlsbGluZyAuYCkuXG4gKiBSb290IGBEb2NrZXJmaWxlYCBpcyB0aGUgZmlyc3QgQVBJIChgcG5wbSBzdGFydGApLiBFeHRyYSBvciBjdXN0b20tbmFtZWQgQVBJc1xuICogYWxzbyBnZXQgYERvY2tlcmZpbGUuPG5hbWU+YCBzbyBlYWNoIHNlcnZpY2UgY2FuIGJlIGRlcGxveWVkIG9uIGl0cyBvd24uXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJhcGlQcm9kdWN0aW9uRG9ja2VyZmlsZSBpbXBsZW1lbnRzIEtleWVkTW9kZWwge1xuXHRwdWJsaWMgcmVhZG9ubHkga2V5ID0gV0VMTF9LTk9XTl9GSUxFUy5QUk9EVUNUSU9OX0RPQ0tFUkZJTEU7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgYXBpTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW0RFRkFVTFRfV0VCQVBJX05BTUVdLFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogUHJvZHVjdGlvbkRvY2tlcmZpbGVPcHRpb25zID0ge30sXG5cdCkge31cblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRjb25zdCBuYW1lcyA9IHRoaXMuYXBpTmFtZXMubGVuZ3RoID4gMCA/IHRoaXMuYXBpTmFtZXMgOiBbREVGQVVMVF9XRUJBUElfTkFNRV07XG5cdFx0Y29uc3QgZmlyc3QgPSBuYW1lc1swXSA/PyBERUZBVUxUX1dFQkFQSV9OQU1FO1xuXHRcdGNvbnN0IGZpbGVzOiBTb3VyY2VGaWxlW10gPSBbXTtcblxuXHRcdGlmICghdGhpcy5vcHRpb25zLm5hbWVkT25seSkge1xuXHRcdFx0ZmlsZXMucHVzaCh7XG5cdFx0XHRcdGZpbGVQYXRoOiBcIi5kb2NrZXJpZ25vcmVcIixcblx0XHRcdFx0Y29udGVudDogZG9ja2VyaWdub3JlQ29udGVudCgpLFxuXHRcdFx0fSk7XG5cdFx0XHRmaWxlcy5wdXNoKHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiRG9ja2VyZmlsZVwiLFxuXHRcdFx0XHRjb250ZW50OiByZW5kZXJQcm9kdWN0aW9uRG9ja2VyZmlsZShmaXJzdCwgXCJzdGFydFwiKSxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IGVtaXROYW1lZCA9XG5cdFx0XHR0aGlzLm9wdGlvbnMubmFtZWRPbmx5IHx8IG5hbWVzLmxlbmd0aCA+IDEgfHwgZmlyc3QgIT09IERFRkFVTFRfV0VCQVBJX05BTUU7XG5cdFx0aWYgKGVtaXROYW1lZCkge1xuXHRcdFx0Zm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG5cdFx0XHRcdGZpbGVzLnB1c2goe1xuXHRcdFx0XHRcdGZpbGVQYXRoOiBgRG9ja2VyZmlsZS4ke25hbWV9YCxcblx0XHRcdFx0XHRjb250ZW50OiByZW5kZXJQcm9kdWN0aW9uRG9ja2VyZmlsZShuYW1lLCBgc3RhcnQ6JHtuYW1lfWApLFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmlsZXM7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclByb2R1Y3Rpb25Eb2NrZXJmaWxlKGFwaU5hbWU6IHN0cmluZywgc3RhcnRTY3JpcHQ6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IHByb2plY3REaXIgPSB3ZWJhcGlQcm9qZWN0RGlyKGFwaU5hbWUpO1xuXHRjb25zdCBzdGFydENtZCA9XG5cdFx0c3RhcnRTY3JpcHQgPT09IFwic3RhcnRcIlxuXHRcdFx0PyAnQ01EIFtcInBucG1cIiwgXCJzdGFydFwiXSdcblx0XHRcdDogYENNRCBbXCJwbnBtXCIsIFwicnVuXCIsIFwiJHtzdGFydFNjcmlwdH1cIl1gO1xuXHRjb25zdCBzdGFydEVudHJ5ID0gd2ViYXBpUmVsZWFzZUVudHJ5KGFwaU5hbWUpO1xuXG5cdHJldHVybiBgIyBzeW50YXg9ZG9ja2VyL2RvY2tlcmZpbGU6MVxuIyBTZWxmLWNvbnRhaW5lZCBwcm9kdWN0aW9uIGltYWdlOiBpbnN0YWxsICsgZm9yZ2UgYnVpbGQgaGFwcGVuIGluc2lkZSBkb2NrZXIgYnVpbGQuXG4jIEhvc3RzIChSYWlsd2F5L0ZseS9ldGMuKSBjbG9uZSBnaXQgYW5kIHJ1biBcXGBkb2NrZXIgYnVpbGRcXGAg4oCUIHRoZXkgZG8gbm90IHJlY2VpdmUgQ0kgZGlzdC8uXG4jIEJ1aWxkIGZyb20gdGhlIHJlcG8gcm9vdDogZG9ja2VyIGJ1aWxkIC1mIERvY2tlcmZpbGUke3N0YXJ0U2NyaXB0ID09PSBcInN0YXJ0XCIgPyBcIlwiIDogYC4ke2FwaU5hbWV9YH0gLlxuI1xuIyBQcml2YXRlIEBkZWNvaGVyZS8qIHBhY2thZ2VzOiBwYXNzIGEgQnVpbGRLaXQgc2VjcmV0IG5hbWVkIG5wbV90b2tlbiAobnBtIGF1dGggdG9rZW4pLCBlLmcuXG4jICAgZG9ja2VyIGJ1aWxkIC0tc2VjcmV0IGlkPW5wbV90b2tlbixlbnY9Tk9ERV9BVVRIX1RPS0VOIC5cbiMgT3Igc2V0IE5PREVfQVVUSF9UT0tFTiBhcyBhIGJ1aWxkLWFyZyBvbiBob3N0cyB0aGF0IG9ubHkgc3VwcG9ydCBidWlsZC1hcmdzLlxuXG5GUk9NIG5vZGU6MjQtYm9va3dvcm0gQVMgYnVpbGRcbldPUktESVIgL2FwcFxuUlVOIGNvcmVwYWNrIGVuYWJsZSAmJiBjb3JlcGFjayBwcmVwYXJlIHBucG1AMTAgLS1hY3RpdmF0ZVxuXG5DT1BZIHBhY2thZ2UuanNvbiAuL1xuQ09QWSBwbnBtLWxvY2sueWFtbCogLi9cbkNPUFkgdHNjb25maWcuanNvbiBiaW9tZS5qc29uIC4vXG5DT1BZIGNvbmZpZyAuL2NvbmZpZ1xuQ09QWSAke3Byb2plY3REaXJ9IC4vJHtwcm9qZWN0RGlyfVxuXG5BUkcgTk9ERV9BVVRIX1RPS0VOPVxuUlVOIC0tbW91bnQ9dHlwZT1zZWNyZXQsaWQ9bnBtX3Rva2VuLHJlcXVpcmVkPWZhbHNlIFxcXFxcblx0aWYgWyAtZiAvcnVuL3NlY3JldHMvbnBtX3Rva2VuIF07IHRoZW4gXFxcXFxuXHRcdFRPS0VOPVwiJChjYXQgL3J1bi9zZWNyZXRzL25wbV90b2tlbilcIjsgXFxcXFxuXHRlbHNlIFxcXFxcblx0XHRUT0tFTj1cIlxcJHtOT0RFX0FVVEhfVE9LRU59XCI7IFxcXFxcblx0Zmk7IFxcXFxcblx0aWYgWyAtbiBcIiRUT0tFTlwiIF07IHRoZW4gXFxcXFxuXHRcdGVjaG8gXCIvL3JlZ2lzdHJ5Lm5wbWpzLm9yZy86X2F1dGhUb2tlbj1cXCR7VE9LRU59XCIgPiAubnBtcmM7IFxcXFxcblx0Zmk7IFxcXFxcblx0aWYgWyAtZiBwbnBtLWxvY2sueWFtbCBdOyB0aGVuIFxcXFxcblx0XHRwbnBtIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGU7IFxcXFxcblx0ZWxzZSBcXFxcXG5cdFx0cG5wbSBpbnN0YWxsOyBcXFxcXG5cdGZpOyBcXFxcXG5cdHJtIC1mIC5ucG1yY1xuXG5SVU4gcG5wbSBydW4gYnVpbGRcblxuRlJPTSBub2RlOjI0LWJvb2t3b3JtLXNsaW0gQVMgcnVuXG5XT1JLRElSIC9hcHBcbkVOViBOT0RFX0VOVj1wcm9kdWN0aW9uXG5SVU4gY29yZXBhY2sgZW5hYmxlICYmIGNvcmVwYWNrIHByZXBhcmUgcG5wbUAxMCAtLWFjdGl2YXRlXG5cbkNPUFkgLS1mcm9tPWJ1aWxkIC9hcHAvcGFja2FnZS5qc29uIC4vXG5DT1BZIC0tZnJvbT1idWlsZCAvYXBwL3BucG0tbG9jay55YW1sKiAuL1xuQ09QWSAtLWZyb209YnVpbGQgL2FwcC9jb25maWcgLi9jb25maWdcbkNPUFkgLS1mcm9tPWJ1aWxkIC9hcHAvZGlzdCAuL2Rpc3RcbkNPUFkgLS1mcm9tPWJ1aWxkIC9hcHAvbm9kZV9tb2R1bGVzIC4vbm9kZV9tb2R1bGVzXG5DT1BZIC0tZnJvbT1idWlsZCAvYXBwLyR7cHJvamVjdERpcn0vcGFja2FnZS5qc29uIC4vJHtwcm9qZWN0RGlyfS9wYWNrYWdlLmpzb25cblxuRVhQT1NFIDMwMDBcbiR7c3RhcnRDbWR9XG4jIEVudHJ5IHJlc29sdmVkIGJ5IHBhY2thZ2UuanNvbiBcIiR7c3RhcnRTY3JpcHR9XCIg4oaSIG5vZGUgJHtzdGFydEVudHJ5fVxuYDtcbn1cblxuZnVuY3Rpb24gZG9ja2VyaWdub3JlQ29udGVudCgpOiBzdHJpbmcge1xuXHRyZXR1cm4gW1xuXHRcdFwibm9kZV9tb2R1bGVzXCIsXG5cdFx0XCJkaXN0XCIsXG5cdFx0XCIuZ2l0XCIsXG5cdFx0XCIuZGV2Y29udGFpbmVyXCIsXG5cdFx0XCIudnNjb2RlXCIsXG5cdFx0XCIuZ2l0aHViXCIsXG5cdFx0XCJwb3N0bWFuXCIsXG5cdFx0XCIucG9zdG1hblwiLFxuXHRcdFwiLmVudlwiLFxuXHRcdFwiLmVudi4qXCIsXG5cdFx0XCIhLmVudi5leGFtcGxlXCIsXG5cdFx0XCJjb3ZlcmFnZVwiLFxuXHRcdFwiKiovKi5zcGVjLnRzXCIsXG5cdFx0XCIqKi8qLnRlc3QudHNcIixcblx0XHRcIlwiLFxuXHRdLmpvaW4oXCJcXG5cIik7XG59XG4iXSwibmFtZXMiOlsiV0VMTF9LTk9XTl9GSUxFUyIsIkRFRkFVTFRfV0VCQVBJX05BTUUiLCJ3ZWJhcGlQcm9qZWN0RGlyIiwid2ViYXBpUmVsZWFzZUVudHJ5IiwiV2ViYXBpUHJvZHVjdGlvbkRvY2tlcmZpbGUiLCJrZXkiLCJQUk9EVUNUSU9OX0RPQ0tFUkZJTEUiLCJhcGlOYW1lcyIsIm9wdGlvbnMiLCJmaWxlcyIsIm5hbWVzIiwibGVuZ3RoIiwiZmlyc3QiLCJuYW1lZE9ubHkiLCJwdXNoIiwiZmlsZVBhdGgiLCJjb250ZW50IiwiZG9ja2VyaWdub3JlQ29udGVudCIsInJlbmRlclByb2R1Y3Rpb25Eb2NrZXJmaWxlIiwiZW1pdE5hbWVkIiwibmFtZSIsImFwaU5hbWUiLCJzdGFydFNjcmlwdCIsInByb2plY3REaXIiLCJzdGFydENtZCIsInN0YXJ0RW50cnkiLCJqb2luIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxnQkFBZ0IsUUFBUSx3QkFBd0I7QUFFekQsU0FBU0MsbUJBQW1CLEVBQUVDLGdCQUFnQixFQUFFQyxrQkFBa0IsUUFBUSxjQUFjO0FBT3hGOzs7Ozs7Q0FNQyxHQUNELE9BQU8sTUFBTUM7OztJQUNJQyxNQUFNTCxpQkFBaUJNLHFCQUFxQixDQUFDO0lBRTdELFlBQ0MsQUFBaUJDLFdBQThCO1FBQUNOO0tBQW9CLEVBQ3BFLEFBQWlCTyxVQUF1QyxDQUFDLENBQUMsQ0FDekQ7YUFGZ0JELFdBQUFBO2FBQ0FDLFVBQUFBO0lBQ2Y7SUFFSUMsUUFBc0I7UUFDNUIsTUFBTUMsUUFBUSxJQUFJLENBQUNILFFBQVEsQ0FBQ0ksTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDSixRQUFRLEdBQUc7WUFBQ047U0FBb0I7UUFDOUUsTUFBTVcsUUFBUUYsS0FBSyxDQUFDLEVBQUUsSUFBSVQ7UUFDMUIsTUFBTVEsUUFBc0IsRUFBRTtRQUU5QixJQUFJLENBQUMsSUFBSSxDQUFDRCxPQUFPLENBQUNLLFNBQVMsRUFBRTtZQUM1QkosTUFBTUssSUFBSSxDQUFDO2dCQUNWQyxVQUFVO2dCQUNWQyxTQUFTQztZQUNWO1lBQ0FSLE1BQU1LLElBQUksQ0FBQztnQkFDVkMsVUFBVTtnQkFDVkMsU0FBU0UsMkJBQTJCTixPQUFPO1lBQzVDO1FBQ0Q7UUFFQSxNQUFNTyxZQUNMLElBQUksQ0FBQ1gsT0FBTyxDQUFDSyxTQUFTLElBQUlILE1BQU1DLE1BQU0sR0FBRyxLQUFLQyxVQUFVWDtRQUN6RCxJQUFJa0IsV0FBVztZQUNkLEtBQUssTUFBTUMsUUFBUVYsTUFBTztnQkFDekJELE1BQU1LLElBQUksQ0FBQztvQkFDVkMsVUFBVSxDQUFDLFdBQVcsRUFBRUssTUFBTTtvQkFDOUJKLFNBQVNFLDJCQUEyQkUsTUFBTSxDQUFDLE1BQU0sRUFBRUEsTUFBTTtnQkFDMUQ7WUFDRDtRQUNEO1FBRUEsT0FBT1g7SUFDUjtBQUNEO0FBRUEsT0FBTyxTQUFTUywyQkFBMkJHLE9BQWUsRUFBRUMsV0FBbUI7SUFDOUUsTUFBTUMsYUFBYXJCLGlCQUFpQm1CO0lBQ3BDLE1BQU1HLFdBQ0xGLGdCQUFnQixVQUNiLDBCQUNBLENBQUMscUJBQXFCLEVBQUVBLFlBQVksRUFBRSxDQUFDO0lBQzNDLE1BQU1HLGFBQWF0QixtQkFBbUJrQjtJQUV0QyxPQUFPLENBQUM7OztzREFHNkMsRUFBRUMsZ0JBQWdCLFVBQVUsS0FBSyxDQUFDLENBQUMsRUFBRUQsU0FBUyxDQUFDOzs7Ozs7Ozs7Ozs7OztLQWNoRyxFQUFFRSxXQUFXLEdBQUcsRUFBRUEsV0FBVzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozt1QkErQlgsRUFBRUEsV0FBVyxnQkFBZ0IsRUFBRUEsV0FBVzs7O0FBR2pFLEVBQUVDLFNBQVM7a0NBQ3VCLEVBQUVGLFlBQVksU0FBUyxFQUFFRyxXQUFXO0FBQ3RFLENBQUM7QUFDRDtBQUVBLFNBQVNSO0lBQ1IsT0FBTztRQUNOO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtLQUNBLENBQUNTLElBQUksQ0FBQztBQUNSIn0=
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
const SAMPLE_CONFIG_CONTENT = `export class SampleConfig {\n\tpublic greeting: string = "";\n}\n`;
|
|
2
|
-
const SAMPLE_SERVICE_CONTENT = [
|
|
3
|
-
`import { inject, injectable } from "@decohere/crucible/decorators";`,
|
|
4
|
-
`import { ConfigurationServiceToken } from "@decohere/nexus/configuration";`,
|
|
5
|
-
`import type { IConfigurationService } from "@decohere/nexus/configuration";`,
|
|
6
|
-
`import { SampleConfig } from "../sample.config.js";`,
|
|
7
|
-
``,
|
|
8
|
-
`@injectable()`,
|
|
9
|
-
`export class SampleService {`,
|
|
10
|
-
`\tpublic constructor(`,
|
|
11
|
-
`\t\t@inject(ConfigurationServiceToken) private readonly config: IConfigurationService,`,
|
|
12
|
-
`\t) {}`,
|
|
13
|
-
``,
|
|
14
|
-
`\tpublic async getGreeting(): Promise<string> {`,
|
|
15
|
-
`\t\tconst config = await this.config.get(SampleConfig);`,
|
|
16
|
-
`\t\treturn config.greeting;`,
|
|
17
|
-
`\t}`,
|
|
18
|
-
`}`,
|
|
19
|
-
``
|
|
20
|
-
].join("\n");
|
|
21
|
-
export class SampleConfigModel {
|
|
22
|
-
files() {
|
|
23
|
-
return [
|
|
24
|
-
{
|
|
25
|
-
filePath: "src/sample.config.ts",
|
|
26
|
-
content: SAMPLE_CONFIG_CONTENT
|
|
27
|
-
}
|
|
28
|
-
];
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
export class SampleServiceModel {
|
|
32
|
-
files() {
|
|
33
|
-
return [
|
|
34
|
-
{
|
|
35
|
-
filePath: "src/services/sample.service.ts",
|
|
36
|
-
content: SAMPLE_SERVICE_CONTENT
|
|
37
|
-
}
|
|
38
|
-
];
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9zYW1wbGUtZmlsZXMubW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTb3VyY2VGaWxlLCBTb3VyY2VGaWxlUHJvdmlkZXIgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5cbmNvbnN0IFNBTVBMRV9DT05GSUdfQ09OVEVOVCA9IGBleHBvcnQgY2xhc3MgU2FtcGxlQ29uZmlnIHtcXG5cXHRwdWJsaWMgZ3JlZXRpbmc6IHN0cmluZyA9IFwiXCI7XFxufVxcbmA7XG5cbmNvbnN0IFNBTVBMRV9TRVJWSUNFX0NPTlRFTlQgPSBbXG5cdGBpbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tIFwiQGRlY29oZXJlL2NydWNpYmxlL2RlY29yYXRvcnNcIjtgLFxuXHRgaW1wb3J0IHsgQ29uZmlndXJhdGlvblNlcnZpY2VUb2tlbiB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY29uZmlndXJhdGlvblwiO2AsXG5cdGBpbXBvcnQgdHlwZSB7IElDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY29uZmlndXJhdGlvblwiO2AsXG5cdGBpbXBvcnQgeyBTYW1wbGVDb25maWcgfSBmcm9tIFwiLi4vc2FtcGxlLmNvbmZpZy5qc1wiO2AsXG5cdGBgLFxuXHRgQGluamVjdGFibGUoKWAsXG5cdGBleHBvcnQgY2xhc3MgU2FtcGxlU2VydmljZSB7YCxcblx0YFxcdHB1YmxpYyBjb25zdHJ1Y3RvcihgLFxuXHRgXFx0XFx0QGluamVjdChDb25maWd1cmF0aW9uU2VydmljZVRva2VuKSBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogSUNvbmZpZ3VyYXRpb25TZXJ2aWNlLGAsXG5cdGBcXHQpIHt9YCxcblx0YGAsXG5cdGBcXHRwdWJsaWMgYXN5bmMgZ2V0R3JlZXRpbmcoKTogUHJvbWlzZTxzdHJpbmc+IHtgLFxuXHRgXFx0XFx0Y29uc3QgY29uZmlnID0gYXdhaXQgdGhpcy5jb25maWcuZ2V0KFNhbXBsZUNvbmZpZyk7YCxcblx0YFxcdFxcdHJldHVybiBjb25maWcuZ3JlZXRpbmc7YCxcblx0YFxcdH1gLFxuXHRgfWAsXG5cdGBgLFxuXS5qb2luKFwiXFxuXCIpO1xuXG5leHBvcnQgY2xhc3MgU2FtcGxlQ29uZmlnTW9kZWwgaW1wbGVtZW50cyBTb3VyY2VGaWxlUHJvdmlkZXIge1xuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCJzcmMvc2FtcGxlLmNvbmZpZy50c1wiLFxuXHRcdFx0XHRjb250ZW50OiBTQU1QTEVfQ09ORklHX0NPTlRFTlQsXG5cdFx0XHR9LFxuXHRcdF07XG5cdH1cbn1cblxuZXhwb3J0IGNsYXNzIFNhbXBsZVNlcnZpY2VNb2RlbCBpbXBsZW1lbnRzIFNvdXJjZUZpbGVQcm92aWRlciB7XG5cdHB1YmxpYyBmaWxlcygpOiBTb3VyY2VGaWxlW10ge1xuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcInNyYy9zZXJ2aWNlcy9zYW1wbGUuc2VydmljZS50c1wiLFxuXHRcdFx0XHRjb250ZW50OiBTQU1QTEVfU0VSVklDRV9DT05URU5ULFxuXHRcdFx0fSxcblx0XHRdO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiU0FNUExFX0NPTkZJR19DT05URU5UIiwiU0FNUExFX1NFUlZJQ0VfQ09OVEVOVCIsImpvaW4iLCJTYW1wbGVDb25maWdNb2RlbCIsImZpbGVzIiwiZmlsZVBhdGgiLCJjb250ZW50IiwiU2FtcGxlU2VydmljZU1vZGVsIl0sIm1hcHBpbmdzIjoiQUFFQSxNQUFNQSx3QkFBd0IsQ0FBQyxpRUFBaUUsQ0FBQztBQUVqRyxNQUFNQyx5QkFBeUI7SUFDOUIsQ0FBQyxtRUFBbUUsQ0FBQztJQUNyRSxDQUFDLDBFQUEwRSxDQUFDO0lBQzVFLENBQUMsMkVBQTJFLENBQUM7SUFDN0UsQ0FBQyxtREFBbUQsQ0FBQztJQUNyRCxFQUFFO0lBQ0YsQ0FBQyxhQUFhLENBQUM7SUFDZixDQUFDLDRCQUE0QixDQUFDO0lBQzlCLENBQUMscUJBQXFCLENBQUM7SUFDdkIsQ0FBQyxzRkFBc0YsQ0FBQztJQUN4RixDQUFDLE1BQU0sQ0FBQztJQUNSLEVBQUU7SUFDRixDQUFDLCtDQUErQyxDQUFDO0lBQ2pELENBQUMsdURBQXVELENBQUM7SUFDekQsQ0FBQywyQkFBMkIsQ0FBQztJQUM3QixDQUFDLEdBQUcsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRTtDQUNGLENBQUNDLElBQUksQ0FBQztBQUVQLE9BQU8sTUFBTUM7SUFDTEMsUUFBc0I7UUFDNUIsT0FBTztZQUNOO2dCQUNDQyxVQUFVO2dCQUNWQyxTQUFTTjtZQUNWO1NBQ0E7SUFDRjtBQUNEO0FBRUEsT0FBTyxNQUFNTztJQUNMSCxRQUFzQjtRQUM1QixPQUFPO1lBQ047Z0JBQ0NDLFVBQVU7Z0JBQ1ZDLFNBQVNMO1lBQ1Y7U0FDQTtJQUNGO0FBQ0QifQ==
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { DevContainerImageModel, withNodeUser, withPnpm, withWorkspaceNodeModulesOwnership } from "../../models/docker-image.model.js";
|
|
2
|
-
export class WebapiDevContainer extends DevContainerImageModel {
|
|
3
|
-
constructor(baseImage = "node:24"){
|
|
4
|
-
super(baseImage);
|
|
5
|
-
}
|
|
6
|
-
registerBaseLayers() {
|
|
7
|
-
super.registerBaseLayers();
|
|
8
|
-
this.addLayer(withNodeUser()).addLayer(withPnpm()).addLayer(withWorkspaceNodeModulesOwnership());
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy93ZWJhcGktaW1hZ2UubW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0RGV2Q29udGFpbmVySW1hZ2VNb2RlbCxcblx0d2l0aE5vZGVVc2VyLFxuXHR3aXRoUG5wbSxcblx0d2l0aFdvcmtzcGFjZU5vZGVNb2R1bGVzT3duZXJzaGlwLFxufSBmcm9tIFwiLi4vLi4vbW9kZWxzL2RvY2tlci1pbWFnZS5tb2RlbC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgV2ViYXBpRGV2Q29udGFpbmVyIGV4dGVuZHMgRGV2Q29udGFpbmVySW1hZ2VNb2RlbCB7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihiYXNlSW1hZ2UgPSBcIm5vZGU6MjRcIikge1xuXHRcdHN1cGVyKGJhc2VJbWFnZSk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVnaXN0ZXJCYXNlTGF5ZXJzKCk6IHZvaWQge1xuXHRcdHN1cGVyLnJlZ2lzdGVyQmFzZUxheWVycygpO1xuXHRcdHRoaXMuYWRkTGF5ZXIod2l0aE5vZGVVc2VyKCkpXG5cdFx0XHQuYWRkTGF5ZXIod2l0aFBucG0oKSlcblx0XHRcdC5hZGRMYXllcih3aXRoV29ya3NwYWNlTm9kZU1vZHVsZXNPd25lcnNoaXAoKSk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJEZXZDb250YWluZXJJbWFnZU1vZGVsIiwid2l0aE5vZGVVc2VyIiwid2l0aFBucG0iLCJ3aXRoV29ya3NwYWNlTm9kZU1vZHVsZXNPd25lcnNoaXAiLCJXZWJhcGlEZXZDb250YWluZXIiLCJiYXNlSW1hZ2UiLCJyZWdpc3RlckJhc2VMYXllcnMiLCJhZGRMYXllciJdLCJtYXBwaW5ncyI6IkFBQUEsU0FDQ0Esc0JBQXNCLEVBQ3RCQyxZQUFZLEVBQ1pDLFFBQVEsRUFDUkMsaUNBQWlDLFFBQzNCLHFDQUFxQztBQUU1QyxPQUFPLE1BQU1DLDJCQUEyQko7SUFDdkMsWUFBbUJLLFlBQVksU0FBUyxDQUFFO1FBQ3pDLEtBQUssQ0FBQ0E7SUFDUDtJQUVtQkMscUJBQTJCO1FBQzdDLEtBQUssQ0FBQ0E7UUFDTixJQUFJLENBQUNDLFFBQVEsQ0FBQ04sZ0JBQ1pNLFFBQVEsQ0FBQ0wsWUFDVEssUUFBUSxDQUFDSjtJQUNaO0FBQ0QifQ==
|