@simplysm/sd-cli 13.0.68 → 13.0.70
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/README.md +10 -957
- package/dist/builders/BaseBuilder.d.ts +23 -23
- package/dist/builders/BaseBuilder.d.ts.map +1 -1
- package/dist/builders/BaseBuilder.js +15 -15
- package/dist/builders/DtsBuilder.d.ts +4 -4
- package/dist/builders/DtsBuilder.js +1 -1
- package/dist/builders/LibraryBuilder.d.ts +3 -3
- package/dist/builders/types.d.ts +10 -10
- package/dist/capacitor/capacitor.d.ts +36 -36
- package/dist/capacitor/capacitor.js +63 -63
- package/dist/capacitor/capacitor.js.map +1 -1
- package/dist/commands/add-client.d.ts +8 -8
- package/dist/commands/add-client.js +15 -15
- package/dist/commands/add-client.js.map +1 -1
- package/dist/commands/add-server.d.ts +9 -9
- package/dist/commands/add-server.js +13 -13
- package/dist/commands/add-server.js.map +1 -1
- package/dist/commands/build.d.ts +9 -9
- package/dist/commands/check.js +3 -3
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/dev.d.ts +9 -9
- package/dist/commands/device.d.ts +9 -9
- package/dist/commands/device.d.ts.map +1 -1
- package/dist/commands/device.js +17 -17
- package/dist/commands/device.js.map +1 -1
- package/dist/commands/init.d.ts +6 -6
- package/dist/commands/init.js +12 -12
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/lint.d.ts +23 -23
- package/dist/commands/lint.d.ts.map +1 -1
- package/dist/commands/lint.js +25 -25
- package/dist/commands/lint.js.map +1 -1
- package/dist/commands/publish.d.ts +13 -13
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +61 -61
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/replace-deps.d.ts +3 -3
- package/dist/commands/replace-deps.d.ts.map +1 -1
- package/dist/commands/replace-deps.js +1 -1
- package/dist/commands/replace-deps.js.map +1 -1
- package/dist/commands/typecheck.d.ts +20 -20
- package/dist/commands/typecheck.d.ts.map +1 -1
- package/dist/commands/typecheck.js +20 -20
- package/dist/commands/typecheck.js.map +1 -1
- package/dist/commands/watch.d.ts +7 -7
- package/dist/electron/electron.d.ts +27 -27
- package/dist/electron/electron.js +32 -32
- package/dist/electron/electron.js.map +1 -1
- package/dist/infra/ResultCollector.d.ts +9 -9
- package/dist/infra/ResultCollector.js +5 -5
- package/dist/infra/SignalHandler.d.ts +7 -7
- package/dist/infra/SignalHandler.js +4 -4
- package/dist/infra/WorkerManager.d.ts +14 -14
- package/dist/infra/WorkerManager.js +11 -11
- package/dist/orchestrators/BuildOrchestrator.d.ts +19 -19
- package/dist/orchestrators/BuildOrchestrator.d.ts.map +1 -1
- package/dist/orchestrators/BuildOrchestrator.js +26 -26
- package/dist/orchestrators/BuildOrchestrator.js.map +1 -1
- package/dist/orchestrators/DevOrchestrator.d.ts +25 -25
- package/dist/orchestrators/DevOrchestrator.d.ts.map +1 -1
- package/dist/orchestrators/DevOrchestrator.js +30 -30
- package/dist/orchestrators/DevOrchestrator.js.map +1 -1
- package/dist/orchestrators/WatchOrchestrator.d.ts +13 -13
- package/dist/orchestrators/WatchOrchestrator.js +17 -17
- package/dist/orchestrators/WatchOrchestrator.js.map +1 -1
- package/dist/sd-cli-entry.d.ts +2 -2
- package/dist/sd-cli-entry.js +38 -38
- package/dist/sd-cli-entry.js.map +1 -1
- package/dist/sd-cli.d.ts +2 -2
- package/dist/sd-cli.js +1 -1
- package/dist/sd-cli.js.map +1 -1
- package/dist/sd-config.types.d.ts +84 -84
- package/dist/sd-config.types.d.ts.map +1 -1
- package/dist/utils/build-env.d.ts +1 -1
- package/dist/utils/config-editor.d.ts +5 -5
- package/dist/utils/config-editor.js +2 -2
- package/dist/utils/config-editor.js.map +1 -1
- package/dist/utils/copy-public.d.ts +9 -9
- package/dist/utils/copy-src.d.ts +9 -9
- package/dist/utils/esbuild-config.d.ts +30 -30
- package/dist/utils/esbuild-config.d.ts.map +1 -1
- package/dist/utils/output-utils.d.ts +6 -6
- package/dist/utils/package-utils.d.ts +6 -6
- package/dist/utils/package-utils.js +1 -1
- package/dist/utils/package-utils.js.map +1 -1
- package/dist/utils/rebuild-manager.js +3 -3
- package/dist/utils/rebuild-manager.js.map +1 -1
- package/dist/utils/replace-deps.d.ts +25 -25
- package/dist/utils/replace-deps.js +3 -3
- package/dist/utils/replace-deps.js.map +1 -1
- package/dist/utils/sd-config.d.ts +3 -3
- package/dist/utils/sd-config.js +3 -3
- package/dist/utils/sd-config.js.map +1 -1
- package/dist/utils/tailwind-config-deps.d.ts +3 -3
- package/dist/utils/template.d.ts +8 -8
- package/dist/utils/tsconfig.d.ts +16 -16
- package/dist/utils/tsconfig.js +2 -2
- package/dist/utils/tsconfig.js.map +1 -1
- package/dist/utils/typecheck-serialization.d.ts +8 -8
- package/dist/utils/vite-config.d.ts +8 -8
- package/dist/utils/vite-config.d.ts.map +1 -1
- package/dist/utils/vite-config.js +3 -3
- package/dist/utils/worker-events.d.ts +12 -12
- package/dist/utils/worker-events.d.ts.map +1 -1
- package/dist/utils/worker-utils.d.ts +3 -3
- package/dist/utils/worker-utils.js +2 -2
- package/dist/utils/worker-utils.js.map +1 -1
- package/dist/workers/client.worker.d.ts +14 -14
- package/dist/workers/client.worker.d.ts.map +1 -1
- package/dist/workers/client.worker.js +1 -1
- package/dist/workers/client.worker.js.map +1 -1
- package/dist/workers/dts.worker.d.ts +13 -13
- package/dist/workers/dts.worker.d.ts.map +1 -1
- package/dist/workers/dts.worker.js +3 -3
- package/dist/workers/dts.worker.js.map +1 -1
- package/dist/workers/library.worker.d.ts +12 -12
- package/dist/workers/library.worker.js +1 -1
- package/dist/workers/library.worker.js.map +1 -1
- package/dist/workers/lint.worker.d.ts +1 -1
- package/dist/workers/server-runtime.worker.d.ts +6 -6
- package/dist/workers/server-runtime.worker.js +6 -6
- package/dist/workers/server-runtime.worker.js.map +1 -1
- package/dist/workers/server.worker.d.ts +20 -20
- package/dist/workers/server.worker.d.ts.map +1 -1
- package/dist/workers/server.worker.js +6 -6
- package/dist/workers/server.worker.js.map +1 -1
- package/package.json +8 -7
- package/src/builders/BaseBuilder.ts +33 -33
- package/src/builders/DtsBuilder.ts +5 -5
- package/src/builders/LibraryBuilder.ts +9 -9
- package/src/builders/types.ts +10 -10
- package/src/capacitor/capacitor.ts +119 -119
- package/src/commands/add-client.ts +31 -31
- package/src/commands/add-server.ts +34 -34
- package/src/commands/build.ts +9 -9
- package/src/commands/check.ts +5 -5
- package/src/commands/dev.ts +9 -9
- package/src/commands/device.ts +30 -30
- package/src/commands/init.ts +25 -25
- package/src/commands/lint.ts +64 -64
- package/src/commands/publish.ts +139 -139
- package/src/commands/replace-deps.ts +4 -4
- package/src/commands/typecheck.ts +74 -74
- package/src/commands/watch.ts +7 -7
- package/src/electron/electron.ts +51 -51
- package/src/infra/ResultCollector.ts +9 -9
- package/src/infra/SignalHandler.ts +7 -7
- package/src/infra/WorkerManager.ts +14 -14
- package/src/orchestrators/BuildOrchestrator.ts +76 -76
- package/src/orchestrators/DevOrchestrator.ts +88 -88
- package/src/orchestrators/WatchOrchestrator.ts +39 -39
- package/src/sd-cli-entry.ts +43 -43
- package/src/sd-cli.ts +15 -15
- package/src/sd-config.types.ts +85 -85
- package/src/utils/build-env.ts +1 -1
- package/src/utils/config-editor.ts +19 -19
- package/src/utils/copy-public.ts +17 -17
- package/src/utils/copy-src.ts +11 -11
- package/src/utils/esbuild-config.ts +33 -33
- package/src/utils/output-utils.ts +11 -11
- package/src/utils/package-utils.ts +12 -12
- package/src/utils/rebuild-manager.ts +3 -3
- package/src/utils/replace-deps.ts +361 -361
- package/src/utils/sd-config.ts +44 -44
- package/src/utils/tailwind-config-deps.ts +98 -98
- package/src/utils/template.ts +56 -56
- package/src/utils/tsconfig.ts +127 -127
- package/src/utils/typecheck-serialization.ts +86 -86
- package/src/utils/vite-config.ts +341 -341
- package/src/utils/worker-events.ts +16 -16
- package/src/utils/worker-utils.ts +45 -45
- package/src/workers/client.worker.ts +34 -34
- package/src/workers/dts.worker.ts +467 -467
- package/src/workers/library.worker.ts +314 -314
- package/src/workers/lint.worker.ts +16 -16
- package/src/workers/server-runtime.worker.ts +157 -157
- package/src/workers/server.worker.ts +572 -572
- package/templates/add-client/__CLIENT__/package.json.hbs +1 -1
- package/templates/add-server/__SERVER__/package.json.hbs +2 -2
- package/templates/init/package.json.hbs +3 -3
- package/tests/config-editor.spec.ts +160 -0
- package/tests/copy-src.spec.ts +50 -0
- package/tests/get-compiler-options-for-package.spec.ts +139 -0
- package/tests/get-package-source-files.spec.ts +181 -0
- package/tests/get-types-from-package-json.spec.ts +107 -0
- package/tests/infra/ResultCollector.spec.ts +39 -0
- package/tests/infra/SignalHandler.spec.ts +38 -0
- package/tests/infra/WorkerManager.spec.ts +97 -0
- package/tests/load-ignore-patterns.spec.ts +188 -0
- package/tests/load-sd-config.spec.ts +137 -0
- package/tests/package-utils.spec.ts +188 -0
- package/tests/parse-root-tsconfig.spec.ts +89 -0
- package/tests/replace-deps.spec.ts +308 -0
- package/tests/run-lint.spec.ts +415 -0
- package/tests/run-typecheck.spec.ts +653 -0
- package/tests/run-watch.spec.ts +75 -0
- package/tests/sd-cli.spec.ts +330 -0
- package/tests/tailwind-config-deps.spec.ts +30 -0
- package/tests/template.spec.ts +70 -0
- package/tests/utils/rebuild-manager.spec.ts +43 -0
- package/tests/write-changed-output-files.spec.ts +97 -0
package/dist/commands/lint.js
CHANGED
|
@@ -39,7 +39,7 @@ async function loadIgnorePatterns(cwd) {
|
|
|
39
39
|
}
|
|
40
40
|
if (configPath == null) {
|
|
41
41
|
throw new SdError(
|
|
42
|
-
`
|
|
42
|
+
`Cannot find ESLint config file (cwd: ${cwd}): ${ESLINT_CONFIG_FILES.join(", ")}`
|
|
43
43
|
);
|
|
44
44
|
}
|
|
45
45
|
const jiti = createJiti(import.meta.url);
|
|
@@ -52,10 +52,10 @@ async function loadIgnorePatterns(cwd) {
|
|
|
52
52
|
} else if (configModule != null && typeof configModule === "object" && "default" in configModule) {
|
|
53
53
|
configs = configModule.default;
|
|
54
54
|
} else {
|
|
55
|
-
throw new SdError(`ESLint
|
|
55
|
+
throw new SdError(`ESLint config file is not in correct format: ${configPath}`);
|
|
56
56
|
}
|
|
57
57
|
if (!Array.isArray(configs)) {
|
|
58
|
-
throw new SdError(`ESLint
|
|
58
|
+
throw new SdError(`ESLint config is not an array: ${configPath}`);
|
|
59
59
|
}
|
|
60
60
|
return configs.filter(isGlobalIgnoresConfig).flatMap((item) => item.ignores);
|
|
61
61
|
}
|
|
@@ -69,15 +69,15 @@ async function executeLint(options) {
|
|
|
69
69
|
const { targets, fix, timing } = options;
|
|
70
70
|
const cwd = process.cwd();
|
|
71
71
|
const logger = consola.withTag("sd:cli:lint");
|
|
72
|
-
logger.debug("
|
|
72
|
+
logger.debug("start lint", { targets, fix, timing });
|
|
73
73
|
if (timing) {
|
|
74
74
|
process.env["TIMING"] = "1";
|
|
75
75
|
}
|
|
76
|
-
logger.start("ESLint
|
|
76
|
+
logger.start("loading ESLint config");
|
|
77
77
|
const ignorePatterns = await loadIgnorePatterns(cwd);
|
|
78
|
-
logger.debug("ignore
|
|
79
|
-
logger.success(`ESLint
|
|
80
|
-
logger.start("
|
|
78
|
+
logger.debug("ignore patterns loaded", { ignorePatternCount: ignorePatterns.length });
|
|
79
|
+
logger.success(`loaded ESLint config (${ignorePatterns.length} ignore patterns)`);
|
|
80
|
+
logger.start("collecting lint target files");
|
|
81
81
|
let files = await fsGlob("**/*.{ts,tsx,js,jsx}", {
|
|
82
82
|
cwd,
|
|
83
83
|
ignore: ignorePatterns,
|
|
@@ -85,12 +85,12 @@ async function executeLint(options) {
|
|
|
85
85
|
absolute: true
|
|
86
86
|
});
|
|
87
87
|
files = pathFilterByTargets(files, targets, cwd);
|
|
88
|
-
logger.debug("
|
|
89
|
-
logger.success(
|
|
88
|
+
logger.debug("file collection complete", { fileCount: files.length });
|
|
89
|
+
logger.success(`collected lint target files (${files.length} files)`);
|
|
90
90
|
let eslint;
|
|
91
91
|
let eslintResults;
|
|
92
92
|
if (files.length > 0) {
|
|
93
|
-
logger.start(
|
|
93
|
+
logger.start(`running lint... (${files.length} files)`);
|
|
94
94
|
eslint = new ESLint({
|
|
95
95
|
cwd,
|
|
96
96
|
fix,
|
|
@@ -98,17 +98,17 @@ async function executeLint(options) {
|
|
|
98
98
|
cacheLocation: path.join(cwd, ".cache", "eslint.cache")
|
|
99
99
|
});
|
|
100
100
|
eslintResults = await eslint.lintFiles(files);
|
|
101
|
-
logger.success("
|
|
101
|
+
logger.success("lint complete");
|
|
102
102
|
if (fix) {
|
|
103
|
-
logger.debug("
|
|
103
|
+
logger.debug("applying auto-fix...");
|
|
104
104
|
await ESLint.outputFixes(eslintResults);
|
|
105
|
-
logger.debug("
|
|
105
|
+
logger.debug("auto-fix applied");
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
108
|
const hasStylelintCfg = await hasStylelintConfig(cwd);
|
|
109
109
|
let stylelintResult;
|
|
110
110
|
if (hasStylelintCfg) {
|
|
111
|
-
logger.start("CSS
|
|
111
|
+
logger.start("collecting CSS files");
|
|
112
112
|
let cssFiles = await fsGlob("**/*.css", {
|
|
113
113
|
cwd,
|
|
114
114
|
ignore: ignorePatterns,
|
|
@@ -116,9 +116,9 @@ async function executeLint(options) {
|
|
|
116
116
|
absolute: true
|
|
117
117
|
});
|
|
118
118
|
cssFiles = pathFilterByTargets(cssFiles, targets, cwd);
|
|
119
|
-
logger.success(`CSS
|
|
119
|
+
logger.success(`collected CSS files (${cssFiles.length} files)`);
|
|
120
120
|
if (cssFiles.length > 0) {
|
|
121
|
-
logger.start(`Stylelint
|
|
121
|
+
logger.start(`running Stylelint... (${cssFiles.length} files)`);
|
|
122
122
|
let configFile;
|
|
123
123
|
for (const f of STYLELINT_CONFIG_FILES) {
|
|
124
124
|
const configPath = path.join(cwd, f);
|
|
@@ -150,21 +150,21 @@ async function executeLint(options) {
|
|
|
150
150
|
};
|
|
151
151
|
}
|
|
152
152
|
stylelintResult = await stylelint.lint(stylelintOptions);
|
|
153
|
-
logger.success("Stylelint
|
|
153
|
+
logger.success("Stylelint execution complete");
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
156
|
if (files.length === 0 || eslintResults == null || eslint == null) {
|
|
157
|
-
logger.info("
|
|
157
|
+
logger.info("no files to lint");
|
|
158
158
|
return { success: true, errorCount: 0, warningCount: 0, formattedOutput: "" };
|
|
159
159
|
}
|
|
160
160
|
let errorCount = eslintResults.sum((r) => r.errorCount);
|
|
161
161
|
let warningCount = eslintResults.sum((r) => r.warningCount);
|
|
162
162
|
if (errorCount > 0) {
|
|
163
|
-
logger.error("
|
|
163
|
+
logger.error("lint errors occurred", { errorCount, warningCount });
|
|
164
164
|
} else if (warningCount > 0) {
|
|
165
|
-
logger.info("
|
|
165
|
+
logger.info("lint complete (warnings present)", { errorCount, warningCount });
|
|
166
166
|
} else {
|
|
167
|
-
logger.info("
|
|
167
|
+
logger.info("lint complete", { errorCount, warningCount });
|
|
168
168
|
}
|
|
169
169
|
let formattedOutput = "";
|
|
170
170
|
const formatter = await eslint.loadFormatter("stylish");
|
|
@@ -182,17 +182,17 @@ async function executeLint(options) {
|
|
|
182
182
|
errorCount += stylelintErrorCount;
|
|
183
183
|
warningCount += stylelintWarningCount;
|
|
184
184
|
if (stylelintErrorCount > 0) {
|
|
185
|
-
logger.error("Stylelint
|
|
185
|
+
logger.error("Stylelint errors occurred", {
|
|
186
186
|
errorCount: stylelintErrorCount,
|
|
187
187
|
warningCount: stylelintWarningCount
|
|
188
188
|
});
|
|
189
189
|
} else if (stylelintWarningCount > 0) {
|
|
190
|
-
logger.info("Stylelint
|
|
190
|
+
logger.info("Stylelint complete (warnings present)", {
|
|
191
191
|
errorCount: stylelintErrorCount,
|
|
192
192
|
warningCount: stylelintWarningCount
|
|
193
193
|
});
|
|
194
194
|
} else {
|
|
195
|
-
logger.info("Stylelint
|
|
195
|
+
logger.info("Stylelint complete", {
|
|
196
196
|
errorCount: stylelintErrorCount,
|
|
197
197
|
warningCount: stylelintWarningCount
|
|
198
198
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/lint.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,OAAO,UAAU;AACjB,SAAS,UAAU,QAAQ,2BAA2B;AACtD,OAAO;AACP,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,OAAO,eAAe;AAmCtB,MAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,MAAM,yBAAyB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKA,SAAS,sBAAsB,MAA8C;AAC3E,MAAI,QAAQ,QAAQ,OAAO,SAAS,SAAU,QAAO;AACrD,MAAI,EAAE,aAAa,MAAO,QAAO;AACjC,MAAI,WAAW,KAAM,QAAO;AAC5B,QAAM,UAAW,KAA8B;AAC/C,MAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO;AACpC,SAAO,QAAQ,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ;AACnD;AAOA,eAAsB,mBAAmB,KAAgC;AACvE,MAAI;AACJ,aAAW,KAAK,qBAAqB;AACnC,UAAM,IAAI,KAAK,KAAK,KAAK,CAAC;AAC1B,QAAI,MAAM,SAAS,CAAC,GAAG;AACrB,mBAAa;AACb;AAAA,IACF;AAAA,EACF;AAEA,MAAI,cAAc,MAAM;AACtB,UAAM,IAAI;AAAA,MACR,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
import "@simplysm/core-common";
|
|
2
2
|
/**
|
|
3
|
-
* Publish
|
|
3
|
+
* Publish command options
|
|
4
4
|
*/
|
|
5
5
|
export interface PublishOptions {
|
|
6
|
-
/**
|
|
6
|
+
/** Filter for packages to deploy (empty array deploys all packages with publish config) */
|
|
7
7
|
targets: string[];
|
|
8
|
-
/**
|
|
8
|
+
/** Deploy without building (dangerous) */
|
|
9
9
|
noBuild: boolean;
|
|
10
|
-
/**
|
|
10
|
+
/** Simulate deployment without actually deploying */
|
|
11
11
|
dryRun: boolean;
|
|
12
|
-
/** sd.config.ts
|
|
12
|
+
/** Additional options to pass to sd.config.ts */
|
|
13
13
|
options: string[];
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
|
-
* publish
|
|
16
|
+
* Execute publish command.
|
|
17
17
|
*
|
|
18
|
-
*
|
|
19
|
-
* 1.
|
|
20
|
-
* 2.
|
|
21
|
-
* 3.
|
|
22
|
-
* 4. Git
|
|
23
|
-
* 5. pnpm
|
|
24
|
-
* 6. postPublish (
|
|
18
|
+
* **Deployment order (safety first):**
|
|
19
|
+
* 1. Pre-validation (npm auth, Git status)
|
|
20
|
+
* 2. Version upgrade (package.json + templates)
|
|
21
|
+
* 3. Build
|
|
22
|
+
* 4. Git commit/tag/push (explicitly stage only changed files)
|
|
23
|
+
* 5. pnpm deployment
|
|
24
|
+
* 6. postPublish (continue even if it fails)
|
|
25
25
|
*/
|
|
26
26
|
export declare function runPublish(options: PublishOptions): Promise<void>;
|
|
27
27
|
//# sourceMappingURL=publish.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["..\\..\\src\\commands\\publish.ts"],"names":[],"mappings":"AAMA,OAAO,uBAAuB,CAAC;AAe/B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["..\\..\\src\\commands\\publish.ts"],"names":[],"mappings":"AAMA,OAAO,uBAAuB,CAAC;AAe/B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2FAA2F;IAC3F,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,MAAM,EAAE,OAAO,CAAC;IAChB,iDAAiD;IACjD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA2aD;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAyWvE"}
|
package/dist/commands/publish.js
CHANGED
|
@@ -25,7 +25,7 @@ function replaceEnvVariables(str, version, projectPath) {
|
|
|
25
25
|
return env[envName] ?? match;
|
|
26
26
|
});
|
|
27
27
|
if (/%[^%]+%/.test(result)) {
|
|
28
|
-
throw new Error(
|
|
28
|
+
throw new Error(`Environment variable substitution failed: ${str} \u2192 ${result}`);
|
|
29
29
|
}
|
|
30
30
|
return result;
|
|
31
31
|
}
|
|
@@ -51,7 +51,7 @@ async function ensureSshAuth(publishPackages, logger) {
|
|
|
51
51
|
if (pkg.config.type !== "sftp") continue;
|
|
52
52
|
if (pkg.config.pass != null) continue;
|
|
53
53
|
if (pkg.config.user == null) {
|
|
54
|
-
throw new Error(`[${pkg.name}] SFTP
|
|
54
|
+
throw new Error(`[${pkg.name}] SFTP config missing user.`);
|
|
55
55
|
}
|
|
56
56
|
const key = `${pkg.config.user}@${pkg.config.host}`;
|
|
57
57
|
sshTargets.set(key, {
|
|
@@ -65,14 +65,14 @@ async function ensureSshAuth(publishPackages, logger) {
|
|
|
65
65
|
const keyPath = path.join(sshDir, "id_ed25519");
|
|
66
66
|
const pubKeyPath = path.join(sshDir, "id_ed25519.pub");
|
|
67
67
|
if (!fs.existsSync(keyPath)) {
|
|
68
|
-
logger.info("SSH
|
|
68
|
+
logger.info("SSH key not found. Creating one...");
|
|
69
69
|
if (!fs.existsSync(sshDir)) {
|
|
70
70
|
fs.mkdirSync(sshDir, { mode: 448 });
|
|
71
71
|
}
|
|
72
72
|
const keyPair = utils.generateKeyPairSync("ed25519");
|
|
73
73
|
fs.writeFileSync(keyPath, keyPair.private, { mode: 384 });
|
|
74
74
|
fs.writeFileSync(pubKeyPath, keyPair.public + "\n", { mode: 420 });
|
|
75
|
-
logger.info(`SSH
|
|
75
|
+
logger.info(`SSH key created: ${keyPath}`);
|
|
76
76
|
}
|
|
77
77
|
const privateKeyData = fs.readFileSync(keyPath);
|
|
78
78
|
const publicKey = fs.readFileSync(pubKeyPath, "utf-8").trim();
|
|
@@ -85,15 +85,15 @@ async function ensureSshAuth(publishPackages, logger) {
|
|
|
85
85
|
agent: sshAgent
|
|
86
86
|
});
|
|
87
87
|
if (canAuth) {
|
|
88
|
-
logger.debug(`SSH
|
|
88
|
+
logger.debug(`SSH key authentication verified: ${label}`);
|
|
89
89
|
continue;
|
|
90
90
|
}
|
|
91
|
-
logger.info(`${label}: SSH
|
|
91
|
+
logger.info(`${label}: SSH key not registered on server.`);
|
|
92
92
|
const pass = await passwordPrompt({
|
|
93
|
-
message: `${label}
|
|
93
|
+
message: `${label} password (to register public key):`
|
|
94
94
|
});
|
|
95
95
|
await registerSshPublicKey(target, pass, publicKey);
|
|
96
|
-
logger.info(`SSH
|
|
96
|
+
logger.info(`SSH public key registered: ${label}`);
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
function testSshKeyAuth(target, auth) {
|
|
@@ -133,7 +133,7 @@ function registerSshPublicKey(target, pass, publicKey) {
|
|
|
133
133
|
conn.exec(cmd, (err, stream) => {
|
|
134
134
|
if (err) {
|
|
135
135
|
conn.end();
|
|
136
|
-
reject(new Error(`
|
|
136
|
+
reject(new Error(`Failed to execute SSH command: ${err.message}`));
|
|
137
137
|
return;
|
|
138
138
|
}
|
|
139
139
|
let stderr = "";
|
|
@@ -145,7 +145,7 @@ function registerSshPublicKey(target, pass, publicKey) {
|
|
|
145
145
|
stream.on("exit", (code) => {
|
|
146
146
|
conn.end();
|
|
147
147
|
if (code !== 0) {
|
|
148
|
-
reject(new Error(`SSH
|
|
148
|
+
reject(new Error(`Failed to register SSH public key (exit code: ${code}): ${stderr}`));
|
|
149
149
|
} else {
|
|
150
150
|
resolve();
|
|
151
151
|
}
|
|
@@ -153,7 +153,7 @@ function registerSshPublicKey(target, pass, publicKey) {
|
|
|
153
153
|
});
|
|
154
154
|
});
|
|
155
155
|
conn.on("error", (err) => {
|
|
156
|
-
reject(new Error(`SSH
|
|
156
|
+
reject(new Error(`SSH connection failed (${target.host}): ${err.message}`));
|
|
157
157
|
});
|
|
158
158
|
conn.connect({
|
|
159
159
|
host: target.host,
|
|
@@ -215,9 +215,9 @@ async function publishPackage(pkgPath, publishConfig, version, projectPath, logg
|
|
|
215
215
|
const targetPath = replaceEnvVariables(publishConfig.path, version, projectPath);
|
|
216
216
|
const distPath = path.resolve(pkgPath, "dist");
|
|
217
217
|
if (dryRun) {
|
|
218
|
-
logger.info(`[DRY-RUN] [${pkgName}]
|
|
218
|
+
logger.info(`[DRY-RUN] [${pkgName}] copy to local: ${distPath} \u2192 ${targetPath}`);
|
|
219
219
|
} else {
|
|
220
|
-
logger.debug(`[${pkgName}]
|
|
220
|
+
logger.debug(`[${pkgName}] copy to local: ${distPath} \u2192 ${targetPath}`);
|
|
221
221
|
await fsCopy(distPath, targetPath);
|
|
222
222
|
}
|
|
223
223
|
} else {
|
|
@@ -225,10 +225,10 @@ async function publishPackage(pkgPath, publishConfig, version, projectPath, logg
|
|
|
225
225
|
const remotePath = publishConfig.path ?? "/";
|
|
226
226
|
if (dryRun) {
|
|
227
227
|
logger.info(
|
|
228
|
-
`[DRY-RUN] [${pkgName}] ${publishConfig.type}
|
|
228
|
+
`[DRY-RUN] [${pkgName}] ${publishConfig.type} upload: ${distPath} \u2192 ${remotePath}`
|
|
229
229
|
);
|
|
230
230
|
} else {
|
|
231
|
-
logger.debug(`[${pkgName}] ${publishConfig.type}
|
|
231
|
+
logger.debug(`[${pkgName}] ${publishConfig.type} upload: ${distPath} \u2192 ${remotePath}`);
|
|
232
232
|
await StorageFactory.connect(
|
|
233
233
|
publishConfig.type,
|
|
234
234
|
{
|
|
@@ -291,15 +291,15 @@ async function runPublish(options) {
|
|
|
291
291
|
const cwd = process.cwd();
|
|
292
292
|
const logger = consola.withTag("sd:cli:publish");
|
|
293
293
|
if (dryRun) {
|
|
294
|
-
logger.info("[DRY-RUN]
|
|
294
|
+
logger.info("[DRY-RUN] Simulation mode - no actual deployment");
|
|
295
295
|
}
|
|
296
|
-
logger.debug("
|
|
296
|
+
logger.debug("publish start", { targets, noBuild, dryRun });
|
|
297
297
|
let sdConfig;
|
|
298
298
|
try {
|
|
299
299
|
sdConfig = await loadSdConfig({ cwd, dev: false, opt: options.options });
|
|
300
|
-
logger.debug("sd.config.ts
|
|
300
|
+
logger.debug("sd.config.ts loaded");
|
|
301
301
|
} catch (err) {
|
|
302
|
-
logger.error(`sd.config.ts
|
|
302
|
+
logger.error(`Failed to load sd.config.ts: ${err instanceof Error ? err.message : err}`);
|
|
303
303
|
process.exitCode = 1;
|
|
304
304
|
return;
|
|
305
305
|
}
|
|
@@ -321,7 +321,7 @@ async function runPublish(options) {
|
|
|
321
321
|
if (targets.length > 0 && !targets.includes(name)) continue;
|
|
322
322
|
const pkgPath = allPkgPaths.find((p) => path.basename(p) === name);
|
|
323
323
|
if (pkgPath == null) {
|
|
324
|
-
logger.warn(
|
|
324
|
+
logger.warn(`Package not found: ${name}`);
|
|
325
325
|
continue;
|
|
326
326
|
}
|
|
327
327
|
publishPackages.push({
|
|
@@ -331,24 +331,24 @@ async function runPublish(options) {
|
|
|
331
331
|
});
|
|
332
332
|
}
|
|
333
333
|
if (publishPackages.length === 0) {
|
|
334
|
-
process.stdout.write("\u2714
|
|
334
|
+
process.stdout.write("\u2714 No packages to deploy.\n");
|
|
335
335
|
return;
|
|
336
336
|
}
|
|
337
337
|
logger.debug(
|
|
338
|
-
"
|
|
338
|
+
"Target packages to deploy",
|
|
339
339
|
publishPackages.map((p) => p.name)
|
|
340
340
|
);
|
|
341
341
|
const hasGit = await fsExists(path.resolve(cwd, ".git"));
|
|
342
342
|
if (publishPackages.some((p) => p.config === "npm")) {
|
|
343
|
-
logger.debug("npm
|
|
343
|
+
logger.debug("Verifying npm authentication...");
|
|
344
344
|
try {
|
|
345
345
|
const { stdout: whoami } = await execa("npm", ["whoami"]);
|
|
346
346
|
if (whoami.trim() === "") {
|
|
347
|
-
throw new Error("npm
|
|
347
|
+
throw new Error("npm login information not found.");
|
|
348
348
|
}
|
|
349
|
-
logger.debug(`npm
|
|
349
|
+
logger.debug(`npm login verified: ${whoami.trim()}`);
|
|
350
350
|
} catch (err) {
|
|
351
|
-
logger.error(`npm whoami
|
|
351
|
+
logger.error(`npm whoami failed:`, err);
|
|
352
352
|
process.exitCode = 1;
|
|
353
353
|
return;
|
|
354
354
|
}
|
|
@@ -356,17 +356,17 @@ async function runPublish(options) {
|
|
|
356
356
|
try {
|
|
357
357
|
await ensureSshAuth(publishPackages, logger);
|
|
358
358
|
} catch (err) {
|
|
359
|
-
logger.error(`
|
|
359
|
+
logger.error(`Failed to setup SSH authentication: ${err instanceof Error ? err.message : err}`);
|
|
360
360
|
process.exitCode = 1;
|
|
361
361
|
return;
|
|
362
362
|
}
|
|
363
363
|
if (!noBuild && hasGit) {
|
|
364
|
-
logger.debug("
|
|
364
|
+
logger.debug("Checking git commit status...");
|
|
365
365
|
try {
|
|
366
366
|
const { stdout: diff } = await execa("git", ["diff", "--name-only"]);
|
|
367
367
|
const { stdout: stagedDiff } = await execa("git", ["diff", "--cached", "--name-only"]);
|
|
368
368
|
if (diff.trim() !== "" || stagedDiff.trim() !== "") {
|
|
369
|
-
logger.info("
|
|
369
|
+
logger.info("Uncommitted changes detected. Attempting auto-commit with claude...");
|
|
370
370
|
try {
|
|
371
371
|
await execa("claude", [
|
|
372
372
|
"-p",
|
|
@@ -377,17 +377,17 @@ async function runPublish(options) {
|
|
|
377
377
|
]);
|
|
378
378
|
} catch (e) {
|
|
379
379
|
throw new Error(
|
|
380
|
-
"
|
|
380
|
+
"Auto-commit failed. Please commit manually and try again.\n" + (e instanceof Error ? e.message : String(e))
|
|
381
381
|
);
|
|
382
382
|
}
|
|
383
383
|
const { stdout: recheckDiff } = await execa("git", ["diff", "--name-only"]);
|
|
384
384
|
const { stdout: recheckStaged } = await execa("git", ["diff", "--cached", "--name-only"]);
|
|
385
385
|
if (recheckDiff.trim() !== "" || recheckStaged.trim() !== "") {
|
|
386
386
|
throw new Error(
|
|
387
|
-
"
|
|
387
|
+
"Uncommitted changes still remain after auto-commit.\n" + recheckDiff + recheckStaged
|
|
388
388
|
);
|
|
389
389
|
}
|
|
390
|
-
logger.info("
|
|
390
|
+
logger.info("Auto-commit completed.");
|
|
391
391
|
}
|
|
392
392
|
} catch (err) {
|
|
393
393
|
logger.error(err instanceof Error ? err.message : err);
|
|
@@ -397,22 +397,22 @@ async function runPublish(options) {
|
|
|
397
397
|
}
|
|
398
398
|
let version = projPkg.version;
|
|
399
399
|
if (noBuild) {
|
|
400
|
-
logger.warn("
|
|
401
|
-
await waitWithCountdown("
|
|
400
|
+
logger.warn("Deploying without building is quite dangerous.");
|
|
401
|
+
await waitWithCountdown("Press 'CTRL+C' to stop the process.", 5);
|
|
402
402
|
} else {
|
|
403
|
-
logger.debug("
|
|
403
|
+
logger.debug("Upgrading version...");
|
|
404
404
|
const upgradeResult = await upgradeVersion(cwd, allPkgPaths, dryRun);
|
|
405
405
|
version = upgradeResult.version;
|
|
406
406
|
const _changedFiles = upgradeResult.changedFiles;
|
|
407
407
|
if (dryRun) {
|
|
408
|
-
logger.info(`[DRY-RUN]
|
|
408
|
+
logger.info(`[DRY-RUN] Version upgrade: ${projPkg.version} \u2192 ${version} (files not modified)`);
|
|
409
409
|
} else {
|
|
410
|
-
logger.info(
|
|
410
|
+
logger.info(`Version upgrade: ${projPkg.version} \u2192 ${version}`);
|
|
411
411
|
}
|
|
412
412
|
if (dryRun) {
|
|
413
|
-
logger.info("[DRY-RUN]
|
|
413
|
+
logger.info("[DRY-RUN] Starting build (validation only)...");
|
|
414
414
|
} else {
|
|
415
|
-
logger.debug("
|
|
415
|
+
logger.debug("Starting build...");
|
|
416
416
|
}
|
|
417
417
|
try {
|
|
418
418
|
await runBuild({
|
|
@@ -420,14 +420,14 @@ async function runPublish(options) {
|
|
|
420
420
|
options: options.options
|
|
421
421
|
});
|
|
422
422
|
if (process.exitCode === 1) {
|
|
423
|
-
throw new Error("
|
|
423
|
+
throw new Error("Build failed");
|
|
424
424
|
}
|
|
425
425
|
} catch {
|
|
426
426
|
if (dryRun) {
|
|
427
|
-
logger.error("[DRY-RUN]
|
|
427
|
+
logger.error("[DRY-RUN] Build failed");
|
|
428
428
|
} else {
|
|
429
429
|
logger.error(
|
|
430
|
-
"
|
|
430
|
+
"Build failed. Manual recovery may be necessary:\n To revert version changes:\n git checkout -- package.json packages/*/package.json packages/sd-cli/templates/"
|
|
431
431
|
);
|
|
432
432
|
}
|
|
433
433
|
process.exitCode = 1;
|
|
@@ -435,30 +435,30 @@ async function runPublish(options) {
|
|
|
435
435
|
}
|
|
436
436
|
if (hasGit) {
|
|
437
437
|
if (dryRun) {
|
|
438
|
-
logger.info("[DRY-RUN] Git
|
|
439
|
-
logger.info(`[DRY-RUN] git add (${_changedFiles.length}
|
|
438
|
+
logger.info("[DRY-RUN] Simulating Git commit/tag/push...");
|
|
439
|
+
logger.info(`[DRY-RUN] git add (${_changedFiles.length} files)`);
|
|
440
440
|
logger.info(`[DRY-RUN] git commit -m "v${version}"`);
|
|
441
441
|
logger.info(`[DRY-RUN] git tag -a v${version} -m "v${version}"`);
|
|
442
442
|
logger.info("[DRY-RUN] git push --dry-run");
|
|
443
443
|
await execa("git", ["push", "--dry-run"]);
|
|
444
444
|
logger.info("[DRY-RUN] git push --tags --dry-run");
|
|
445
445
|
await execa("git", ["push", "--tags", "--dry-run"]);
|
|
446
|
-
logger.info("[DRY-RUN] Git
|
|
446
|
+
logger.info("[DRY-RUN] Git operations simulation completed");
|
|
447
447
|
} else {
|
|
448
|
-
logger.debug("Git
|
|
448
|
+
logger.debug("Git commit/tag/push...");
|
|
449
449
|
try {
|
|
450
450
|
await execa("git", ["add", ..._changedFiles]);
|
|
451
451
|
await execa("git", ["commit", "-m", `v${version}`]);
|
|
452
452
|
await execa("git", ["tag", "-a", `v${version}`, "-m", `v${version}`]);
|
|
453
453
|
await execa("git", ["push"]);
|
|
454
454
|
await execa("git", ["push", "--tags"]);
|
|
455
|
-
logger.debug("Git
|
|
455
|
+
logger.debug("Git operations completed");
|
|
456
456
|
} catch (err) {
|
|
457
457
|
logger.error(
|
|
458
|
-
`Git
|
|
459
|
-
|
|
460
|
-
git revert HEAD #
|
|
461
|
-
git tag -d v${version} #
|
|
458
|
+
`Git operations failed: ${err instanceof Error ? err.message : err}
|
|
459
|
+
Manual recovery may be necessary:
|
|
460
|
+
git revert HEAD # Revert version commit
|
|
461
|
+
git tag -d v${version} # Delete tag`
|
|
462
462
|
);
|
|
463
463
|
process.exitCode = 1;
|
|
464
464
|
return;
|
|
@@ -485,7 +485,7 @@ async function runPublish(options) {
|
|
|
485
485
|
if (attempt < maxRetries) {
|
|
486
486
|
const delay = attempt * 5e3;
|
|
487
487
|
logger.debug(
|
|
488
|
-
dryRun ? `[DRY-RUN] ${pkg.name} (
|
|
488
|
+
dryRun ? `[DRY-RUN] ${pkg.name} (retry ${attempt + 1}/${maxRetries})` : `${pkg.name} (retry ${attempt + 1}/${maxRetries})`
|
|
489
489
|
);
|
|
490
490
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
491
491
|
} else {
|
|
@@ -509,42 +509,42 @@ async function runPublish(options) {
|
|
|
509
509
|
if (failedPkgNames.length > 0) {
|
|
510
510
|
if (publishedPackages.length > 0) {
|
|
511
511
|
logger.error(
|
|
512
|
-
"
|
|
512
|
+
"Error during deployment.\nAlready deployed packages:\n" + publishedPackages.map((n) => ` - ${n}`).join("\n") + "\n\nManual recovery may be necessary.\nnpm packages can be deleted within 72 hours with `npm unpublish <pkg>@<version>`."
|
|
513
513
|
);
|
|
514
514
|
}
|
|
515
515
|
for (const name of failedPkgNames) {
|
|
516
|
-
logger.error(`[${name}]
|
|
516
|
+
logger.error(`[${name}] Deployment failed`);
|
|
517
517
|
}
|
|
518
518
|
process.exitCode = 1;
|
|
519
519
|
return;
|
|
520
520
|
}
|
|
521
521
|
if (sdConfig.postPublish != null && sdConfig.postPublish.length > 0) {
|
|
522
522
|
if (dryRun) {
|
|
523
|
-
logger.info("[DRY-RUN] postPublish
|
|
523
|
+
logger.info("[DRY-RUN] Simulating postPublish scripts...");
|
|
524
524
|
} else {
|
|
525
|
-
logger.debug("postPublish
|
|
525
|
+
logger.debug("Running postPublish scripts...");
|
|
526
526
|
}
|
|
527
527
|
for (const script of sdConfig.postPublish) {
|
|
528
528
|
try {
|
|
529
529
|
const cmd = replaceEnvVariables(script.cmd, version, cwd);
|
|
530
530
|
const args = script.args.map((arg) => replaceEnvVariables(arg, version, cwd));
|
|
531
531
|
if (dryRun) {
|
|
532
|
-
logger.info(`[DRY-RUN]
|
|
532
|
+
logger.info(`[DRY-RUN] Will execute: ${cmd} ${args.join(" ")}`);
|
|
533
533
|
} else {
|
|
534
|
-
logger.debug(
|
|
534
|
+
logger.debug(`Executing: ${cmd} ${args.join(" ")}`);
|
|
535
535
|
await execa(cmd, args, { cwd });
|
|
536
536
|
}
|
|
537
537
|
} catch (err) {
|
|
538
538
|
logger.warn(
|
|
539
|
-
`postPublish
|
|
539
|
+
`postPublish script failed (continuing): ${err instanceof Error ? err.message : err}`
|
|
540
540
|
);
|
|
541
541
|
}
|
|
542
542
|
}
|
|
543
543
|
}
|
|
544
544
|
if (dryRun) {
|
|
545
|
-
logger.info(`[DRY-RUN]
|
|
545
|
+
logger.info(`[DRY-RUN] Simulation completed. Actual deployment version: v${version}`);
|
|
546
546
|
} else {
|
|
547
|
-
logger.info(
|
|
547
|
+
logger.info(`All deployments completed. (v${version})`);
|
|
548
548
|
}
|
|
549
549
|
}
|
|
550
550
|
export {
|