@decohere/create 0.0.1-dev.21 → 0.0.1-dev.23
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 +12 -4
- package/commonjs/src/models/docker-image.model.js +212 -0
- package/commonjs/src/runner.js +27 -6
- package/commonjs/src/version.js +26 -8
- package/commonjs/src/webapi/create-api.js +3 -3
- package/commonjs/src/webapi/features/finalize.feature.js +10 -3
- package/commonjs/src/webapi/models/webapi-image.model.js +22 -0
- package/es6/src/cli.js +12 -4
- package/es6/src/models/docker-image.model.js +176 -0
- package/es6/src/runner.js +28 -7
- package/es6/src/version.js +15 -5
- package/es6/src/webapi/create-api.js +3 -3
- package/es6/src/webapi/features/finalize.feature.js +10 -3
- package/es6/src/webapi/models/webapi-image.model.js +12 -0
- package/package.json +6 -3
- package/types/src/models/docker-image.model.d.ts +56 -0
- package/types/src/runner.d.ts +2 -3
- package/types/src/version.d.ts +2 -0
- package/types/src/webapi/create-api.d.ts +3 -1
- package/types/src/webapi/models/webapi-image.model.d.ts +5 -0
- package/commonjs/src/models/container-image.model.js +0 -88
- package/es6/src/models/container-image.model.js +0 -84
- package/types/src/models/container-image.model.d.ts +0 -15
package/types/src/runner.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ApiOptions } from "./webapi/create-api.js";
|
|
1
2
|
/**
|
|
2
3
|
* Run the scaffold inside a pre-built Docker builder image.
|
|
3
4
|
*
|
|
@@ -8,6 +9,4 @@
|
|
|
8
9
|
* If `~/.config/auth0` exists on the host the directory is also mounted so
|
|
9
10
|
* the auth0 CLI inside the container can reuse existing credentials silently.
|
|
10
11
|
*/
|
|
11
|
-
export declare function runInBuilder(opts:
|
|
12
|
-
d?: string;
|
|
13
|
-
}): never;
|
|
12
|
+
export declare function runInBuilder(opts: ApiOptions): never;
|
package/types/src/version.d.ts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
/** Version of @decohere/create, used to pin scaffolded @decohere/* dependencies. */
|
|
2
2
|
export declare const CREATE_VERSION: string;
|
|
3
|
+
/** Canonical published Docker repository for the @decohere/create builder image. */
|
|
4
|
+
export declare const CREATE_IMAGE_REPOSITORY: string;
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export declare const WEBAPI_PROJECT_DIR = "projects/api";
|
|
2
2
|
export type ApiOptions = {
|
|
3
3
|
d?: string;
|
|
4
|
-
authProvider?:
|
|
4
|
+
authProvider?: "auth0" | "none";
|
|
5
5
|
databaseProvider?: "none" | "postgres/typeorm";
|
|
6
|
+
postmanProvider?: "api" | "local" | "none";
|
|
7
|
+
installDependencies?: "yes" | "no";
|
|
6
8
|
};
|
|
7
9
|
export declare function scaffoldApi(cliOptions: ApiOptions): Promise<void>;
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "DockerfileModel", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return DockerfileModel;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _const = require("./const.js");
|
|
12
|
-
// Everything before the final USER instruction. Features insert RUN steps here.
|
|
13
|
-
const DOCKERFILE_BASE = `FROM node:24
|
|
14
|
-
|
|
15
|
-
ARG USERNAME=node
|
|
16
|
-
|
|
17
|
-
# System tools: jq + ripgrep for scripting/search, python3 for AI tooling,
|
|
18
|
-
# gh for GitHub workflows, curl/gnupg for package sources.
|
|
19
|
-
RUN apt-get update \\
|
|
20
|
-
&& apt-get install -y --no-install-recommends ca-certificates curl gnupg jq ripgrep python3 \\
|
|
21
|
-
&& curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg -o /usr/share/keyrings/githubcli-archive-keyring.gpg \\
|
|
22
|
-
&& chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \\
|
|
23
|
-
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" > /etc/apt/sources.list.d/github-cli.list \\
|
|
24
|
-
&& apt-get update \\
|
|
25
|
-
&& apt-get install -y --no-install-recommends gh \\
|
|
26
|
-
&& rm -rf /var/lib/apt/lists/*
|
|
27
|
-
|
|
28
|
-
RUN npm install --global npm@latest \\
|
|
29
|
-
&& npm add --global pnpm@10
|
|
30
|
-
|
|
31
|
-
RUN mkdir -p /home/\${USERNAME}/.config/pnpm /home/\${USERNAME}/.pnpm-store \\
|
|
32
|
-
&& chown -R \${USERNAME}:\${USERNAME} /home/\${USERNAME}/.config /home/\${USERNAME}/.pnpm-store \\
|
|
33
|
-
&& printf "store-dir=/home/\${USERNAME}/.pnpm-store\\n" > /home/\${USERNAME}/.config/pnpm/rc
|
|
34
|
-
|
|
35
|
-
# Pre-create workspace node_modules so the named volume mount is owned by the user
|
|
36
|
-
RUN mkdir -p /workspace/node_modules && chown \${USERNAME}:\${USERNAME} /workspace/node_modules
|
|
37
|
-
|
|
38
|
-
RUN mkdir /commandhistory && touch /commandhistory/.bash_history \\
|
|
39
|
-
&& chown -R \${USERNAME} /commandhistory
|
|
40
|
-
|
|
41
|
-
RUN SNIPPET="export PROMPT_COMMAND='history -a' && export HISTFILE=/commandhistory/.bash_history" \\
|
|
42
|
-
&& echo "$SNIPPET" >> "/home/\${USERNAME}/.bashrc"
|
|
43
|
-
|
|
44
|
-
# VS Code js-debug bug: bootloader.js in workspaceStorage is only created when
|
|
45
|
-
# the user manually toggles Auto Attach settings. On a fresh container it is
|
|
46
|
-
# missing, which crashes every Node command. Fix: if the injected path is
|
|
47
|
-
# missing, substitute the stable bootloader from the VS Code server extension
|
|
48
|
-
# directory (always present once the server is installed).
|
|
49
|
-
RUN cat <<'EOF' >> "/home/\${USERNAME}/.bashrc"
|
|
50
|
-
if [[ -n "\${NODE_OPTIONS:-}" && "\${NODE_OPTIONS}" == *"bootloader.js"* ]]; then
|
|
51
|
-
_bootloader_path="$(printf '%s\\n' "$NODE_OPTIONS" | sed -n 's/.*--require[= ]\\([^[:space:]]*bootloader\\.js\\).*/\\1/p')"
|
|
52
|
-
if [[ -n "\${_bootloader_path}" && ! -f "\${_bootloader_path}" ]]; then
|
|
53
|
-
_stable_bootloader="$(find /vscode/vscode-server /home/node/.vscode-server/extensions -name "bootloader.js" -path "*/ms-vscode.js-debug/*" 2>/dev/null | head -1)"
|
|
54
|
-
if [[ -n "\${_stable_bootloader}" ]]; then
|
|
55
|
-
NODE_OPTIONS="\${NODE_OPTIONS//\${_bootloader_path}/\${_stable_bootloader}}"
|
|
56
|
-
else
|
|
57
|
-
NODE_OPTIONS="$(printf '%s\\n' "$NODE_OPTIONS" | sed -E 's#(^| )--require(=| )[[:graph:]]*bootloader\\.js( |$)# #g; s# +# #g; s#^ ##; s# $##')"
|
|
58
|
-
unset VSCODE_INSPECTOR_OPTIONS
|
|
59
|
-
fi
|
|
60
|
-
export NODE_OPTIONS
|
|
61
|
-
if [[ -z "$NODE_OPTIONS" ]]; then
|
|
62
|
-
unset NODE_OPTIONS
|
|
63
|
-
fi
|
|
64
|
-
fi
|
|
65
|
-
unset _bootloader_path _stable_bootloader
|
|
66
|
-
fi
|
|
67
|
-
EOF
|
|
68
|
-
`;
|
|
69
|
-
const DOCKERFILE_USER = `\nUSER \${USERNAME}\n`;
|
|
70
|
-
class DockerfileModel {
|
|
71
|
-
key = _const.WELL_KNOWN_FILES.DOCKERFILE;
|
|
72
|
-
_runSteps = [];
|
|
73
|
-
/** Append a RUN instruction (pass the command, not the RUN keyword). */ addRunStep(cmd) {
|
|
74
|
-
this._runSteps.push(cmd);
|
|
75
|
-
return this;
|
|
76
|
-
}
|
|
77
|
-
files() {
|
|
78
|
-
const extras = this._runSteps.length > 0 ? `\n${this._runSteps.map((s)=>`RUN ${s}`).join("\n\n")}\n` : "";
|
|
79
|
-
return [
|
|
80
|
-
{
|
|
81
|
-
filePath: ".devcontainer/Dockerfile",
|
|
82
|
-
content: DOCKERFILE_BASE + extras + DOCKERFILE_USER
|
|
83
|
-
}
|
|
84
|
-
];
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2NvbnRhaW5lci1pbWFnZS5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4vY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSB9IGZyb20gXCIuL3NvdXJjZS1maWxlLmpzXCI7XG5cbi8vIEV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSBmaW5hbCBVU0VSIGluc3RydWN0aW9uLiBGZWF0dXJlcyBpbnNlcnQgUlVOIHN0ZXBzIGhlcmUuXG5jb25zdCBET0NLRVJGSUxFX0JBU0UgPSBgRlJPTSBub2RlOjI0XG5cbkFSRyBVU0VSTkFNRT1ub2RlXG5cbiMgU3lzdGVtIHRvb2xzOiBqcSArIHJpcGdyZXAgZm9yIHNjcmlwdGluZy9zZWFyY2gsIHB5dGhvbjMgZm9yIEFJIHRvb2xpbmcsXG4jIGdoIGZvciBHaXRIdWIgd29ya2Zsb3dzLCBjdXJsL2dudXBnIGZvciBwYWNrYWdlIHNvdXJjZXMuXG5SVU4gYXB0LWdldCB1cGRhdGUgXFxcXFxuICAgICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBjYS1jZXJ0aWZpY2F0ZXMgY3VybCBnbnVwZyBqcSByaXBncmVwIHB5dGhvbjMgXFxcXFxuICAgICYmIGN1cmwgLWZzU0wgaHR0cHM6Ly9jbGkuZ2l0aHViLmNvbS9wYWNrYWdlcy9naXRodWJjbGktYXJjaGl2ZS1rZXlyaW5nLmdwZyAtbyAvdXNyL3NoYXJlL2tleXJpbmdzL2dpdGh1YmNsaS1hcmNoaXZlLWtleXJpbmcuZ3BnIFxcXFxcbiAgICAmJiBjaG1vZCBnbytyIC91c3Ivc2hhcmUva2V5cmluZ3MvZ2l0aHViY2xpLWFyY2hpdmUta2V5cmluZy5ncGcgXFxcXFxuICAgICYmIGVjaG8gXCJkZWIgW2FyY2g9JChkcGtnIC0tcHJpbnQtYXJjaGl0ZWN0dXJlKSBzaWduZWQtYnk9L3Vzci9zaGFyZS9rZXlyaW5ncy9naXRodWJjbGktYXJjaGl2ZS1rZXlyaW5nLmdwZ10gaHR0cHM6Ly9jbGkuZ2l0aHViLmNvbS9wYWNrYWdlcyBzdGFibGUgbWFpblwiID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZ2l0aHViLWNsaS5saXN0IFxcXFxcbiAgICAmJiBhcHQtZ2V0IHVwZGF0ZSBcXFxcXG4gICAgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIGdoIFxcXFxcbiAgICAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLypcblxuUlVOIG5wbSBpbnN0YWxsIC0tZ2xvYmFsIG5wbUBsYXRlc3QgXFxcXFxuICAgICYmIG5wbSBhZGQgLS1nbG9iYWwgcG5wbUAxMFxuXG5SVU4gbWtkaXIgLXAgL2hvbWUvXFwke1VTRVJOQU1FfS8uY29uZmlnL3BucG0gL2hvbWUvXFwke1VTRVJOQU1FfS8ucG5wbS1zdG9yZSBcXFxcXG4gICAgJiYgY2hvd24gLVIgXFwke1VTRVJOQU1FfTpcXCR7VVNFUk5BTUV9IC9ob21lL1xcJHtVU0VSTkFNRX0vLmNvbmZpZyAvaG9tZS9cXCR7VVNFUk5BTUV9Ly5wbnBtLXN0b3JlIFxcXFxcbiAgICAmJiBwcmludGYgXCJzdG9yZS1kaXI9L2hvbWUvXFwke1VTRVJOQU1FfS8ucG5wbS1zdG9yZVxcXFxuXCIgPiAvaG9tZS9cXCR7VVNFUk5BTUV9Ly5jb25maWcvcG5wbS9yY1xuXG4jIFByZS1jcmVhdGUgd29ya3NwYWNlIG5vZGVfbW9kdWxlcyBzbyB0aGUgbmFtZWQgdm9sdW1lIG1vdW50IGlzIG93bmVkIGJ5IHRoZSB1c2VyXG5SVU4gbWtkaXIgLXAgL3dvcmtzcGFjZS9ub2RlX21vZHVsZXMgJiYgY2hvd24gXFwke1VTRVJOQU1FfTpcXCR7VVNFUk5BTUV9IC93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzXG5cblJVTiBta2RpciAvY29tbWFuZGhpc3RvcnkgJiYgdG91Y2ggL2NvbW1hbmRoaXN0b3J5Ly5iYXNoX2hpc3RvcnkgXFxcXFxuICAgICYmIGNob3duIC1SIFxcJHtVU0VSTkFNRX0gL2NvbW1hbmRoaXN0b3J5XG5cblJVTiBTTklQUEVUPVwiZXhwb3J0IFBST01QVF9DT01NQU5EPSdoaXN0b3J5IC1hJyAmJiBleHBvcnQgSElTVEZJTEU9L2NvbW1hbmRoaXN0b3J5Ly5iYXNoX2hpc3RvcnlcIiBcXFxcXG4gICAgJiYgZWNobyBcIiRTTklQUEVUXCIgPj4gXCIvaG9tZS9cXCR7VVNFUk5BTUV9Ly5iYXNocmNcIlxuXG4jIFZTIENvZGUganMtZGVidWcgYnVnOiBib290bG9hZGVyLmpzIGluIHdvcmtzcGFjZVN0b3JhZ2UgaXMgb25seSBjcmVhdGVkIHdoZW5cbiMgdGhlIHVzZXIgbWFudWFsbHkgdG9nZ2xlcyBBdXRvIEF0dGFjaCBzZXR0aW5ncy4gT24gYSBmcmVzaCBjb250YWluZXIgaXQgaXNcbiMgbWlzc2luZywgd2hpY2ggY3Jhc2hlcyBldmVyeSBOb2RlIGNvbW1hbmQuIEZpeDogaWYgdGhlIGluamVjdGVkIHBhdGggaXNcbiMgbWlzc2luZywgc3Vic3RpdHV0ZSB0aGUgc3RhYmxlIGJvb3Rsb2FkZXIgZnJvbSB0aGUgVlMgQ29kZSBzZXJ2ZXIgZXh0ZW5zaW9uXG4jIGRpcmVjdG9yeSAoYWx3YXlzIHByZXNlbnQgb25jZSB0aGUgc2VydmVyIGlzIGluc3RhbGxlZCkuXG5SVU4gY2F0IDw8J0VPRicgPj4gXCIvaG9tZS9cXCR7VVNFUk5BTUV9Ly5iYXNocmNcIlxuaWYgW1sgLW4gXCJcXCR7Tk9ERV9PUFRJT05TOi19XCIgJiYgXCJcXCR7Tk9ERV9PUFRJT05TfVwiID09ICpcImJvb3Rsb2FkZXIuanNcIiogXV07IHRoZW5cbiAgICBfYm9vdGxvYWRlcl9wYXRoPVwiJChwcmludGYgJyVzXFxcXG4nIFwiJE5PREVfT1BUSU9OU1wiIHwgc2VkIC1uICdzLy4qLS1yZXF1aXJlWz0gXVxcXFwoW15bOnNwYWNlOl1dKmJvb3Rsb2FkZXJcXFxcLmpzXFxcXCkuKi9cXFxcMS9wJylcIlxuICAgIGlmIFtbIC1uIFwiXFwke19ib290bG9hZGVyX3BhdGh9XCIgJiYgISAtZiBcIlxcJHtfYm9vdGxvYWRlcl9wYXRofVwiIF1dOyB0aGVuXG4gICAgICAgIF9zdGFibGVfYm9vdGxvYWRlcj1cIiQoZmluZCAvdnNjb2RlL3ZzY29kZS1zZXJ2ZXIgL2hvbWUvbm9kZS8udnNjb2RlLXNlcnZlci9leHRlbnNpb25zIC1uYW1lIFwiYm9vdGxvYWRlci5qc1wiIC1wYXRoIFwiKi9tcy12c2NvZGUuanMtZGVidWcvKlwiIDI+L2Rldi9udWxsIHwgaGVhZCAtMSlcIlxuICAgICAgICBpZiBbWyAtbiBcIlxcJHtfc3RhYmxlX2Jvb3Rsb2FkZXJ9XCIgXV07IHRoZW5cbiAgICAgICAgICAgIE5PREVfT1BUSU9OUz1cIlxcJHtOT0RFX09QVElPTlMvL1xcJHtfYm9vdGxvYWRlcl9wYXRofS9cXCR7X3N0YWJsZV9ib290bG9hZGVyfX1cIlxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBOT0RFX09QVElPTlM9XCIkKHByaW50ZiAnJXNcXFxcbicgXCIkTk9ERV9PUFRJT05TXCIgfCBzZWQgLUUgJ3MjKF58ICktLXJlcXVpcmUoPXwgKVtbOmdyYXBoOl1dKmJvb3Rsb2FkZXJcXFxcLmpzKCB8JCkjICNnOyBzIyAgKyMgI2c7IHMjXiAjIzsgcyMgJCMjJylcIlxuICAgICAgICAgICAgdW5zZXQgVlNDT0RFX0lOU1BFQ1RPUl9PUFRJT05TXG4gICAgICAgIGZpXG4gICAgICAgIGV4cG9ydCBOT0RFX09QVElPTlNcbiAgICAgICAgaWYgW1sgLXogXCIkTk9ERV9PUFRJT05TXCIgXV07IHRoZW5cbiAgICAgICAgICAgIHVuc2V0IE5PREVfT1BUSU9OU1xuICAgICAgICBmaVxuICAgIGZpXG4gICAgdW5zZXQgX2Jvb3Rsb2FkZXJfcGF0aCBfc3RhYmxlX2Jvb3Rsb2FkZXJcbmZpXG5FT0ZcbmA7XG5cbmNvbnN0IERPQ0tFUkZJTEVfVVNFUiA9IGBcXG5VU0VSIFxcJHtVU0VSTkFNRX1cXG5gO1xuXG4vKipcbiAqIEJ1aWxkZXIgZm9yIGAuZGV2Y29udGFpbmVyL0RvY2tlcmZpbGVgLlxuICpcbiAqIEZlYXR1cmVzIGNhbGwgYGFkZFJ1blN0ZXAoY21kKWAgZHVyaW5nIHRoZWlyIHNjYWZmb2xkIHBoYXNlIHRvIGFwcGVuZFxuICogYWRkaXRpb25hbCBgUlVOYCBpbnN0cnVjdGlvbnMgYmVmb3JlIHRoZSBmaW5hbCBgVVNFUmAgaW5zdHJ1Y3Rpb24uXG4gKiBgZmlsZXMoKWAgYXNzZW1ibGVzIHRoZSBjb21wbGV0ZSBEb2NrZXJmaWxlIGNvbnRlbnQgYXQgcmVuZGVyIHRpbWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBEb2NrZXJmaWxlTW9kZWwgaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuRE9DS0VSRklMRTtcblx0cHJpdmF0ZSByZWFkb25seSBfcnVuU3RlcHM6IHN0cmluZ1tdID0gW107XG5cblx0LyoqIEFwcGVuZCBhIFJVTiBpbnN0cnVjdGlvbiAocGFzcyB0aGUgY29tbWFuZCwgbm90IHRoZSBSVU4ga2V5d29yZCkuICovXG5cdHB1YmxpYyBhZGRSdW5TdGVwKGNtZDogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fcnVuU3RlcHMucHVzaChjbWQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0Y29uc3QgZXh0cmFzID1cblx0XHRcdHRoaXMuX3J1blN0ZXBzLmxlbmd0aCA+IDBcblx0XHRcdFx0PyBgXFxuJHt0aGlzLl9ydW5TdGVwcy5tYXAoKHMpID0+IGBSVU4gJHtzfWApLmpvaW4oXCJcXG5cXG5cIil9XFxuYFxuXHRcdFx0XHQ6IFwiXCI7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLmRldmNvbnRhaW5lci9Eb2NrZXJmaWxlXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IERPQ0tFUkZJTEVfQkFTRSArIGV4dHJhcyArIERPQ0tFUkZJTEVfVVNFUixcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkRvY2tlcmZpbGVNb2RlbCIsIkRPQ0tFUkZJTEVfQkFTRSIsIkRPQ0tFUkZJTEVfVVNFUiIsImtleSIsIldFTExfS05PV05fRklMRVMiLCJET0NLRVJGSUxFIiwiX3J1blN0ZXBzIiwiYWRkUnVuU3RlcCIsImNtZCIsInB1c2giLCJmaWxlcyIsImV4dHJhcyIsImxlbmd0aCIsIm1hcCIsInMiLCJqb2luIiwiZmlsZVBhdGgiLCJjb250ZW50Il0sIm1hcHBpbmdzIjoiOzs7OytCQXNFYUE7OztlQUFBQTs7O3VCQXRFb0I7QUFHakMsZ0ZBQWdGO0FBQ2hGLE1BQU1DLGtCQUFrQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUR6QixDQUFDO0FBRUQsTUFBTUMsa0JBQWtCLENBQUMscUJBQXFCLENBQUM7QUFTeEMsTUFBTUY7SUFDSUcsTUFBTUMsdUJBQWdCLENBQUNDLFVBQVUsQ0FBQztJQUNqQ0MsWUFBc0IsRUFBRSxDQUFDO0lBRTFDLHNFQUFzRSxHQUN0RSxBQUFPQyxXQUFXQyxHQUFXLEVBQVE7UUFDcEMsSUFBSSxDQUFDRixTQUFTLENBQUNHLElBQUksQ0FBQ0Q7UUFDcEIsT0FBTyxJQUFJO0lBQ1o7SUFFT0UsUUFBc0I7UUFDNUIsTUFBTUMsU0FDTCxJQUFJLENBQUNMLFNBQVMsQ0FBQ00sTUFBTSxHQUFHLElBQ3JCLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQ04sU0FBUyxDQUFDTyxHQUFHLENBQUMsQ0FBQ0MsSUFBTSxDQUFDLElBQUksRUFBRUEsR0FBRyxFQUFFQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsR0FDM0Q7UUFDSixPQUFPO1lBQ047Z0JBQ0NDLFVBQVU7Z0JBQ1ZDLFNBQVNoQixrQkFBa0JVLFNBQVNUO1lBQ3JDO1NBQ0E7SUFDRjtBQUNEIn0=
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { WELL_KNOWN_FILES } from "./const.js";
|
|
2
|
-
// Everything before the final USER instruction. Features insert RUN steps here.
|
|
3
|
-
const DOCKERFILE_BASE = `FROM node:24
|
|
4
|
-
|
|
5
|
-
ARG USERNAME=node
|
|
6
|
-
|
|
7
|
-
# System tools: jq + ripgrep for scripting/search, python3 for AI tooling,
|
|
8
|
-
# gh for GitHub workflows, curl/gnupg for package sources.
|
|
9
|
-
RUN apt-get update \\
|
|
10
|
-
&& apt-get install -y --no-install-recommends ca-certificates curl gnupg jq ripgrep python3 \\
|
|
11
|
-
&& curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg -o /usr/share/keyrings/githubcli-archive-keyring.gpg \\
|
|
12
|
-
&& chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \\
|
|
13
|
-
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" > /etc/apt/sources.list.d/github-cli.list \\
|
|
14
|
-
&& apt-get update \\
|
|
15
|
-
&& apt-get install -y --no-install-recommends gh \\
|
|
16
|
-
&& rm -rf /var/lib/apt/lists/*
|
|
17
|
-
|
|
18
|
-
RUN npm install --global npm@latest \\
|
|
19
|
-
&& npm add --global pnpm@10
|
|
20
|
-
|
|
21
|
-
RUN mkdir -p /home/\${USERNAME}/.config/pnpm /home/\${USERNAME}/.pnpm-store \\
|
|
22
|
-
&& chown -R \${USERNAME}:\${USERNAME} /home/\${USERNAME}/.config /home/\${USERNAME}/.pnpm-store \\
|
|
23
|
-
&& printf "store-dir=/home/\${USERNAME}/.pnpm-store\\n" > /home/\${USERNAME}/.config/pnpm/rc
|
|
24
|
-
|
|
25
|
-
# Pre-create workspace node_modules so the named volume mount is owned by the user
|
|
26
|
-
RUN mkdir -p /workspace/node_modules && chown \${USERNAME}:\${USERNAME} /workspace/node_modules
|
|
27
|
-
|
|
28
|
-
RUN mkdir /commandhistory && touch /commandhistory/.bash_history \\
|
|
29
|
-
&& chown -R \${USERNAME} /commandhistory
|
|
30
|
-
|
|
31
|
-
RUN SNIPPET="export PROMPT_COMMAND='history -a' && export HISTFILE=/commandhistory/.bash_history" \\
|
|
32
|
-
&& echo "$SNIPPET" >> "/home/\${USERNAME}/.bashrc"
|
|
33
|
-
|
|
34
|
-
# VS Code js-debug bug: bootloader.js in workspaceStorage is only created when
|
|
35
|
-
# the user manually toggles Auto Attach settings. On a fresh container it is
|
|
36
|
-
# missing, which crashes every Node command. Fix: if the injected path is
|
|
37
|
-
# missing, substitute the stable bootloader from the VS Code server extension
|
|
38
|
-
# directory (always present once the server is installed).
|
|
39
|
-
RUN cat <<'EOF' >> "/home/\${USERNAME}/.bashrc"
|
|
40
|
-
if [[ -n "\${NODE_OPTIONS:-}" && "\${NODE_OPTIONS}" == *"bootloader.js"* ]]; then
|
|
41
|
-
_bootloader_path="$(printf '%s\\n' "$NODE_OPTIONS" | sed -n 's/.*--require[= ]\\([^[:space:]]*bootloader\\.js\\).*/\\1/p')"
|
|
42
|
-
if [[ -n "\${_bootloader_path}" && ! -f "\${_bootloader_path}" ]]; then
|
|
43
|
-
_stable_bootloader="$(find /vscode/vscode-server /home/node/.vscode-server/extensions -name "bootloader.js" -path "*/ms-vscode.js-debug/*" 2>/dev/null | head -1)"
|
|
44
|
-
if [[ -n "\${_stable_bootloader}" ]]; then
|
|
45
|
-
NODE_OPTIONS="\${NODE_OPTIONS//\${_bootloader_path}/\${_stable_bootloader}}"
|
|
46
|
-
else
|
|
47
|
-
NODE_OPTIONS="$(printf '%s\\n' "$NODE_OPTIONS" | sed -E 's#(^| )--require(=| )[[:graph:]]*bootloader\\.js( |$)# #g; s# +# #g; s#^ ##; s# $##')"
|
|
48
|
-
unset VSCODE_INSPECTOR_OPTIONS
|
|
49
|
-
fi
|
|
50
|
-
export NODE_OPTIONS
|
|
51
|
-
if [[ -z "$NODE_OPTIONS" ]]; then
|
|
52
|
-
unset NODE_OPTIONS
|
|
53
|
-
fi
|
|
54
|
-
fi
|
|
55
|
-
unset _bootloader_path _stable_bootloader
|
|
56
|
-
fi
|
|
57
|
-
EOF
|
|
58
|
-
`;
|
|
59
|
-
const DOCKERFILE_USER = `\nUSER \${USERNAME}\n`;
|
|
60
|
-
/**
|
|
61
|
-
* Builder for `.devcontainer/Dockerfile`.
|
|
62
|
-
*
|
|
63
|
-
* Features call `addRunStep(cmd)` during their scaffold phase to append
|
|
64
|
-
* additional `RUN` instructions before the final `USER` instruction.
|
|
65
|
-
* `files()` assembles the complete Dockerfile content at render time.
|
|
66
|
-
*/ export class DockerfileModel {
|
|
67
|
-
key = WELL_KNOWN_FILES.DOCKERFILE;
|
|
68
|
-
_runSteps = [];
|
|
69
|
-
/** Append a RUN instruction (pass the command, not the RUN keyword). */ addRunStep(cmd) {
|
|
70
|
-
this._runSteps.push(cmd);
|
|
71
|
-
return this;
|
|
72
|
-
}
|
|
73
|
-
files() {
|
|
74
|
-
const extras = this._runSteps.length > 0 ? `\n${this._runSteps.map((s)=>`RUN ${s}`).join("\n\n")}\n` : "";
|
|
75
|
-
return [
|
|
76
|
-
{
|
|
77
|
-
filePath: ".devcontainer/Dockerfile",
|
|
78
|
-
content: DOCKERFILE_BASE + extras + DOCKERFILE_USER
|
|
79
|
-
}
|
|
80
|
-
];
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2NvbnRhaW5lci1pbWFnZS5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4vY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSB9IGZyb20gXCIuL3NvdXJjZS1maWxlLmpzXCI7XG5cbi8vIEV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSBmaW5hbCBVU0VSIGluc3RydWN0aW9uLiBGZWF0dXJlcyBpbnNlcnQgUlVOIHN0ZXBzIGhlcmUuXG5jb25zdCBET0NLRVJGSUxFX0JBU0UgPSBgRlJPTSBub2RlOjI0XG5cbkFSRyBVU0VSTkFNRT1ub2RlXG5cbiMgU3lzdGVtIHRvb2xzOiBqcSArIHJpcGdyZXAgZm9yIHNjcmlwdGluZy9zZWFyY2gsIHB5dGhvbjMgZm9yIEFJIHRvb2xpbmcsXG4jIGdoIGZvciBHaXRIdWIgd29ya2Zsb3dzLCBjdXJsL2dudXBnIGZvciBwYWNrYWdlIHNvdXJjZXMuXG5SVU4gYXB0LWdldCB1cGRhdGUgXFxcXFxuICAgICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBjYS1jZXJ0aWZpY2F0ZXMgY3VybCBnbnVwZyBqcSByaXBncmVwIHB5dGhvbjMgXFxcXFxuICAgICYmIGN1cmwgLWZzU0wgaHR0cHM6Ly9jbGkuZ2l0aHViLmNvbS9wYWNrYWdlcy9naXRodWJjbGktYXJjaGl2ZS1rZXlyaW5nLmdwZyAtbyAvdXNyL3NoYXJlL2tleXJpbmdzL2dpdGh1YmNsaS1hcmNoaXZlLWtleXJpbmcuZ3BnIFxcXFxcbiAgICAmJiBjaG1vZCBnbytyIC91c3Ivc2hhcmUva2V5cmluZ3MvZ2l0aHViY2xpLWFyY2hpdmUta2V5cmluZy5ncGcgXFxcXFxuICAgICYmIGVjaG8gXCJkZWIgW2FyY2g9JChkcGtnIC0tcHJpbnQtYXJjaGl0ZWN0dXJlKSBzaWduZWQtYnk9L3Vzci9zaGFyZS9rZXlyaW5ncy9naXRodWJjbGktYXJjaGl2ZS1rZXlyaW5nLmdwZ10gaHR0cHM6Ly9jbGkuZ2l0aHViLmNvbS9wYWNrYWdlcyBzdGFibGUgbWFpblwiID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZ2l0aHViLWNsaS5saXN0IFxcXFxcbiAgICAmJiBhcHQtZ2V0IHVwZGF0ZSBcXFxcXG4gICAgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIGdoIFxcXFxcbiAgICAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLypcblxuUlVOIG5wbSBpbnN0YWxsIC0tZ2xvYmFsIG5wbUBsYXRlc3QgXFxcXFxuICAgICYmIG5wbSBhZGQgLS1nbG9iYWwgcG5wbUAxMFxuXG5SVU4gbWtkaXIgLXAgL2hvbWUvXFwke1VTRVJOQU1FfS8uY29uZmlnL3BucG0gL2hvbWUvXFwke1VTRVJOQU1FfS8ucG5wbS1zdG9yZSBcXFxcXG4gICAgJiYgY2hvd24gLVIgXFwke1VTRVJOQU1FfTpcXCR7VVNFUk5BTUV9IC9ob21lL1xcJHtVU0VSTkFNRX0vLmNvbmZpZyAvaG9tZS9cXCR7VVNFUk5BTUV9Ly5wbnBtLXN0b3JlIFxcXFxcbiAgICAmJiBwcmludGYgXCJzdG9yZS1kaXI9L2hvbWUvXFwke1VTRVJOQU1FfS8ucG5wbS1zdG9yZVxcXFxuXCIgPiAvaG9tZS9cXCR7VVNFUk5BTUV9Ly5jb25maWcvcG5wbS9yY1xuXG4jIFByZS1jcmVhdGUgd29ya3NwYWNlIG5vZGVfbW9kdWxlcyBzbyB0aGUgbmFtZWQgdm9sdW1lIG1vdW50IGlzIG93bmVkIGJ5IHRoZSB1c2VyXG5SVU4gbWtkaXIgLXAgL3dvcmtzcGFjZS9ub2RlX21vZHVsZXMgJiYgY2hvd24gXFwke1VTRVJOQU1FfTpcXCR7VVNFUk5BTUV9IC93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzXG5cblJVTiBta2RpciAvY29tbWFuZGhpc3RvcnkgJiYgdG91Y2ggL2NvbW1hbmRoaXN0b3J5Ly5iYXNoX2hpc3RvcnkgXFxcXFxuICAgICYmIGNob3duIC1SIFxcJHtVU0VSTkFNRX0gL2NvbW1hbmRoaXN0b3J5XG5cblJVTiBTTklQUEVUPVwiZXhwb3J0IFBST01QVF9DT01NQU5EPSdoaXN0b3J5IC1hJyAmJiBleHBvcnQgSElTVEZJTEU9L2NvbW1hbmRoaXN0b3J5Ly5iYXNoX2hpc3RvcnlcIiBcXFxcXG4gICAgJiYgZWNobyBcIiRTTklQUEVUXCIgPj4gXCIvaG9tZS9cXCR7VVNFUk5BTUV9Ly5iYXNocmNcIlxuXG4jIFZTIENvZGUganMtZGVidWcgYnVnOiBib290bG9hZGVyLmpzIGluIHdvcmtzcGFjZVN0b3JhZ2UgaXMgb25seSBjcmVhdGVkIHdoZW5cbiMgdGhlIHVzZXIgbWFudWFsbHkgdG9nZ2xlcyBBdXRvIEF0dGFjaCBzZXR0aW5ncy4gT24gYSBmcmVzaCBjb250YWluZXIgaXQgaXNcbiMgbWlzc2luZywgd2hpY2ggY3Jhc2hlcyBldmVyeSBOb2RlIGNvbW1hbmQuIEZpeDogaWYgdGhlIGluamVjdGVkIHBhdGggaXNcbiMgbWlzc2luZywgc3Vic3RpdHV0ZSB0aGUgc3RhYmxlIGJvb3Rsb2FkZXIgZnJvbSB0aGUgVlMgQ29kZSBzZXJ2ZXIgZXh0ZW5zaW9uXG4jIGRpcmVjdG9yeSAoYWx3YXlzIHByZXNlbnQgb25jZSB0aGUgc2VydmVyIGlzIGluc3RhbGxlZCkuXG5SVU4gY2F0IDw8J0VPRicgPj4gXCIvaG9tZS9cXCR7VVNFUk5BTUV9Ly5iYXNocmNcIlxuaWYgW1sgLW4gXCJcXCR7Tk9ERV9PUFRJT05TOi19XCIgJiYgXCJcXCR7Tk9ERV9PUFRJT05TfVwiID09ICpcImJvb3Rsb2FkZXIuanNcIiogXV07IHRoZW5cbiAgICBfYm9vdGxvYWRlcl9wYXRoPVwiJChwcmludGYgJyVzXFxcXG4nIFwiJE5PREVfT1BUSU9OU1wiIHwgc2VkIC1uICdzLy4qLS1yZXF1aXJlWz0gXVxcXFwoW15bOnNwYWNlOl1dKmJvb3Rsb2FkZXJcXFxcLmpzXFxcXCkuKi9cXFxcMS9wJylcIlxuICAgIGlmIFtbIC1uIFwiXFwke19ib290bG9hZGVyX3BhdGh9XCIgJiYgISAtZiBcIlxcJHtfYm9vdGxvYWRlcl9wYXRofVwiIF1dOyB0aGVuXG4gICAgICAgIF9zdGFibGVfYm9vdGxvYWRlcj1cIiQoZmluZCAvdnNjb2RlL3ZzY29kZS1zZXJ2ZXIgL2hvbWUvbm9kZS8udnNjb2RlLXNlcnZlci9leHRlbnNpb25zIC1uYW1lIFwiYm9vdGxvYWRlci5qc1wiIC1wYXRoIFwiKi9tcy12c2NvZGUuanMtZGVidWcvKlwiIDI+L2Rldi9udWxsIHwgaGVhZCAtMSlcIlxuICAgICAgICBpZiBbWyAtbiBcIlxcJHtfc3RhYmxlX2Jvb3Rsb2FkZXJ9XCIgXV07IHRoZW5cbiAgICAgICAgICAgIE5PREVfT1BUSU9OUz1cIlxcJHtOT0RFX09QVElPTlMvL1xcJHtfYm9vdGxvYWRlcl9wYXRofS9cXCR7X3N0YWJsZV9ib290bG9hZGVyfX1cIlxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBOT0RFX09QVElPTlM9XCIkKHByaW50ZiAnJXNcXFxcbicgXCIkTk9ERV9PUFRJT05TXCIgfCBzZWQgLUUgJ3MjKF58ICktLXJlcXVpcmUoPXwgKVtbOmdyYXBoOl1dKmJvb3Rsb2FkZXJcXFxcLmpzKCB8JCkjICNnOyBzIyAgKyMgI2c7IHMjXiAjIzsgcyMgJCMjJylcIlxuICAgICAgICAgICAgdW5zZXQgVlNDT0RFX0lOU1BFQ1RPUl9PUFRJT05TXG4gICAgICAgIGZpXG4gICAgICAgIGV4cG9ydCBOT0RFX09QVElPTlNcbiAgICAgICAgaWYgW1sgLXogXCIkTk9ERV9PUFRJT05TXCIgXV07IHRoZW5cbiAgICAgICAgICAgIHVuc2V0IE5PREVfT1BUSU9OU1xuICAgICAgICBmaVxuICAgIGZpXG4gICAgdW5zZXQgX2Jvb3Rsb2FkZXJfcGF0aCBfc3RhYmxlX2Jvb3Rsb2FkZXJcbmZpXG5FT0ZcbmA7XG5cbmNvbnN0IERPQ0tFUkZJTEVfVVNFUiA9IGBcXG5VU0VSIFxcJHtVU0VSTkFNRX1cXG5gO1xuXG4vKipcbiAqIEJ1aWxkZXIgZm9yIGAuZGV2Y29udGFpbmVyL0RvY2tlcmZpbGVgLlxuICpcbiAqIEZlYXR1cmVzIGNhbGwgYGFkZFJ1blN0ZXAoY21kKWAgZHVyaW5nIHRoZWlyIHNjYWZmb2xkIHBoYXNlIHRvIGFwcGVuZFxuICogYWRkaXRpb25hbCBgUlVOYCBpbnN0cnVjdGlvbnMgYmVmb3JlIHRoZSBmaW5hbCBgVVNFUmAgaW5zdHJ1Y3Rpb24uXG4gKiBgZmlsZXMoKWAgYXNzZW1ibGVzIHRoZSBjb21wbGV0ZSBEb2NrZXJmaWxlIGNvbnRlbnQgYXQgcmVuZGVyIHRpbWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBEb2NrZXJmaWxlTW9kZWwgaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuRE9DS0VSRklMRTtcblx0cHJpdmF0ZSByZWFkb25seSBfcnVuU3RlcHM6IHN0cmluZ1tdID0gW107XG5cblx0LyoqIEFwcGVuZCBhIFJVTiBpbnN0cnVjdGlvbiAocGFzcyB0aGUgY29tbWFuZCwgbm90IHRoZSBSVU4ga2V5d29yZCkuICovXG5cdHB1YmxpYyBhZGRSdW5TdGVwKGNtZDogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fcnVuU3RlcHMucHVzaChjbWQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0Y29uc3QgZXh0cmFzID1cblx0XHRcdHRoaXMuX3J1blN0ZXBzLmxlbmd0aCA+IDBcblx0XHRcdFx0PyBgXFxuJHt0aGlzLl9ydW5TdGVwcy5tYXAoKHMpID0+IGBSVU4gJHtzfWApLmpvaW4oXCJcXG5cXG5cIil9XFxuYFxuXHRcdFx0XHQ6IFwiXCI7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLmRldmNvbnRhaW5lci9Eb2NrZXJmaWxlXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IERPQ0tFUkZJTEVfQkFTRSArIGV4dHJhcyArIERPQ0tFUkZJTEVfVVNFUixcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIldFTExfS05PV05fRklMRVMiLCJET0NLRVJGSUxFX0JBU0UiLCJET0NLRVJGSUxFX1VTRVIiLCJEb2NrZXJmaWxlTW9kZWwiLCJrZXkiLCJET0NLRVJGSUxFIiwiX3J1blN0ZXBzIiwiYWRkUnVuU3RlcCIsImNtZCIsInB1c2giLCJmaWxlcyIsImV4dHJhcyIsImxlbmd0aCIsIm1hcCIsInMiLCJqb2luIiwiZmlsZVBhdGgiLCJjb250ZW50Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxnQkFBZ0IsUUFBUSxhQUFhO0FBRzlDLGdGQUFnRjtBQUNoRixNQUFNQyxrQkFBa0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVEekIsQ0FBQztBQUVELE1BQU1DLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDO0FBRS9DOzs7Ozs7Q0FNQyxHQUNELE9BQU8sTUFBTUM7SUFDSUMsTUFBTUosaUJBQWlCSyxVQUFVLENBQUM7SUFDakNDLFlBQXNCLEVBQUUsQ0FBQztJQUUxQyxzRUFBc0UsR0FDdEUsQUFBT0MsV0FBV0MsR0FBVyxFQUFRO1FBQ3BDLElBQUksQ0FBQ0YsU0FBUyxDQUFDRyxJQUFJLENBQUNEO1FBQ3BCLE9BQU8sSUFBSTtJQUNaO0lBRU9FLFFBQXNCO1FBQzVCLE1BQU1DLFNBQ0wsSUFBSSxDQUFDTCxTQUFTLENBQUNNLE1BQU0sR0FBRyxJQUNyQixDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUNOLFNBQVMsQ0FBQ08sR0FBRyxDQUFDLENBQUNDLElBQU0sQ0FBQyxJQUFJLEVBQUVBLEdBQUcsRUFBRUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQzNEO1FBQ0osT0FBTztZQUNOO2dCQUNDQyxVQUFVO2dCQUNWQyxTQUFTaEIsa0JBQWtCVSxTQUFTVDtZQUNyQztTQUNBO0lBQ0Y7QUFDRCJ9
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { KeyedModel, SourceFile } from "./source-file.js";
|
|
2
|
-
/**
|
|
3
|
-
* Builder for `.devcontainer/Dockerfile`.
|
|
4
|
-
*
|
|
5
|
-
* Features call `addRunStep(cmd)` during their scaffold phase to append
|
|
6
|
-
* additional `RUN` instructions before the final `USER` instruction.
|
|
7
|
-
* `files()` assembles the complete Dockerfile content at render time.
|
|
8
|
-
*/
|
|
9
|
-
export declare class DockerfileModel implements KeyedModel {
|
|
10
|
-
readonly key: string;
|
|
11
|
-
private readonly _runSteps;
|
|
12
|
-
/** Append a RUN instruction (pass the command, not the RUN keyword). */
|
|
13
|
-
addRunStep(cmd: string): this;
|
|
14
|
-
files(): SourceFile[];
|
|
15
|
-
}
|