@furo/open-models 1.15.0 → 1.15.1
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/custom-elements.json +23 -23
- package/dist/decorators/ModelDecorators.d.ts +1 -1
- package/dist/decorators/ModelDecorators.js +1 -1
- package/dist/decorators/ModelDecorators.js.map +1 -1
- package/dist/decorators/ServiceDecorators.d.ts +1 -1
- package/dist/decorators/ServiceDecorators.js +1 -1
- package/dist/decorators/ServiceDecorators.js.map +1 -1
- package/dist/decorators/defaultServiceEventHandlers.d.ts +5 -5
- package/dist/decorators/defaultServiceEventHandlers.js +6 -6
- package/dist/decorators/defaultServiceEventHandlers.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/custom-elements.json
CHANGED
|
@@ -1258,7 +1258,7 @@
|
|
|
1258
1258
|
"declarations": [
|
|
1259
1259
|
{
|
|
1260
1260
|
"kind": "function",
|
|
1261
|
-
"name": "
|
|
1261
|
+
"name": "ModelBindings",
|
|
1262
1262
|
"parameters": [
|
|
1263
1263
|
{
|
|
1264
1264
|
"name": "model",
|
|
@@ -1276,9 +1276,9 @@
|
|
|
1276
1276
|
"exports": [
|
|
1277
1277
|
{
|
|
1278
1278
|
"kind": "js",
|
|
1279
|
-
"name": "
|
|
1279
|
+
"name": "ModelBindings",
|
|
1280
1280
|
"declaration": {
|
|
1281
|
-
"name": "
|
|
1281
|
+
"name": "ModelBindings",
|
|
1282
1282
|
"module": "dist/decorators/ModelDecorators.js"
|
|
1283
1283
|
}
|
|
1284
1284
|
}
|
|
@@ -1375,7 +1375,7 @@
|
|
|
1375
1375
|
"declarations": [
|
|
1376
1376
|
{
|
|
1377
1377
|
"kind": "function",
|
|
1378
|
-
"name": "
|
|
1378
|
+
"name": "ServiceBindings",
|
|
1379
1379
|
"parameters": [
|
|
1380
1380
|
{
|
|
1381
1381
|
"name": "service",
|
|
@@ -1393,9 +1393,9 @@
|
|
|
1393
1393
|
"exports": [
|
|
1394
1394
|
{
|
|
1395
1395
|
"kind": "js",
|
|
1396
|
-
"name": "
|
|
1396
|
+
"name": "ServiceBindings",
|
|
1397
1397
|
"declaration": {
|
|
1398
|
-
"name": "
|
|
1398
|
+
"name": "ServiceBindings",
|
|
1399
1399
|
"module": "dist/decorators/ServiceDecorators.js"
|
|
1400
1400
|
}
|
|
1401
1401
|
}
|
|
@@ -1413,7 +1413,7 @@
|
|
|
1413
1413
|
"declarations": [
|
|
1414
1414
|
{
|
|
1415
1415
|
"kind": "function",
|
|
1416
|
-
"name": "
|
|
1416
|
+
"name": "DefaultServiceEventHandlers",
|
|
1417
1417
|
"parameters": [
|
|
1418
1418
|
{
|
|
1419
1419
|
"name": "dispatch",
|
|
@@ -1425,7 +1425,7 @@
|
|
|
1425
1425
|
"description": "Optional configuration"
|
|
1426
1426
|
}
|
|
1427
1427
|
],
|
|
1428
|
-
"description": "###
|
|
1428
|
+
"description": "### DefaultServiceEventHandlers\n\nCreates default service handlers that dispatch standard events.\nUse this to reduce boilerplate when setting up service handlers.\n\nThe `onResponse` handler is intentionally NOT included - you must provide your own\nimplementation since response handling is typically service-specific.\n\nUsage:\n```typescript\nclass MyEntityService extends EventTarget {\n private dispatch = createDispatch(this);\n\n setupHandlers() {\n this.service.Get.setHandlers({\n ...DefaultServiceEventHandlers(this.dispatch),\n onResponse: (response, serverResponse) => {\n // Your custom response handling\n this.entity.fromLiteral(response.entity);\n this.dispatch(\"response-received\", { response, serverResponse });\n },\n });\n }\n}\n```\n\nWith loading check:\n```typescript\nthis.service.Get.setHandlers({\n ...DefaultServiceEventHandlers(this.dispatch, {\n isLoading: () => this.service.Get.isLoading || this.service.Update.isLoading,\n }),\n onResponse: (response, serverResponse) => { ... },\n});\n```",
|
|
1429
1429
|
"return": {
|
|
1430
1430
|
"type": {
|
|
1431
1431
|
"text": ""
|
|
@@ -1434,7 +1434,7 @@
|
|
|
1434
1434
|
},
|
|
1435
1435
|
{
|
|
1436
1436
|
"kind": "function",
|
|
1437
|
-
"name": "
|
|
1437
|
+
"name": "CreateDispatch",
|
|
1438
1438
|
"parameters": [
|
|
1439
1439
|
{
|
|
1440
1440
|
"name": "target",
|
|
@@ -1452,17 +1452,17 @@
|
|
|
1452
1452
|
"exports": [
|
|
1453
1453
|
{
|
|
1454
1454
|
"kind": "js",
|
|
1455
|
-
"name": "
|
|
1455
|
+
"name": "DefaultServiceEventHandlers",
|
|
1456
1456
|
"declaration": {
|
|
1457
|
-
"name": "
|
|
1457
|
+
"name": "DefaultServiceEventHandlers",
|
|
1458
1458
|
"module": "dist/decorators/defaultServiceEventHandlers.js"
|
|
1459
1459
|
}
|
|
1460
1460
|
},
|
|
1461
1461
|
{
|
|
1462
1462
|
"kind": "js",
|
|
1463
|
-
"name": "
|
|
1463
|
+
"name": "CreateDispatch",
|
|
1464
1464
|
"declaration": {
|
|
1465
|
-
"name": "
|
|
1465
|
+
"name": "CreateDispatch",
|
|
1466
1466
|
"module": "dist/decorators/defaultServiceEventHandlers.js"
|
|
1467
1467
|
}
|
|
1468
1468
|
}
|
|
@@ -1769,17 +1769,17 @@
|
|
|
1769
1769
|
},
|
|
1770
1770
|
{
|
|
1771
1771
|
"kind": "js",
|
|
1772
|
-
"name": "
|
|
1772
|
+
"name": "ServiceBindings",
|
|
1773
1773
|
"declaration": {
|
|
1774
|
-
"name": "
|
|
1774
|
+
"name": "ServiceBindings",
|
|
1775
1775
|
"module": "./decorators/ServiceDecorators.js"
|
|
1776
1776
|
}
|
|
1777
1777
|
},
|
|
1778
1778
|
{
|
|
1779
1779
|
"kind": "js",
|
|
1780
|
-
"name": "
|
|
1780
|
+
"name": "ModelBindings",
|
|
1781
1781
|
"declaration": {
|
|
1782
|
-
"name": "
|
|
1782
|
+
"name": "ModelBindings",
|
|
1783
1783
|
"module": "./decorators/ModelDecorators.js"
|
|
1784
1784
|
}
|
|
1785
1785
|
},
|
|
@@ -1801,18 +1801,18 @@
|
|
|
1801
1801
|
},
|
|
1802
1802
|
{
|
|
1803
1803
|
"kind": "js",
|
|
1804
|
-
"name": "
|
|
1804
|
+
"name": "DefaultServiceEventHandlers",
|
|
1805
1805
|
"declaration": {
|
|
1806
|
-
"name": "
|
|
1807
|
-
"module": "./decorators/
|
|
1806
|
+
"name": "DefaultServiceEventHandlers",
|
|
1807
|
+
"module": "./decorators/DefaultServiceEventHandlers.js"
|
|
1808
1808
|
}
|
|
1809
1809
|
},
|
|
1810
1810
|
{
|
|
1811
1811
|
"kind": "js",
|
|
1812
|
-
"name": "
|
|
1812
|
+
"name": "CreateDispatch",
|
|
1813
1813
|
"declaration": {
|
|
1814
|
-
"name": "
|
|
1815
|
-
"module": "./decorators/
|
|
1814
|
+
"name": "CreateDispatch",
|
|
1815
|
+
"module": "./decorators/DefaultServiceEventHandlers.js"
|
|
1816
1816
|
}
|
|
1817
1817
|
}
|
|
1818
1818
|
]
|
|
@@ -72,7 +72,7 @@ interface FieldNodeLike {
|
|
|
72
72
|
* @param model - The FieldNode model to bind to
|
|
73
73
|
* @returns Object with `bind`, `onEvent`, and `onFieldEvent` decorator factories
|
|
74
74
|
*/
|
|
75
|
-
export declare function
|
|
75
|
+
export declare function ModelBindings<TEventMap extends ModelEventMap = ModelEventMap>(model: FieldNodeLike): {
|
|
76
76
|
/**
|
|
77
77
|
* Binds a component property to a model field value.
|
|
78
78
|
* When the field changes, the property is automatically updated.
|
|
@@ -49,7 +49,7 @@ const MODEL_EVENT_METHODS = Symbol.for("__modelEventMethods__");
|
|
|
49
49
|
* @param model - The FieldNode model to bind to
|
|
50
50
|
* @returns Object with `bind`, `onEvent`, and `onFieldEvent` decorator factories
|
|
51
51
|
*/
|
|
52
|
-
export function
|
|
52
|
+
export function ModelBindings(model) {
|
|
53
53
|
return {
|
|
54
54
|
/**
|
|
55
55
|
* Binds a component property to a model field value.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelDecorators.js","sourceRoot":"","sources":["../../src/decorators/ModelDecorators.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-param-reassign */\nimport { LitElement, ReactiveElement } from \"lit\";\n\n// ─────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────\n\n/**\n * Event types dispatched by FieldNode models.\n */\nexport type ModelEventType =\n | \"update\"\n | \"field-value-changed\"\n | \"this-field-value-changed\"\n | \"field-value-updated\"\n | \"this-state-changed\"\n | \"state-changed\"\n | \"validity-changed\"\n | \"array-changed\"\n | \"this-array-changed\"\n | \"map-changed\"\n | \"this-map-changed\"\n | \"parent-readonly-set\"\n | \"parent-readonly-unset\"\n | \"model-injected\";\n\n/**\n * Event map for FieldNode model events.\n * Most events don't have detail - they just notify that something changed.\n */\nexport interface ModelEventMap {\n update: undefined;\n \"field-value-changed\": unknown;\n \"this-field-value-changed\": undefined;\n \"field-value-updated\": unknown;\n \"this-state-changed\": undefined;\n \"state-changed\": unknown;\n \"validity-changed\": undefined;\n \"array-changed\": unknown;\n \"this-array-changed\": undefined;\n \"map-changed\": unknown;\n \"this-map-changed\": undefined;\n \"parent-readonly-set\": undefined;\n \"parent-readonly-unset\": undefined;\n \"model-injected\": undefined;\n}\n\n/**\n * Interface for FieldNode-like objects that support event listening and path navigation.\n */\ninterface FieldNodeLike {\n __addEventListener(type: string, listener: (e: CustomEvent) => void): void;\n __removeEventListener(type: string, listener: (e: CustomEvent) => void): void;\n __getFieldNodeByPath?(path: string): FieldNodeLike | undefined;\n value?: unknown;\n}\n\n// ─────────────────────────────────────────────────────────────────\n// Metadata Storage\n// ─────────────────────────────────────────────────────────────────\n\ninterface BindingMeta {\n model: FieldNodeLike;\n path: string;\n eventType: ModelEventType;\n}\nconst bindingsMetadata = new WeakMap<object, Map<string, BindingMeta>>();\n\ninterface EventBindingMeta {\n propertyKey: string;\n model: FieldNodeLike;\n path: string | null;\n eventType: ModelEventType;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n method: Function;\n}\n\n// Symbol keys for instance storage\nconst MODEL_BIND_LISTENERS = Symbol.for(\"__modelBindListeners__\");\nconst MODEL_EVENT_LISTENERS = Symbol.for(\"__modelEventListeners__\");\nconst MODEL_BIND_PATCHED = Symbol.for(\"__modelBindPatched__\");\nconst MODEL_EVENT_PATCHED = Symbol.for(\"__modelEventPatched__\");\nconst MODEL_EVENT_METHODS = Symbol.for(\"__modelEventMethods__\");\n\n// ─────────────────────────────────────────────────────────────────\n// modelBindings Factory\n// ─────────────────────────────────────────────────────────────────\n\n/**\n * ### modelBindings Factory\n *\n * Creates type-safe decorators bound to a specific FieldNode model.\n * Use this to bind component properties and methods to model events.\n *\n * Usage:\n * ```typescript\n * import { modelBindings } from \"@x/furo/open-models/ModelDecorators\";\n * import { CubeEntityModel } from \"./CubeEntityModel\";\n *\n * const cubeModel = modelBindings(CubeEntityModel.model);\n *\n * class MyComponent extends LitElement {\n * // Bind to a nested field value - updates when cube.length changes\n * @cubeModel.bind(\"cube.length\")\n * @state()\n * private cubeLength: number = 0;\n *\n * // Bind to model validity\n * @cubeModel.bind(\"__isValid\", \"validity-changed\")\n * @state()\n * private isValid: boolean = true;\n *\n * // React to any field value change on the model\n * @cubeModel.onEvent(\"field-value-changed\")\n * private onAnyFieldChanged() {\n * console.log(\"Something changed!\");\n * }\n *\n * // React to a specific field's changes\n * @cubeModel.onFieldEvent(\"cube.length\", \"this-field-value-changed\")\n * private onLengthChanged() {\n * console.log(\"Length changed!\");\n * }\n * }\n * ```\n *\n * @param model - The FieldNode model to bind to\n * @returns Object with `bind`, `onEvent`, and `onFieldEvent` decorator factories\n */\nexport function modelBindings<TEventMap extends ModelEventMap = ModelEventMap>(model: FieldNodeLike) {\n return {\n /**\n * Binds a component property to a model field value.\n * When the field changes, the property is automatically updated.\n *\n * @param path - Path to the field (e.g., \"cube.length\", \"__isValid\")\n * @param eventType - Event to listen for (defaults to \"this-field-value-changed\")\n */\n bind(path: string, eventType: ModelEventType = \"this-field-value-changed\") {\n return function bindDecorator(target: object, propertyKey: string) {\n let metadata = bindingsMetadata.get(target);\n if (!metadata) {\n metadata = new Map();\n bindingsMetadata.set(target, metadata);\n }\n metadata.set(propertyKey, { model, path, eventType });\n\n patchBindLifecycle(target.constructor as typeof ReactiveElement);\n };\n },\n\n /**\n * Binds a method to an event on the root model.\n * When the event fires, the method is called.\n *\n * @param eventType - The event type to listen for\n */\n onEvent<K extends keyof TEventMap & ModelEventType>(eventType: K) {\n return function onEventDecorator(target: object, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n const ctor = target.constructor as typeof ReactiveElement;\n\n let methods = (ctor as unknown as Record<symbol, EventBindingMeta[]>)[MODEL_EVENT_METHODS];\n if (!methods) {\n methods = [];\n (ctor as unknown as Record<symbol, EventBindingMeta[]>)[MODEL_EVENT_METHODS] = methods;\n }\n methods.push({ propertyKey, model, path: null, eventType, method: originalMethod });\n\n patchEventLifecycle(ctor);\n };\n },\n\n /**\n * Binds a method to an event on a specific field.\n * When the event fires on that field, the method is called.\n *\n * @param path - Path to the field (e.g., \"cube.length\")\n * @param eventType - The event type to listen for\n */\n onFieldEvent<K extends keyof TEventMap & ModelEventType>(path: string, eventType: K) {\n return function onFieldEventDecorator(target: object, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n const ctor = target.constructor as typeof ReactiveElement;\n\n let methods = (ctor as unknown as Record<symbol, EventBindingMeta[]>)[MODEL_EVENT_METHODS];\n if (!methods) {\n methods = [];\n (ctor as unknown as Record<symbol, EventBindingMeta[]>)[MODEL_EVENT_METHODS] = methods;\n }\n methods.push({ propertyKey, model, path, eventType, method: originalMethod });\n\n patchEventLifecycle(ctor);\n };\n },\n };\n}\n\n// ─────────────────────────────────────────────────────────────────\n// Lifecycle Patching\n// ─────────────────────────────────────────────────────────────────\n\n/**\n * Get the field node for a path, handling both direct properties and nested paths.\n */\nfunction getFieldForPath(model: FieldNodeLike, path: string): FieldNodeLike {\n // Check if it's a direct property (starts with __ or no dots)\n if (path.startsWith(\"__\") || !path.includes(\".\")) {\n return model;\n }\n // Navigate to nested field (we trust the field exists per user guarantee)\n if (model.__getFieldNodeByPath) {\n return model.__getFieldNodeByPath(path) as FieldNodeLike;\n }\n return model;\n}\n\n/**\n * Get the value for a path from the model.\n */\nfunction getValueForPath(model: FieldNodeLike, path: string): unknown {\n if (path.startsWith(\"__\")) {\n // Direct property access for internal properties\n return (model as unknown as Record<string, unknown>)[path];\n }\n if (!path.includes(\".\")) {\n // Direct child field\n const field = (model as unknown as Record<string, unknown>)[path] as FieldNodeLike | undefined;\n return field?.value ?? field;\n }\n // Nested path - get the field and return its value\n if (model.__getFieldNodeByPath) {\n const field = model.__getFieldNodeByPath(path);\n return field?.value ?? field;\n }\n return undefined;\n}\n\n/**\n * Patch connectedCallback/disconnectedCallback for bind decorators.\n */\nfunction patchBindLifecycle(ctor: typeof ReactiveElement): void {\n if ((ctor as unknown as Record<symbol, boolean>)[MODEL_BIND_PATCHED]) {\n return;\n }\n (ctor as unknown as Record<symbol, boolean>)[MODEL_BIND_PATCHED] = true;\n\n const originalConnected = ctor.prototype.connectedCallback;\n const originalDisconnected = ctor.prototype.disconnectedCallback;\n\n ctor.prototype.connectedCallback = function connectedCallback(\n this: LitElement & Record<symbol, Map<string, { listener: (e: CustomEvent) => void; field: FieldNodeLike; eventType: string }>>\n ) {\n originalConnected?.call(this);\n\n const metadata = bindingsMetadata.get(Object.getPrototypeOf(this));\n if (!metadata) return;\n\n const listeners = new Map<string, { listener: (e: CustomEvent) => void; field: FieldNodeLike; eventType: string }>();\n this[MODEL_BIND_LISTENERS] = listeners;\n\n metadata.forEach(({ model, path, eventType }, propKey) => {\n const field = getFieldForPath(model, path);\n\n // Set initial value\n (this as unknown as Record<string, unknown>)[propKey] = getValueForPath(model, path);\n\n const listener = () => {\n (this as unknown as Record<string, unknown>)[propKey] = getValueForPath(model, path);\n };\n\n listeners.set(propKey, { listener, field, eventType });\n field.__addEventListener(eventType, listener);\n });\n };\n\n ctor.prototype.disconnectedCallback = function disconnectedCallback(\n this: LitElement & Record<symbol, Map<string, { listener: (e: CustomEvent) => void; field: FieldNodeLike; eventType: string }>>\n ) {\n const listeners = this[MODEL_BIND_LISTENERS];\n if (listeners) {\n listeners.forEach(({ listener, field, eventType }) => {\n field.__removeEventListener(eventType, listener);\n });\n listeners.clear();\n }\n\n originalDisconnected?.call(this);\n };\n}\n\n/**\n * Patch connectedCallback/disconnectedCallback for event decorators.\n */\nfunction patchEventLifecycle(ctor: typeof ReactiveElement): void {\n if ((ctor as unknown as Record<symbol, boolean>)[MODEL_EVENT_PATCHED]) {\n return;\n }\n (ctor as unknown as Record<symbol, boolean>)[MODEL_EVENT_PATCHED] = true;\n\n const originalConnected = ctor.prototype.connectedCallback;\n const originalDisconnected = ctor.prototype.disconnectedCallback;\n\n ctor.prototype.connectedCallback = function connectedCallback(\n this: LitElement & Record<symbol, Map<string, { listener: (e: CustomEvent) => void; field: FieldNodeLike; eventType: string }>>\n ) {\n originalConnected?.call(this);\n\n const methods = (this.constructor as unknown as Record<symbol, EventBindingMeta[]>)[MODEL_EVENT_METHODS];\n if (!methods) return;\n\n const listeners = new Map<string, { listener: (e: CustomEvent) => void; field: FieldNodeLike; eventType: string }>();\n this[MODEL_EVENT_LISTENERS] = listeners;\n\n methods.forEach(({ propertyKey, model, path, eventType, method }) => {\n // If path is specified, listen on that field; otherwise listen on root model\n const field = path ? getFieldForPath(model, path) : model;\n\n const listener = (e: CustomEvent) => {\n method.call(this, e.detail);\n };\n\n listeners.set(propertyKey, { listener, field, eventType });\n field.__addEventListener(eventType, listener);\n });\n };\n\n ctor.prototype.disconnectedCallback = function disconnectedCallback(\n this: LitElement & Record<symbol, Map<string, { listener: (e: CustomEvent) => void; field: FieldNodeLike; eventType: string }>>\n ) {\n const listeners = this[MODEL_EVENT_LISTENERS];\n if (listeners) {\n listeners.forEach(({ listener, field, eventType }) => {\n field.__removeEventListener(eventType, listener);\n });\n listeners.clear();\n }\n\n originalDisconnected?.call(this);\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ModelDecorators.js","sourceRoot":"","sources":["../../src/decorators/ModelDecorators.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-param-reassign */\nimport { LitElement, ReactiveElement } from \"lit\";\n\n// ─────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────\n\n/**\n * Event types dispatched by FieldNode models.\n */\nexport type ModelEventType =\n | \"update\"\n | \"field-value-changed\"\n | \"this-field-value-changed\"\n | \"field-value-updated\"\n | \"this-state-changed\"\n | \"state-changed\"\n | \"validity-changed\"\n | \"array-changed\"\n | \"this-array-changed\"\n | \"map-changed\"\n | \"this-map-changed\"\n | \"parent-readonly-set\"\n | \"parent-readonly-unset\"\n | \"model-injected\";\n\n/**\n * Event map for FieldNode model events.\n * Most events don't have detail - they just notify that something changed.\n */\nexport interface ModelEventMap {\n update: undefined;\n \"field-value-changed\": unknown;\n \"this-field-value-changed\": undefined;\n \"field-value-updated\": unknown;\n \"this-state-changed\": undefined;\n \"state-changed\": unknown;\n \"validity-changed\": undefined;\n \"array-changed\": unknown;\n \"this-array-changed\": undefined;\n \"map-changed\": unknown;\n \"this-map-changed\": undefined;\n \"parent-readonly-set\": undefined;\n \"parent-readonly-unset\": undefined;\n \"model-injected\": undefined;\n}\n\n/**\n * Interface for FieldNode-like objects that support event listening and path navigation.\n */\ninterface FieldNodeLike {\n __addEventListener(type: string, listener: (e: CustomEvent) => void): void;\n __removeEventListener(type: string, listener: (e: CustomEvent) => void): void;\n __getFieldNodeByPath?(path: string): FieldNodeLike | undefined;\n value?: unknown;\n}\n\n// ─────────────────────────────────────────────────────────────────\n// Metadata Storage\n// ─────────────────────────────────────────────────────────────────\n\ninterface BindingMeta {\n model: FieldNodeLike;\n path: string;\n eventType: ModelEventType;\n}\nconst bindingsMetadata = new WeakMap<object, Map<string, BindingMeta>>();\n\ninterface EventBindingMeta {\n propertyKey: string;\n model: FieldNodeLike;\n path: string | null;\n eventType: ModelEventType;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n method: Function;\n}\n\n// Symbol keys for instance storage\nconst MODEL_BIND_LISTENERS = Symbol.for(\"__modelBindListeners__\");\nconst MODEL_EVENT_LISTENERS = Symbol.for(\"__modelEventListeners__\");\nconst MODEL_BIND_PATCHED = Symbol.for(\"__modelBindPatched__\");\nconst MODEL_EVENT_PATCHED = Symbol.for(\"__modelEventPatched__\");\nconst MODEL_EVENT_METHODS = Symbol.for(\"__modelEventMethods__\");\n\n// ─────────────────────────────────────────────────────────────────\n// modelBindings Factory\n// ─────────────────────────────────────────────────────────────────\n\n/**\n * ### modelBindings Factory\n *\n * Creates type-safe decorators bound to a specific FieldNode model.\n * Use this to bind component properties and methods to model events.\n *\n * Usage:\n * ```typescript\n * import { modelBindings } from \"@x/furo/open-models/ModelDecorators\";\n * import { CubeEntityModel } from \"./CubeEntityModel\";\n *\n * const cubeModel = modelBindings(CubeEntityModel.model);\n *\n * class MyComponent extends LitElement {\n * // Bind to a nested field value - updates when cube.length changes\n * @cubeModel.bind(\"cube.length\")\n * @state()\n * private cubeLength: number = 0;\n *\n * // Bind to model validity\n * @cubeModel.bind(\"__isValid\", \"validity-changed\")\n * @state()\n * private isValid: boolean = true;\n *\n * // React to any field value change on the model\n * @cubeModel.onEvent(\"field-value-changed\")\n * private onAnyFieldChanged() {\n * console.log(\"Something changed!\");\n * }\n *\n * // React to a specific field's changes\n * @cubeModel.onFieldEvent(\"cube.length\", \"this-field-value-changed\")\n * private onLengthChanged() {\n * console.log(\"Length changed!\");\n * }\n * }\n * ```\n *\n * @param model - The FieldNode model to bind to\n * @returns Object with `bind`, `onEvent`, and `onFieldEvent` decorator factories\n */\nexport function ModelBindings<TEventMap extends ModelEventMap = ModelEventMap>(model: FieldNodeLike) {\n return {\n /**\n * Binds a component property to a model field value.\n * When the field changes, the property is automatically updated.\n *\n * @param path - Path to the field (e.g., \"cube.length\", \"__isValid\")\n * @param eventType - Event to listen for (defaults to \"this-field-value-changed\")\n */\n bind(path: string, eventType: ModelEventType = \"this-field-value-changed\") {\n return function bindDecorator(target: object, propertyKey: string) {\n let metadata = bindingsMetadata.get(target);\n if (!metadata) {\n metadata = new Map();\n bindingsMetadata.set(target, metadata);\n }\n metadata.set(propertyKey, { model, path, eventType });\n\n patchBindLifecycle(target.constructor as typeof ReactiveElement);\n };\n },\n\n /**\n * Binds a method to an event on the root model.\n * When the event fires, the method is called.\n *\n * @param eventType - The event type to listen for\n */\n onEvent<K extends keyof TEventMap & ModelEventType>(eventType: K) {\n return function onEventDecorator(target: object, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n const ctor = target.constructor as typeof ReactiveElement;\n\n let methods = (ctor as unknown as Record<symbol, EventBindingMeta[]>)[MODEL_EVENT_METHODS];\n if (!methods) {\n methods = [];\n (ctor as unknown as Record<symbol, EventBindingMeta[]>)[MODEL_EVENT_METHODS] = methods;\n }\n methods.push({ propertyKey, model, path: null, eventType, method: originalMethod });\n\n patchEventLifecycle(ctor);\n };\n },\n\n /**\n * Binds a method to an event on a specific field.\n * When the event fires on that field, the method is called.\n *\n * @param path - Path to the field (e.g., \"cube.length\")\n * @param eventType - The event type to listen for\n */\n onFieldEvent<K extends keyof TEventMap & ModelEventType>(path: string, eventType: K) {\n return function onFieldEventDecorator(target: object, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n const ctor = target.constructor as typeof ReactiveElement;\n\n let methods = (ctor as unknown as Record<symbol, EventBindingMeta[]>)[MODEL_EVENT_METHODS];\n if (!methods) {\n methods = [];\n (ctor as unknown as Record<symbol, EventBindingMeta[]>)[MODEL_EVENT_METHODS] = methods;\n }\n methods.push({ propertyKey, model, path, eventType, method: originalMethod });\n\n patchEventLifecycle(ctor);\n };\n },\n };\n}\n\n// ─────────────────────────────────────────────────────────────────\n// Lifecycle Patching\n// ─────────────────────────────────────────────────────────────────\n\n/**\n * Get the field node for a path, handling both direct properties and nested paths.\n */\nfunction getFieldForPath(model: FieldNodeLike, path: string): FieldNodeLike {\n // Check if it's a direct property (starts with __ or no dots)\n if (path.startsWith(\"__\") || !path.includes(\".\")) {\n return model;\n }\n // Navigate to nested field (we trust the field exists per user guarantee)\n if (model.__getFieldNodeByPath) {\n return model.__getFieldNodeByPath(path) as FieldNodeLike;\n }\n return model;\n}\n\n/**\n * Get the value for a path from the model.\n */\nfunction getValueForPath(model: FieldNodeLike, path: string): unknown {\n if (path.startsWith(\"__\")) {\n // Direct property access for internal properties\n return (model as unknown as Record<string, unknown>)[path];\n }\n if (!path.includes(\".\")) {\n // Direct child field\n const field = (model as unknown as Record<string, unknown>)[path] as FieldNodeLike | undefined;\n return field?.value ?? field;\n }\n // Nested path - get the field and return its value\n if (model.__getFieldNodeByPath) {\n const field = model.__getFieldNodeByPath(path);\n return field?.value ?? field;\n }\n return undefined;\n}\n\n/**\n * Patch connectedCallback/disconnectedCallback for bind decorators.\n */\nfunction patchBindLifecycle(ctor: typeof ReactiveElement): void {\n if ((ctor as unknown as Record<symbol, boolean>)[MODEL_BIND_PATCHED]) {\n return;\n }\n (ctor as unknown as Record<symbol, boolean>)[MODEL_BIND_PATCHED] = true;\n\n const originalConnected = ctor.prototype.connectedCallback;\n const originalDisconnected = ctor.prototype.disconnectedCallback;\n\n ctor.prototype.connectedCallback = function connectedCallback(\n this: LitElement & Record<symbol, Map<string, { listener: (e: CustomEvent) => void; field: FieldNodeLike; eventType: string }>>\n ) {\n originalConnected?.call(this);\n\n const metadata = bindingsMetadata.get(Object.getPrototypeOf(this));\n if (!metadata) return;\n\n const listeners = new Map<string, { listener: (e: CustomEvent) => void; field: FieldNodeLike; eventType: string }>();\n this[MODEL_BIND_LISTENERS] = listeners;\n\n metadata.forEach(({ model, path, eventType }, propKey) => {\n const field = getFieldForPath(model, path);\n\n // Set initial value\n (this as unknown as Record<string, unknown>)[propKey] = getValueForPath(model, path);\n\n const listener = () => {\n (this as unknown as Record<string, unknown>)[propKey] = getValueForPath(model, path);\n };\n\n listeners.set(propKey, { listener, field, eventType });\n field.__addEventListener(eventType, listener);\n });\n };\n\n ctor.prototype.disconnectedCallback = function disconnectedCallback(\n this: LitElement & Record<symbol, Map<string, { listener: (e: CustomEvent) => void; field: FieldNodeLike; eventType: string }>>\n ) {\n const listeners = this[MODEL_BIND_LISTENERS];\n if (listeners) {\n listeners.forEach(({ listener, field, eventType }) => {\n field.__removeEventListener(eventType, listener);\n });\n listeners.clear();\n }\n\n originalDisconnected?.call(this);\n };\n}\n\n/**\n * Patch connectedCallback/disconnectedCallback for event decorators.\n */\nfunction patchEventLifecycle(ctor: typeof ReactiveElement): void {\n if ((ctor as unknown as Record<symbol, boolean>)[MODEL_EVENT_PATCHED]) {\n return;\n }\n (ctor as unknown as Record<symbol, boolean>)[MODEL_EVENT_PATCHED] = true;\n\n const originalConnected = ctor.prototype.connectedCallback;\n const originalDisconnected = ctor.prototype.disconnectedCallback;\n\n ctor.prototype.connectedCallback = function connectedCallback(\n this: LitElement & Record<symbol, Map<string, { listener: (e: CustomEvent) => void; field: FieldNodeLike; eventType: string }>>\n ) {\n originalConnected?.call(this);\n\n const methods = (this.constructor as unknown as Record<symbol, EventBindingMeta[]>)[MODEL_EVENT_METHODS];\n if (!methods) return;\n\n const listeners = new Map<string, { listener: (e: CustomEvent) => void; field: FieldNodeLike; eventType: string }>();\n this[MODEL_EVENT_LISTENERS] = listeners;\n\n methods.forEach(({ propertyKey, model, path, eventType, method }) => {\n // If path is specified, listen on that field; otherwise listen on root model\n const field = path ? getFieldForPath(model, path) : model;\n\n const listener = (e: CustomEvent) => {\n method.call(this, e.detail);\n };\n\n listeners.set(propertyKey, { listener, field, eventType });\n field.__addEventListener(eventType, listener);\n });\n };\n\n ctor.prototype.disconnectedCallback = function disconnectedCallback(\n this: LitElement & Record<symbol, Map<string, { listener: (e: CustomEvent) => void; field: FieldNodeLike; eventType: string }>>\n ) {\n const listeners = this[MODEL_EVENT_LISTENERS];\n if (listeners) {\n listeners.forEach(({ listener, field, eventType }) => {\n field.__removeEventListener(eventType, listener);\n });\n listeners.clear();\n }\n\n originalDisconnected?.call(this);\n };\n}\n"]}
|
|
@@ -53,7 +53,7 @@ import { EntityServiceEventMap } from "./EntityServiceTypes.js";
|
|
|
53
53
|
* @param service - The EventTarget service to bind to
|
|
54
54
|
* @returns Object with `bindToEvent` and `onEvent` decorator factories
|
|
55
55
|
*/
|
|
56
|
-
export declare function
|
|
56
|
+
export declare function ServiceBindings<TEventMap extends EntityServiceEventMap = EntityServiceEventMap>(service: EventTarget): {
|
|
57
57
|
/**
|
|
58
58
|
* Binds a property to a service event.
|
|
59
59
|
* When the event fires, the property is automatically updated from event.detail.
|
|
@@ -59,7 +59,7 @@ const EVENT_METHODS = Symbol.for("__serviceEventMethods__");
|
|
|
59
59
|
* @param service - The EventTarget service to bind to
|
|
60
60
|
* @returns Object with `bindToEvent` and `onEvent` decorator factories
|
|
61
61
|
*/
|
|
62
|
-
export function
|
|
62
|
+
export function ServiceBindings(service) {
|
|
63
63
|
return {
|
|
64
64
|
/**
|
|
65
65
|
* Binds a property to a service event.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceDecorators.js","sourceRoot":"","sources":["../../src/decorators/ServiceDecorators.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-param-reassign */\nimport { LitElement, ReactiveElement } from \"lit\";\n\nimport { EntityServiceEventMap } from \"./EntityServiceTypes\";\n\n/**\n * Metadata storage for property bindings\n * Maps: class prototype -> Map<propertyKey, { service, eventType, detailKey }>\n */\ninterface PropertyBindingMeta {\n service: EventTarget;\n eventType: string;\n detailKey: string;\n}\nconst propertyBindingsMetadata = new WeakMap<object, Map<string, PropertyBindingMeta>>();\n\n/**\n * Metadata storage for event method bindings\n * Maps: class constructor -> Array<{ propertyKey, service, eventType, method }>\n */\ninterface EventBindingMeta {\n propertyKey: string;\n service: EventTarget;\n eventType: string;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n method: Function;\n}\n\n// Symbol keys for instance storage\nconst PROPERTY_LISTENERS = Symbol.for(\"__servicePropertyListeners__\");\nconst EVENT_LISTENERS = Symbol.for(\"__serviceEventListeners__\");\nconst PROPERTY_PATCHED = Symbol.for(\"__servicePropertyPatched__\");\nconst EVENT_PATCHED = Symbol.for(\"__serviceEventPatched__\");\nconst EVENT_METHODS = Symbol.for(\"__serviceEventMethods__\");\n\n/**\n * ### serviceBindings Factory\n *\n * Creates type-safe decorators bound to a specific service instance.\n * Use this to bind component properties and methods to service events.\n *\n * The factory is generic and works with any `EventTarget`.\n * Event types and their detail payloads are type-checked at compile time\n * via the `TEventMap` type parameter.\n *\n * Usage:\n * ```typescript\n * import { cubeEntityService } from \"./CubeEntityService\";\n * import { serviceBindings } from \"./ServiceDecorators\";\n *\n * const cube = serviceBindings(cubeEntityService);\n *\n * class MyComponent extends LitElement {\n * // Property binding - type-safe event name, auto-extracts from detail\n * @cube.bindToEvent(\"busy-changed\")\n * @state()\n * private busy: boolean = false;\n *\n * // Event binding - type-safe event name and detail type\n * @cube.onEvent(\"response-received\")\n * private onResponseReceived() {\n * console.log(\"Data received!\");\n * }\n *\n * @cube.onEvent(\"error-5xx\")\n * private onError(detail: { serverResponse: Response }) {\n * console.error(\"Server error:\", detail.serverResponse);\n * }\n *\n * // Compile error! \"typo-event\" is not a valid event type\n * // @cube.onEvent(\"typo-event\")\n * }\n * ```\n *\n * ### Custom Event Maps\n *\n * To add custom events, extend the `EntityServiceEventMap`:\n * ```typescript\n * interface MyServiceEventMap extends EntityServiceEventMap {\n * \"custom-event\": { data: string };\n * }\n *\n * const myBindings = serviceBindings<MyServiceEventMap>(myService);\n * ```\n *\n * @typeParam TEventMap - The event map type (defaults to EntityServiceEventMap)\n * @param service - The EventTarget service to bind to\n * @returns Object with `bindToEvent` and `onEvent` decorator factories\n */\nexport function serviceBindings<TEventMap extends EntityServiceEventMap = EntityServiceEventMap>(service: EventTarget) {\n return {\n /**\n * Binds a property to a service event.\n * When the event fires, the property is automatically updated from event.detail.\n *\n * @typeParam K - The event type (constrained to valid event names)\n * @param eventType - The event name to listen for\n * @param detailKey - Optional key to extract from event.detail (defaults to inferring from event type)\n */\n bindToEvent<K extends keyof TEventMap & string>(eventType: K, detailKey?: string) {\n return function bindToEventDecorator(target: object, propertyKey: string) {\n // Infer detailKey from event type if not provided\n // e.g., \"busy-changed\" -> \"busy\"\n const key = detailKey ?? inferDetailKey(eventType, propertyKey);\n\n // Get or create metadata map for this class\n let metadata = propertyBindingsMetadata.get(target);\n if (!metadata) {\n metadata = new Map();\n propertyBindingsMetadata.set(target, metadata);\n }\n metadata.set(propertyKey, { service, eventType, detailKey: key });\n\n // Patch lifecycle methods (only once per class)\n patchPropertyLifecycle(target.constructor as typeof ReactiveElement);\n };\n },\n\n /**\n * Binds a method to a service event.\n * When the event fires, the method is called with event.detail as argument.\n *\n * The detail type is inferred from the event map:\n * - `@cube.onEvent(\"busy-changed\")` → method receives `{ busy: boolean }`\n * - `@cube.onEvent(\"error-5xx\")` → method receives `{ serverResponse: Response }`\n * - `@cube.onEvent(\"response-received\")` → method receives `{ response, serverResponse }`\n *\n * @typeParam K - The event type (constrained to valid event names)\n * @param eventType - The event name to listen for\n */\n onEvent<K extends keyof TEventMap & string>(eventType: K) {\n return function onEventDecorator(target: object, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n const ctor = target.constructor as typeof ReactiveElement;\n\n // Store method metadata on the constructor\n let methods = (ctor as unknown as Record<symbol, EventBindingMeta[]>)[EVENT_METHODS];\n if (!methods) {\n methods = [];\n (ctor as unknown as Record<symbol, EventBindingMeta[]>)[EVENT_METHODS] = methods;\n }\n methods.push({ propertyKey, service, eventType, method: originalMethod });\n\n // Patch lifecycle methods (only once per class)\n patchEventLifecycle(ctor);\n };\n },\n };\n}\n\n/**\n * Infer the detail key from the event type or property name\n */\nfunction inferDetailKey(eventType: string, propertyKey: string): string {\n // Common patterns: \"busy-changed\" -> \"busy\", \"validity-changed\" -> check property\n const match = eventType.match(/^(.+)-changed$/);\n if (match) {\n return match[1];\n }\n // Fall back to property name\n return propertyKey;\n}\n\n/**\n * Patch connectedCallback/disconnectedCallback for property bindings\n */\nfunction patchPropertyLifecycle(ctor: typeof ReactiveElement): void {\n if ((ctor as unknown as Record<symbol, boolean>)[PROPERTY_PATCHED]) {\n return;\n }\n (ctor as unknown as Record<symbol, boolean>)[PROPERTY_PATCHED] = true;\n\n const originalConnected = ctor.prototype.connectedCallback;\n const originalDisconnected = ctor.prototype.disconnectedCallback;\n\n ctor.prototype.connectedCallback = function connectedCallback(\n this: LitElement & Record<symbol, Map<string, { listener: EventListener; service: EventTarget; eventType: string }>>\n ) {\n originalConnected?.call(this);\n\n const metadata = propertyBindingsMetadata.get(Object.getPrototypeOf(this));\n if (!metadata) return;\n\n const listeners = new Map<string, { listener: EventListener; service: EventTarget; eventType: string }>();\n this[PROPERTY_LISTENERS] = listeners;\n\n metadata.forEach(({ service, eventType, detailKey }, propKey) => {\n const listener = ((e: CustomEvent) => {\n if (e.detail && detailKey in e.detail) {\n (this as unknown as Record<string, unknown>)[propKey] = e.detail[detailKey];\n }\n }) as EventListener;\n\n listeners.set(propKey, { listener, service, eventType });\n service.addEventListener(eventType, listener);\n });\n };\n\n ctor.prototype.disconnectedCallback = function disconnectedCallback(\n this: LitElement & Record<symbol, Map<string, { listener: EventListener; service: EventTarget; eventType: string }>>\n ) {\n const listeners = this[PROPERTY_LISTENERS];\n if (listeners) {\n listeners.forEach(({ listener, service, eventType }) => {\n service.removeEventListener(eventType, listener);\n });\n listeners.clear();\n }\n\n originalDisconnected?.call(this);\n };\n}\n\n/**\n * Patch connectedCallback/disconnectedCallback for event method bindings\n */\nfunction patchEventLifecycle(ctor: typeof ReactiveElement): void {\n if ((ctor as unknown as Record<symbol, boolean>)[EVENT_PATCHED]) {\n return;\n }\n (ctor as unknown as Record<symbol, boolean>)[EVENT_PATCHED] = true;\n\n const originalConnected = ctor.prototype.connectedCallback;\n const originalDisconnected = ctor.prototype.disconnectedCallback;\n\n ctor.prototype.connectedCallback = function connectedCallback(\n this: LitElement & Record<symbol, Map<string, { listener: EventListener; service: EventTarget; eventType: string }>>\n ) {\n originalConnected?.call(this);\n\n const methods = (this.constructor as unknown as Record<symbol, EventBindingMeta[]>)[EVENT_METHODS];\n if (!methods) return;\n\n const listeners = new Map<string, { listener: EventListener; service: EventTarget; eventType: string }>();\n this[EVENT_LISTENERS] = listeners;\n\n methods.forEach(({ propertyKey, service, eventType, method }) => {\n const listener = ((e: CustomEvent) => {\n method.call(this, e.detail);\n }) as EventListener;\n\n listeners.set(propertyKey, { listener, service, eventType });\n service.addEventListener(eventType, listener);\n });\n };\n\n ctor.prototype.disconnectedCallback = function disconnectedCallback(\n this: LitElement & Record<symbol, Map<string, { listener: EventListener; service: EventTarget; eventType: string }>>\n ) {\n const listeners = this[EVENT_LISTENERS];\n if (listeners) {\n listeners.forEach(({ listener, service, eventType }) => {\n service.removeEventListener(eventType, listener);\n });\n listeners.clear();\n }\n\n originalDisconnected?.call(this);\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ServiceDecorators.js","sourceRoot":"","sources":["../../src/decorators/ServiceDecorators.ts"],"names":[],"mappings":"AAcA,MAAM,wBAAwB,GAAG,IAAI,OAAO,EAA4C,CAAC;AAczF,mCAAmC;AACnC,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;AACtE,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAChE,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAClE,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAC5D,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,MAAM,UAAU,eAAe,CAAkE,OAAoB;IACnH,OAAO;QACL;;;;;;;WAOG;QACH,WAAW,CAAqC,SAAY,EAAE,SAAkB;YAC9E,OAAO,SAAS,oBAAoB,CAAC,MAAc,EAAE,WAAmB;gBACtE,kDAAkD;gBAClD,iCAAiC;gBACjC,MAAM,GAAG,GAAG,SAAS,IAAI,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;gBAEhE,4CAA4C;gBAC5C,IAAI,QAAQ,GAAG,wBAAwB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;oBACrB,wBAAwB,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACjD,CAAC;gBACD,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;gBAElE,gDAAgD;gBAChD,sBAAsB,CAAC,MAAM,CAAC,WAAqC,CAAC,CAAC;YACvE,CAAC,CAAC;QACJ,CAAC;QAED;;;;;;;;;;;WAWG;QACH,OAAO,CAAqC,SAAY;YACtD,OAAO,SAAS,gBAAgB,CAAC,MAAc,EAAE,WAAmB,EAAE,UAA8B;gBAClG,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC;gBACxC,MAAM,IAAI,GAAG,MAAM,CAAC,WAAqC,CAAC;gBAE1D,2CAA2C;gBAC3C,IAAI,OAAO,GAAI,IAAsD,CAAC,aAAa,CAAC,CAAC;gBACrF,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO,GAAG,EAAE,CAAC;oBACZ,IAAsD,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC;gBACnF,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;gBAE1E,gDAAgD;gBAChD,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,SAAiB,EAAE,WAAmB;IAC5D,kFAAkF;IAClF,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAChD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,6BAA6B;IAC7B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,IAA4B;IAC1D,IAAK,IAA2C,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACnE,OAAO;IACT,CAAC;IACA,IAA2C,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAEtE,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;IAC3D,MAAM,oBAAoB,GAAG,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC;IAEjE,IAAI,CAAC,SAAS,CAAC,iBAAiB,GAAG,SAAS,iBAAiB;QAG3D,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9B,MAAM,QAAQ,GAAG,wBAAwB,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAgF,CAAC;QAC1G,IAAI,CAAC,kBAAkB,CAAC,GAAG,SAAS,CAAC;QAErC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE;YAC9D,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAc,EAAE,EAAE;gBACnC,IAAI,CAAC,CAAC,MAAM,IAAI,SAAS,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;oBACrC,IAA2C,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC9E,CAAC;YACH,CAAC,CAAkB,CAAC;YAEpB,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,IAAI,CAAC,SAAS,CAAC,oBAAoB,GAAG,SAAS,oBAAoB;QAGjE,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC3C,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;gBACrD,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;YACH,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;QAED,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAA4B;IACvD,IAAK,IAA2C,CAAC,aAAa,CAAC,EAAE,CAAC;QAChE,OAAO;IACT,CAAC;IACA,IAA2C,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;IAEnE,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;IAC3D,MAAM,oBAAoB,GAAG,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC;IAEjE,IAAI,CAAC,SAAS,CAAC,iBAAiB,GAAG,SAAS,iBAAiB;QAG3D,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9B,MAAM,OAAO,GAAI,IAAI,CAAC,WAA6D,CAAC,aAAa,CAAC,CAAC;QACnG,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAgF,CAAC;QAC1G,IAAI,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;QAElC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE;YAC9D,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAc,EAAE,EAAE;gBACnC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC,CAAkB,CAAC;YAEpB,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,IAAI,CAAC,SAAS,CAAC,oBAAoB,GAAG,SAAS,oBAAoB;QAGjE,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;QACxC,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;gBACrD,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;YACH,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;QAED,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/* eslint-disable no-param-reassign */\nimport { LitElement, ReactiveElement } from \"lit\";\n\nimport { EntityServiceEventMap } from \"./EntityServiceTypes\";\n\n/**\n * Metadata storage for property bindings\n * Maps: class prototype -> Map<propertyKey, { service, eventType, detailKey }>\n */\ninterface PropertyBindingMeta {\n service: EventTarget;\n eventType: string;\n detailKey: string;\n}\nconst propertyBindingsMetadata = new WeakMap<object, Map<string, PropertyBindingMeta>>();\n\n/**\n * Metadata storage for event method bindings\n * Maps: class constructor -> Array<{ propertyKey, service, eventType, method }>\n */\ninterface EventBindingMeta {\n propertyKey: string;\n service: EventTarget;\n eventType: string;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n method: Function;\n}\n\n// Symbol keys for instance storage\nconst PROPERTY_LISTENERS = Symbol.for(\"__servicePropertyListeners__\");\nconst EVENT_LISTENERS = Symbol.for(\"__serviceEventListeners__\");\nconst PROPERTY_PATCHED = Symbol.for(\"__servicePropertyPatched__\");\nconst EVENT_PATCHED = Symbol.for(\"__serviceEventPatched__\");\nconst EVENT_METHODS = Symbol.for(\"__serviceEventMethods__\");\n\n/**\n * ### serviceBindings Factory\n *\n * Creates type-safe decorators bound to a specific service instance.\n * Use this to bind component properties and methods to service events.\n *\n * The factory is generic and works with any `EventTarget`.\n * Event types and their detail payloads are type-checked at compile time\n * via the `TEventMap` type parameter.\n *\n * Usage:\n * ```typescript\n * import { cubeEntityService } from \"./CubeEntityService\";\n * import { serviceBindings } from \"./ServiceDecorators\";\n *\n * const cube = serviceBindings(cubeEntityService);\n *\n * class MyComponent extends LitElement {\n * // Property binding - type-safe event name, auto-extracts from detail\n * @cube.bindToEvent(\"busy-changed\")\n * @state()\n * private busy: boolean = false;\n *\n * // Event binding - type-safe event name and detail type\n * @cube.onEvent(\"response-received\")\n * private onResponseReceived() {\n * console.log(\"Data received!\");\n * }\n *\n * @cube.onEvent(\"error-5xx\")\n * private onError(detail: { serverResponse: Response }) {\n * console.error(\"Server error:\", detail.serverResponse);\n * }\n *\n * // Compile error! \"typo-event\" is not a valid event type\n * // @cube.onEvent(\"typo-event\")\n * }\n * ```\n *\n * ### Custom Event Maps\n *\n * To add custom events, extend the `EntityServiceEventMap`:\n * ```typescript\n * interface MyServiceEventMap extends EntityServiceEventMap {\n * \"custom-event\": { data: string };\n * }\n *\n * const myBindings = serviceBindings<MyServiceEventMap>(myService);\n * ```\n *\n * @typeParam TEventMap - The event map type (defaults to EntityServiceEventMap)\n * @param service - The EventTarget service to bind to\n * @returns Object with `bindToEvent` and `onEvent` decorator factories\n */\nexport function ServiceBindings<TEventMap extends EntityServiceEventMap = EntityServiceEventMap>(service: EventTarget) {\n return {\n /**\n * Binds a property to a service event.\n * When the event fires, the property is automatically updated from event.detail.\n *\n * @typeParam K - The event type (constrained to valid event names)\n * @param eventType - The event name to listen for\n * @param detailKey - Optional key to extract from event.detail (defaults to inferring from event type)\n */\n bindToEvent<K extends keyof TEventMap & string>(eventType: K, detailKey?: string) {\n return function bindToEventDecorator(target: object, propertyKey: string) {\n // Infer detailKey from event type if not provided\n // e.g., \"busy-changed\" -> \"busy\"\n const key = detailKey ?? inferDetailKey(eventType, propertyKey);\n\n // Get or create metadata map for this class\n let metadata = propertyBindingsMetadata.get(target);\n if (!metadata) {\n metadata = new Map();\n propertyBindingsMetadata.set(target, metadata);\n }\n metadata.set(propertyKey, { service, eventType, detailKey: key });\n\n // Patch lifecycle methods (only once per class)\n patchPropertyLifecycle(target.constructor as typeof ReactiveElement);\n };\n },\n\n /**\n * Binds a method to a service event.\n * When the event fires, the method is called with event.detail as argument.\n *\n * The detail type is inferred from the event map:\n * - `@cube.onEvent(\"busy-changed\")` → method receives `{ busy: boolean }`\n * - `@cube.onEvent(\"error-5xx\")` → method receives `{ serverResponse: Response }`\n * - `@cube.onEvent(\"response-received\")` → method receives `{ response, serverResponse }`\n *\n * @typeParam K - The event type (constrained to valid event names)\n * @param eventType - The event name to listen for\n */\n onEvent<K extends keyof TEventMap & string>(eventType: K) {\n return function onEventDecorator(target: object, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n const ctor = target.constructor as typeof ReactiveElement;\n\n // Store method metadata on the constructor\n let methods = (ctor as unknown as Record<symbol, EventBindingMeta[]>)[EVENT_METHODS];\n if (!methods) {\n methods = [];\n (ctor as unknown as Record<symbol, EventBindingMeta[]>)[EVENT_METHODS] = methods;\n }\n methods.push({ propertyKey, service, eventType, method: originalMethod });\n\n // Patch lifecycle methods (only once per class)\n patchEventLifecycle(ctor);\n };\n },\n };\n}\n\n/**\n * Infer the detail key from the event type or property name\n */\nfunction inferDetailKey(eventType: string, propertyKey: string): string {\n // Common patterns: \"busy-changed\" -> \"busy\", \"validity-changed\" -> check property\n const match = eventType.match(/^(.+)-changed$/);\n if (match) {\n return match[1];\n }\n // Fall back to property name\n return propertyKey;\n}\n\n/**\n * Patch connectedCallback/disconnectedCallback for property bindings\n */\nfunction patchPropertyLifecycle(ctor: typeof ReactiveElement): void {\n if ((ctor as unknown as Record<symbol, boolean>)[PROPERTY_PATCHED]) {\n return;\n }\n (ctor as unknown as Record<symbol, boolean>)[PROPERTY_PATCHED] = true;\n\n const originalConnected = ctor.prototype.connectedCallback;\n const originalDisconnected = ctor.prototype.disconnectedCallback;\n\n ctor.prototype.connectedCallback = function connectedCallback(\n this: LitElement & Record<symbol, Map<string, { listener: EventListener; service: EventTarget; eventType: string }>>\n ) {\n originalConnected?.call(this);\n\n const metadata = propertyBindingsMetadata.get(Object.getPrototypeOf(this));\n if (!metadata) return;\n\n const listeners = new Map<string, { listener: EventListener; service: EventTarget; eventType: string }>();\n this[PROPERTY_LISTENERS] = listeners;\n\n metadata.forEach(({ service, eventType, detailKey }, propKey) => {\n const listener = ((e: CustomEvent) => {\n if (e.detail && detailKey in e.detail) {\n (this as unknown as Record<string, unknown>)[propKey] = e.detail[detailKey];\n }\n }) as EventListener;\n\n listeners.set(propKey, { listener, service, eventType });\n service.addEventListener(eventType, listener);\n });\n };\n\n ctor.prototype.disconnectedCallback = function disconnectedCallback(\n this: LitElement & Record<symbol, Map<string, { listener: EventListener; service: EventTarget; eventType: string }>>\n ) {\n const listeners = this[PROPERTY_LISTENERS];\n if (listeners) {\n listeners.forEach(({ listener, service, eventType }) => {\n service.removeEventListener(eventType, listener);\n });\n listeners.clear();\n }\n\n originalDisconnected?.call(this);\n };\n}\n\n/**\n * Patch connectedCallback/disconnectedCallback for event method bindings\n */\nfunction patchEventLifecycle(ctor: typeof ReactiveElement): void {\n if ((ctor as unknown as Record<symbol, boolean>)[EVENT_PATCHED]) {\n return;\n }\n (ctor as unknown as Record<symbol, boolean>)[EVENT_PATCHED] = true;\n\n const originalConnected = ctor.prototype.connectedCallback;\n const originalDisconnected = ctor.prototype.disconnectedCallback;\n\n ctor.prototype.connectedCallback = function connectedCallback(\n this: LitElement & Record<symbol, Map<string, { listener: EventListener; service: EventTarget; eventType: string }>>\n ) {\n originalConnected?.call(this);\n\n const methods = (this.constructor as unknown as Record<symbol, EventBindingMeta[]>)[EVENT_METHODS];\n if (!methods) return;\n\n const listeners = new Map<string, { listener: EventListener; service: EventTarget; eventType: string }>();\n this[EVENT_LISTENERS] = listeners;\n\n methods.forEach(({ propertyKey, service, eventType, method }) => {\n const listener = ((e: CustomEvent) => {\n method.call(this, e.detail);\n }) as EventListener;\n\n listeners.set(propertyKey, { listener, service, eventType });\n service.addEventListener(eventType, listener);\n });\n };\n\n ctor.prototype.disconnectedCallback = function disconnectedCallback(\n this: LitElement & Record<symbol, Map<string, { listener: EventListener; service: EventTarget; eventType: string }>>\n ) {\n const listeners = this[EVENT_LISTENERS];\n if (listeners) {\n listeners.forEach(({ listener, service, eventType }) => {\n service.removeEventListener(eventType, listener);\n });\n listeners.clear();\n }\n\n originalDisconnected?.call(this);\n };\n}\n"]}
|
|
@@ -17,7 +17,7 @@ export interface DefaultServiceEventHandlersOptions {
|
|
|
17
17
|
isLoading?: () => boolean;
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
|
-
* ###
|
|
20
|
+
* ### DefaultServiceEventHandlers
|
|
21
21
|
*
|
|
22
22
|
* Creates default service handlers that dispatch standard events.
|
|
23
23
|
* Use this to reduce boilerplate when setting up service handlers.
|
|
@@ -32,7 +32,7 @@ export interface DefaultServiceEventHandlersOptions {
|
|
|
32
32
|
*
|
|
33
33
|
* setupHandlers() {
|
|
34
34
|
* this.service.Get.setHandlers({
|
|
35
|
-
* ...
|
|
35
|
+
* ...DefaultServiceEventHandlers(this.dispatch),
|
|
36
36
|
* onResponse: (response, serverResponse) => {
|
|
37
37
|
* // Your custom response handling
|
|
38
38
|
* this.entity.fromLiteral(response.entity);
|
|
@@ -46,7 +46,7 @@ export interface DefaultServiceEventHandlersOptions {
|
|
|
46
46
|
* With loading check:
|
|
47
47
|
* ```typescript
|
|
48
48
|
* this.service.Get.setHandlers({
|
|
49
|
-
* ...
|
|
49
|
+
* ...DefaultServiceEventHandlers(this.dispatch, {
|
|
50
50
|
* isLoading: () => this.service.Get.isLoading || this.service.Update.isLoading,
|
|
51
51
|
* }),
|
|
52
52
|
* onResponse: (response, serverResponse) => { ... },
|
|
@@ -57,7 +57,7 @@ export interface DefaultServiceEventHandlersOptions {
|
|
|
57
57
|
* @param options - Optional configuration
|
|
58
58
|
* @returns Object with all standard handlers except onResponse
|
|
59
59
|
*/
|
|
60
|
-
export declare function
|
|
60
|
+
export declare function DefaultServiceEventHandlers(dispatch: DispatchFn, options?: DefaultServiceEventHandlersOptions): {
|
|
61
61
|
onRequestStarted(request: unknown): void;
|
|
62
62
|
onRequestFinished(request: unknown): void;
|
|
63
63
|
onResponseError(parsedResponse: unknown, serverResponse: Response): void;
|
|
@@ -85,5 +85,5 @@ export declare function defaultServiceEventHandlers(dispatch: DispatchFn, option
|
|
|
85
85
|
* @param target - The EventTarget to dispatch events on
|
|
86
86
|
* @returns A typed dispatch function
|
|
87
87
|
*/
|
|
88
|
-
export declare function
|
|
88
|
+
export declare function CreateDispatch(target: EventTarget): DispatchFn;
|
|
89
89
|
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ###
|
|
2
|
+
* ### DefaultServiceEventHandlers
|
|
3
3
|
*
|
|
4
4
|
* Creates default service handlers that dispatch standard events.
|
|
5
5
|
* Use this to reduce boilerplate when setting up service handlers.
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*
|
|
15
15
|
* setupHandlers() {
|
|
16
16
|
* this.service.Get.setHandlers({
|
|
17
|
-
* ...
|
|
17
|
+
* ...DefaultServiceEventHandlers(this.dispatch),
|
|
18
18
|
* onResponse: (response, serverResponse) => {
|
|
19
19
|
* // Your custom response handling
|
|
20
20
|
* this.entity.fromLiteral(response.entity);
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
* With loading check:
|
|
29
29
|
* ```typescript
|
|
30
30
|
* this.service.Get.setHandlers({
|
|
31
|
-
* ...
|
|
31
|
+
* ...DefaultServiceEventHandlers(this.dispatch, {
|
|
32
32
|
* isLoading: () => this.service.Get.isLoading || this.service.Update.isLoading,
|
|
33
33
|
* }),
|
|
34
34
|
* onResponse: (response, serverResponse) => { ... },
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
* @param options - Optional configuration
|
|
40
40
|
* @returns Object with all standard handlers except onResponse
|
|
41
41
|
*/
|
|
42
|
-
export function
|
|
42
|
+
export function DefaultServiceEventHandlers(dispatch, options = {}) {
|
|
43
43
|
const { isLoading } = options;
|
|
44
44
|
return {
|
|
45
45
|
onRequestStarted(request) {
|
|
@@ -92,9 +92,9 @@ export function defaultServiceEventHandlers(dispatch, options = {}) {
|
|
|
92
92
|
* @param target - The EventTarget to dispatch events on
|
|
93
93
|
* @returns A typed dispatch function
|
|
94
94
|
*/
|
|
95
|
-
export function
|
|
95
|
+
export function CreateDispatch(target) {
|
|
96
96
|
return function dispatchEvent(type, detail) {
|
|
97
97
|
target.dispatchEvent(new CustomEvent(type, { detail }));
|
|
98
98
|
};
|
|
99
99
|
}
|
|
100
|
-
//# sourceMappingURL=
|
|
100
|
+
//# sourceMappingURL=DefaultServiceEventHandlers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"DefaultServiceEventHandlers.js","sourceRoot":"","sources":["../../src/decorators/DefaultServiceEventHandlers.ts"],"names":[],"mappings":"AAqBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,MAAM,UAAU,2BAA2B,CAAC,QAAoB,EAAE,UAA8C,EAAE;IAChH,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAE9B,OAAO;QACL,gBAAgB,CAAC,OAAgB;YAC/B,QAAQ,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YACzC,QAAQ,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,iBAAiB,CAAC,OAAgB;YAChC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAC1C,QAAQ,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,eAAe,CAAC,cAAuB,EAAE,cAAwB;YAC/D,QAAQ,CAAC,gBAAgB,EAAE,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;YAC/D,IAAI,cAAc,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAClC,QAAQ,CAAC,WAAW,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,cAAc,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBACjC,QAAQ,CAAC,WAAW,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,kBAAkB,CAAC,cAAwB;YACzC,QAAQ,CAAC,WAAW,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,aAAa,CAAC,cAAwB;YACpC,QAAQ,CAAC,cAAc,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,gBAAgB,CAAC,MAAe;YAC9B,QAAQ,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,YAAY,CAAC,KAAc;YACzB,QAAQ,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACrC,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,cAAc,CAAC,MAAmB;IAChD,OAAO,SAAS,aAAa,CAAmC,IAAO,EAAE,MAAgC;QACvG,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { EntityServiceEventMap, EntityServiceEventType } from \"./EntityServiceTypes\";\n\n/**\n * Dispatch function type for entity service events.\n * Accepts any function that can dispatch the standard EntityServiceEventType events.\n * This allows extended event maps (like CubeServiceEventMap) to be used.\n */\ntype DispatchFn = (type: EntityServiceEventType, detail: EntityServiceEventMap[EntityServiceEventType]) => void;\n\n/**\n * Options for creating default service event handlers.\n */\nexport interface DefaultServiceEventHandlersOptions {\n /**\n * Function to check if the service is still loading.\n * Used by `onRequestFinished` to determine the busy state.\n * If not provided, busy is set to false on request finish.\n */\n isLoading?: () => boolean;\n}\n\n/**\n * ### DefaultServiceEventHandlers\n *\n * Creates default service handlers that dispatch standard events.\n * Use this to reduce boilerplate when setting up service handlers.\n *\n * The `onResponse` handler is intentionally NOT included - you must provide your own\n * implementation since response handling is typically service-specific.\n *\n * Usage:\n * ```typescript\n * class MyEntityService extends EventTarget {\n * private dispatch = createDispatch(this);\n *\n * setupHandlers() {\n * this.service.Get.setHandlers({\n * ...DefaultServiceEventHandlers(this.dispatch),\n * onResponse: (response, serverResponse) => {\n * // Your custom response handling\n * this.entity.fromLiteral(response.entity);\n * this.dispatch(\"response-received\", { response, serverResponse });\n * },\n * });\n * }\n * }\n * ```\n *\n * With loading check:\n * ```typescript\n * this.service.Get.setHandlers({\n * ...DefaultServiceEventHandlers(this.dispatch, {\n * isLoading: () => this.service.Get.isLoading || this.service.Update.isLoading,\n * }),\n * onResponse: (response, serverResponse) => { ... },\n * });\n * ```\n *\n * @param dispatch - Function to dispatch events (typically bound to the service's dispatchEvent)\n * @param options - Optional configuration\n * @returns Object with all standard handlers except onResponse\n */\nexport function DefaultServiceEventHandlers(dispatch: DispatchFn, options: DefaultServiceEventHandlersOptions = {}) {\n const { isLoading } = options;\n\n return {\n onRequestStarted(request: unknown) {\n dispatch(\"request-started\", { request });\n dispatch(\"busy-changed\", { busy: true });\n },\n\n onRequestFinished(request: unknown) {\n dispatch(\"request-finished\", { request });\n dispatch(\"busy-changed\", { busy: isLoading ? isLoading() : false });\n },\n\n onResponseError(parsedResponse: unknown, serverResponse: Response) {\n dispatch(\"response-error\", { parsedResponse, serverResponse });\n if (serverResponse.status === 404) {\n dispatch(\"error-404\", { serverResponse });\n }\n if (serverResponse.status >= 500) {\n dispatch(\"error-5xx\", { serverResponse });\n }\n },\n\n onResponseErrorRaw(serverResponse: Response) {\n dispatch(\"raw-error\", { serverResponse });\n },\n\n onResponseRaw(serverResponse: Response) {\n dispatch(\"raw-response\", { serverResponse });\n },\n\n onRequestAborted(reason: unknown) {\n dispatch(\"request-aborted\", { reason: String(reason) });\n },\n\n onFatalError(error: unknown) {\n dispatch(\"fatal-error\", { error });\n },\n };\n}\n\n/**\n * ### createDispatch\n *\n * Helper to create a typed dispatch function for an EventTarget.\n *\n * Usage:\n * ```typescript\n * class MyService extends EventTarget {\n * private dispatch = createDispatch(this);\n *\n * doSomething() {\n * this.dispatch(\"busy-changed\", { busy: true });\n * }\n * }\n * ```\n *\n * @param target - The EventTarget to dispatch events on\n * @returns A typed dispatch function\n */\nexport function CreateDispatch(target: EventTarget): DispatchFn {\n return function dispatchEvent<K extends EntityServiceEventType>(type: K, detail: EntityServiceEventMap[K]) {\n target.dispatchEvent(new CustomEvent(type, { detail }));\n };\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -36,13 +36,13 @@ export { FieldMask } from './well_known/FieldMask.js';
|
|
|
36
36
|
export { ARRAY } from './proxies/ARRAY.js';
|
|
37
37
|
export { MAP } from './proxies/MAP.js';
|
|
38
38
|
export { RECURSION } from './proxies/RECURSION.js';
|
|
39
|
-
export {
|
|
40
|
-
export {
|
|
39
|
+
export { ServiceBindings } from './decorators/ServiceDecorators.js';
|
|
40
|
+
export { ModelBindings } from './decorators/ModelDecorators.js';
|
|
41
41
|
export type { ModelEventType } from './decorators/ModelDecorators.js';
|
|
42
42
|
export { fieldBindings } from './decorators/FieldBindings.js';
|
|
43
43
|
export type { BindableComponent, FieldNodeLike } from './decorators/FieldBindings.js';
|
|
44
44
|
export { SchemaBuilder } from './decorators/SchemaBuilder.js';
|
|
45
|
-
export {
|
|
45
|
+
export { DefaultServiceEventHandlers, CreateDispatch } from './decorators/DefaultServiceEventHandlers.js';
|
|
46
46
|
export type { EntityServiceEventType, TypedEntityService } from './decorators/EntityServiceTypes.js';
|
|
47
47
|
export type { EntityServiceEventMap } from './decorators/EntityServiceTypes.js';
|
|
48
48
|
export interface IAny {
|
package/dist/index.js
CHANGED
|
@@ -37,9 +37,9 @@ export { ARRAY } from './proxies/ARRAY.js';
|
|
|
37
37
|
export { MAP } from './proxies/MAP.js';
|
|
38
38
|
export { RECURSION } from './proxies/RECURSION.js';
|
|
39
39
|
// Decorators
|
|
40
|
-
export {
|
|
41
|
-
export {
|
|
40
|
+
export { ServiceBindings } from './decorators/ServiceDecorators.js';
|
|
41
|
+
export { ModelBindings } from './decorators/ModelDecorators.js';
|
|
42
42
|
export { fieldBindings } from './decorators/FieldBindings.js';
|
|
43
43
|
export { SchemaBuilder } from './decorators/SchemaBuilder.js';
|
|
44
|
-
export {
|
|
44
|
+
export { DefaultServiceEventHandlers, CreateDispatch } from './decorators/DefaultServiceEventHandlers.js';
|
|
45
45
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGvD,aAAa;AACb,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,aAAa;AACb,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAI7C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,UAAU;AACV,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,aAAa;AACb,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC","sourcesContent":["export { FieldNode, ValueStateSummary } from './FieldNode';\nexport { Registry } from './Registry';\nexport { ValueState } from './ValueState';\nexport { OPEN_MODELS_OPTIONS } from './OPEN_MODELS_OPTIONS';\nexport { ToString, ValueOf } from './CustomPrototypes';\nexport { FieldConstraints } from './FieldConstraints';\n\n// Primitives\nexport { BOOLEAN } from './primitives/BOOLEAN';\nexport { ENUM } from './primitives/ENUM';\nexport { INT32 } from './primitives/INT32';\nexport { INT64 } from './primitives/INT64';\nexport { SINT32 } from './primitives/SINT32';\nexport { SINT64 } from './primitives/SINT64';\nexport { UINT32 } from './primitives/UINT32';\nexport { UINT64 } from './primitives/UINT64';\nexport { STRING } from './primitives/STRING';\nexport { BYTES } from './primitives/BYTES';\nexport { DOUBLE } from './primitives/DOUBLE';\nexport { FLOAT } from './primitives/FLOAT';\n\n// well known\nexport { EMPTY } from './well_known/EMPTY';\nexport { ANY } from './well_known/ANY';\nexport { Int32Value } from './well_known/Int32Value';\nexport { Int64Value } from './well_known/Int64Value';\nexport { UInt32Value } from './well_known/UInt32Value';\nexport { UInt64Value } from './well_known/UInt64Value';\nexport { DoubleValue } from './well_known/DoubleValue';\nexport { FloatValue } from './well_known/FloatValue';\nexport { BoolValue } from './well_known/BoolValue';\nexport { BytesValue } from './well_known/BytesValue';\nexport { StringValue } from './well_known/StringValue';\nexport { Timestamp } from './well_known/Timestamp';\nexport { Struct } from './well_known/Struct';\n\nexport { JSONValue } from './well_known/Struct';\nexport { JSONObject } from './well_known/Struct';\nexport { Duration } from './well_known/Duration';\nexport { FieldMask } from './well_known/FieldMask';\n\n// proxies\nexport { ARRAY } from './proxies/ARRAY';\nexport { MAP } from './proxies/MAP';\nexport { RECURSION } from './proxies/RECURSION';\n\n// Decorators\nexport {
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGvD,aAAa;AACb,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,aAAa;AACb,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAI7C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,UAAU;AACV,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,aAAa;AACb,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC","sourcesContent":["export { FieldNode, ValueStateSummary } from './FieldNode';\nexport { Registry } from './Registry';\nexport { ValueState } from './ValueState';\nexport { OPEN_MODELS_OPTIONS } from './OPEN_MODELS_OPTIONS';\nexport { ToString, ValueOf } from './CustomPrototypes';\nexport { FieldConstraints } from './FieldConstraints';\n\n// Primitives\nexport { BOOLEAN } from './primitives/BOOLEAN';\nexport { ENUM } from './primitives/ENUM';\nexport { INT32 } from './primitives/INT32';\nexport { INT64 } from './primitives/INT64';\nexport { SINT32 } from './primitives/SINT32';\nexport { SINT64 } from './primitives/SINT64';\nexport { UINT32 } from './primitives/UINT32';\nexport { UINT64 } from './primitives/UINT64';\nexport { STRING } from './primitives/STRING';\nexport { BYTES } from './primitives/BYTES';\nexport { DOUBLE } from './primitives/DOUBLE';\nexport { FLOAT } from './primitives/FLOAT';\n\n// well known\nexport { EMPTY } from './well_known/EMPTY';\nexport { ANY } from './well_known/ANY';\nexport { Int32Value } from './well_known/Int32Value';\nexport { Int64Value } from './well_known/Int64Value';\nexport { UInt32Value } from './well_known/UInt32Value';\nexport { UInt64Value } from './well_known/UInt64Value';\nexport { DoubleValue } from './well_known/DoubleValue';\nexport { FloatValue } from './well_known/FloatValue';\nexport { BoolValue } from './well_known/BoolValue';\nexport { BytesValue } from './well_known/BytesValue';\nexport { StringValue } from './well_known/StringValue';\nexport { Timestamp } from './well_known/Timestamp';\nexport { Struct } from './well_known/Struct';\n\nexport { JSONValue } from './well_known/Struct';\nexport { JSONObject } from './well_known/Struct';\nexport { Duration } from './well_known/Duration';\nexport { FieldMask } from './well_known/FieldMask';\n\n// proxies\nexport { ARRAY } from './proxies/ARRAY';\nexport { MAP } from './proxies/MAP';\nexport { RECURSION } from './proxies/RECURSION';\n\n// Decorators\nexport { ServiceBindings } from './decorators/ServiceDecorators';\nexport { ModelBindings } from './decorators/ModelDecorators';\nexport type { ModelEventType } from './decorators/ModelDecorators';\nexport { fieldBindings } from './decorators/FieldBindings';\nexport type { BindableComponent, FieldNodeLike } from './decorators/FieldBindings';\nexport { SchemaBuilder } from './decorators/SchemaBuilder';\nexport { DefaultServiceEventHandlers, CreateDispatch } from './decorators/DefaultServiceEventHandlers';\nexport type { EntityServiceEventType, TypedEntityService } from './decorators/EntityServiceTypes';\nexport type { EntityServiceEventMap } from './decorators/EntityServiceTypes';\n\nexport interface IAny {\n '@type': string;\n [key: string]: unknown;\n}\n"]}
|