@xfilecom/xframe 0.1.20 → 0.1.21
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/bin/xframe.js +45 -4
- package/defaults.json +4 -0
- package/package.json +6 -1
- package/template/README.md +16 -0
- package/template/docs/WEB_DEV_CONSOLE.md +20 -0
package/bin/xframe.js
CHANGED
|
@@ -30,12 +30,52 @@ function shouldProcess(filePath) {
|
|
|
30
30
|
return false;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
/** 모노레포 sibling 패키지 또는 배포 tarball 의 defaults.json → ^semver */
|
|
34
|
+
let defaultCoreSpecsCache;
|
|
35
|
+
function getDefaultCoreSpecs() {
|
|
36
|
+
if (defaultCoreSpecsCache) return defaultCoreSpecsCache;
|
|
37
|
+
const hardcoded = { backendCore: '^1.0.1', frontCore: '^0.2.6' };
|
|
38
|
+
const readCaret = (pkgPath, expectedName) => {
|
|
39
|
+
try {
|
|
40
|
+
if (!fs.existsSync(pkgPath)) return null;
|
|
41
|
+
const j = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
42
|
+
if (j.name !== expectedName || !j.version) return null;
|
|
43
|
+
return `^${j.version}`;
|
|
44
|
+
} catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const binDir = __dirname;
|
|
49
|
+
const monoBackend = path.join(binDir, '..', '..', 'backend-core', 'package.json');
|
|
50
|
+
const monoFront = path.join(binDir, '..', '..', 'front-core', 'package.json');
|
|
51
|
+
let backendCore = readCaret(monoBackend, '@xfilecom/backend-core');
|
|
52
|
+
let frontCore = readCaret(monoFront, '@xfilecom/front-core');
|
|
53
|
+
if (!backendCore || !frontCore) {
|
|
54
|
+
try {
|
|
55
|
+
const defPath = path.join(binDir, '..', 'defaults.json');
|
|
56
|
+
if (fs.existsSync(defPath)) {
|
|
57
|
+
const d = JSON.parse(fs.readFileSync(defPath, 'utf8'));
|
|
58
|
+
if (d.backendCore) backendCore = backendCore || d.backendCore;
|
|
59
|
+
if (d.frontCore) frontCore = frontCore || d.frontCore;
|
|
60
|
+
}
|
|
61
|
+
} catch {
|
|
62
|
+
/* ignore */
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
defaultCoreSpecsCache = {
|
|
66
|
+
backendCore: backendCore || hardcoded.backendCore,
|
|
67
|
+
frontCore: frontCore || hardcoded.frontCore,
|
|
68
|
+
};
|
|
69
|
+
return defaultCoreSpecsCache;
|
|
70
|
+
}
|
|
71
|
+
|
|
33
72
|
function usage() {
|
|
73
|
+
const { backendCore: defB, frontCore: defF } = getDefaultCoreSpecs();
|
|
34
74
|
console.log(`Usage: xframe <project-directory> [options]
|
|
35
75
|
|
|
36
76
|
Options:
|
|
37
|
-
--backend-core <spec> @xfilecom/backend-core (default:
|
|
38
|
-
--front-core <spec> @xfilecom/front-core (default:
|
|
77
|
+
--backend-core <spec> @xfilecom/backend-core (default: ${defB})
|
|
78
|
+
--front-core <spec> @xfilecom/front-core (default: ${defF}, npm 공개 레지스트리)
|
|
39
79
|
--no-install 스캐폴드만 하고 yarn/npm install 생략
|
|
40
80
|
|
|
41
81
|
MySQL (shared/config/api/application.yml 의 database.*)
|
|
@@ -57,10 +97,11 @@ Examples:
|
|
|
57
97
|
}
|
|
58
98
|
|
|
59
99
|
function parseArgs(argv) {
|
|
100
|
+
const defs = getDefaultCoreSpecs();
|
|
60
101
|
const rest = argv.slice(2);
|
|
61
102
|
let projectDir = null;
|
|
62
|
-
let backendCore =
|
|
63
|
-
let frontCore =
|
|
103
|
+
let backendCore = defs.backendCore;
|
|
104
|
+
let frontCore = defs.frontCore;
|
|
64
105
|
let skipInstall = false;
|
|
65
106
|
let skipDbPrompt = false;
|
|
66
107
|
let dbPull = false;
|
package/defaults.json
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xfilecom/xframe",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.21",
|
|
4
4
|
"description": "Scaffold full-stack app: Nest + @xfilecom/backend-core, Vite/React + @xfilecom/front-core",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"bin": {
|
|
@@ -8,8 +8,13 @@
|
|
|
8
8
|
},
|
|
9
9
|
"files": [
|
|
10
10
|
"bin",
|
|
11
|
+
"defaults.json",
|
|
11
12
|
"template"
|
|
12
13
|
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"sync-defaults": "node scripts/sync-defaults.js",
|
|
16
|
+
"prepublishOnly": "npm run sync-defaults"
|
|
17
|
+
},
|
|
13
18
|
"engines": {
|
|
14
19
|
"node": ">=18"
|
|
15
20
|
},
|
package/template/README.md
CHANGED
|
@@ -20,6 +20,8 @@ Nest API (`@xfilecom/backend-core`) + Vite/React client·admin (`@xfilecom/front
|
|
|
20
20
|
- Client: `http://localhost:3001` — `CommonResponse` 형태로 `/health` 표시
|
|
21
21
|
- Admin: `http://localhost:3002`
|
|
22
22
|
|
|
23
|
+
`@xfilecom/front-core` / `@xfilecom/backend-core` 는 **`package.json`에서 npm 버전 범위**(예: `^0.2.6`, `^1.0.1`)로 두는 것을 권장합니다. `file:../../../packages/...` 는 폴더 구조에 따라 깨지기 쉽습니다. 스캐폴드 시 `npx @xfilecom/xframe` 이 넣는 기본 범위는 **배포 시점의 코어 패키지 버전**과 맞춰지며(`defaults.json`, `npm publish` 전 동기화), 필요하면 `--backend-core` / `--front-core` 로 덮어쓸 수 있습니다.
|
|
24
|
+
|
|
23
25
|
## `shared/` (설정·스키마·SQL·endpoint)
|
|
24
26
|
|
|
25
27
|
- **`shared/config/api`**, **`shared/config/web/client`**, **`shared/config/web/admin`**: YAML (`application.yml` + `application-<env>.yml`)
|
|
@@ -32,6 +34,20 @@ Nest API (`@xfilecom/backend-core`) + Vite/React client·admin (`@xfilecom/front
|
|
|
32
34
|
|
|
33
35
|
설정 흐름, `DatabaseService` / `DatabaseQuery` 주입, Drizzle Kit 스크립트는 **[docs/DATABASE.md](./docs/DATABASE.md)** 를 보면 됩니다.
|
|
34
36
|
|
|
37
|
+
## 브라우저 콘솔: `content.js`, `chrome-extension://invalid`, `locales.getpip.com`
|
|
38
|
+
|
|
39
|
+
Client/Admin을 Chrome으로 열었을 때 아래 같은 메시지가 **앱 코드와 무관**하게 뜰 수 있습니다.
|
|
40
|
+
|
|
41
|
+
| 증상 | 원인 |
|
|
42
|
+
|------|------|
|
|
43
|
+
| `content.js:…` 스택 | Chrome **확장 프로그램**이 페이지에 주입한 스크립트 |
|
|
44
|
+
| `GET chrome-extension://invalid/ … ERR_FAILED` | 지갑·Web3 등 확장이 잘못된 확장 URL로 리소스를 요청할 때 |
|
|
45
|
+
| `GET https://locales.getpip.com/… … ERR_NAME_NOT_RESOLVED` | 일부 확장이 원격 번역/로케일을 가져오다 DNS·네트워크로 실패할 때 |
|
|
46
|
+
|
|
47
|
+
**대응:** 앱 버그가 아니므로 무시해도 됩니다. 콘솔을 깨끗이 보고 싶으면 **시크릿 창**(확장 기본 비활성)에서 `localhost`를 열거나, 개발용 Chrome 프로필에서 확장을 끄면 됩니다.
|
|
48
|
+
|
|
49
|
+
자세한 설명은 **[docs/WEB_DEV_CONSOLE.md](./docs/WEB_DEV_CONSOLE.md)** 참고.
|
|
50
|
+
|
|
35
51
|
## GitLab `~/.npmrc` 와 충돌 시
|
|
36
52
|
|
|
37
53
|
프로젝트 루트 `.npmrc`의 `@xfilecom:registry`가 npm 공개 레지스트리를 가리키므로, `@xfilecom/*` 설치는 여기서 우선합니다.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# 웹 Client/Admin — 브라우저 콘솔 노이즈
|
|
2
|
+
|
|
3
|
+
Chrome에서 `http://localhost:3001` 등을 열었을 때 DevTools 콘솔에 아래가 보일 수 있습니다. **이 프로젝트(Vite/React) 소스와는 무관**합니다.
|
|
4
|
+
|
|
5
|
+
## `content.js` / `chrome-extension://invalid/`
|
|
6
|
+
|
|
7
|
+
- Chrome **확장 프로그램**이 모든 탭에 주입하는 **content script**가 `content.js`처럼 보이는 스택을 남깁니다.
|
|
8
|
+
- `chrome-extension://invalid/` 요청은 지갑·Web3·기타 확장이 내부 리소스 URL을 잘못 잡았을 때 발생합니다.
|
|
9
|
+
- 스택에 `getProvider`, `autoConnect` 등이 보이면 **지갑 확장** 쪽일 가능성이 큽니다.
|
|
10
|
+
|
|
11
|
+
## `locales.getpip.com` / `ERR_NAME_NOT_RESOLVED`
|
|
12
|
+
|
|
13
|
+
- 일부 확장이 원격 번역 JSON을 받아오다 DNS 실패·차단으로 네트워크 오류를 냅니다.
|
|
14
|
+
- 앱의 `fetch` / 라우팅과는 별개입니다.
|
|
15
|
+
|
|
16
|
+
## 권장 대응
|
|
17
|
+
|
|
18
|
+
1. **무시** — 앱 동작·배포와 무관하면 그대로 두어도 됩니다.
|
|
19
|
+
2. **시크릿 창**에서 로컬 호스트를 열면 확장이 기본 꺼져 콘솔이 조용해집니다.
|
|
20
|
+
3. 개발 전용 Chrome 프로필에서 확장을 끄거나, 해당 확장만 비활성화합니다.
|