@context-action/core 0.0.1 → 0.0.3

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/index.js CHANGED
@@ -1,6 +1,3 @@
1
- import React, { createContext, useContext, useEffect, useId, useRef } from "react";
2
- import { jsx } from "react/jsx-runtime";
3
-
4
1
  //#region rolldown:runtime
5
2
  var __create = Object.create;
6
3
  var __defProp = Object.defineProperty;
@@ -73,7 +70,7 @@ var require_toPropertyKey = __commonJS({ "../../node_modules/.pnpm/@oxc-project+
73
70
  //#region ../../node_modules/.pnpm/@oxc-project+runtime@0.77.3/node_modules/@oxc-project/runtime/src/helpers/defineProperty.js
74
71
  var require_defineProperty = __commonJS({ "../../node_modules/.pnpm/@oxc-project+runtime@0.77.3/node_modules/@oxc-project/runtime/src/helpers/defineProperty.js"(exports, module) {
75
72
  var toPropertyKey = require_toPropertyKey();
76
- function _defineProperty$1(e, r, t) {
73
+ function _defineProperty$2(e, r, t) {
77
74
  return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
78
75
  value: t,
79
76
  enumerable: !0,
@@ -81,68 +78,311 @@ var require_defineProperty = __commonJS({ "../../node_modules/.pnpm/@oxc-project
81
78
  writable: !0
82
79
  }) : e[r] = t, e;
83
80
  }
84
- module.exports = _defineProperty$1, module.exports.__esModule = true, module.exports["default"] = module.exports;
81
+ module.exports = _defineProperty$2, module.exports.__esModule = true, module.exports["default"] = module.exports;
85
82
  } });
86
83
 
87
84
  //#endregion
88
- //#region src/core/ActionRegister.ts
85
+ //#region src/logger.ts
86
+ var import_defineProperty$1 = __toESM(require_defineProperty(), 1);
87
+ /**
88
+ * Log levels in order of severity (lowest to highest)
89
+ */
90
+ let LogLevel = /* @__PURE__ */ function(LogLevel$1) {
91
+ LogLevel$1[LogLevel$1["TRACE"] = 0] = "TRACE";
92
+ LogLevel$1[LogLevel$1["DEBUG"] = 1] = "DEBUG";
93
+ LogLevel$1[LogLevel$1["INFO"] = 2] = "INFO";
94
+ LogLevel$1[LogLevel$1["WARN"] = 3] = "WARN";
95
+ LogLevel$1[LogLevel$1["ERROR"] = 4] = "ERROR";
96
+ LogLevel$1[LogLevel$1["FATAL"] = 5] = "FATAL";
97
+ return LogLevel$1;
98
+ }({});
99
+ /**
100
+ * Default console logger implementation
101
+ */
102
+ var ConsoleLogger = class {
103
+ constructor(level = LogLevel.ERROR) {
104
+ this.level = level;
105
+ }
106
+ shouldLog(level) {
107
+ return level >= this.level;
108
+ }
109
+ formatMessage(level, message) {
110
+ return `[${level.toUpperCase()}] ${message}`;
111
+ }
112
+ trace(message, ...args) {
113
+ if (this.shouldLog(LogLevel.TRACE)) console.trace(this.formatMessage("trace", message), ...args);
114
+ }
115
+ debug(message, ...args) {
116
+ if (this.shouldLog(LogLevel.DEBUG)) console.debug(this.formatMessage("debug", message), ...args);
117
+ }
118
+ info(message, ...args) {
119
+ if (this.shouldLog(LogLevel.INFO)) console.info(this.formatMessage("info", message), ...args);
120
+ }
121
+ warn(message, ...args) {
122
+ if (this.shouldLog(LogLevel.WARN)) console.warn(this.formatMessage("warn", message), ...args);
123
+ }
124
+ error(message, ...args) {
125
+ if (this.shouldLog(LogLevel.ERROR)) console.error(this.formatMessage("error", message), ...args);
126
+ }
127
+ fatal(message, ...args) {
128
+ if (this.shouldLog(LogLevel.FATAL)) console.error(this.formatMessage("fatal", message), ...args);
129
+ }
130
+ setLevel(level) {
131
+ this.level = level;
132
+ }
133
+ };
134
+ /**
135
+ * Parse log level from string
136
+ */
137
+ function parseLogLevel(level) {
138
+ const upperLevel = level.toUpperCase();
139
+ switch (upperLevel) {
140
+ case "TRACE": return LogLevel.TRACE;
141
+ case "DEBUG": return LogLevel.DEBUG;
142
+ case "INFO": return LogLevel.INFO;
143
+ case "WARN": return LogLevel.WARN;
144
+ case "ERROR": return LogLevel.ERROR;
145
+ case "FATAL": return LogLevel.FATAL;
146
+ default: return LogLevel.ERROR;
147
+ }
148
+ }
149
+ /**
150
+ * Get log level from environment variable or default to ERROR
151
+ */
152
+ function getLogLevelFromEnv() {
153
+ if (typeof process !== "undefined" && process.env) {
154
+ const envLevel = process.env.LOG_LEVEL || process.env.ACTION_LOG_LEVEL;
155
+ if (envLevel) return parseLogLevel(envLevel);
156
+ }
157
+ return LogLevel.TRACE;
158
+ }
159
+ /**
160
+ * Extract trace ID from payload if it exists
161
+ */
162
+ function extractTraceIdFromPayload(payload) {
163
+ if (payload && typeof payload === "object") return payload._traceId || payload.traceId || payload.trace_id;
164
+ return void 0;
165
+ }
166
+ /**
167
+ * Extract session ID from payload if it exists
168
+ */
169
+ function extractSessionIdFromPayload(payload) {
170
+ if (payload && typeof payload === "object") return payload._sessionId || payload.sessionId || payload.session_id;
171
+ return void 0;
172
+ }
173
+ /**
174
+ * Create OTEL context from payload
175
+ */
176
+ function createOtelContextFromPayload(payload) {
177
+ return {
178
+ traceId: extractTraceIdFromPayload(payload),
179
+ sessionId: extractSessionIdFromPayload(payload),
180
+ metadata: payload
181
+ };
182
+ }
183
+ /**
184
+ * OpenTelemetry-aware console logger implementation
185
+ */
186
+ var OtelConsoleLogger = class extends ConsoleLogger {
187
+ constructor(level = LogLevel.ERROR) {
188
+ super(level);
189
+ (0, import_defineProperty$1.default)(this, "context", {});
190
+ }
191
+ setContext(context) {
192
+ this.context = {
193
+ ...this.context,
194
+ ...context
195
+ };
196
+ }
197
+ getContext() {
198
+ return { ...this.context };
199
+ }
200
+ clearContext() {
201
+ this.context = {};
202
+ }
203
+ formatWithContext(level, message) {
204
+ const contextParts = [];
205
+ if (this.context.sessionId) contextParts.push(`session=${this.context.sessionId}`);
206
+ if (this.context.traceId) contextParts.push(`trace=${this.context.traceId}`);
207
+ if (this.context.spanId) contextParts.push(`span=${this.context.spanId}`);
208
+ const contextStr = contextParts.length > 0 ? ` [${contextParts.join(", ")}]` : "";
209
+ return `[${level.toUpperCase()}]${contextStr} ${message}`;
210
+ }
211
+ logWithContext(level, message, ...args) {
212
+ const levelName = LogLevel[level].toLowerCase();
213
+ const formattedMessage = this.formatWithContext(levelName, message);
214
+ switch (level) {
215
+ case LogLevel.TRACE:
216
+ if (this.shouldLog(LogLevel.TRACE)) console.trace(formattedMessage, ...args);
217
+ break;
218
+ case LogLevel.DEBUG:
219
+ if (this.shouldLog(LogLevel.DEBUG)) console.debug(formattedMessage, ...args);
220
+ break;
221
+ case LogLevel.INFO:
222
+ if (this.shouldLog(LogLevel.INFO)) console.info(formattedMessage, ...args);
223
+ break;
224
+ case LogLevel.WARN:
225
+ if (this.shouldLog(LogLevel.WARN)) console.warn(formattedMessage, ...args);
226
+ break;
227
+ case LogLevel.ERROR:
228
+ if (this.shouldLog(LogLevel.ERROR)) console.error(formattedMessage, ...args);
229
+ break;
230
+ case LogLevel.FATAL:
231
+ if (this.shouldLog(LogLevel.FATAL)) console.error(formattedMessage, ...args);
232
+ break;
233
+ }
234
+ }
235
+ trace(message, ...args) {
236
+ this.logWithContext(LogLevel.TRACE, message, ...args);
237
+ }
238
+ debug(message, ...args) {
239
+ this.logWithContext(LogLevel.DEBUG, message, ...args);
240
+ }
241
+ info(message, ...args) {
242
+ this.logWithContext(LogLevel.INFO, message, ...args);
243
+ }
244
+ warn(message, ...args) {
245
+ this.logWithContext(LogLevel.WARN, message, ...args);
246
+ }
247
+ error(message, ...args) {
248
+ this.logWithContext(LogLevel.ERROR, message, ...args);
249
+ }
250
+ fatal(message, ...args) {
251
+ this.logWithContext(LogLevel.FATAL, message, ...args);
252
+ }
253
+ };
254
+
255
+ //#endregion
256
+ //#region src/ActionRegister.ts
89
257
  var import_defineProperty = __toESM(require_defineProperty(), 1);
258
+ /**
259
+ * Core action pipeline management system
260
+ * @template T - Action payload map defining available actions and their payload types
261
+ * @example
262
+ * ```typescript
263
+ * interface AppActions extends ActionPayloadMap {
264
+ * increment: void;
265
+ * setCount: number;
266
+ * }
267
+ *
268
+ * const actionRegister = new ActionRegister<AppActions>();
269
+ *
270
+ * // Register handlers
271
+ * actionRegister.register('increment', () => console.log('Incremented'));
272
+ * actionRegister.register('setCount', (count) => console.log(`Count: ${count}`));
273
+ *
274
+ * // Dispatch actions
275
+ * await actionRegister.dispatch('increment');
276
+ * await actionRegister.dispatch('setCount', 42);
277
+ * ```
278
+ */
90
279
  var ActionRegister = class {
91
- constructor() {
280
+ constructor(config) {
92
281
  (0, import_defineProperty.default)(this, "pipelines", /* @__PURE__ */ new Map());
93
282
  (0, import_defineProperty.default)(this, "atomSetters", /* @__PURE__ */ new Map());
283
+ (0, import_defineProperty.default)(this, "handlerCounter", 0);
284
+ (0, import_defineProperty.default)(this, "logger", void 0);
285
+ const envLogLevel = getLogLevelFromEnv();
286
+ const configLogLevel = config?.logLevel ?? envLogLevel;
287
+ if (config?.logger) this.logger = config.logger;
288
+ else if (config?.useOtel) this.logger = new OtelConsoleLogger(configLogLevel);
289
+ else this.logger = new ConsoleLogger(configLogLevel);
290
+ if (config?.otelContext && this.logger instanceof OtelConsoleLogger) this.logger.setContext(config.otelContext);
291
+ this.logger.debug("ActionRegister initialized", {
292
+ logLevel: configLogLevel,
293
+ useOtel: config?.useOtel ?? false,
294
+ hasOtelContext: !!config?.otelContext
295
+ });
94
296
  }
297
+ /**
298
+ * Register a handler for an action in the pipeline
299
+ * @param action - The action name to handle
300
+ * @param handler - The handler function to execute
301
+ * @param config - Optional configuration for the handler
302
+ * @returns Unregister function to remove the handler
303
+ * @example
304
+ * ```typescript
305
+ * const unregister = actionRegister.register('increment', () => {
306
+ * console.log('Incremented!');
307
+ * }, { priority: 10 });
308
+ *
309
+ * // Later, remove the handler
310
+ * unregister();
311
+ * ```
312
+ */
95
313
  register(action, handler, config = {}) {
96
- if (!this.pipelines.has(action)) this.pipelines.set(action, /* @__PURE__ */ new Map());
314
+ if (!this.pipelines.has(action)) {
315
+ this.pipelines.set(action, /* @__PURE__ */ new Map());
316
+ this.logger.debug(`Created new pipeline for action: ${String(action)}`);
317
+ }
97
318
  const pipeline = this.pipelines.get(action);
98
- const handlerId = config.id || `handler_${Date.now()}_${Math.random()}`;
319
+ const handlerId = config.id || `handler_${++this.handlerCounter}`;
99
320
  if (pipeline.has(handlerId)) {
100
- console.warn(`Handler with id ${handlerId} already exists`);
321
+ this.logger.warn(`Handler with id ${handlerId} already exists for action: ${String(action)}`);
101
322
  return () => {};
102
323
  }
103
324
  pipeline.set(handlerId, {
104
325
  handler,
105
326
  config
106
327
  });
328
+ this.logger.debug(`Registered handler for action: ${String(action)}`, {
329
+ handlerId,
330
+ priority: config.priority ?? 0,
331
+ blocking: config.blocking ?? false
332
+ });
107
333
  this.sortPipeline(action);
108
334
  return () => {
109
335
  pipeline.delete(handlerId);
336
+ this.logger.debug(`Unregistered handler: ${handlerId} for action: ${String(action)}`);
110
337
  };
111
338
  }
112
339
  registerAtomSetter(name, setter) {
113
340
  this.atomSetters.set(name, setter);
341
+ this.logger.debug(`Registered atom setter: ${name}`);
114
342
  }
343
+ /**
344
+ * Internal dispatch implementation
345
+ * @internal
346
+ */
115
347
  async dispatch(action, payload) {
116
348
  const pipeline = this.pipelines.get(action);
349
+ if (this.logger instanceof OtelConsoleLogger && payload) {
350
+ const otelContext = createOtelContextFromPayload(payload);
351
+ if (otelContext.traceId || otelContext.sessionId) this.logger.setContext(otelContext);
352
+ }
353
+ this.logger.debug(`Dispatching action: ${String(action)}`, { payload });
117
354
  if (!pipeline || pipeline.size === 0) {
118
- console.warn(`No handlers registered for action: ${String(action)}`);
355
+ this.logger.warn(`No handlers registered for action: ${String(action)}`);
119
356
  return;
120
357
  }
121
358
  let modifiedPayload = payload;
122
359
  const handlers = Array.from(pipeline.values());
360
+ let shouldContinue = true;
361
+ this.logger.trace(`Executing pipeline for action: ${String(action)}`, { handlerCount: handlers.length });
123
362
  for (const { handler, config } of handlers) {
124
- let shouldContinue = true;
363
+ if (!shouldContinue) break;
125
364
  const controller = {
126
365
  next: () => {
127
366
  shouldContinue = true;
128
367
  },
129
368
  abort: (reason) => {
130
369
  shouldContinue = false;
131
- console.log(`Pipeline aborted: ${reason}`);
370
+ this.logger.warn(`Pipeline aborted: ${reason}`);
132
371
  },
133
372
  modifyPayload: (modifier) => {
134
373
  modifiedPayload = modifier(modifiedPayload);
374
+ this.logger.trace(`Payload modified for action: ${String(action)}`);
135
375
  }
136
376
  };
137
377
  try {
138
378
  if (config.blocking) await handler(modifiedPayload, controller);
139
379
  else handler(modifiedPayload, controller);
140
- if (!shouldContinue) break;
141
380
  } catch (error) {
142
- console.error(`Error in pipeline handler:`, error);
381
+ this.logger.error(`Error in pipeline handler for action: ${String(action)}`, error);
143
382
  if (config.blocking) throw error;
144
383
  }
145
384
  }
385
+ this.logger.debug(`Completed dispatching action: ${String(action)}`);
146
386
  }
147
387
  sortPipeline(action) {
148
388
  const pipeline = this.pipelines.get(action);
@@ -154,11 +394,15 @@ var ActionRegister = class {
154
394
  });
155
395
  pipeline.clear();
156
396
  sorted.forEach(([id, data]) => pipeline.set(id, data));
397
+ this.logger.trace(`Sorted pipeline for action: ${String(action)}`, {
398
+ handlerCount: sorted.length,
399
+ priorities: sorted.map(([, data]) => data.config.priority ?? 0)
400
+ });
157
401
  }
158
402
  };
159
403
 
160
404
  //#endregion
161
- //#region src/core/types.ts
405
+ //#region src/types.ts
162
406
  function createAction(type, payload) {
163
407
  return {
164
408
  type,
@@ -170,54 +414,5 @@ function isAction(action, type) {
170
414
  }
171
415
 
172
416
  //#endregion
173
- //#region src/react/ActionContext.tsx
174
- /**
175
- * ActionRegister를 Context로 공유할 수 있는 헬퍼 함수
176
- * @returns Provider, hooks를 포함한 객체
177
- */
178
- function createActionContext() {
179
- const ActionContext = createContext(null);
180
- const Provider = ({ children }) => {
181
- const actionRegisterRef = useRef(new ActionRegister());
182
- return /* @__PURE__ */ jsx(ActionContext.Provider, {
183
- value: { actionRegisterRef },
184
- children
185
- });
186
- };
187
- const useActionContext = () => {
188
- const context = useContext(ActionContext);
189
- if (!context) throw new Error("useActionContext must be used within Provider");
190
- return context;
191
- };
192
- const useAction = () => {
193
- const { actionRegisterRef } = useActionContext();
194
- return actionRegisterRef.current;
195
- };
196
- const useActionHandler = (action, handler, config) => {
197
- const actionRegister = useAction();
198
- const componentId = useId();
199
- useEffect(() => {
200
- const unregister = actionRegister.register(action, handler, {
201
- ...config,
202
- id: config?.id || componentId
203
- });
204
- return unregister;
205
- }, [
206
- action,
207
- handler,
208
- config,
209
- componentId,
210
- actionRegister
211
- ]);
212
- };
213
- return {
214
- Provider,
215
- useActionContext,
216
- useAction,
217
- useActionHandler
218
- };
219
- }
220
-
221
- //#endregion
222
- export { ActionRegister, createAction, createActionContext, isAction };
417
+ export { ActionRegister, ConsoleLogger, LogLevel, OtelConsoleLogger, createAction, createOtelContextFromPayload, extractSessionIdFromPayload, extractTraceIdFromPayload, getLogLevelFromEnv, isAction, parseLogLevel };
223
418
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_typeof","o","_typeof","toPrimitive","toPropertyKey","_defineProperty","action: K","handler: ActionHandler<T[K]>","config: HandlerConfig","name: string","setter: Function","payload?: T[K]","controller: PipelineController<T[K]>","type: K","payload: T[K]","action: any","action: K","handler: ActionHandler<T[K]>","config?: HandlerConfig"],"sources":["../../../node_modules/.pnpm/@oxc-project+runtime@0.77.3/node_modules/@oxc-project/runtime/src/helpers/typeof.js","../../../node_modules/.pnpm/@oxc-project+runtime@0.77.3/node_modules/@oxc-project/runtime/src/helpers/toPrimitive.js","../../../node_modules/.pnpm/@oxc-project+runtime@0.77.3/node_modules/@oxc-project/runtime/src/helpers/toPropertyKey.js","../../../node_modules/.pnpm/@oxc-project+runtime@0.77.3/node_modules/@oxc-project/runtime/src/helpers/defineProperty.js","../src/core/ActionRegister.ts","../src/core/types.ts","../src/react/ActionContext.tsx"],"sourcesContent":["function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nmodule.exports = toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nmodule.exports = toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nmodule.exports = _defineProperty, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// 타입 정의\nexport type PipelineController<T = any> = {\n next: () => void;\n abort: (reason?: string) => void;\n modifyPayload: (modifier: (payload: T) => T) => void;\n};\n\nexport type ActionHandler<T = any> = (\n payload: T,\n controller: PipelineController<T>\n) => void | Promise<void>;\n\nexport type HandlerConfig = {\n priority?: number;\n id?: string;\n blocking?: boolean;\n};\n\n// 선언적 타입 정의를 위한 인터페이스\nexport interface ActionPayloadMap {\n // 확장 가능한 구조\n // 'actionName': PayloadType;\n}\n\n// Action Register 클래스\nexport class ActionRegister<T extends ActionPayloadMap = ActionPayloadMap> {\n private pipelines = new Map<keyof T, Map<string, {\n handler: ActionHandler<any>;\n config: HandlerConfig;\n }>>();\n \n private atomSetters = new Map<string, Function>();\n\n // 파이프라인에 핸들러 등록\n register<K extends keyof T>(\n action: K,\n handler: ActionHandler<T[K]>,\n config: HandlerConfig = {}\n ): () => void {\n if (!this.pipelines.has(action)) {\n this.pipelines.set(action, new Map());\n }\n \n const pipeline = this.pipelines.get(action)!;\n const handlerId = config.id || `handler_${Date.now()}_${Math.random()}`;\n \n // 중복 등록 방지\n if (pipeline.has(handlerId)) {\n console.warn(`Handler with id ${handlerId} already exists`);\n return () => {};\n }\n \n pipeline.set(handlerId, { handler, config });\n \n // 우선순위로 정렬\n this.sortPipeline(action);\n \n // unregister 함수 반환\n return () => {\n pipeline.delete(handlerId);\n };\n }\n\n // Atom setter 등록\n registerAtomSetter(name: string, setter: Function) {\n this.atomSetters.set(name, setter);\n }\n\n // 파이프라인 실행 - void 타입을 위한 오버로드\n async dispatch<K extends keyof T>(\n action: T[K] extends void ? K : never\n ): Promise<void>;\n async dispatch<K extends keyof T>(\n action: K,\n payload: T[K]\n ): Promise<void>;\n async dispatch<K extends keyof T>(\n action: K,\n payload?: T[K]\n ): Promise<void> {\n const pipeline = this.pipelines.get(action);\n \n if (!pipeline || pipeline.size === 0) {\n console.warn(`No handlers registered for action: ${String(action)}`);\n return;\n }\n \n let modifiedPayload = payload as T[K];\n const handlers = Array.from(pipeline.values());\n \n for (const { handler, config } of handlers) {\n let shouldContinue = true;\n \n const controller: PipelineController<T[K]> = {\n next: () => { shouldContinue = true; },\n abort: (reason) => {\n shouldContinue = false;\n console.log(`Pipeline aborted: ${reason}`);\n },\n modifyPayload: (modifier) => {\n modifiedPayload = modifier(modifiedPayload);\n }\n };\n \n try {\n if (config.blocking) {\n await handler(modifiedPayload, controller);\n } else {\n handler(modifiedPayload, controller);\n }\n \n if (!shouldContinue) break;\n } catch (error) {\n console.error(`Error in pipeline handler:`, error);\n if (config.blocking) throw error;\n }\n }\n }\n\n private sortPipeline<K extends keyof T>(action: K) {\n const pipeline = this.pipelines.get(action);\n if (!pipeline) return;\n \n const sorted = Array.from(pipeline.entries())\n .sort(([, a], [, b]) => {\n const priorityA = a.config.priority ?? 0;\n const priorityB = b.config.priority ?? 0;\n return priorityB - priorityA; // 높은 우선순위가 먼저\n });\n \n pipeline.clear();\n sorted.forEach(([id, data]) => pipeline.set(id, data));\n }\n}","// 기본 액션 타입 정의\nexport interface BaseActionPayloadMap {\n // 기본 액션들은 여기에 정의\n}\n\n// 액션 타입 추출 헬퍼\nexport type ActionType<T extends Record<string, any>> = keyof T;\nexport type ActionPayload<\n T extends Record<string, any>,\n K extends keyof T\n> = T[K];\n\n// 액션 핸들러 타입\nexport type ActionHandlerMap<T extends Record<string, any>> = {\n [K in keyof T]?: (payload: T[K]) => void | Promise<void>;\n};\n\n// 액션 생성 헬퍼\nexport function createAction<T extends Record<string, any>, K extends keyof T>(\n type: K,\n payload: T[K]\n): { type: K; payload: T[K] } {\n return { type, payload };\n}\n\n// 타입 가드\nexport function isAction<T extends Record<string, any>, K extends keyof T>(\n action: any,\n type: K\n): action is { type: K; payload: T[K] } {\n return action?.type === type;\n}","import React, { createContext, ReactNode, useContext, useRef, useEffect, useId } from 'react';\nimport { ActionPayloadMap, ActionRegister, ActionHandler, HandlerConfig } from '../core';\n\n/**\n * Context type for ActionRegister\n */\nexport interface ActionContextType<T extends ActionPayloadMap = ActionPayloadMap> {\n actionRegisterRef: React.RefObject<ActionRegister<T>>;\n}\n\n/**\n * Return type for createActionContext\n */\nexport interface ActionContextReturn<T extends ActionPayloadMap = ActionPayloadMap> {\n Provider: React.FC<{ children: ReactNode }>;\n useActionContext: () => ActionContextType<T>;\n useAction: () => ActionRegister<T>;\n useActionHandler: <K extends keyof T>(\n action: K,\n handler: ActionHandler<T[K]>,\n config?: HandlerConfig\n ) => void;\n}\n\n/**\n * ActionRegister를 Context로 공유할 수 있는 헬퍼 함수\n * @returns Provider, hooks를 포함한 객체\n */\nexport function createActionContext<T extends ActionPayloadMap = ActionPayloadMap>(): ActionContextReturn<T> {\n\n const ActionContext = createContext<ActionContextType<T> | null>(null);\n\n // Provider 컴포넌트\n const Provider = ({ children }: { children: ReactNode }) => {\n const actionRegisterRef = useRef(new ActionRegister<T>());\n return (\n <ActionContext.Provider value={{ actionRegisterRef }}>\n {children}\n </ActionContext.Provider>\n );\n };\n\n // Context 접근 hook\n const useActionContext = () => {\n const context = useContext(ActionContext);\n if (!context) {\n throw new Error('useActionContext must be used within Provider');\n }\n return context;\n };\n\n // ActionRegister 인스턴스 반환 hook\n const useAction = () => {\n const { actionRegisterRef } = useActionContext();\n return actionRegisterRef.current!;\n };\n\n // Action Handler 등록 hook\n const useActionHandler = <K extends keyof T>(\n action: K,\n handler: ActionHandler<T[K]>,\n config?: HandlerConfig\n ) => {\n const actionRegister = useAction();\n const componentId = useId();\n \n useEffect(() => {\n const unregister = actionRegister.register(\n action,\n handler,\n { ...config, id: config?.id || componentId }\n );\n \n return unregister;\n }, [action, handler, config, componentId, actionRegister]);\n };\n\n return {\n Provider,\n useActionContext,\n useAction,\n useActionHandler,\n };\n}\n"],"x_google_ignoreList":[0,1,2,3],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["_typeof","o","_typeof","toPrimitive","toPropertyKey","_defineProperty","level: LogLevel","level: string","message: string","payload: any","context: OtelContext","contextParts: string[]","config?: ActionRegisterConfig","action: K","handler: ActionHandler<T[K]>","config: HandlerConfig","name: string","setter: Function","payload?: T[K]","controller: PipelineController<T[K]>","type: K","payload: T[K]","action: any"],"sources":["../../../node_modules/.pnpm/@oxc-project+runtime@0.77.3/node_modules/@oxc-project/runtime/src/helpers/typeof.js","../../../node_modules/.pnpm/@oxc-project+runtime@0.77.3/node_modules/@oxc-project/runtime/src/helpers/toPrimitive.js","../../../node_modules/.pnpm/@oxc-project+runtime@0.77.3/node_modules/@oxc-project/runtime/src/helpers/toPropertyKey.js","../../../node_modules/.pnpm/@oxc-project+runtime@0.77.3/node_modules/@oxc-project/runtime/src/helpers/defineProperty.js","../src/logger.ts","../src/ActionRegister.ts","../src/types.ts"],"sourcesContent":["function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nmodule.exports = toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nmodule.exports = toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nmodule.exports = _defineProperty, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","/**\n * Log levels in order of severity (lowest to highest)\n */\nexport enum LogLevel {\n TRACE = 0,\n DEBUG = 1,\n INFO = 2,\n WARN = 3,\n ERROR = 4,\n FATAL = 5\n}\n\n/**\n * Logger interface for custom logger implementations\n */\nexport interface Logger {\n trace(message: string, ...args: any[]): void;\n debug(message: string, ...args: any[]): void;\n info(message: string, ...args: any[]): void;\n warn(message: string, ...args: any[]): void;\n error(message: string, ...args: any[]): void;\n fatal(message: string, ...args: any[]): void;\n}\n\n/**\n * Default console logger implementation\n */\nexport class ConsoleLogger implements Logger {\n constructor(private level: LogLevel = LogLevel.ERROR) {}\n\n protected shouldLog(level: LogLevel): boolean {\n return level >= this.level;\n }\n\n private formatMessage(level: string, message: string): string {\n return `[${level.toUpperCase()}] ${message}`;\n }\n\n trace(message: string, ...args: any[]): void {\n if (this.shouldLog(LogLevel.TRACE)) {\n console.trace(this.formatMessage('trace', message), ...args);\n }\n }\n\n debug(message: string, ...args: any[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n console.debug(this.formatMessage('debug', message), ...args);\n }\n }\n\n info(message: string, ...args: any[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.info(this.formatMessage('info', message), ...args);\n }\n }\n\n warn(message: string, ...args: any[]): void {\n if (this.shouldLog(LogLevel.WARN)) {\n console.warn(this.formatMessage('warn', message), ...args);\n }\n }\n\n error(message: string, ...args: any[]): void {\n if (this.shouldLog(LogLevel.ERROR)) {\n console.error(this.formatMessage('error', message), ...args);\n }\n }\n\n fatal(message: string, ...args: any[]): void {\n if (this.shouldLog(LogLevel.FATAL)) {\n console.error(this.formatMessage('fatal', message), ...args);\n }\n }\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n}\n\n/**\n * Parse log level from string\n */\nexport function parseLogLevel(level: string): LogLevel {\n const upperLevel = level.toUpperCase();\n switch (upperLevel) {\n case 'TRACE':\n return LogLevel.TRACE;\n case 'DEBUG':\n return LogLevel.DEBUG;\n case 'INFO':\n return LogLevel.INFO;\n case 'WARN':\n return LogLevel.WARN;\n case 'ERROR':\n return LogLevel.ERROR;\n case 'FATAL':\n return LogLevel.FATAL;\n default:\n return LogLevel.ERROR;\n }\n}\n\n/**\n * Get log level from environment variable or default to ERROR\n */\nexport function getLogLevelFromEnv(): LogLevel {\n if (typeof process !== 'undefined' && process.env) {\n const envLevel = process.env.LOG_LEVEL || process.env.ACTION_LOG_LEVEL;\n if (envLevel) {\n return parseLogLevel(envLevel);\n }\n }\n return LogLevel.TRACE;\n}\n\n/**\n * Extract trace ID from payload if it exists\n */\nexport function extractTraceIdFromPayload(payload: any): string | undefined {\n if (payload && typeof payload === 'object') {\n return payload._traceId || payload.traceId || payload.trace_id;\n }\n return undefined;\n}\n\n/**\n * Extract session ID from payload if it exists\n */\nexport function extractSessionIdFromPayload(payload: any): string | undefined {\n if (payload && typeof payload === 'object') {\n return payload._sessionId || payload.sessionId || payload.session_id;\n }\n return undefined;\n}\n\n/**\n * Create OTEL context from payload\n */\nexport function createOtelContextFromPayload(payload: any): OtelContext {\n return {\n traceId: extractTraceIdFromPayload(payload),\n sessionId: extractSessionIdFromPayload(payload),\n metadata: payload\n };\n}\n\n/**\n * OpenTelemetry context interface for tracing\n */\nexport interface OtelContext {\n /** Session ID for tracking user sessions */\n sessionId?: string;\n /** Trace ID for distributed tracing */\n traceId?: string;\n /** Span ID for current operation */\n spanId?: string;\n /** Parent span ID for operation hierarchy */\n parentSpanId?: string;\n /** Additional context metadata */\n metadata?: Record<string, any>;\n}\n\n/**\n * Extended logger interface with OpenTelemetry support\n */\nexport interface OtelLogger extends Logger {\n /** Set OpenTelemetry context */\n setContext(context: OtelContext): void;\n /** Get current OpenTelemetry context */\n getContext(): OtelContext;\n /** Clear OpenTelemetry context */\n clearContext(): void;\n /** Log with OpenTelemetry context */\n logWithContext(level: LogLevel, message: string, ...args: any[]): void;\n}\n\n/**\n * OpenTelemetry-aware console logger implementation\n */\nexport class OtelConsoleLogger extends ConsoleLogger implements OtelLogger {\n private context: OtelContext = {};\n\n constructor(level: LogLevel = LogLevel.ERROR) {\n super(level);\n }\n\n setContext(context: OtelContext): void {\n this.context = { ...this.context, ...context };\n }\n\n getContext(): OtelContext {\n return { ...this.context };\n }\n\n clearContext(): void {\n this.context = {};\n }\n\n private formatWithContext(level: string, message: string): string {\n const contextParts: string[] = [];\n \n if (this.context.sessionId) {\n contextParts.push(`session=${this.context.sessionId}`);\n }\n if (this.context.traceId) {\n contextParts.push(`trace=${this.context.traceId}`);\n }\n if (this.context.spanId) {\n contextParts.push(`span=${this.context.spanId}`);\n }\n \n const contextStr = contextParts.length > 0 ? ` [${contextParts.join(', ')}]` : '';\n return `[${level.toUpperCase()}]${contextStr} ${message}`;\n }\n\n logWithContext(level: LogLevel, message: string, ...args: any[]): void {\n const levelName = LogLevel[level].toLowerCase();\n const formattedMessage = this.formatWithContext(levelName, message);\n \n switch (level) {\n case LogLevel.TRACE:\n if (this.shouldLog(LogLevel.TRACE)) {\n console.trace(formattedMessage, ...args);\n }\n break;\n case LogLevel.DEBUG:\n if (this.shouldLog(LogLevel.DEBUG)) {\n console.debug(formattedMessage, ...args);\n }\n break;\n case LogLevel.INFO:\n if (this.shouldLog(LogLevel.INFO)) {\n console.info(formattedMessage, ...args);\n }\n break;\n case LogLevel.WARN:\n if (this.shouldLog(LogLevel.WARN)) {\n console.warn(formattedMessage, ...args);\n }\n break;\n case LogLevel.ERROR:\n if (this.shouldLog(LogLevel.ERROR)) {\n console.error(formattedMessage, ...args);\n }\n break;\n case LogLevel.FATAL:\n if (this.shouldLog(LogLevel.FATAL)) {\n console.error(formattedMessage, ...args);\n }\n break;\n }\n }\n\n // Override base methods to include context\n trace(message: string, ...args: any[]): void {\n this.logWithContext(LogLevel.TRACE, message, ...args);\n }\n\n debug(message: string, ...args: any[]): void {\n this.logWithContext(LogLevel.DEBUG, message, ...args);\n }\n\n info(message: string, ...args: any[]): void {\n this.logWithContext(LogLevel.INFO, message, ...args);\n }\n\n warn(message: string, ...args: any[]): void {\n this.logWithContext(LogLevel.WARN, message, ...args);\n }\n\n error(message: string, ...args: any[]): void {\n this.logWithContext(LogLevel.ERROR, message, ...args);\n }\n\n fatal(message: string, ...args: any[]): void {\n this.logWithContext(LogLevel.FATAL, message, ...args);\n }\n}\n","import { Logger, LogLevel, ConsoleLogger, OtelConsoleLogger, OtelContext, getLogLevelFromEnv, createOtelContextFromPayload } from './logger';\n\n/**\n * Controller object provided to action handlers for pipeline management\n * @template T - The type of the payload being processed\n */\nexport type PipelineController<T = any> = {\n /** Continue to the next handler in the pipeline */\n next: () => void;\n /** Abort the pipeline execution with an optional reason */\n abort: (reason?: string) => void;\n /** Modify the payload that will be passed to subsequent handlers */\n modifyPayload: (modifier: (payload: T) => T) => void;\n};\n\n/**\n * Action handler function that processes actions in the pipeline\n * @template T - The type of the payload\n * @param payload - The data passed to the handler\n * @param controller - Pipeline controller for flow management\n * @returns void or Promise<void> for async handlers\n */\nexport type ActionHandler<T = any> = (\n payload: T,\n controller: PipelineController<T>\n) => void | Promise<void>;\n\n/**\n * Configuration options for action handlers\n */\nexport type HandlerConfig = {\n /** Priority level (higher numbers execute first). Default: 0 */\n priority?: number;\n /** Unique identifier for the handler. Auto-generated if not provided */\n id?: string;\n /** Whether to wait for async handlers to complete. Default: false */\n blocking?: boolean;\n};\n\n/**\n * Base interface for defining action payload mappings\n * @example\n * ```typescript\n * interface MyActions extends ActionPayloadMap {\n * increment: void;\n * setCount: number;\n * updateUser: { id: string; name: string };\n * }\n * ```\n */\nexport interface ActionPayloadMap {\n // Extensible structure for action definitions\n // 'actionName': PayloadType;\n}\n\n/**\n * Configuration options for ActionRegister\n */\nexport interface ActionRegisterConfig {\n /** Custom logger implementation. Defaults to ConsoleLogger */\n logger?: Logger;\n /** Log level for the logger. Defaults to ERROR if not provided */\n logLevel?: LogLevel;\n /** OpenTelemetry context for tracing */\n otelContext?: OtelContext;\n /** Whether to use OTEL-aware logger. Defaults to false */\n useOtel?: boolean;\n}\n\n/**\n * Core action pipeline management system\n * @template T - Action payload map defining available actions and their payload types\n * @example\n * ```typescript\n * interface AppActions extends ActionPayloadMap {\n * increment: void;\n * setCount: number;\n * }\n * \n * const actionRegister = new ActionRegister<AppActions>();\n * \n * // Register handlers\n * actionRegister.register('increment', () => console.log('Incremented'));\n * actionRegister.register('setCount', (count) => console.log(`Count: ${count}`));\n * \n * // Dispatch actions\n * await actionRegister.dispatch('increment');\n * await actionRegister.dispatch('setCount', 42);\n * ```\n */\nexport class ActionRegister<T extends ActionPayloadMap = ActionPayloadMap> {\n private pipelines = new Map<keyof T, Map<string, {\n handler: ActionHandler<any>;\n config: HandlerConfig;\n }>>();\n \n private atomSetters = new Map<string, Function>();\n private handlerCounter = 0;\n public readonly logger: Logger;\n\n constructor(config?: ActionRegisterConfig) {\n // 환경변수에서 로그 레벨 가져오기\n const envLogLevel = getLogLevelFromEnv();\n \n // 설정에서 로그 레벨 가져오기 (환경변수보다 우선)\n const configLogLevel = config?.logLevel ?? envLogLevel;\n \n // 커스텀 로거가 있으면 사용, OTEL 사용 설정이 있으면 OTEL 로거 사용, 없으면 기본 콘솔 로거 사용\n if (config?.logger) {\n this.logger = config.logger;\n } else if (config?.useOtel) {\n this.logger = new OtelConsoleLogger(configLogLevel);\n } else {\n this.logger = new ConsoleLogger(configLogLevel);\n }\n \n // OTEL 컨텍스트 설정\n if (config?.otelContext && this.logger instanceof OtelConsoleLogger) {\n this.logger.setContext(config.otelContext);\n }\n \n this.logger.debug('ActionRegister initialized', { \n logLevel: configLogLevel,\n useOtel: config?.useOtel ?? false,\n hasOtelContext: !!config?.otelContext\n });\n }\n\n /**\n * Register a handler for an action in the pipeline\n * @param action - The action name to handle\n * @param handler - The handler function to execute\n * @param config - Optional configuration for the handler\n * @returns Unregister function to remove the handler\n * @example\n * ```typescript\n * const unregister = actionRegister.register('increment', () => {\n * console.log('Incremented!');\n * }, { priority: 10 });\n * \n * // Later, remove the handler\n * unregister();\n * ```\n */\n register<K extends keyof T>(\n action: K,\n handler: ActionHandler<T[K]>,\n config: HandlerConfig = {}\n ): () => void {\n if (!this.pipelines.has(action)) {\n this.pipelines.set(action, new Map());\n this.logger.debug(`Created new pipeline for action: ${String(action)}`);\n }\n \n const pipeline = this.pipelines.get(action)!;\n const handlerId = config.id || `handler_${++this.handlerCounter}`;\n \n // 중복 등록 방지\n if (pipeline.has(handlerId)) {\n this.logger.warn(`Handler with id ${handlerId} already exists for action: ${String(action)}`);\n return () => {};\n }\n \n pipeline.set(handlerId, { handler, config });\n this.logger.debug(`Registered handler for action: ${String(action)}`, { \n handlerId, \n priority: config.priority ?? 0,\n blocking: config.blocking ?? false \n });\n \n // 우선순위로 정렬\n this.sortPipeline(action);\n \n // unregister 함수 반환\n return () => {\n pipeline.delete(handlerId);\n this.logger.debug(`Unregistered handler: ${handlerId} for action: ${String(action)}`);\n };\n }\n\n // Atom setter 등록\n registerAtomSetter(name: string, setter: Function) {\n this.atomSetters.set(name, setter);\n this.logger.debug(`Registered atom setter: ${name}`);\n }\n\n /**\n * Dispatch an action through the pipeline (for actions without payload)\n * @param action - The action to dispatch\n * @returns Promise that resolves when all handlers complete\n */\n async dispatch<K extends keyof T>(\n action: T[K] extends void ? K : never\n ): Promise<void>;\n /**\n * Dispatch an action through the pipeline (for actions with payload)\n * @param action - The action to dispatch\n * @param payload - The payload data to pass to handlers\n * @returns Promise that resolves when all handlers complete\n */\n async dispatch<K extends keyof T>(\n action: K,\n payload: T[K]\n ): Promise<void>;\n /**\n * Internal dispatch implementation\n * @internal\n */\n async dispatch<K extends keyof T>(\n action: K,\n payload?: T[K]\n ): Promise<void> {\n const pipeline = this.pipelines.get(action);\n \n // OTEL 컨텍스트 자동 감지 및 설정\n if (this.logger instanceof OtelConsoleLogger && payload) {\n const otelContext = createOtelContextFromPayload(payload);\n if (otelContext.traceId || otelContext.sessionId) {\n this.logger.setContext(otelContext);\n }\n }\n \n this.logger.debug(`Dispatching action: ${String(action)}`, { payload });\n \n if (!pipeline || pipeline.size === 0) {\n this.logger.warn(`No handlers registered for action: ${String(action)}`);\n return;\n }\n \n let modifiedPayload = payload as T[K];\n const handlers = Array.from(pipeline.values());\n let shouldContinue = true;\n \n this.logger.trace(`Executing pipeline for action: ${String(action)}`, { \n handlerCount: handlers.length \n });\n \n for (const { handler, config } of handlers) {\n if (!shouldContinue) break;\n \n const controller: PipelineController<T[K]> = {\n next: () => { shouldContinue = true; },\n abort: (reason) => {\n shouldContinue = false;\n this.logger.warn(`Pipeline aborted: ${reason}`);\n },\n modifyPayload: (modifier) => {\n modifiedPayload = modifier(modifiedPayload);\n this.logger.trace(`Payload modified for action: ${String(action)}`);\n }\n };\n \n try {\n if (config.blocking) {\n await handler(modifiedPayload, controller);\n } else {\n handler(modifiedPayload, controller);\n }\n } catch (error) {\n this.logger.error(`Error in pipeline handler for action: ${String(action)}`, error);\n if (config.blocking) throw error;\n }\n }\n \n this.logger.debug(`Completed dispatching action: ${String(action)}`);\n }\n\n private sortPipeline<K extends keyof T>(action: K) {\n const pipeline = this.pipelines.get(action);\n if (!pipeline) return;\n \n const sorted = Array.from(pipeline.entries())\n .sort(([, a], [, b]) => {\n const priorityA = a.config.priority ?? 0;\n const priorityB = b.config.priority ?? 0;\n return priorityB - priorityA; // 높은 우선순위가 먼저\n });\n \n pipeline.clear();\n sorted.forEach(([id, data]) => pipeline.set(id, data));\n \n this.logger.trace(`Sorted pipeline for action: ${String(action)}`, {\n handlerCount: sorted.length,\n priorities: sorted.map(([, data]) => data.config.priority ?? 0)\n });\n }\n}","// 기본 액션 타입 정의\nexport interface BaseActionPayloadMap {\n // 기본 액션들은 여기에 정의\n}\n\n// 액션 타입 추출 헬퍼\nexport type ActionType<T extends Record<string, any>> = keyof T;\nexport type ActionPayload<\n T extends Record<string, any>,\n K extends keyof T\n> = T[K];\n\n// 액션 핸들러 타입\nexport type ActionHandlerMap<T extends Record<string, any>> = {\n [K in keyof T]?: (payload: T[K]) => void | Promise<void>;\n};\n\n// 액션 생성 헬퍼\nexport function createAction<T extends Record<string, any>, K extends keyof T>(\n type: K,\n payload: T[K]\n): { type: K; payload: T[K] } {\n return { type, payload };\n}\n\n// 타입 가드\nexport function isAction<T extends Record<string, any>, K extends keyof T>(\n action: any,\n type: K\n): action is { type: K; payload: T[K] } {\n return action?.type === type;\n}"],"x_google_ignoreList":[0,1,2,3],"mappings":"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"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@context-action/core",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "type": "module",
5
- "description": "A TypeScript library for type-safe action pipeline management with React integration",
5
+ "description": "Type-safe action pipeline management library for JavaScript/TypeScript",
6
6
  "main": "dist/index.cjs",
7
7
  "module": "dist/index.js",
8
8
  "types": "dist/index.d.ts",
@@ -24,53 +24,31 @@
24
24
  "README.ko.md",
25
25
  "LICENSE"
26
26
  ],
27
- "scripts": {
28
- "build": "tsdown",
29
- "build:watch": "tsdown --watch",
30
- "test": "jest",
31
- "test:watch": "jest --watch",
32
- "lint": "eslint src --ext .ts,.tsx",
33
- "lint:fix": "eslint src --ext .ts,.tsx --fix",
34
- "type-check": "tsc --noEmit",
35
- "clean": "rimraf dist",
36
- "prepublishOnly": "pnpm run build"
37
- },
38
27
  "keywords": [
39
28
  "typescript",
40
- "react",
29
+ "javascript",
41
30
  "action",
42
31
  "pipeline",
43
32
  "state-management",
44
- "context",
45
- "hooks"
33
+ "event-system"
46
34
  ],
47
35
  "author": "mineclover",
48
36
  "license": "Apache-2.0",
49
37
  "repository": {
50
38
  "type": "git",
51
39
  "url": "git+https://github.com/mineclover/context-action.git",
52
- "directory": "packages/context-action"
40
+ "directory": "packages/core"
53
41
  },
54
42
  "bugs": {
55
43
  "url": "https://github.com/mineclover/context-action/issues"
56
44
  },
57
45
  "homepage": "https://github.com/mineclover/context-action#readme",
58
- "peerDependencies": {
59
- "react": ">=16.8.0"
60
- },
61
- "peerDependenciesMeta": {
62
- "react": {
63
- "optional": true
64
- }
65
- },
66
46
  "devDependencies": {
67
47
  "@types/jest": "^29.5.0",
68
- "@types/react": "^18.2.0",
69
48
  "@typescript-eslint/eslint-plugin": "^6.0.0",
70
49
  "@typescript-eslint/parser": "^6.0.0",
71
50
  "eslint": "^8.0.0",
72
51
  "jest": "^29.0.0",
73
- "react": "^18.2.0",
74
52
  "rimraf": "^5.0.0",
75
53
  "ts-jest": "^29.0.0",
76
54
  "tsdown": "^0.13.0",
@@ -79,5 +57,15 @@
79
57
  },
80
58
  "engines": {
81
59
  "node": ">=18.0.0"
60
+ },
61
+ "scripts": {
62
+ "build": "tsdown",
63
+ "build:watch": "tsdown --watch",
64
+ "test": "jest --passWithNoTests",
65
+ "test:watch": "jest --watch",
66
+ "lint": "eslint src --ext .ts",
67
+ "lint:fix": "eslint src --ext .ts --fix",
68
+ "type-check": "tsc --noEmit",
69
+ "clean": "rimraf dist"
82
70
  }
83
- }
71
+ }