@simplysm/sd-cli 14.2.6 → 14.2.8
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/dist/commands/device.d.ts.map +1 -1
- package/dist/commands/device.js +6 -3
- package/dist/commands/device.js.map +1 -1
- package/dist/commands/init/normalize.d.ts.map +1 -1
- package/dist/commands/init/normalize.js +1 -0
- package/dist/commands/init/normalize.js.map +1 -1
- package/dist/commands/init/types.d.ts +1 -0
- package/dist/commands/init/types.d.ts.map +1 -1
- package/dist/esbuild/esbuild-config.d.ts.map +1 -1
- package/dist/esbuild/esbuild-config.js +2 -0
- package/dist/esbuild/esbuild-config.js.map +1 -1
- package/dist/sd-config.types.d.ts +2 -1
- package/dist/sd-config.types.d.ts.map +1 -1
- package/dist/utils/license-extractor.d.ts +53 -0
- package/dist/utils/license-extractor.d.ts.map +1 -0
- package/dist/utils/license-extractor.js +163 -0
- package/dist/utils/license-extractor.js.map +1 -0
- package/dist/workers/client.worker.d.ts.map +1 -1
- package/dist/workers/client.worker.js +6 -11
- package/dist/workers/client.worker.js.map +1 -1
- package/dist/workers/server-build.worker.d.ts.map +1 -1
- package/dist/workers/server-build.worker.js +14 -4
- package/dist/workers/server-build.worker.js.map +1 -1
- package/package.json +4 -4
- package/src/commands/device.ts +7 -3
- package/src/commands/init/normalize.ts +1 -0
- package/src/commands/init/templates/client/package.json.hbs +10 -8
- package/src/commands/init/templates/client/src/app/home/master/role-permission/role-permission.view.ts.hbs +2 -2
- package/src/commands/init/templates/client/src/app/home/master/role-permission/role.detail.ts.hbs +7 -5
- package/src/commands/init/templates/client/src/app/home/my-info/my-info.detail.ts.hbs +2 -2
- package/src/commands/init/templates/client/src/app/home/system/system-log/system-log.list.ts.hbs +1 -1
- package/src/commands/init/templates/client/src/app/login/login.view.ts.hbs +1 -1
- package/src/commands/init/templates/client/src/modals/text-view.modal.ts.hbs +1 -1
- package/src/commands/init/templates/client/tsconfig.json +1 -0
- package/src/commands/init/templates/client-common/package.json.hbs +5 -5
- package/src/commands/init/templates/client-common/tsconfig.json +1 -0
- package/src/commands/init/templates/common/package.json.hbs +4 -4
- package/src/commands/init/templates/common/src/db/system-data-log.ext.ts.hbs +4 -4
- package/src/commands/init/templates/server/package.json.hbs +7 -7
- package/src/commands/init/templates/workspace-root/package.json.hbs +3 -2
- package/src/commands/init/templates/workspace-root/pnpm-workspace.yaml +13 -0
- package/src/commands/init/types.ts +1 -0
- package/src/esbuild/esbuild-config.ts +27 -32
- package/src/sd-config.types.ts +2 -1
- package/src/utils/license-extractor.ts +224 -0
- package/src/workers/client.worker.ts +16 -23
- package/src/workers/server-build.worker.ts +32 -12
- package/tests/init/render.spec.ts +21 -0
- package/tests/utils/license-extractor.spec.ts +273 -0
|
@@ -4,15 +4,16 @@ import esbuild from "esbuild";
|
|
|
4
4
|
import { createWorker, FsWatcher, pathx } from "@simplysm/core-node";
|
|
5
5
|
import { err as errNs } from "@simplysm/core-common";
|
|
6
6
|
import { formatEsbuildMessages } from "../utils/output-utils.js";
|
|
7
|
-
import { parseTsconfig, getPackageSourceFiles
|
|
8
|
-
import { createServerEsbuildOptions, writeChangedOutputFiles
|
|
9
|
-
import { collectAllExternals, generateProductionFiles } from "../deps/server-externals/server-production-files.js";
|
|
7
|
+
import { parseTsconfig, getPackageSourceFiles } from "../utils/tsconfig.js";
|
|
8
|
+
import { createServerEsbuildOptions, writeChangedOutputFiles } from "../esbuild/esbuild-config.js";
|
|
9
|
+
import { collectAllExternals, generateProductionFiles, } from "../deps/server-externals/server-production-files.js";
|
|
10
10
|
import { SdTsCompiler } from "../ts-compiler/SdTsCompiler.js";
|
|
11
11
|
import { createTscPlugin } from "../esbuild/esbuild-tsc-plugin.js";
|
|
12
12
|
import { createWorkerBundlePlugin } from "../esbuild/esbuild-worker-plugin.js";
|
|
13
13
|
import { setupWorkerLifecycle } from "./shared-worker-lifecycle.js";
|
|
14
14
|
import { buildWatchPaths } from "./build-watch-paths.js";
|
|
15
15
|
import { copyPublicFiles, watchPublicFiles } from "../utils/copy-public.js";
|
|
16
|
+
import { extractLicenses, LICENSE_NOTICE_FILE_NAME } from "../utils/license-extractor.js";
|
|
16
17
|
import * as esbuildCtx from "./server-esbuild-context.js";
|
|
17
18
|
import { startServerWatchLoop } from "./server-watch-manager.js";
|
|
18
19
|
//#endregion
|
|
@@ -53,6 +54,7 @@ async function build(info) {
|
|
|
53
54
|
let tscErrors;
|
|
54
55
|
let tscDiagnostics;
|
|
55
56
|
let lint;
|
|
57
|
+
let bundleMetafile;
|
|
56
58
|
if (info.output.js) {
|
|
57
59
|
// js=true: tsc 플러그인 통합 — 단일 esbuild.build() 호출
|
|
58
60
|
const tscPlugin = createTscPlugin({
|
|
@@ -69,8 +71,10 @@ async function build(info) {
|
|
|
69
71
|
env: info.env,
|
|
70
72
|
external: bundleExternals,
|
|
71
73
|
});
|
|
72
|
-
jsResult = await esbuild
|
|
74
|
+
jsResult = await esbuild
|
|
75
|
+
.build({ ...esbuildOptions, plugins: [createWorkerBundlePlugin(), tscPlugin.plugin] })
|
|
73
76
|
.then(async (result) => {
|
|
77
|
+
bundleMetafile = result.metafile;
|
|
74
78
|
if (result.outputFiles) {
|
|
75
79
|
await writeChangedOutputFiles(result.outputFiles, { rewriteJsExtensions: false });
|
|
76
80
|
}
|
|
@@ -116,6 +120,12 @@ async function build(info) {
|
|
|
116
120
|
fsx.writeJsonSync(confDistPath, info.configs ?? {}, { space: 2 });
|
|
117
121
|
await copyPublicFiles(info.pkgDir, false);
|
|
118
122
|
generateProductionFiles(info, prodDependencies);
|
|
123
|
+
if (jsResult.success) {
|
|
124
|
+
if (bundleMetafile == null) {
|
|
125
|
+
throw new Error("번들 metafile이 없어 제3자 라이선스 고지를 생성할 수 없습니다.");
|
|
126
|
+
}
|
|
127
|
+
await fsx.write(path.join(info.pkgDir, "dist", LICENSE_NOTICE_FILE_NAME), await extractLicenses(bundleMetafile, process.cwd()));
|
|
128
|
+
}
|
|
119
129
|
}
|
|
120
130
|
const allErrors = [...(jsResult.errors ?? []), ...tscErrors];
|
|
121
131
|
const tscSuccess = tscErrors.length === 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-build.worker.js","sourceRoot":"","sources":["../../src/workers/server-build.worker.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,GAAG,IAAI,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,OAAO,
|
|
1
|
+
{"version":3,"file":"server-build.worker.js","sourceRoot":"","sources":["../../src/workers/server-build.worker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/sd-cli",
|
|
3
|
-
"version": "14.2.
|
|
3
|
+
"version": "14.2.8",
|
|
4
4
|
"description": "Simplysm package - CLI tool",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "simplysm",
|
|
@@ -44,9 +44,9 @@
|
|
|
44
44
|
"ws": "^8.21.1",
|
|
45
45
|
"yaml": "^2.9.0",
|
|
46
46
|
"yargs": "^18.1.0",
|
|
47
|
-
"@simplysm/core-node": "14.2.
|
|
48
|
-
"@simplysm/
|
|
49
|
-
"@simplysm/
|
|
47
|
+
"@simplysm/core-node": "14.2.8",
|
|
48
|
+
"@simplysm/core-common": "14.2.8",
|
|
49
|
+
"@simplysm/storage": "14.2.8"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@angular/core": "^22.0.8",
|
package/src/commands/device.ts
CHANGED
|
@@ -64,9 +64,13 @@ export async function runDevice(options: DeviceOptions): Promise<void> {
|
|
|
64
64
|
if (typeof clientConfig.server === "number") {
|
|
65
65
|
serverUrl = `http://localhost:${clientConfig.server}/${targetName}/`;
|
|
66
66
|
} else {
|
|
67
|
-
// server가 패키지명(string)
|
|
68
|
-
|
|
69
|
-
const
|
|
67
|
+
// server 가 패키지명(string)이면 그 서버가 클라이언트를 서빙하고,
|
|
68
|
+
// 미지정이면 클라이언트 자신의 dev server 가 서빙한다. 양쪽 다 .dev-port 로 포트를 탐지
|
|
69
|
+
const servingPkgDir =
|
|
70
|
+
clientConfig.server != null
|
|
71
|
+
? pathx.posixResolve(cwd, "packages", clientConfig.server)
|
|
72
|
+
: pkgDir;
|
|
73
|
+
const portFile = path.join(servingPkgDir, "dist", ".dev-port");
|
|
70
74
|
let portStr: string;
|
|
71
75
|
try {
|
|
72
76
|
portStr = fsx.readSync(portFile).trim();
|
|
@@ -58,6 +58,7 @@ export function normalize(input: InitInput): NormalizedInput {
|
|
|
58
58
|
isMobile,
|
|
59
59
|
appStructureName: `${str.toCamelCase(baseName)}AppStructureItems`,
|
|
60
60
|
needsNgIcons: (hasRouter && hasAuth) || hasDb,
|
|
61
|
+
needsExcel: hasRouter && hasAuth,
|
|
61
62
|
useSsg,
|
|
62
63
|
robotsDirective: useSsg ? "Allow: /" : "Disallow: /",
|
|
63
64
|
};
|
|
@@ -9,18 +9,20 @@
|
|
|
9
9
|
"@angular/common": "^22.0.0",
|
|
10
10
|
"@angular/core": "^22.0.0",
|
|
11
11
|
"@angular/platform-browser": "^22.0.0",
|
|
12
|
-
"@simplysm/angular": "~14.
|
|
13
|
-
"@simplysm/core-browser": "~14.
|
|
14
|
-
"@simplysm/core-common": "~14.
|
|
12
|
+
"@simplysm/angular": "~14.2.0",
|
|
13
|
+
"@simplysm/core-browser": "~14.2.0",
|
|
14
|
+
"@simplysm/core-common": "~14.2.0"{{#if hasClientCommon}},
|
|
15
15
|
"@{{workspaceName}}/client-common": "workspace:*"{{/if}}{{#if hasServer}},
|
|
16
|
-
"@simplysm/service-client": "~14.
|
|
17
|
-
"@simplysm/service-common": "~14.
|
|
16
|
+
"@simplysm/service-client": "~14.2.0",
|
|
17
|
+
"@simplysm/service-common": "~14.2.0"{{/if}}{{#if client.hasRouter}},
|
|
18
18
|
"@angular/router": "^22.0.0"{{/if}}{{#if client.useSsg}},
|
|
19
19
|
"@angular/platform-server": "^22.0.0"{{/if}}{{#if client.needsNgIcons}},
|
|
20
|
-
"@ng-icons/core": "^
|
|
21
|
-
"@ng-icons/tabler-icons": "^
|
|
20
|
+
"@ng-icons/core": "^34.0.0",
|
|
21
|
+
"@ng-icons/tabler-icons": "^34.0.0"{{/if}}{{#if client.needsExcel}},
|
|
22
|
+
"@simplysm/excel": "~14.2.0",
|
|
23
|
+
"zod": "^4.4.3"{{/if}}{{#if hasDb}},
|
|
22
24
|
"@{{workspaceName}}/common": "workspace:*",
|
|
23
|
-
"@simplysm/orm-common": "~14.
|
|
25
|
+
"@simplysm/orm-common": "~14.2.0"{{/if}}{{#if client.isMobile}},
|
|
24
26
|
"@capacitor/core": "^8.0.0"{{/if}}
|
|
25
27
|
},
|
|
26
28
|
"devDependencies": {
|
|
@@ -43,7 +43,7 @@ import { RoleList } from "./role.list";
|
|
|
43
43
|
<div class="flex-row fill">
|
|
44
44
|
<!-- min-width: 좌측 역할 목록이 너무 좁아져 가독성이 떨어지는 것을 막는 의도적 고정 폭 (사용자 지시) -->
|
|
45
45
|
<sd-shared-data-select-list
|
|
46
|
-
class="flex-min bdr bdr-
|
|
46
|
+
class="flex-min bdr bdr-soft"
|
|
47
47
|
style="min-width: 12rem;"
|
|
48
48
|
[items]="sharedRoles.items()"
|
|
49
49
|
[(selectedItem)]="selectedRole"
|
|
@@ -59,7 +59,7 @@ import { RoleList } from "./role.list";
|
|
|
59
59
|
@let _selectedRole = selectedRole();
|
|
60
60
|
@if (_selectedRole == null) {
|
|
61
61
|
<div
|
|
62
|
-
class="flex-fill tx-
|
|
62
|
+
class="flex-fill tx-gray p-xxl"
|
|
63
63
|
style="font-size: 48px; line-height: 1.5em"
|
|
64
64
|
>
|
|
65
65
|
<ng-icon [svg]="tablerArrowLeft" />
|
package/src/commands/init/templates/client/src/app/home/master/role-permission/role.detail.ts.hbs
CHANGED
|
@@ -132,6 +132,10 @@ export class RoleDetail implements SdModalContentDef<{ id: number } | undefined>
|
|
|
132
132
|
|
|
133
133
|
this.busyCount.update((v) => v + 1);
|
|
134
134
|
await this._sdToast.try(async () => {
|
|
135
|
+
const roleName = data.name;
|
|
136
|
+
if (roleName == null) {
|
|
137
|
+
throw new Error("이름을 입력하세요.");
|
|
138
|
+
}
|
|
135
139
|
const roleId = this.roleId();
|
|
136
140
|
const {{userEntityCamel}}Id = this._appAuth.authInfo()?.{{userEntityCamel}}Id;
|
|
137
141
|
|
|
@@ -140,7 +144,7 @@ export class RoleDetail implements SdModalContentDef<{ id: number } | undefined>
|
|
|
140
144
|
const isDuplicated = await db
|
|
141
145
|
.role()
|
|
142
146
|
.where((c) => [
|
|
143
|
-
expr.eq(c.name,
|
|
147
|
+
expr.eq(c.name, roleName),
|
|
144
148
|
expr.eq(c.isDeleted, false),
|
|
145
149
|
...(roleId == null ? [] : [expr.not(expr.eq(c.id, roleId))]),
|
|
146
150
|
])
|
|
@@ -150,16 +154,14 @@ export class RoleDetail implements SdModalContentDef<{ id: number } | undefined>
|
|
|
150
154
|
}
|
|
151
155
|
|
|
152
156
|
if (roleId == null) {
|
|
153
|
-
const [inserted] = await db
|
|
154
|
-
.role()
|
|
155
|
-
.insert([{ name: data.name, isDeleted: false }], ["id"]);
|
|
157
|
+
const [inserted] = await db.role().insert([{ name: roleName, isDeleted: false }], ["id"]);
|
|
156
158
|
await db.role().insertDataLog({ action: "등록", itemId: inserted.id, {{userEntityCamel}}Id });
|
|
157
159
|
return inserted.id;
|
|
158
160
|
}
|
|
159
161
|
await db
|
|
160
162
|
.role()
|
|
161
163
|
.where((c) => [expr.eq(c.id, roleId)])
|
|
162
|
-
.update(() => ({ name:
|
|
164
|
+
.update(() => ({ name: roleName }));
|
|
163
165
|
await db.role().insertDataLog({ action: "수정", itemId: roleId, {{userEntityCamel}}Id });
|
|
164
166
|
return roleId;
|
|
165
167
|
});
|
|
@@ -107,7 +107,7 @@ import type { I{{userEntityPascal}}ConfigMap } from "@{{workspaceName}}/server";
|
|
|
107
107
|
(valueChange)="mark(data)"
|
|
108
108
|
>
|
|
109
109
|
<sd-select-item [value]="undefined">
|
|
110
|
-
<span class="tx-
|
|
110
|
+
<span class="tx-gray">미지정</span>
|
|
111
111
|
</sd-select-item>
|
|
112
112
|
@for (flatMenu of flatMenus(); track flatMenu.codeChain.join(".")) {
|
|
113
113
|
<sd-select-item [value]="'/home/' + flatMenu.codeChain.join('/')">
|
|
@@ -121,7 +121,7 @@ import type { I{{userEntityPascal}}ConfigMap } from "@{{workspaceName}}/server";
|
|
|
121
121
|
</table>
|
|
122
122
|
|
|
123
123
|
@if (data().lastModifiedAt != null || data().lastModifiedBy != null) {
|
|
124
|
-
<div class="p-sm-default tx-
|
|
124
|
+
<div class="p-sm-default tx-gray">
|
|
125
125
|
최종수정:
|
|
126
126
|
@if (data().lastModifiedAt != null) {
|
|
127
127
|
\{{ data().lastModifiedAt | format: "yyyy-MM-dd HH:mm" }}
|
package/src/commands/init/templates/client/src/app/home/system/system-log/system-log.list.ts.hbs
CHANGED
|
@@ -97,7 +97,7 @@ type TSeverity = "error" | "warn" | "log";
|
|
|
97
97
|
<label>심각도</label>
|
|
98
98
|
<sd-select [(value)]="filter().severity" (valueChange)="mark(filter)">
|
|
99
99
|
<sd-select-item [value]="undefined">
|
|
100
|
-
<span class="tx-
|
|
100
|
+
<span class="tx-gray">전체</span>
|
|
101
101
|
</sd-select-item>
|
|
102
102
|
<sd-select-item [value]="'error'">
|
|
103
103
|
<sd-label [theme]="'danger'">error</sd-label>
|
|
@@ -41,7 +41,7 @@ interface ILoginInput {
|
|
|
41
41
|
</div>
|
|
42
42
|
|
|
43
43
|
<div class="card m-0-auto bd-radius-lg" style="width: 22em;">
|
|
44
|
-
<div class="flex-row cross-align-center p-lg-xl bdb bdb-
|
|
44
|
+
<div class="flex-row cross-align-center p-lg-xl bdb bdb-default">
|
|
45
45
|
<h3 class="flex-fill">로그인</h3>
|
|
46
46
|
<div>v\{{ VER }}.\{{ DEV ? "d" : "p" }}</div>
|
|
47
47
|
</div>
|
|
@@ -16,7 +16,7 @@ import { type SdModalContentDef } from "@simplysm/angular";
|
|
|
16
16
|
imports: [],
|
|
17
17
|
template: `
|
|
18
18
|
<div class="p-default">
|
|
19
|
-
<div class="p-default bg-
|
|
19
|
+
<div class="p-default bg-gray-subtle bd-radius-default bd bd-hairline">
|
|
20
20
|
<pre>\{{ text() }}</pre>
|
|
21
21
|
</div>
|
|
22
22
|
</div>
|
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
"dependencies": {
|
|
7
7
|
"@angular/common": "^22.0.0",
|
|
8
8
|
"@angular/core": "^22.0.0",
|
|
9
|
-
"@simplysm/angular": "~14.
|
|
10
|
-
"@simplysm/core-common": "~14.
|
|
9
|
+
"@simplysm/angular": "~14.2.0",
|
|
10
|
+
"@simplysm/core-common": "~14.2.0"{{#if hasServer}},
|
|
11
11
|
"@{{workspaceName}}/common": "workspace:*",
|
|
12
|
-
"@simplysm/service-client": "~14.
|
|
13
|
-
"@simplysm/service-common": "~14.
|
|
12
|
+
"@simplysm/service-client": "~14.2.0",
|
|
13
|
+
"@simplysm/service-common": "~14.2.0"{{/if}}{{#if hasDb}},
|
|
14
14
|
"@{{workspaceName}}/server": "workspace:*",
|
|
15
|
-
"@simplysm/orm-common": "~14.
|
|
15
|
+
"@simplysm/orm-common": "~14.2.0"{{/if}}
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
18
|
"@angular/compiler": "^22.0.0",
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
"type": "module",
|
|
5
5
|
"private": true,
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@simplysm/core-common": "~14.
|
|
8
|
-
"@simplysm/orm-common": "~14.
|
|
9
|
-
"@simplysm/service-common": "~14.
|
|
10
|
-
"@ng-icons/tabler-icons": "^
|
|
7
|
+
"@simplysm/core-common": "~14.2.0"{{#if hasDb}},
|
|
8
|
+
"@simplysm/orm-common": "~14.2.0"{{/if}}{{#if hasAuth}},
|
|
9
|
+
"@simplysm/service-common": "~14.2.0",
|
|
10
|
+
"@ng-icons/tabler-icons": "^34.0.0"{{/if}}
|
|
11
11
|
}
|
|
12
12
|
}
|
|
@@ -28,7 +28,7 @@ export type IInsertDataLogParam = {
|
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
declare module "@simplysm/orm-common" {
|
|
31
|
-
interface Queryable<TData extends DataRecord, TFrom extends TableBuilder<any, any
|
|
31
|
+
interface Queryable<TData extends DataRecord, TFrom extends TableBuilder<any, any> | never> {
|
|
32
32
|
joinLastDataLog(
|
|
33
33
|
opts?: IDataLogJoinOptions,
|
|
34
34
|
): Queryable<TData & { lastDataLog?: IDataLogJoinResult }, TFrom>;
|
|
@@ -47,7 +47,7 @@ Queryable.prototype.insertDataLog = async function (
|
|
|
47
47
|
this: Queryable<any, any>,
|
|
48
48
|
log: IInsertDataLogParam,
|
|
49
49
|
): Promise<void> {
|
|
50
|
-
const fromTable = this.meta.from as TableBuilder<any, any
|
|
50
|
+
const fromTable = this.meta.from as TableBuilder<any, any>;
|
|
51
51
|
const qr = queryable(this.meta.db, SystemDataLog);
|
|
52
52
|
|
|
53
53
|
await qr().insert([
|
|
@@ -71,7 +71,7 @@ Queryable.prototype.joinLastDataLog = function (
|
|
|
71
71
|
this: Queryable<any, any>,
|
|
72
72
|
opts?: IDataLogJoinOptions,
|
|
73
73
|
) {
|
|
74
|
-
const tableName = (this.meta.from as TableBuilder<any, any
|
|
74
|
+
const tableName = (this.meta.from as TableBuilder<any, any>).meta.name;
|
|
75
75
|
|
|
76
76
|
return this.joinSingle("lastDataLog", (qr, en) =>
|
|
77
77
|
qr
|
|
@@ -107,7 +107,7 @@ Queryable.prototype.joinFirstDataLog = function (
|
|
|
107
107
|
this: Queryable<any, any>,
|
|
108
108
|
opts?: IDataLogJoinOptions,
|
|
109
109
|
) {
|
|
110
|
-
const tableName = (this.meta.from as TableBuilder<any, any
|
|
110
|
+
const tableName = (this.meta.from as TableBuilder<any, any>).meta.name;
|
|
111
111
|
|
|
112
112
|
return this.joinSingle("firstDataLog", (qr, en) =>
|
|
113
113
|
qr
|
|
@@ -7,17 +7,17 @@
|
|
|
7
7
|
"private": true,
|
|
8
8
|
"dependencies": {
|
|
9
9
|
"@{{workspaceName}}/common": "workspace:*",
|
|
10
|
-
"@simplysm/core-common": "~14.
|
|
11
|
-
"@simplysm/core-node": "~14.
|
|
12
|
-
"@simplysm/service-common": "~14.
|
|
13
|
-
"@simplysm/service-server": "~14.
|
|
14
|
-
"@simplysm/orm-common": "~14.
|
|
15
|
-
"@simplysm/orm-node": "~14.
|
|
10
|
+
"@simplysm/core-common": "~14.2.0",
|
|
11
|
+
"@simplysm/core-node": "~14.2.0",
|
|
12
|
+
"@simplysm/service-common": "~14.2.0",
|
|
13
|
+
"@simplysm/service-server": "~14.2.0"{{#if hasDb}},
|
|
14
|
+
"@simplysm/orm-common": "~14.2.0",
|
|
15
|
+
"@simplysm/orm-node": "~14.2.0"{{#if isMysql}},
|
|
16
16
|
"mysql2": "^3.22.0"{{/if}}{{#if isPostgres}},
|
|
17
17
|
"pg": "^8.13.0",
|
|
18
18
|
"pg-copy-streams": "^7.0.0"{{/if}}{{#if isMssql}},
|
|
19
19
|
"mssql": "^11.0.0"{{/if}}{{/if}}{{#if hasAuth}},
|
|
20
|
-
"@simplysm/excel": "~14.
|
|
20
|
+
"@simplysm/excel": "~14.2.0",
|
|
21
21
|
"bcrypt": "^6.0.0"{{/if}}
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
@@ -25,14 +25,15 @@
|
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@playwright/cli": "^0.1.11",
|
|
28
|
-
"@simplysm/lint": "~14.
|
|
29
|
-
"@simplysm/sd-cli": "~14.
|
|
28
|
+
"@simplysm/lint": "~14.2.0",
|
|
29
|
+
"@simplysm/sd-cli": "~14.2.0",
|
|
30
30
|
"@types/node": "^24.13.2",
|
|
31
31
|
"@vitest/browser-playwright": "^4.1.0",
|
|
32
32
|
"@vitest/coverage-v8": "^4.1.0",
|
|
33
33
|
"eslint": "^10.6.0",
|
|
34
34
|
"jiti": "^2.7.0",
|
|
35
35
|
"oxfmt": "^0.59.0",
|
|
36
|
+
"playwright": "^1.62.0",
|
|
36
37
|
"typescript": "~6.0.0",
|
|
37
38
|
"vite": "^8.1.0",
|
|
38
39
|
"vitest": "^4.1.0"
|
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
packages:
|
|
2
2
|
- packages/*
|
|
3
3
|
- tests/*
|
|
4
|
+
allowBuilds:
|
|
5
|
+
"@parcel/watcher": true
|
|
6
|
+
bcrypt: true
|
|
7
|
+
bufferutil: true
|
|
8
|
+
core-js: true
|
|
9
|
+
cpu-features: true
|
|
10
|
+
esbuild: true
|
|
11
|
+
lmdb: true
|
|
12
|
+
msgpackr-extract: true
|
|
13
|
+
ssh2: true
|
|
14
|
+
unrs-resolver: true
|
|
15
|
+
utf-8-validate: true
|
|
16
|
+
minimumReleaseAge: 0
|
|
@@ -27,9 +27,10 @@ export async function writeChangedOutputFiles(
|
|
|
27
27
|
logger.debug(`변경된 출력 파일 쓰기 시작 (${outputFiles.length}개)`);
|
|
28
28
|
await Promise.all(
|
|
29
29
|
outputFiles.map(async (file) => {
|
|
30
|
-
const finalText =
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
const finalText =
|
|
31
|
+
file.path.endsWith(".js") && rewriteJsExtensions
|
|
32
|
+
? addJsExtensionToImports(file.text)
|
|
33
|
+
: file.text;
|
|
33
34
|
|
|
34
35
|
try {
|
|
35
36
|
const existing = await fsx.read(file.path);
|
|
@@ -91,6 +92,8 @@ export function createServerEsbuildOptions(options: ServerEsbuildOptions): esbui
|
|
|
91
92
|
platform: "node",
|
|
92
93
|
target: "node24",
|
|
93
94
|
bundle: true,
|
|
95
|
+
// 번들에 포함된 제3자 패키지를 식별해 라이선스 고지를 생성하는 데 사용한다
|
|
96
|
+
metafile: true,
|
|
94
97
|
banner: { js: bannerJs },
|
|
95
98
|
external: options.external,
|
|
96
99
|
tsconfig: path.join(options.pkgDir, "tsconfig.json"),
|
|
@@ -161,46 +164,38 @@ export function collectAllDependencyExternals(pkgDir: string): {
|
|
|
161
164
|
const nativeModules = new Set<string>();
|
|
162
165
|
const visited = new Set<string>();
|
|
163
166
|
|
|
164
|
-
const pkgJson = JSON.parse(
|
|
165
|
-
fsx.readSync(path.join(pkgDir, "package.json")),
|
|
166
|
-
) as PkgJson;
|
|
167
|
+
const pkgJson = JSON.parse(fsx.readSync(path.join(pkgDir, "package.json"))) as PkgJson;
|
|
167
168
|
const deps = Object.keys(pkgJson.dependencies ?? {});
|
|
168
169
|
logger.debug(
|
|
169
170
|
`[collectAllDependencyExternals] Scanning ${String(deps.length)} top-level dependencies...`,
|
|
170
171
|
);
|
|
171
172
|
|
|
172
173
|
for (const dep of deps) {
|
|
173
|
-
scanDependencyTree(
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
if (meta.optional === true && name in peerDeps) {
|
|
187
|
-
try {
|
|
188
|
-
depReq.resolve(name);
|
|
189
|
-
} catch {
|
|
190
|
-
found.push(name);
|
|
191
|
-
}
|
|
174
|
+
scanDependencyTree(dep, pkgDir, optionalPeerDeps, visited, (pkgName, depDir, depPkgJson) => {
|
|
175
|
+
const found: string[] = [];
|
|
176
|
+
|
|
177
|
+
// Optional peer deps 확인
|
|
178
|
+
if (depPkgJson.peerDependenciesMeta != null) {
|
|
179
|
+
const peerDeps = depPkgJson.peerDependencies ?? {};
|
|
180
|
+
const depReq = createRequire(path.join(depDir, "noop.js"));
|
|
181
|
+
for (const [name, meta] of Object.entries(depPkgJson.peerDependenciesMeta)) {
|
|
182
|
+
if (meta.optional === true && name in peerDeps) {
|
|
183
|
+
try {
|
|
184
|
+
depReq.resolve(name);
|
|
185
|
+
} catch {
|
|
186
|
+
found.push(name);
|
|
192
187
|
}
|
|
193
188
|
}
|
|
194
189
|
}
|
|
190
|
+
}
|
|
195
191
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
192
|
+
// 네이티브 모듈 확인
|
|
193
|
+
if (fsx.existsSync(path.join(depDir, "binding.gyp"))) {
|
|
194
|
+
nativeModules.add(pkgName);
|
|
195
|
+
}
|
|
200
196
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
);
|
|
197
|
+
return found;
|
|
198
|
+
});
|
|
204
199
|
}
|
|
205
200
|
|
|
206
201
|
logger.debug(
|
package/src/sd-config.types.ts
CHANGED
|
@@ -225,8 +225,9 @@ export interface SdClientPackageConfig {
|
|
|
225
225
|
* 서버 설정
|
|
226
226
|
* - string: 연결할 서버 패키지명 (예: "demo-server")
|
|
227
227
|
* - number: 포트 직접 지정 (하위 호환)
|
|
228
|
+
* - 미지정: 독립 실행 (dev 서버 포트 자동 할당)
|
|
228
229
|
*/
|
|
229
|
-
server
|
|
230
|
+
server?: string | number;
|
|
230
231
|
/** 빌드 시 치환할 환경 변수 (process.env를 객체로 치환) */
|
|
231
232
|
env?: Record<string, string>;
|
|
232
233
|
/** 배포 설정 */
|