@simplysm/sd-claude 14.0.81 → 14.0.83
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/claude/references/sd-requirement-source-handling.md +20 -20
- package/claude/references/sd-simplysm14/README.md +13 -13
- package/claude/references/sd-simplysm14/manuals/client-component.md +92 -92
- package/claude/references/sd-simplysm14/manuals/client-crud.md +11 -11
- package/claude/references/sd-simplysm14/manuals/client-demo.md +28 -28
- package/claude/references/sd-simplysm14/manuals/client-rules.md +1 -1
- package/claude/references/sd-simplysm14/manuals/client-setup.md +21 -21
- package/claude/references/sd-simplysm14/manuals/client-tab.md +3 -3
- package/claude/references/sd-simplysm14/manuals/logging.md +15 -15
- package/claude/references/sd-simplysm14/manuals/orm-union.md +6 -6
- package/claude/references/sd-simplysm14/manuals/orm.md +19 -19
- package/claude/references/sd-simplysm14/manuals/test.md +33 -33
- package/claude/rules/sd-base-rules.md +44 -43
- package/claude/rules/sd-design-rules.md +18 -18
- package/claude/skills/sd-commit/SKILL.md +10 -10
- package/claude/skills/sd-config/SKILL.md +2 -2
- package/claude/skills/sd-demo/SKILL.md +45 -45
- package/claude/skills/sd-dev/SKILL.md +15 -15
- package/claude/skills/sd-docs/SKILL.md +7 -7
- package/claude/skills/sd-docs/references/subagent-prompt.md +33 -33
- package/claude/skills/sd-impl/SKILL.md +60 -60
- package/claude/skills/sd-review/SKILL.md +9 -9
- package/claude/skills/sd-skill/SKILL.md +74 -74
- package/claude/skills/sd-skill/evals/fixtures/existing-skill/.claude/skills/todo-format/SKILL.md +1 -1
- package/claude/skills/sd-spec/SKILL.md +355 -319
- package/claude/skills/sd-spec/references/example-spec.md +104 -104
- package/claude/skills/sd-unpack/SKILL.md +34 -34
- package/claude/skills/sd-use/SKILL.md +4 -4
- package/package.json +1 -1
- package/claude/references/sd-simplysm14/apis/angular/README.md +0 -37
- package/claude/references/sd-simplysm14/apis/angular/app-structure.md +0 -92
- package/claude/references/sd-simplysm14/apis/angular/buttons.md +0 -88
- package/claude/references/sd-simplysm14/apis/angular/crud.md +0 -100
- package/claude/references/sd-simplysm14/apis/angular/forms.md +0 -200
- package/claude/references/sd-simplysm14/apis/angular/infrastructure.md +0 -231
- package/claude/references/sd-simplysm14/apis/angular/kanban.md +0 -80
- package/claude/references/sd-simplysm14/apis/angular/layout.md +0 -92
- package/claude/references/sd-simplysm14/apis/angular/modal.md +0 -115
- package/claude/references/sd-simplysm14/apis/angular/routing.md +0 -107
- package/claude/references/sd-simplysm14/apis/angular/select-dropdown.md +0 -35
- package/claude/references/sd-simplysm14/apis/angular/selection-managers.md +0 -82
- package/claude/references/sd-simplysm14/apis/angular/shared-data.md +0 -134
- package/claude/references/sd-simplysm14/apis/angular/sheet.md +0 -127
- package/claude/references/sd-simplysm14/apis/angular/toast.md +0 -97
- package/claude/references/sd-simplysm14/apis/angular/visual.md +0 -167
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +0 -79
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +0 -83
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +0 -91
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +0 -49
- package/claude/references/sd-simplysm14/apis/core-browser/README.md +0 -143
- package/claude/references/sd-simplysm14/apis/core-common/README.md +0 -58
- package/claude/references/sd-simplysm14/apis/core-common/extensions.md +0 -88
- package/claude/references/sd-simplysm14/apis/core-common/features.md +0 -51
- package/claude/references/sd-simplysm14/apis/core-common/types.md +0 -88
- package/claude/references/sd-simplysm14/apis/core-common/utils.md +0 -189
- package/claude/references/sd-simplysm14/apis/core-node/README.md +0 -12
- package/claude/references/sd-simplysm14/apis/core-node/consola.md +0 -59
- package/claude/references/sd-simplysm14/apis/core-node/cpx.md +0 -44
- package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +0 -42
- package/claude/references/sd-simplysm14/apis/core-node/fsx.md +0 -53
- package/claude/references/sd-simplysm14/apis/core-node/pathx.md +0 -24
- package/claude/references/sd-simplysm14/apis/core-node/worker.md +0 -65
- package/claude/references/sd-simplysm14/apis/excel/README.md +0 -193
- package/claude/references/sd-simplysm14/apis/lint/README.md +0 -94
- package/claude/references/sd-simplysm14/apis/orm-common/README.md +0 -58
- package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +0 -77
- package/claude/references/sd-simplysm14/apis/orm-common/executable.md +0 -20
- package/claude/references/sd-simplysm14/apis/orm-common/expr.md +0 -92
- package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +0 -98
- package/claude/references/sd-simplysm14/apis/orm-common/schema-builders.md +0 -128
- package/claude/references/sd-simplysm14/apis/orm-node/README.md +0 -69
- package/claude/references/sd-simplysm14/apis/sd-claude/README.md +0 -32
- package/claude/references/sd-simplysm14/apis/sd-cli/README.md +0 -80
- package/claude/references/sd-simplysm14/apis/sd-cli/sd-config.md +0 -155
- package/claude/references/sd-simplysm14/apis/service-client/README.md +0 -131
- package/claude/references/sd-simplysm14/apis/service-common/README.md +0 -29
- package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +0 -63
- package/claude/references/sd-simplysm14/apis/service-common/messages.md +0 -56
- package/claude/references/sd-simplysm14/apis/service-common/protocol.md +0 -64
- package/claude/references/sd-simplysm14/apis/service-common/service-types.md +0 -43
- package/claude/references/sd-simplysm14/apis/service-server/README.md +0 -13
- package/claude/references/sd-simplysm14/apis/service-server/auth.md +0 -39
- package/claude/references/sd-simplysm14/apis/service-server/builtin-services.md +0 -71
- package/claude/references/sd-simplysm14/apis/service-server/define-service.md +0 -55
- package/claude/references/sd-simplysm14/apis/service-server/internals.md +0 -82
- package/claude/references/sd-simplysm14/apis/service-server/server.md +0 -57
- package/claude/references/sd-simplysm14/apis/storage/README.md +0 -71
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
# @simplysm/angular — toast / busy / print
|
|
2
|
-
|
|
3
|
-
전역 알림·로딩·인쇄 프로바이더. 컨테이너는 첫 호출 시 body 에 자동 생성.
|
|
4
|
-
|
|
5
|
-
## SdToastProvider (root)
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
alertThemes: WritableSignal<SdToastSeverity[]>; // 여기에 포함된 severity 는 window.alert 로 강제
|
|
9
|
-
overlap: WritableSignal<boolean>; // true 면 동시 표시 안 함(새 토스트가 기존 제거)
|
|
10
|
-
beforeShowFn?: (theme: SdToastSeverity) => void;
|
|
11
|
-
|
|
12
|
-
info/success/warning/danger(message: string, useProgress?: false): void;
|
|
13
|
-
info/success/warning/danger(message: string, useProgress: true): WritableSignal<number>;
|
|
14
|
-
notify<T extends SdToastContentDef<O>>(input: SdToastInput<T>): Promise<O|undefined>;
|
|
15
|
-
try<R>(fn: () => Promise<R>|R, messageFn?: (err) => string): Promise<R|undefined>|R|undefined;
|
|
16
|
-
|
|
17
|
-
type SdToastSeverity = "info"|"success"|"warning"|"danger";
|
|
18
|
-
type SdToastTheme = "primary"|"secondary"|SdToastSeverity|"gray"|"blue-gray";
|
|
19
|
-
interface SdToastContentDef<O> { close: OutputEmitterRef<O|undefined>; }
|
|
20
|
-
interface SdToastInput<T> { type: Type<T>; inputs: <T 의 input prop 들, close 제외>; }
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
- `info`/`success` 는 `polite` aria-live, `warning`/`danger` 는 `assertive`/`alert` role.
|
|
24
|
-
- `useProgress=true` 면 진행률 토스트. 반환 signal 에 0~100 set. 100 도달 후 1초 뒤 자동 해제. progress 모드가 아니면 3초(호버 중이면 마우스 떠난 뒤 1초) 자동 해제.
|
|
25
|
-
- `alertThemes` 에 severity 포함되면 토스트 대신 `window.alert(message)`. 키오스크/PWA 백그라운드 알림 강제용.
|
|
26
|
-
- `beforeShowFn` — 매 토스트 표시 직전 호출(소리·진동 등 부수효과).
|
|
27
|
-
- `notify` — 커스텀 컴포넌트 컨텐츠로 토스트. 컴포넌트가 `close.emit(result)` 호출 시 Promise resolve, 5초 후 자동 dismiss(undefined resolve).
|
|
28
|
-
- `try` — fn 실행 후 throw 된 Error 의 메시지로 `danger` 토스트 + `SdSystemLogProvider.writeAsync('error', ...)` 호출. 비-Error throw 는 다시 던짐.
|
|
29
|
-
|
|
30
|
-
```ts
|
|
31
|
-
sdToast.success("저장 완료");
|
|
32
|
-
const sig = sdToast.info("업로드 중...", true); sig.set(50);
|
|
33
|
-
await sdToast.try(async () => await api.save(item));
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## SdToast / SdToastContainer
|
|
37
|
-
|
|
38
|
-
내부 사용 컴포넌트. 직접 쓸 일 거의 없음. `SdToastProvider` 가 첫 호출 시 `<sd-toast-container>` 를 body 에 append.
|
|
39
|
-
|
|
40
|
-
```ts
|
|
41
|
-
// SdToastContainer
|
|
42
|
-
overlap = input(false); // true 면 절대배치로 1개만 표시되는 룩
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## SdBusyProvider (root)
|
|
46
|
-
|
|
47
|
-
```ts
|
|
48
|
-
type: WritableSignal<SdBusyType>; // "spinner"|"bar"|"cube", default "bar"
|
|
49
|
-
globalBusyCount: WritableSignal<number>; // >0 이면 전역 busy 표시. provideSdAngular 가 navigation 동안 증감
|
|
50
|
-
type SdBusyType = "spinner"|"bar"|"cube";
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
- `globalBusyCount` 증가/감소로 전역 잠금 화면 토글.
|
|
54
|
-
- `type` — 인디케이터 모양. `spinner` 는 원형 회전, `bar` 는 상단 진행 바(슬림), `cube` 는 4분할 큐브 애니메이션.
|
|
55
|
-
|
|
56
|
-
## SdBusyContainer — `<sd-busy-container>`
|
|
57
|
-
|
|
58
|
-
```ts
|
|
59
|
-
busy = input(false); message = input<string|undefined>();
|
|
60
|
-
type = input<SdBusyType|undefined>(); // 미지정이면 SdBusyProvider.type() 사용
|
|
61
|
-
progressPercent = input<number|undefined>(); // 0~100, null 이면 막대 숨김
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
- 일부 영역만 busy 표시. `busy` true 동안 자식 영역에 오버레이 + 키보드 입력 차단.
|
|
65
|
-
|
|
66
|
-
```html
|
|
67
|
-
<sd-busy-container [busy]="loading()" [progressPercent]="pct()">...영역 내용...</sd-busy-container>
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
## SdPrintProvider (root)
|
|
71
|
-
|
|
72
|
-
```ts
|
|
73
|
-
printAsync<T extends SdPrint>(template: SdPrintInput<T>, options?: { size?: string; margin?: string }): Promise<void>;
|
|
74
|
-
getPdfBufferAsync<T extends SdPrint>(template: SdPrintInput<T>, options?: { orientation?: "portrait"|"landscape"; pageSize?: string }): Promise<Uint8Array>;
|
|
75
|
-
|
|
76
|
-
interface SdPrint { initialized: Signal<boolean>; readonly _optionalPrintInputs?: string; }
|
|
77
|
-
interface SdPrintInput<T, X = ""> { type: Type<T>; inputs: <T 의 input prop 들>; }
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
- 인쇄용 컴포넌트를 동적으로 body 에 부착 → `initialized() === true` 대기 → 이미지 로드 완료 대기 → `window.print()` 또는 jsPDF + html-to-image 로 PDF 버퍼 생성.
|
|
81
|
-
- `printAsync.options.size` — `@page size`. 기본 `"A4 auto"`.
|
|
82
|
-
- `printAsync.options.margin` — `@page margin`. 기본 `"0"`.
|
|
83
|
-
- `getPdfBufferAsync.options.pageSize` — jsPDF page 크기. 기본 `"a4"`.
|
|
84
|
-
- `getPdfBufferAsync.options.orientation` — `"portrait"`/`"landscape"`. 기본 `"portrait"`(`"p"`).
|
|
85
|
-
- PDF 생성 시 컴포넌트 안 `.page` 클래스 요소 각각 1페이지로 처리, 없으면 컴포넌트 전체 1페이지.
|
|
86
|
-
- 인쇄 진행 동안 `SdBusyProvider.globalBusyCount` 자동 증감.
|
|
87
|
-
|
|
88
|
-
```ts
|
|
89
|
-
await sdPrint.printAsync({ type: InvoicePrint, inputs: { order: data } }, { size: "A4 portrait" });
|
|
90
|
-
const buf = await sdPrint.getPdfBufferAsync({ type: InvoicePrint, inputs: { order } });
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
## 주의
|
|
94
|
-
|
|
95
|
-
- `SdToastProvider.try` 는 `Error` 가 아닌 throw 는 그대로 re-throw. 일반 함수에서 throw 시 반드시 Error 인스턴스 던질 것.
|
|
96
|
-
- `SdBusyContainer` 의 `min-height: 70px` 가 기본. 빈 컨테이너에서도 인디케이터 보이도록.
|
|
97
|
-
- `SdPrint.initialized` 를 컴포넌트가 true 로 안 set 하면 `wait.until` 이 영원히 대기. 비동기 데이터 로드 후 반드시 set.
|
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
# @simplysm/angular — visual
|
|
2
|
-
|
|
3
|
-
시각/표시 컴포넌트 (라벨·뱃지·진행률·달력·바코드·차트·에디터·주소검색) + 보조 레이아웃 컨테이너 (collapse·tab·list·gap·pagination·dropdown).
|
|
4
|
-
|
|
5
|
-
## SdLabel — `<sd-label>`
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
theme = input<"primary"|"secondary"|"info"|"success"|"warning"|"danger"|"gray"|"blue-gray">();
|
|
9
|
-
color = input<string>(); // 직접 색상 hex
|
|
10
|
-
clickable = input(false);
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
- 작은 텍스트 뱃지. `theme` 또는 `color` 중 하나. `clickable=true` 면 커서 pointer + 호버 효과.
|
|
14
|
-
|
|
15
|
-
## SdNote — `<sd-note>`
|
|
16
|
-
|
|
17
|
-
```ts
|
|
18
|
-
theme = input<...8 themes>();
|
|
19
|
-
size = input<"sm"|"lg">();
|
|
20
|
-
inset = input(false);
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
- 정보 박스(노트). `<ng-content>` 가 본문. 페이지 안내문구.
|
|
24
|
-
|
|
25
|
-
## SdProgress — `<sd-progress>`
|
|
26
|
-
|
|
27
|
-
```ts
|
|
28
|
-
inset = input(false); size = input<"sm"|"lg">();
|
|
29
|
-
theme = input.required<...8 themes>();
|
|
30
|
-
value = input.required<number>(); // 0~100
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
- 가로 진행 바. value/100 만큼 채움.
|
|
34
|
-
|
|
35
|
-
## SdCalendar — `<sd-calendar>`
|
|
36
|
-
|
|
37
|
-
```ts
|
|
38
|
-
class SdCalendar<T>
|
|
39
|
-
items = input.required<T[]>();
|
|
40
|
-
getItemDateFn = input.required<(item: T, index: number) => DateOnly>();
|
|
41
|
-
yearMonth = input(new DateOnly().setDay(1));
|
|
42
|
-
weekStartDay = input(0); // 0=일요일, 1=월요일
|
|
43
|
-
minDaysInFirstWeek = input(1);
|
|
44
|
-
// 자식: <ng-template itemOf>...</ng-template> 로 셀별 아이템 렌더
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
- 월별 달력 그리드. 각 날짜 셀에 해당하는 items 만 추려 itemOf 템플릿으로 렌더.
|
|
48
|
-
- `weekStartDay` — 0~6.
|
|
49
|
-
- `minDaysInFirstWeek` — 첫 주에 포함될 최소 일수(ISO 주차 규칙).
|
|
50
|
-
|
|
51
|
-
```html
|
|
52
|
-
<sd-calendar [items]="events()" [getItemDateFn]="getDate" [yearMonth]="ym()">
|
|
53
|
-
<ng-template itemOf [itemOf]="events()" let-item>{{ item.title }}</ng-template>
|
|
54
|
-
</sd-calendar>
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
## SdBarcode — `<sd-barcode>`
|
|
58
|
-
|
|
59
|
-
```ts
|
|
60
|
-
type = input.required<BarcodeType>();
|
|
61
|
-
value = input<string>();
|
|
62
|
-
|
|
63
|
-
type BarcodeType = "code128"|"qrcode"|"ean13"|"ean8"|"code39"|... (bwip-js bcid 전체)
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
- bwip-js 로 SVG 바코드 렌더. value 비면 빈 출력. 인식 불가 데이터면 catch 후 빈 출력.
|
|
67
|
-
|
|
68
|
-
## SdEcharts — `<sd-echarts>`
|
|
69
|
-
|
|
70
|
-
```ts
|
|
71
|
-
option = input.required<echarts.EChartsOption>();
|
|
72
|
-
notMerge = input(false); // setOption merge 비활성
|
|
73
|
-
loading = input(false); // showLoading/hideLoading
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
- ECharts 래퍼. `option` 변경 시 자동 setOption.
|
|
77
|
-
|
|
78
|
-
## SdTiptapEditor — `<sd-tiptap-editor>`
|
|
79
|
-
|
|
80
|
-
```ts
|
|
81
|
-
value = model<string>(); // HTML 문자열
|
|
82
|
-
disabled = input(false); readonly = input(false); required = input(false);
|
|
83
|
-
placeholder = input<string>();
|
|
84
|
-
validatorFn = input<(value) => string|undefined>();
|
|
85
|
-
extensions = input<AnyExtension[]>(); // 추가 tiptap extensions
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
- WYSIWYG HTML 에디터. tiptap 기반. 기본 extension(헤딩/볼드/리스트 등) 내장.
|
|
89
|
-
|
|
90
|
-
## SdAddressSearchModal — `<sd-address-search-modal>` (SdModalContentDef<Address>)
|
|
91
|
-
|
|
92
|
-
```ts
|
|
93
|
-
close = output<Address>();
|
|
94
|
-
initialized = signal(false);
|
|
95
|
-
interface Address { postNumber: string|undefined; address: string|undefined; buildingName: string|undefined; }
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
- 다음(daum) 우편번호 검색 위젯 모달. `SdModalProvider.showAsync({ type: SdAddressSearchModal, ... })` 로 호출.
|
|
99
|
-
- 다음 postcode 스크립트 로드 실패 시 에러 메시지 표시.
|
|
100
|
-
|
|
101
|
-
## SdCollapse — `<sd-collapse>`
|
|
102
|
-
|
|
103
|
-
```ts
|
|
104
|
-
open = input(false);
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
- 접힘/펼침 컨테이너. transition 으로 height 애니메이션. `<ng-content>` 가 본문.
|
|
108
|
-
|
|
109
|
-
## SdCollapseIcon — `<sd-collapse-icon>`
|
|
110
|
-
|
|
111
|
-
```ts
|
|
112
|
-
icon = input(tablerChevronDown);
|
|
113
|
-
open = input(false);
|
|
114
|
-
openRotate = input(90); // open 일 때 회전 각도
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
- 펼침/접힘 표시 아이콘. open 토글 시 회전 애니메이션.
|
|
118
|
-
|
|
119
|
-
## SdTab — `<sd-tab>` / SdTabItem — `<sd-tab-item>`
|
|
120
|
-
|
|
121
|
-
```ts
|
|
122
|
-
class SdTab { value = model<any>(); }
|
|
123
|
-
class SdTabItem { value = input<any>(); }
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
- 탭 컨테이너 + 탭 항목. `<sd-tab-item value="a">A</sd-tab-item>` 클릭 시 `SdTab.value` 가 `"a"` 로.
|
|
127
|
-
|
|
128
|
-
## SdList — `<sd-list>` / SdListItem — `<sd-list-item>`
|
|
129
|
-
|
|
130
|
-
```ts
|
|
131
|
-
class SdList { inset = input(false); }
|
|
132
|
-
class SdListItem {
|
|
133
|
-
layout = input<"accordion"|"flat">("accordion");
|
|
134
|
-
open = model(false);
|
|
135
|
-
selected = input(false); selectedIcon = input<string>();
|
|
136
|
-
readonly = input(false);
|
|
137
|
-
contentStyle = input<string>(); contentClass = input<string>();
|
|
138
|
-
}
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
- 세로 메뉴/리스트. `layout="accordion"` 이면 자식 리스트 펼침 가능, `flat` 이면 상시 전개.
|
|
142
|
-
- `selected=true` → 강조 + `selectedIcon` 표시.
|
|
143
|
-
|
|
144
|
-
## SdGap — `<sd-gap>`
|
|
145
|
-
|
|
146
|
-
```ts
|
|
147
|
-
height = input<"xxs"|"xs"|"sm"|"default"|"lg"|"xl"|"xxl">();
|
|
148
|
-
heightPx = input<number>();
|
|
149
|
-
width = input<"xxs"|...|"xxl">(); widthPx = input<number>(); widthEm = input<number>();
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
- 빈 공간 채움. 토큰 키워드(디자인 변수) 또는 px/em 직접 지정.
|
|
153
|
-
|
|
154
|
-
## SdPagination — `<sd-pagination>`
|
|
155
|
-
|
|
156
|
-
```ts
|
|
157
|
-
currentPage = model(0);
|
|
158
|
-
totalPageCount = input(0);
|
|
159
|
-
visiblePageCount = input(10);
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
- 페이지 번호 바. 0-based. `<sd-sheet>`/`<sd-crud-list>` 내부에서 사용되지만 단독 사용도 가능.
|
|
163
|
-
|
|
164
|
-
## 주의
|
|
165
|
-
|
|
166
|
-
- `SdCalendar` 의 자식 `<ng-template itemOf>` 의 `[itemOf]` 는 `items()` 와 같은 배열 바인딩(type token 용도).
|
|
167
|
-
- `SdBarcode` 는 `bypassSecurityTrustHtml` 사용. value 가 사용자 입력이라도 bwip-js 가 SVG 만 생성하므로 안전(코드 주입 불가).
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
# @simplysm/capacitor-plugin-auto-update
|
|
2
|
-
|
|
3
|
-
Android Capacitor 앱의 APK 자동 업데이트 흐름(버전 비교 → 다운로드 → 권한 확인 → 설치)과 APK 설치 네이티브 플러그인 래퍼.
|
|
4
|
-
|
|
5
|
-
## 사용 트리거 인덱스
|
|
6
|
-
|
|
7
|
-
- **`AutoUpdate`** — 앱 부팅 직후 서버 또는 외부 저장소에서 최신 APK 버전을 확인·다운로드·설치하는 전체 흐름을 한 번에 실행할 때.
|
|
8
|
-
- **`ApkInstaller`** — 자체 UI/흐름을 만들면서 APK 설치 권한·설치·현재 앱 버전 조회를 개별로 호출할 때.
|
|
9
|
-
- **`ApkInstallerPlugin`, `VersionInfo`** — Capacitor 플러그인 인터페이스 타입을 참조하거나 모킹할 때.
|
|
10
|
-
|
|
11
|
-
## `AutoUpdate`
|
|
12
|
-
|
|
13
|
-
```ts
|
|
14
|
-
abstract class AutoUpdate {
|
|
15
|
-
static run(opt: { log: (messageHtml: string) => void; serviceClient: ServiceClient }): Promise<void>;
|
|
16
|
-
static runByExternalStorage(opt: { log: (messageHtml: string) => void; dirPath: string }): Promise<void>;
|
|
17
|
-
}
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
- `run` — `serviceClient.getService<AutoUpdateService>("AutoUpdate").getLastVersion("android")` 호출 → semver 비교 후 더 큰 버전이면 `serviceClient.hostUrl + downloadPath` 에서 APK 다운로드 → `appCache/latest.apk` 저장 → 설치. 서버 기반 배포용.
|
|
21
|
-
- `runByExternalStorage` — `FileSystem.getStoragePath("external")` 하위 `dirPath` 폴더에서 파일명이 `^[0-9.]*$` 인 `.apk` 들을 후보로 모아 semver 최댓값을 골라 설치. 서버 없이 사이드로드 배포용.
|
|
22
|
-
- `opt.log` — 진행/오류를 HTML 문자열로 받는 콜백. 다운로드 버튼·재시도 버튼 등 HTML 마크업이 포함되므로 호출측이 innerHTML 로 렌더해야 함.
|
|
23
|
-
- `opt.serviceClient` — `@simplysm/service-client` 의 `ServiceClient` 연결 인스턴스. 서버에 `AutoUpdateService` 가 등록되어 있어야 함.
|
|
24
|
-
- `opt.dirPath` — external 저장소 루트 기준 상대 경로.
|
|
25
|
-
|
|
26
|
-
동작 주의:
|
|
27
|
-
|
|
28
|
-
- UA 가 android 가 아니면 throw.
|
|
29
|
-
- 현재 또는 비교 대상 버전이 invalid semver 이거나 서버에서 버전 정보를 못 받으면 silent return (로그만 남김).
|
|
30
|
-
- 권한 미부여 시 `ApkInstaller.requestPermissions()` 호출 후 1초 간격 최대 300회(5분) polling.
|
|
31
|
-
- manifest 에 `REQUEST_INSTALL_PACKAGES` 미선언이거나 권한 확인 자체가 실패하면 "APK 재다운로드/재설치" 안내를 throw — `run` 의 경우 다운로드 링크 버튼 HTML 을 메시지에 포함.
|
|
32
|
-
- try/catch 종료 후 항상 `_freezeApp()`(무한 await) — 정상 경로·에러 경로 모두 호출부의 후속 코드는 실행되지 않음 전제로 사용.
|
|
33
|
-
|
|
34
|
-
사용 예:
|
|
35
|
-
|
|
36
|
-
```ts
|
|
37
|
-
await AutoUpdate.run({ log: (h) => (document.body.innerHTML = h), serviceClient });
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## `ApkInstaller`
|
|
41
|
-
|
|
42
|
-
```ts
|
|
43
|
-
abstract class ApkInstaller {
|
|
44
|
-
static checkPermissions(): Promise<{ granted: boolean; manifest: boolean }>;
|
|
45
|
-
static requestPermissions(): Promise<void>;
|
|
46
|
-
static install(apkUri: string): Promise<void>;
|
|
47
|
-
static getVersionInfo(): Promise<VersionInfo>;
|
|
48
|
-
}
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
- `checkPermissions` — `granted` 는 사용자의 `REQUEST_INSTALL_PACKAGES` 승인 여부, `manifest` 는 AndroidManifest 에 권한이 선언돼 있는지. `manifest=false` 면 APK 자체를 재빌드/재설치 해야 함.
|
|
52
|
-
- `requestPermissions` — 시스템 설정의 "알 수 없는 앱 설치" 화면으로 이동. 결과를 await 하지 않으므로 호출측에서 `checkPermissions` polling 필요.
|
|
53
|
-
- `install` — `apkUri` 는 `content://` FileProvider URI. `@simplysm/capacitor-plugin-file-system` 의 `FileSystem.getUri(path)` 로 변환해 넘김. 설치 인텐트 실행 후 즉시 반환 — 실제 설치 완료를 await 하지 않음.
|
|
54
|
-
- `getVersionInfo` — 현재 설치된 앱 자체의 `versionName`/`versionCode` 반환.
|
|
55
|
-
- 웹(비-android) 환경에서는 `ApkInstallerWeb` 폴백이 알림만 표시하고 정상 반환(no-op).
|
|
56
|
-
|
|
57
|
-
사용 예:
|
|
58
|
-
|
|
59
|
-
```ts
|
|
60
|
-
const { granted } = await ApkInstaller.checkPermissions();
|
|
61
|
-
if (!granted) await ApkInstaller.requestPermissions();
|
|
62
|
-
await ApkInstaller.install(await FileSystem.getUri(apkFilePath));
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
## `ApkInstallerPlugin`, `VersionInfo`
|
|
66
|
-
|
|
67
|
-
```ts
|
|
68
|
-
interface VersionInfo { versionName: string; versionCode: string }
|
|
69
|
-
interface ApkInstallerPlugin {
|
|
70
|
-
install(options: { uri: string }): Promise<void>;
|
|
71
|
-
checkPermissions(): Promise<{ granted: boolean; manifest: boolean }>;
|
|
72
|
-
requestPermissions(): Promise<void>;
|
|
73
|
-
getVersionInfo(): Promise<VersionInfo>;
|
|
74
|
-
}
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
- `VersionInfo.versionName` — `build.gradle` 의 versionName 문자열. `AutoUpdate` 가 semver 비교에 사용하므로 semver 형식 권장.
|
|
78
|
-
- `VersionInfo.versionCode` — versionCode 를 문자열로 반환(정수 증가값).
|
|
79
|
-
- `ApkInstallerPlugin` — `registerPlugin<ApkInstallerPlugin>("ApkInstaller", ...)` 의 타입 파라미터. 직접 호출하지 말고 `ApkInstaller` 정적 메서드 사용. 타입 참조/모킹 시에만 import.
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
# @simplysm/capacitor-plugin-file-system
|
|
2
|
-
|
|
3
|
-
Capacitor 기반 파일 시스템 접근 플러그인. Android(11+ MANAGE_EXTERNAL_STORAGE, 10- READ/WRITE_EXTERNAL_STORAGE) 네이티브, Web 은 IndexedDB 에뮬레이션.
|
|
4
|
-
|
|
5
|
-
## 사용 트리거 인덱스
|
|
6
|
-
|
|
7
|
-
- **`FileSystem`** — 모바일/웹에서 파일·디렉토리 읽기/쓰기/삭제, 저장소 경로·URI 조회, 권한 처리 필요 시.
|
|
8
|
-
- **`FileInfo`, `StorageType`** — `readdir` 결과 처리, `getStoragePath` 호출 시 타입.
|
|
9
|
-
- **`FileSystemPlugin`** — 저수준 Capacitor 플러그인 인터페이스 직접 호출 필요 시(정상적으론 `FileSystem` 정적 메서드 사용).
|
|
10
|
-
|
|
11
|
-
## FileSystem
|
|
12
|
-
|
|
13
|
-
`abstract class` — 정적 메서드만 호출.
|
|
14
|
-
|
|
15
|
-
```ts
|
|
16
|
-
// 권한
|
|
17
|
-
await FileSystem.checkPermissions(): Promise<boolean>
|
|
18
|
-
await FileSystem.requestPermissions(): Promise<void> // Android 11+: 설정 화면 이동, 10-: 권한 대화상자
|
|
19
|
-
|
|
20
|
-
// 경로/URI
|
|
21
|
-
await FileSystem.getStoragePath(type: StorageType): Promise<string>
|
|
22
|
-
await FileSystem.getUri(filePath: string): Promise<string> // 네이티브: FileProvider URI / Web: Blob URL (사용 후 `URL.revokeObjectURL` 필수)
|
|
23
|
-
|
|
24
|
-
// 디렉토리
|
|
25
|
-
await FileSystem.readdir(dirPath: string): Promise<FileInfo[]>
|
|
26
|
-
await FileSystem.mkdir(targetPath: string): Promise<void> // 재귀
|
|
27
|
-
|
|
28
|
-
// 파일
|
|
29
|
-
await FileSystem.writeFile(filePath: string, data: string | Bytes): Promise<void>
|
|
30
|
-
await FileSystem.readFile(filePath: string): Promise<Bytes>
|
|
31
|
-
await FileSystem.readFile(filePath: string, encoding: "utf8"): Promise<string>
|
|
32
|
-
|
|
33
|
-
// 공통
|
|
34
|
-
await FileSystem.remove(targetPath: string): Promise<void> // 파일/디렉토리 재귀 삭제
|
|
35
|
-
await FileSystem.exists(targetPath: string): Promise<boolean>
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
`writeFile`: `string` 은 utf8, `Bytes`(=`Uint8Array`, `@simplysm/core-common`) 는 base64 로 전달. cross-realm 안전.
|
|
39
|
-
`readFile`: encoding 미지정 시 `Bytes`, `"utf8"` 지정 시 `string`.
|
|
40
|
-
|
|
41
|
-
사용 예:
|
|
42
|
-
|
|
43
|
-
```ts
|
|
44
|
-
if (!(await FileSystem.checkPermissions())) await FileSystem.requestPermissions();
|
|
45
|
-
const root = await FileSystem.getStoragePath("externalFiles");
|
|
46
|
-
await FileSystem.mkdir(`${root}/logs`);
|
|
47
|
-
await FileSystem.writeFile(`${root}/logs/a.txt`, "hello");
|
|
48
|
-
const files = await FileSystem.readdir(`${root}/logs`);
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## FileInfo / StorageType
|
|
52
|
-
|
|
53
|
-
```ts
|
|
54
|
-
interface FileInfo { name: string; isDirectory: boolean; }
|
|
55
|
-
|
|
56
|
-
type StorageType =
|
|
57
|
-
| "external" // 외부 저장소 루트 (Environment.getExternalStorageDirectory)
|
|
58
|
-
| "externalFiles" // 앱 전용 외부 파일
|
|
59
|
-
| "externalCache" // 앱 전용 외부 캐시
|
|
60
|
-
| "externalMedia" // 앱 전용 외부 미디어
|
|
61
|
-
| "appData" // 앱 데이터
|
|
62
|
-
| "appFiles" // 앱 파일
|
|
63
|
-
| "appCache"; // 앱 캐시
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## FileSystemPlugin
|
|
67
|
-
|
|
68
|
-
저수준 Capacitor 인터페이스. `FileSystem` 의 모든 정적 메서드가 위임 대상. 직접 사용 시 `writeFile`/`readFile` 의 `encoding` 은 `"utf8" | "base64"`, `data` 는 항상 `string`.
|
|
69
|
-
|
|
70
|
-
```ts
|
|
71
|
-
interface FileSystemPlugin {
|
|
72
|
-
checkPermissions(): Promise<{ granted: boolean }>;
|
|
73
|
-
requestPermissions(): Promise<void>;
|
|
74
|
-
readdir(options: { path: string }): Promise<{ files: FileInfo[] }>;
|
|
75
|
-
getStoragePath(options: { type: StorageType }): Promise<{ path: string }>;
|
|
76
|
-
getUri(options: { path: string }): Promise<{ uri: string }>;
|
|
77
|
-
writeFile(options: { path: string; data: string; encoding?: "utf8" | "base64" }): Promise<void>;
|
|
78
|
-
readFile(options: { path: string; encoding?: "utf8" | "base64" }): Promise<{ data: string }>;
|
|
79
|
-
remove(options: { path: string }): Promise<void>;
|
|
80
|
-
mkdir(options: { path: string }): Promise<void>;
|
|
81
|
-
exists(options: { path: string }): Promise<{ exists: boolean }>;
|
|
82
|
-
}
|
|
83
|
-
```
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
# @simplysm/capacitor-plugin-intent
|
|
2
|
-
|
|
3
|
-
Android 인텐트 송수신·외부 Activity 실행용 Capacitor 플러그인. 산업용 디바이스 연동(바코드 스캐너·PDA 등). 웹은 stub(경고 로그 + no-op).
|
|
4
|
-
|
|
5
|
-
## 사용 트리거 인덱스
|
|
6
|
-
|
|
7
|
-
- **`Intent.subscribe` / `Intent.unsubscribeAll`** — 외부 앱이 보내는 브로드캐스트 액션을 앱에서 수신할 때 (스캐너 RESULT 등).
|
|
8
|
-
- **`Intent.send`** — 외부 앱(DataWedge 등)에 브로드캐스트 명령을 송신할 때.
|
|
9
|
-
- **`Intent.getLaunchIntent`** — 앱을 기동시킨 인텐트의 action/extras 를 읽을 때.
|
|
10
|
-
- **`Intent.addListener("newIntent", …)` / `Intent.removeAllListeners`** — 이미 실행 중인 앱에 들어오는 새 인텐트를 받을 때 (`singleTask`/`singleTop` launchMode 필요).
|
|
11
|
-
- **`Intent.startActivityForResult`** — 외부 Activity 를 실행하고 결과 코드/데이터를 받을 때 (결제·인증 모듈 등).
|
|
12
|
-
|
|
13
|
-
## `Intent` (abstract class, static only)
|
|
14
|
-
|
|
15
|
-
`new` 금지, 정적 메서드만 호출.
|
|
16
|
-
|
|
17
|
-
### `subscribe(filters, callback): Promise<() => Promise<void>>`
|
|
18
|
-
|
|
19
|
-
- `filters: string[]` — 수신할 Intent action 문자열 배열.
|
|
20
|
-
- `callback: (result: IntentResult) => void` — 매 수신마다 호출. 등록 직후의 빈 resolve(`action == null`)는 내부 필터로 콜백 호출 X.
|
|
21
|
-
- 반환: 해당 구독만 해제하는 함수.
|
|
22
|
-
|
|
23
|
-
```ts
|
|
24
|
-
const unsub = await Intent.subscribe(
|
|
25
|
-
["com.symbol.datawedge.api.RESULT_ACTION"],
|
|
26
|
-
(r) => console.log(r.extras),
|
|
27
|
-
);
|
|
28
|
-
await unsub();
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### `unsubscribeAll(): Promise<void>`
|
|
32
|
-
|
|
33
|
-
`subscribe` 로 등록된 모든 수신기 해제.
|
|
34
|
-
|
|
35
|
-
### `send({ action, extras? }): Promise<void>`
|
|
36
|
-
|
|
37
|
-
- `action: string` — 송신할 브로드캐스트 action.
|
|
38
|
-
- `extras?: Record<string, unknown>` — 함께 보낼 키/값.
|
|
39
|
-
|
|
40
|
-
```ts
|
|
41
|
-
await Intent.send({
|
|
42
|
-
action: "com.symbol.datawedge.api.ACTION",
|
|
43
|
-
extras: { "com.symbol.datawedge.api.SOFT_SCAN_TRIGGER": "TOGGLE_SCANNING" },
|
|
44
|
-
});
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### `getLaunchIntent(): Promise<IntentResult>`
|
|
48
|
-
|
|
49
|
-
앱을 기동시킨 인텐트의 action/extras 반환. 웹은 `{}`.
|
|
50
|
-
|
|
51
|
-
### `addListener("newIntent", callback): Promise<PluginListenerHandle>`
|
|
52
|
-
|
|
53
|
-
- `eventName: "newIntent"` — 고정 리터럴. Android `onNewIntent` 수신 시점에 호출.
|
|
54
|
-
- 반환 핸들의 `handle.remove()` 로 개별 해제.
|
|
55
|
-
|
|
56
|
-
### `removeAllListeners(): Promise<void>`
|
|
57
|
-
|
|
58
|
-
`addListener` 등록 전체 제거.
|
|
59
|
-
|
|
60
|
-
### `startActivityForResult(options): Promise<StartActivityForResultResult>`
|
|
61
|
-
|
|
62
|
-
`StartActivityForResultOptions` (모두 선택, 최소 1개로 대상 결정):
|
|
63
|
-
|
|
64
|
-
- `action?: string` — Intent action.
|
|
65
|
-
- `uri?: string` — `setData()` URI.
|
|
66
|
-
- `extras?: Record<string, unknown>` — 전달 extras.
|
|
67
|
-
- `type?: string` — MIME type (`setType()`).
|
|
68
|
-
- `packageName?: string` — 대상 앱 패키지 한정.
|
|
69
|
-
- `className?: string` — 대상 Activity FQCN 한정.
|
|
70
|
-
- `flags?: number` — Intent flags 비트마스크 (Android `Intent.FLAG_*`).
|
|
71
|
-
|
|
72
|
-
반환 `StartActivityForResultResult`:
|
|
73
|
-
|
|
74
|
-
- `resultCode: number` — Android 결과 코드. `-1` = `RESULT_OK`, `0` = `RESULT_CANCELED`, 그 외 앱 정의 값.
|
|
75
|
-
- `data?: { action?, uri?, extras? }` — 결과 Intent 의 action/uri/extras.
|
|
76
|
-
|
|
77
|
-
```ts
|
|
78
|
-
const r = await Intent.startActivityForResult({ action: "com.example.PAY", extras: { amount: 1000 } });
|
|
79
|
-
if (r.resultCode === -1) { /* OK */ }
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## 타입
|
|
83
|
-
|
|
84
|
-
- `IntentResult { action?: string; extras?: Record<string, unknown> }` — 수신/조회 결과 공통 형태.
|
|
85
|
-
- `StartActivityForResultOptions` / `StartActivityForResultResult` — 위 메서드 시그니처 참조.
|
|
86
|
-
- `IntentPlugin` — Capacitor `registerPlugin` 용 저수준 인터페이스. 커스텀 래핑이 필요할 때만 참조, 일반 사용은 `Intent` static API.
|
|
87
|
-
|
|
88
|
-
## 플랫폼 동작
|
|
89
|
-
|
|
90
|
-
- Android: 네이티브 구현.
|
|
91
|
-
- Web(`IntentWeb`): `subscribe`/`send`/`startActivityForResult` 는 `consola.withTag("capacitor:intent").warn("웹 환경에서는 지원하지 않습니다.")` 후 stub 반환 (`subscribe` → `{ id: "web-stub" }`, `startActivityForResult` → `{ resultCode: 0 }`, `send` → void). `getLaunchIntent` 는 `{}`, `unsubscribe`/`unsubscribeAll` 은 조용히 no-op.
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
# @simplysm/capacitor-plugin-usb-storage
|
|
2
|
-
|
|
3
|
-
USB Mass Storage 접근용 Capacitor 플러그인 (Android: libaums, Browser: IndexedDB 가상 USB 에뮬레이션).
|
|
4
|
-
|
|
5
|
-
## 사용 트리거 인덱스
|
|
6
|
-
|
|
7
|
-
- **`UsbStorage`** — 정적 메서드로 장치 목록·권한·디렉토리·파일 읽기. USB 저장 장치에서 데이터를 가져올 때.
|
|
8
|
-
- **`UsbDeviceInfo` / `UsbDeviceFilter` / `UsbFileInfo`** — 인자·반환 타입. 호출부 타입 선언에.
|
|
9
|
-
- **`UsbStoragePlugin`** — 원시 Capacitor 플러그인 인터페이스. `UsbStorage` 래퍼로 충분하면 직접 사용 X.
|
|
10
|
-
|
|
11
|
-
## UsbStorage
|
|
12
|
-
|
|
13
|
-
모든 메서드 `static async`. 장치 식별은 `{ vendorId, productId }` (`UsbDeviceFilter`) 로 한다.
|
|
14
|
-
|
|
15
|
-
```ts
|
|
16
|
-
import { UsbStorage } from "@simplysm/capacitor-plugin-usb-storage";
|
|
17
|
-
|
|
18
|
-
const devices = await UsbStorage.getDevices(); // UsbDeviceInfo[]
|
|
19
|
-
const filter = { vendorId: devices[0].vendorId, productId: devices[0].productId };
|
|
20
|
-
|
|
21
|
-
if (!(await UsbStorage.checkPermissions(filter))) {
|
|
22
|
-
if (!(await UsbStorage.requestPermissions(filter))) return; // boolean
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const files = await UsbStorage.readdir(filter, "/"); // UsbFileInfo[]
|
|
26
|
-
const data = await UsbStorage.readFile(filter, "/a.txt"); // Bytes | undefined
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
- `getDevices()` — 연결된 USB 장치 전체 반환.
|
|
30
|
-
- `requestPermissions(filter)` — 해당 장치 접근 권한 요청. `true` = 사용자가 승인, `false` = 거부. 사용자 인터랙션 유발.
|
|
31
|
-
- `checkPermissions(filter)` — 현재 권한 보유 여부 조회. 인터랙션 없음. `true` 면 곧바로 read 호출 가능.
|
|
32
|
-
- `readdir(filter, dirPath)` — 디렉토리 항목 목록 (`UsbFileInfo[]`).
|
|
33
|
-
- `readFile(filter, filePath)` — 파일 바이트. 없으면 `undefined`. 내부에서 base64 → `Bytes`(@simplysm/core-common) 변환.
|
|
34
|
-
|
|
35
|
-
## 타입
|
|
36
|
-
|
|
37
|
-
`UsbDeviceInfo` — `getDevices()` 반환 원소.
|
|
38
|
-
- `deviceName` — OS 가 부여한 장치 노드 이름 (예: `/dev/bus/usb/001/002`).
|
|
39
|
-
- `manufacturerName` — 제조사 문자열.
|
|
40
|
-
- `productName` — 제품명 문자열.
|
|
41
|
-
- `vendorId` / `productId` — USB VID/PID 정수. 다른 메서드의 `filter` 로 그대로 사용.
|
|
42
|
-
|
|
43
|
-
`UsbDeviceFilter` — 장치 식별 인자. `vendorId`, `productId` 두 정수만.
|
|
44
|
-
|
|
45
|
-
`UsbFileInfo` — `readdir` 반환 원소.
|
|
46
|
-
- `name` — 항목 이름 (디렉토리 내 상대명, 경로 X).
|
|
47
|
-
- `isDirectory` — `true` = 하위 디렉토리(다시 `readdir` 호출 대상), `false` = 파일(`readFile` 호출 대상).
|
|
48
|
-
|
|
49
|
-
`UsbStoragePlugin` — Capacitor `registerPlugin` 원시 인터페이스. 메서드 반환이 `{ devices }`/`{ granted }`/`{ files }`/`{ data: string | null }` 형태의 base64 raw 응답. `UsbStorage` 가 이를 풀어 `Bytes`·`boolean` 등으로 변환해 노출.
|