@designbasekorea/figma-license-core 0.1.0

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 ADDED
@@ -0,0 +1,59 @@
1
+ # @designbasekorea/figma-license-core
2
+
3
+ Figma 플러그인의 라이선스 검증/비활성화/상태 동기화를 공통으로 처리하는 패키지입니다.
4
+
5
+ ## 핵심 포인트
6
+
7
+ - `LicenseCore`: 순수 로직 (상태, 검증, 에러 매핑, 활성화 제한 판별)
8
+ - `FigmaStorageAdapter` / `FigmaNotifierAdapter`: Figma 전용 어댑터
9
+ - `FigmaLicenseStatusManager`: `initialize`, `verify-license`, `deactivate-license` 메시지 처리
10
+ - `LicenseConfig` 주입 방식으로 플러그인별 하드코딩 제거
11
+
12
+ ## 빠른 시작
13
+
14
+ ```ts
15
+ import { createFigmaLicenseStatusManager } from '@designbasekorea/figma-license-core';
16
+
17
+ const statusManager = createFigmaLicenseStatusManager({
18
+ config: {
19
+ productId: 'my-plugin',
20
+ endpoint: 'https://api.example.com/license/verify',
21
+ deactivateEndpoint: 'https://api.example.com/license/deactivate',
22
+ instanceName: figma.root?.name || 'figma-plugin',
23
+ usageLimit: 20,
24
+ storagePrefix: 'my-plugin-license',
25
+ },
26
+ });
27
+
28
+ statusManager.bindToOnMessage(async (msg) => {
29
+ if ((msg as { type?: string }).type === 'process') {
30
+ // 기존 플러그인 로직
31
+ }
32
+ });
33
+
34
+ await statusManager.initialize();
35
+ ```
36
+
37
+ ## UI 이벤트 계약
38
+
39
+ ### UI -> Main
40
+
41
+ - `initialize`
42
+ - `verify-license` (`licenseKey` 포함)
43
+ - `deactivate-license`
44
+
45
+ ### Main -> UI
46
+
47
+ - `update-plugin-status`
48
+ - `license-verification-result`
49
+ - `license-deactivation-result`
50
+
51
+ 에러는 `errorCode` 값으로 전달됩니다.
52
+
53
+ - `ACTIVATION_LIMIT_REACHED`
54
+ - `INVALID_LICENSE`
55
+ - `PRODUCT_MISMATCH`
56
+ - `NETWORK_ERROR`
57
+ - `STORAGE_ERROR`
58
+ - `SERVER_ERROR`
59
+ - `UNKNOWN_ERROR`
@@ -0,0 +1,23 @@
1
+ import { DeactivateLicensePayload, DeactivateLicenseResult, LicenseTransport, VerifyLicensePayload, VerifyLicenseResult } from './types';
2
+ export declare function defaultNormalizeVerifyResponse(raw: unknown): VerifyLicenseResult;
3
+ export declare function defaultNormalizeDeactivateResponse(raw: unknown): DeactivateLicenseResult;
4
+ export interface FetchLicenseTransportConfig {
5
+ verifyUrl: string;
6
+ deactivateUrl?: string;
7
+ headers?: Record<string, string>;
8
+ timeoutMs?: number;
9
+ fetchFn?: typeof fetch;
10
+ buildVerifyBody?: (payload: VerifyLicensePayload) => unknown;
11
+ buildDeactivateBody?: (payload: DeactivateLicensePayload) => unknown;
12
+ normalizeVerifyResponse?: (raw: unknown) => VerifyLicenseResult;
13
+ normalizeDeactivateResponse?: (raw: unknown) => DeactivateLicenseResult;
14
+ }
15
+ export declare class FetchLicenseTransport implements LicenseTransport {
16
+ private readonly config;
17
+ private readonly fetchFn;
18
+ constructor(config: FetchLicenseTransportConfig);
19
+ verify(payload: VerifyLicensePayload): Promise<VerifyLicenseResult>;
20
+ deactivate(payload: DeactivateLicensePayload): Promise<DeactivateLicenseResult>;
21
+ private postJson;
22
+ }
23
+ //# sourceMappingURL=fetchLicenseTransport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchLicenseTransport.d.ts","sourceRoot":"","sources":["../src/fetchLicenseTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,SAAS,CAAC;AA4CjB,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,OAAO,GAAG,mBAAmB,CAmChF;AAED,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,OAAO,GAAG,uBAAuB,CAexF;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC;IAC7D,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,OAAO,CAAC;IACrE,uBAAuB,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,mBAAmB,CAAC;IAChE,2BAA2B,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,uBAAuB,CAAC;CACzE;AAED,qBAAa,qBAAsB,YAAW,gBAAgB;IAGhD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;gBAEV,MAAM,EAAE,2BAA2B;IAQ1D,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAUnE,UAAU,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC;YAevE,QAAQ;CA8BvB"}
@@ -0,0 +1,69 @@
1
+ import { LicenseCore } from './licenseCore';
2
+ import { LicenseConfig, LicenseManagerMessageTypes, LicenseNotifierAdapter, LicenseStorageAdapter, LicenseTransport } from './types';
3
+ export interface FigmaClientStorageLike {
4
+ getAsync(key: string): Promise<unknown>;
5
+ setAsync(key: string, value: unknown): Promise<void>;
6
+ deleteAsync?(key: string): Promise<void>;
7
+ }
8
+ export interface FigmaUiLike {
9
+ postMessage(message: unknown): void;
10
+ onmessage?: (pluginMessage: unknown) => void | Promise<void>;
11
+ }
12
+ export interface FigmaApiLike {
13
+ clientStorage: FigmaClientStorageLike;
14
+ ui: FigmaUiLike;
15
+ notify?: (message: string, options?: {
16
+ error?: boolean;
17
+ timeout?: number;
18
+ }) => void;
19
+ }
20
+ export declare class FigmaStorageAdapter implements LicenseStorageAdapter {
21
+ private readonly figma;
22
+ constructor(figma: FigmaApiLike);
23
+ get<T = unknown>(key: string): Promise<T | undefined>;
24
+ set<T = unknown>(key: string, value: T): Promise<void>;
25
+ delete(key: string): Promise<void>;
26
+ }
27
+ export declare class FigmaNotifierAdapter implements LicenseNotifierAdapter {
28
+ private readonly figma;
29
+ constructor(figma: FigmaApiLike);
30
+ notify(message: string, options?: {
31
+ error?: boolean;
32
+ timeout?: number;
33
+ }): void;
34
+ }
35
+ export interface FigmaLicenseStatusManagerOptions {
36
+ figma: FigmaApiLike;
37
+ core: LicenseCore;
38
+ notifier?: LicenseNotifierAdapter;
39
+ messageTypes?: Partial<LicenseManagerMessageTypes>;
40
+ }
41
+ export interface FigmaLicenseMessage {
42
+ type: string;
43
+ [key: string]: unknown;
44
+ }
45
+ export declare class FigmaLicenseStatusManager {
46
+ private readonly options;
47
+ private readonly messageTypes;
48
+ private readonly notifier?;
49
+ constructor(options: FigmaLicenseStatusManagerOptions);
50
+ initialize(): Promise<void>;
51
+ handleMessage(pluginMessage: unknown): Promise<boolean>;
52
+ bindToOnMessage(fallbackHandler?: (pluginMessage: unknown) => void | Promise<void>): void;
53
+ private handleVerifyLicense;
54
+ private handleDeactivateLicense;
55
+ private postStatusUpdate;
56
+ private postMessage;
57
+ private notifyError;
58
+ }
59
+ export interface CreateFigmaLicenseStatusManagerOptions {
60
+ config: LicenseConfig;
61
+ figma?: FigmaApiLike;
62
+ transport?: LicenseTransport;
63
+ storage?: LicenseStorageAdapter;
64
+ notifier?: LicenseNotifierAdapter;
65
+ messageTypes?: Partial<LicenseManagerMessageTypes>;
66
+ fetchFn?: typeof fetch;
67
+ }
68
+ export declare function createFigmaLicenseStatusManager(options: CreateFigmaLicenseStatusManagerOptions): FigmaLicenseStatusManager;
69
+ //# sourceMappingURL=figmaStatusManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figmaStatusManager.d.ts","sourceRoot":"","sources":["../src/figmaStatusManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from './types';
2
+ export * from './licenseErrorMapper';
3
+ export * from './licenseCore';
4
+ export * from './fetchLicenseTransport';
5
+ export * from './figmaStatusManager';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC"}