@furo/open-models 1.17.0 → 1.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +7794 -2699
- package/dist/API_OPTIONS.d.ts +1 -1
- package/dist/API_OPTIONS.js.map +1 -1
- package/dist/CustomPrototypes.js.map +1 -1
- package/dist/FieldNode.d.ts +31 -1
- package/dist/FieldNode.js +98 -0
- package/dist/FieldNode.js.map +1 -1
- package/dist/Mapper.js +6 -8
- package/dist/Mapper.js.map +1 -1
- package/dist/OPEN_MODELS_OPTIONS.js +2 -2
- package/dist/OPEN_MODELS_OPTIONS.js.map +1 -1
- package/dist/StrictFetcher.js.map +1 -1
- package/dist/Validator.d.ts +1 -1
- package/dist/Validator.js.map +1 -1
- package/dist/ValueState.js.map +1 -1
- package/dist/decorators/ModelDecorators.d.ts +13 -11
- package/dist/decorators/ModelDecorators.js +14 -34
- package/dist/decorators/ModelDecorators.js.map +1 -1
- package/dist/index.d.ts +50 -49
- package/dist/index.js +42 -41
- package/dist/index.js.map +1 -1
- package/dist/primitives/BOOLEAN.d.ts +1 -1
- package/dist/primitives/BOOLEAN.js +9 -13
- package/dist/primitives/BOOLEAN.js.map +1 -1
- package/dist/primitives/DOUBLE.d.ts +2 -2
- package/dist/primitives/DOUBLE.js +17 -24
- package/dist/primitives/DOUBLE.js.map +1 -1
- package/dist/primitives/ENUM.d.ts +1 -1
- package/dist/primitives/ENUM.js +6 -9
- package/dist/primitives/ENUM.js.map +1 -1
- package/dist/primitives/FLOAT.d.ts +2 -2
- package/dist/primitives/FLOAT.js +17 -24
- package/dist/primitives/FLOAT.js.map +1 -1
- package/dist/primitives/INT32.d.ts +2 -2
- package/dist/primitives/INT32.js +17 -18
- package/dist/primitives/INT32.js.map +1 -1
- package/dist/primitives/SINT32.d.ts +2 -2
- package/dist/primitives/SINT32.js +17 -18
- package/dist/primitives/SINT32.js.map +1 -1
- package/dist/primitives/UINT32.d.ts +2 -2
- package/dist/primitives/UINT32.js +17 -18
- package/dist/primitives/UINT32.js.map +1 -1
- package/dist/web-components/furo-type-renderer.d.ts +2 -2
- package/dist/web-components/furo-type-renderer.js +2 -2
- package/dist/web-components/furo-type-renderer.js.map +1 -1
- package/dist/web-components/impl/TypeRenderer/index.d.ts +2 -2
- package/dist/web-components/impl/TypeRenderer/index.js +2 -2
- package/dist/web-components/impl/TypeRenderer/index.js.map +1 -1
- package/dist/well_known/BoolValue.d.ts +2 -2
- package/dist/well_known/BoolValue.js +12 -16
- package/dist/well_known/BoolValue.js.map +1 -1
- package/dist/well_known/BytesValue.d.ts +2 -2
- package/dist/well_known/BytesValue.js +21 -25
- package/dist/well_known/BytesValue.js.map +1 -1
- package/dist/well_known/DoubleValue.d.ts +1 -1
- package/dist/well_known/DoubleValue.js +23 -37
- package/dist/well_known/DoubleValue.js.map +1 -1
- package/dist/well_known/Duration.d.ts +2 -2
- package/dist/well_known/Duration.js +15 -19
- package/dist/well_known/Duration.js.map +1 -1
- package/dist/well_known/FieldMask.d.ts +2 -2
- package/dist/well_known/FieldMask.js +15 -19
- package/dist/well_known/FieldMask.js.map +1 -1
- package/dist/well_known/FloatValue.d.ts +2 -2
- package/dist/well_known/FloatValue.js +4 -4
- package/dist/well_known/FloatValue.js.map +1 -1
- package/dist/well_known/Int32Value.d.ts +2 -2
- package/dist/well_known/Int32Value.js +23 -31
- package/dist/well_known/Int32Value.js.map +1 -1
- package/dist/well_known/ListValue.d.ts +23 -0
- package/dist/well_known/ListValue.js +84 -0
- package/dist/well_known/ListValue.js.map +1 -0
- package/dist/well_known/Timestamp.d.ts +2 -2
- package/dist/well_known/Timestamp.js +15 -19
- package/dist/well_known/Timestamp.js.map +1 -1
- package/dist/well_known/UInt32Value.d.ts +2 -2
- package/dist/well_known/UInt32Value.js +23 -31
- package/dist/well_known/UInt32Value.js.map +1 -1
- package/dist/well_known/UInt64Value.d.ts +2 -2
- package/dist/well_known/UInt64Value.js +23 -34
- package/dist/well_known/UInt64Value.js.map +1 -1
- package/package.json +2 -2
- package/web-types.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OPEN_MODELS_OPTIONS.js","sourceRoot":"","sources":["../src/OPEN_MODELS_OPTIONS.ts"],"names":[],"mappings":"AAyDA,MAAM,CAAC,MAAM,mBAAmB,GAAY;IAC1C,aAAa,EAAE,IAAI;IACnB,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"OPEN_MODELS_OPTIONS.js","sourceRoot":"","sources":["../src/OPEN_MODELS_OPTIONS.ts"],"names":[],"mappings":"AAyDA,MAAM,CAAC,MAAM,mBAAmB,GAAY;IAC1C,aAAa,EAAE,IAAI;IACnB,cAAc,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE;IAC7D,iBAAiB,EAAE,KAAK;IACxB,eAAe,EAAE,KAAK;IACtB,0BAA0B,EAAE,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;CAC3G,CAAC","sourcesContent":["export interface Options {\n /**\n * UseProtoNames uses proto field name instead of lowerCamelCase name in JSON field names.\n */\n UseProtoNames: boolean;\n /**\n * Replace with your own label formatter, if you want to use translations for the labels.\n * @param key\n */\n labelFormatter: (key: string, ...params: string[]) => string;\n /**\n * EmitUnpopulated specifies whether to emit unpopulated fields. It does not\n * emit unpopulated oneof fields or unpopulated extension fields.\n * The JSON value emitted for unpopulated fields are as follows:\n * ╔═══════╤════════════════════════════╗\n * ║ JSON │ Protobuf field ║\n * ╠═══════╪════════════════════════════╣\n * ║ false │ proto3 boolean fields ║\n * ║ 0 │ proto3 numeric fields ║\n * ║ \"\" │ proto3 string/bytes fields ║\n * ║ null │ proto2 scalar fields ║\n * ║ null │ message fields ║\n * ║ [] │ list fields ║\n * ║ {} │ map fields ║\n * ╚═══════╧════════════════════════════╝\n */\n EmitUnpopulated: boolean;\n /**\n * EmitDefaultValues specifies whether to emit default-valued primitive fields,\n * empty lists, and empty maps. The fields affected are as follows:\n * ╔═══════╤════════════════════════════════════════╗\n * ║ JSON │ Protobuf field ║\n * ╠═══════╪════════════════════════════════════════╣\n * ║ false │ non-optional scalar boolean fields ║\n * ║ 0 │ non-optional scalar numeric fields ║\n * ║ \"\" │ non-optional scalar string/byte fields ║\n * ║ [] │ empty repeated fields ║\n * ║ {} │ empty map fields ║\n * ╚═══════╧════════════════════════════════════════╝\n *\n * Behaves similarly to EmitUnpopulated, but does not emit \"null\"-value fields,\n * i.e. presence-sensing fields that are omitted will remain omitted to preserve\n * presence-sensing.\n * EmitUnpopulated takes precedence over EmitDefaultValues since the former generates\n * a strict superset of the latter.\n *\n */\n EmitDefaultValues: boolean;\n /**\n * Use this method to translate the value state messages.\n * @param key - message key\n * @param params - message params\n */\n valueStateMessageFormatter: (key: string, ...params: string[]) => string;\n // todo merge all formatters to one formatter, maybe rename to \"translate\"\n}\n\nexport const OPEN_MODELS_OPTIONS: Options = {\n UseProtoNames: true,\n labelFormatter: key => key.replaceAll(\".\", \"_\").toUpperCase(),\n EmitDefaultValues: false,\n EmitUnpopulated: false,\n valueStateMessageFormatter: (key, ...params) => `${key}${params.length > 0 ? ` ${params.join(\" \")}` : \"\"}`,\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StrictFetcher.js","sourceRoot":"","sources":["../src/StrictFetcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { FieldNode } from \"./FieldNode\";\n\nexport interface IApiOptions {\n serverAddr: string;\n ApiBaseURL: string;\n headers?: Headers;\n timeout?: number;\n UseProtoNames: boolean;\n UseProtoNamesForQueryParams: boolean;\n}\n\ninterface Handlers<REQ, RES> {\n onResponse?: (response: RES, serverResponse: Response) => void;\n onResponseError?: (parsedResponse: unknown, serverResponse: Response) => void;\n onRequestStarted?: (req: REQ) => void;\n onRequestFinished?: (req: REQ) => void;\n onRequestAborted?: (req: REQ) => void;\n onResponseRaw?: (serverResponse: Response) => void;\n onResponseErrorRaw?: (serverResponse: Response) => void;\n onResponseParseError?: (error: unknown, serverResponse: Response) => void;\n onResponseErrorParseError?: (error: unknown, serverResponse: Response) => void;\n onFatalError?: (error: unknown) => void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype FieldNodeConstructor = new (initData?: any, parent?: FieldNode, parentAttributeName?: string) => FieldNode;\n\nexport class StrictFetcher<REQ, RES> {\n public timeout: number;\n public lastResponse: Response | undefined;\n public isLoading = false;\n\n private path: string;\n private requestInit: RequestInit;\n private method: string;\n private responseHandler: Map<string, (r: Response) => void> = new Map<string, (r: Response) => void>();\n private abortController: AbortController;\n private timeoutId: ReturnType<typeof setTimeout> | number | undefined;\n private bodyField: keyof REQ | \"*\" | undefined;\n private API_OPTIONS: IApiOptions;\n\n private ReqType: FieldNodeConstructor;\n private ResType: FieldNodeConstructor;\n\n // Maps camelCase fieldName → protoName from the REQ type's field descriptors\n private reqProtoNameMap: Map<string, string>;\n // Maps camelCase fieldName → FieldConstructor from the REQ type's field descriptors\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private reqFieldConstructorMap: Map<string, any>;\n\n constructor(\n options: IApiOptions,\n method: string,\n path: string,\n ReqType: FieldNodeConstructor,\n ResType: FieldNodeConstructor,\n bodyField?: keyof REQ | \"*\",\n ) {\n this.API_OPTIONS = options;\n this.path = path;\n this.bodyField = bodyField;\n this.method = method;\n this.ReqType = ReqType;\n this.ResType = ResType;\n\n // Build the proto name map from the REQ type's field descriptors\n this.reqProtoNameMap = new Map<string, string>();\n this.reqFieldConstructorMap = new Map<string, FieldNodeConstructor>();\n const tempReq = new ReqType();\n tempReq.__meta.nodeFields.forEach(field => {\n this.reqProtoNameMap.set(field.fieldName, field.protoName);\n this.reqFieldConstructorMap.set(field.fieldName, field.FieldConstructor as FieldNodeConstructor);\n });\n\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n this.requestInit = {\n method: this.method,\n signal,\n headers: this.API_OPTIONS.headers,\n redirect: \"follow\",\n };\n\n this.timeout = this.API_OPTIONS.timeout ?? 300000;\n }\n\n public setRequestOptions(ri: RequestInit) {\n const { signal } = this.abortController;\n this.requestInit = {\n method: this.method,\n headers: this.API_OPTIONS.headers,\n signal,\n ...ri,\n };\n }\n\n public setHandlers(handlers: Handlers<REQ, RES>) {\n this.onResponse = handlers.onResponse;\n this.onResponseError = handlers.onResponseError;\n this.onRequestStarted = handlers.onRequestStarted;\n this.onRequestFinished = handlers.onRequestFinished;\n this.onRequestAborted = handlers.onRequestAborted;\n this.onResponseRaw = handlers.onResponseRaw;\n this.onResponseErrorRaw = handlers.onResponseErrorRaw;\n this.onResponseParseError = handlers.onResponseParseError;\n this.onResponseErrorParseError = handlers.onResponseErrorParseError;\n this.onFatalError = handlers.onFatalError;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public abortPendingRequest(reason: any): void {\n if (!this.isLoading) {\n return;\n }\n clearTimeout(this.timeoutId);\n this.isLoading = false;\n this.abortController.abort(reason);\n\n if (this.onRequestAborted) {\n this.onRequestAborted(reason as REQ);\n }\n }\n\n public invoke(rqo: REQ, options?: RequestInit): Promise<RES> {\n return new Promise((resolve, reject) => {\n if (this.isLoading) {\n this.abortPendingRequest(\"invoke triggered before response\");\n }\n\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n\n this.requestInit = {\n method: this.method,\n signal,\n headers: this.API_OPTIONS.headers,\n };\n\n if (options) {\n this.setRequestOptions(options);\n }\n\n this.isLoading = true;\n\n const { evaluatedPath, evaluatedBody } = this.buildPathAndBodyfield(this.path, this.bodyField, rqo);\n if (evaluatedBody) {\n this.requestInit.body = evaluatedBody;\n }\n\n clearTimeout(this.timeoutId);\n const request = new Request(evaluatedPath, this.requestInit);\n this.timeoutId = setTimeout(() => {\n this.abortController.abort(`Timeout of ${String(this.timeout)}ms reached`);\n if (this.onRequestAborted) {\n this.onRequestAborted(rqo);\n }\n\n console.error(`RequestService fetch aborted: Timeout of ${String(this.timeout)}ms reached`);\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(rqo);\n }, this.timeout);\n\n if (this.onRequestStarted) {\n this.onRequestStarted(rqo);\n }\n\n fetch(request)\n .then(response => {\n this._reworkRequest(response)\n .then(data => {\n resolve(data);\n })\n .catch(reject);\n if (this.onRequestFinished) {\n this.onRequestFinished(rqo);\n }\n })\n .catch((err: unknown) => {\n this.isLoading = false;\n\n if (err instanceof Error && err.name === \"AbortError\") {\n if (this.onRequestAborted) {\n this.onRequestAborted(rqo);\n }\n if (this.onRequestFinished) {\n this.onRequestFinished(rqo);\n }\n\n console.error(\"RequestService fetch aborted: \", err);\n } else {\n if (this.onRequestFinished) {\n this.onRequestFinished(rqo);\n }\n\n if (this.onFatalError) {\n this.onFatalError(err);\n }\n }\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n }\n\n _reworkRequest(response: Response): Promise<RES> {\n return new Promise((resolve, reject) => {\n this.isLoading = false;\n clearTimeout(this.timeoutId);\n const status = response.status;\n\n if (status === 0 || (status >= 200 && status < 300)) {\n this.lastResponse = response;\n\n if (this.onResponseRaw) {\n this.onResponseRaw(response);\n }\n\n this._parseResponse(response)\n .then(r => {\n resolve(r as RES);\n if (this.onResponse) {\n this.onResponse(r as RES, response);\n }\n })\n .catch((error: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(error);\n if (this.onResponseParseError) {\n this.onResponseParseError(error, response);\n }\n });\n } else {\n this.lastResponse = response;\n if (this.onResponseErrorRaw) {\n this.onResponseErrorRaw(response);\n }\n\n this._parseResponse(response)\n .then(r => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(r);\n if (this.onResponseError) {\n this.onResponseError(r, response);\n }\n })\n .catch((error: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(error);\n if (this.onResponseErrorParseError) {\n this.onResponseErrorParseError(error, response);\n }\n });\n }\n });\n }\n\n _parseResponse(response: Response) {\n return new Promise((resolve, reject) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\n if (response) {\n this.responseHandler.set(\"text/plain\", r => {\n r.text()\n .then(text => {\n resolve(text);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n\n this.responseHandler.set(\"text/html\", r => {\n r.text()\n .then(text => {\n resolve(text);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n\n this.responseHandler.set(\"application/json\", r => {\n r.json()\n .then(json => {\n if (this.API_OPTIONS.UseProtoNames) {\n // Use FieldNode-based conversion instead of generic Mapper\n const resNode = new this.ResType();\n resNode.__fromProtoNameJson(json);\n resolve(resNode.__toLiteral());\n } else {\n resolve(json);\n }\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n\n this.responseHandler.set(\"application/x-ndjson\", r => {\n const preserveProtoNames = this.API_OPTIONS.UseProtoNames;\n const ResTypeCtor = this.ResType;\n\n const reader = r.body?.getReader();\n if (!reader) {\n throw new Error(\"NDJSON response has no readable body\");\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const iterator = {\n async *[Symbol.asyncIterator](): AsyncGenerator<RES> {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- loop exits via break on done\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"\") {\n continue;\n }\n\n let parsed: RES;\n try {\n parsed = JSON.parse(trimmed) as RES;\n } catch {\n throw new Error(`Failed to parse NDJSON line: ${trimmed}`);\n }\n\n if (preserveProtoNames) {\n const resNode = new ResTypeCtor();\n resNode.__fromProtoNameJson(parsed);\n yield resNode.__toLiteral() as RES;\n } else {\n yield parsed;\n }\n }\n }\n\n if (buffer.trim() !== \"\") {\n try {\n const parsed = JSON.parse(buffer.trim()) as RES;\n if (preserveProtoNames) {\n const resNode = new ResTypeCtor();\n resNode.__fromProtoNameJson(parsed);\n yield resNode.__toLiteral() as RES;\n } else {\n yield parsed;\n }\n } catch {\n throw new Error(`Failed to parse final NDJSON line: ${buffer.trim()}`);\n }\n }\n },\n };\n\n resolve(iterator);\n });\n\n this.responseHandler.set(\"application/octet-stream\", r => {\n r.arrayBuffer()\n .then(buffer => {\n resolve(buffer);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n this.responseHandler.set(\"application/pdf\", r => {\n r.blob()\n .then(blob => {\n resolve(blob);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n this.responseHandler.set(\"image/jpeg\", r => {\n r.blob()\n .then(blob => {\n resolve(blob);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n\n const contentType = response.headers.get(\"content-type\");\n let handler = contentType?.split(\";\")[0].trim();\n handler ??= \"application/json\";\n let typeHandler = this.responseHandler.get(handler);\n\n if (typeHandler === undefined) {\n console.error(\"No parser for\", handler);\n typeHandler = this.responseHandler.get(\"application/json\");\n }\n\n if (typeHandler) {\n typeHandler(response);\n }\n } else {\n reject(new Error(\"no response\"));\n }\n });\n }\n\n private buildPathAndBodyfield(\n path: string,\n bodyField: keyof REQ | \"*\" | undefined,\n rqo: REQ,\n ): {\n evaluatedPath: string;\n evaluatedBody: string | undefined;\n } {\n let evaluatedPath = path;\n let evaluatedBody;\n\n const keysForBodyOrQueryParams = new Map<string, keyof REQ>();\n Object.keys(rqo as object).forEach(key => {\n keysForBodyOrQueryParams.set(key, key as keyof REQ);\n });\n\n // Build a reverse map: protoName → camelCase fieldName for path template resolution\n const protoToFieldMap = new Map<string, string>();\n this.reqProtoNameMap.forEach((protoName, fieldName) => {\n protoToFieldMap.set(protoName, fieldName);\n });\n\n const fields = [...path.matchAll(/\\{([^}]+)}/g)];\n // Replace URL templates with values: /v1/cube/{cube_id} => /v1/cube/12\n // Path templates use proto names, but rqo uses camelCase keys\n fields.forEach(field => {\n const protoName = field[1];\n const camelKey = (protoToFieldMap.get(protoName) ?? protoName) as keyof REQ;\n const rqoValue = rqo[camelKey];\n evaluatedPath = evaluatedPath.replace(field[0], String(rqoValue));\n keysForBodyOrQueryParams.delete(camelKey as string);\n });\n\n if (bodyField === \"*\") {\n // Use FieldNode serialization for body when UseProtoNames is true\n if (this.API_OPTIONS.UseProtoNames) {\n const reqNode = new this.ReqType();\n // Build a literal from remaining keys\n const literalBody: Record<string, unknown> = {};\n keysForBodyOrQueryParams.forEach(key => {\n literalBody[key as string] = rqo[key];\n });\n reqNode.__fromLiteral(literalBody);\n evaluatedBody = JSON.stringify(reqNode.__toJson());\n } else {\n const body: Record<string, unknown> = {};\n keysForBodyOrQueryParams.forEach(key => {\n body[key as string] = rqo[key];\n });\n evaluatedBody = JSON.stringify(body);\n }\n } else {\n // Build query params\n const params: string[] = [];\n if (bodyField !== undefined) {\n keysForBodyOrQueryParams.delete(bodyField as string);\n }\n keysForBodyOrQueryParams.forEach(key => {\n // Use the reqProtoNameMap for proto name lookup instead of generic conversion\n const paramName = this.API_OPTIONS.UseProtoNamesForQueryParams ? (this.reqProtoNameMap.get(key as string) ?? (key as string)) : (key as string);\n if (Array.isArray(rqo[key])) {\n (rqo[key] as unknown[]).forEach(e => {\n params.push(`${paramName}=${String(e)}`);\n });\n } else {\n params.push(`${paramName}=${String(rqo[key])}`);\n }\n });\n if (params.length) {\n evaluatedPath = `${evaluatedPath}?${params.join(\"&\")}`;\n }\n\n if (bodyField !== undefined) {\n // Use FieldNode serialization for the named body field when UseProtoNames is true\n if (this.API_OPTIONS.UseProtoNames) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- FieldConstructor stored from meta is untyped\n const FieldCtor = this.reqFieldConstructorMap.get(bodyField as string);\n if (FieldCtor) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call -- FieldConstructor is dynamically resolved from meta\n const fieldNode = new FieldCtor(undefined) as FieldNode;\n fieldNode.__fromLiteral(rqo[bodyField]);\n evaluatedBody = JSON.stringify(fieldNode.__toJson());\n } else {\n evaluatedBody = JSON.stringify(rqo[bodyField]);\n }\n } else {\n evaluatedBody = JSON.stringify(rqo[bodyField]);\n }\n }\n }\n\n evaluatedPath = `${this.API_OPTIONS.serverAddr}${this.API_OPTIONS.ApiBaseURL}${evaluatedPath}`;\n\n return {\n evaluatedPath,\n evaluatedBody,\n };\n }\n\n onResponse?: (response: RES, serverResponse: Response) => void;\n onResponseError?: (parsedResponse: unknown, serverResponse: Response) => void;\n onRequestStarted?: (req: REQ) => void;\n onRequestFinished?: (req: REQ) => void;\n onRequestAborted?: (req: REQ) => void;\n onResponseRaw?: (serverResponse: Response) => void;\n onResponseErrorRaw?: (serverResponse: Response) => void;\n onResponseParseError?: (error: unknown, serverResponse: Response) => void;\n onResponseErrorParseError?: (error: unknown, serverResponse: Response) => void;\n onFatalError?: (error: unknown) => void;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"StrictFetcher.js","sourceRoot":"","sources":["../src/StrictFetcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { FieldNode } from \"./FieldNode\";\n\nexport interface IApiOptions {\n serverAddr: string;\n ApiBaseURL: string;\n headers?: Headers;\n timeout?: number;\n UseProtoNames: boolean;\n UseProtoNamesForQueryParams: boolean;\n}\n\ninterface Handlers<REQ, RES> {\n onResponse?: (response: RES, serverResponse: Response) => void;\n onResponseError?: (parsedResponse: unknown, serverResponse: Response) => void;\n onRequestStarted?: (req: REQ) => void;\n onRequestFinished?: (req: REQ) => void;\n onRequestAborted?: (req: REQ) => void;\n onResponseRaw?: (serverResponse: Response) => void;\n onResponseErrorRaw?: (serverResponse: Response) => void;\n onResponseParseError?: (error: unknown, serverResponse: Response) => void;\n onResponseErrorParseError?: (error: unknown, serverResponse: Response) => void;\n onFatalError?: (error: unknown) => void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype FieldNodeConstructor = new (initData?: any, parent?: FieldNode, parentAttributeName?: string) => FieldNode;\n\nexport class StrictFetcher<REQ, RES> {\n public timeout: number;\n public lastResponse: Response | undefined;\n public isLoading = false;\n\n private path: string;\n private requestInit: RequestInit;\n private method: string;\n private responseHandler: Map<string, (r: Response) => void> = new Map<string, (r: Response) => void>();\n private abortController: AbortController;\n private timeoutId: ReturnType<typeof setTimeout> | number | undefined;\n private bodyField: keyof REQ | \"*\" | undefined;\n private API_OPTIONS: IApiOptions;\n\n private ReqType: FieldNodeConstructor;\n private ResType: FieldNodeConstructor;\n\n // Maps camelCase fieldName → protoName from the REQ type's field descriptors\n private reqProtoNameMap: Map<string, string>;\n // Maps camelCase fieldName → FieldConstructor from the REQ type's field descriptors\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private reqFieldConstructorMap: Map<string, any>;\n\n constructor(options: IApiOptions, method: string, path: string, ReqType: FieldNodeConstructor, ResType: FieldNodeConstructor, bodyField?: keyof REQ | \"*\") {\n this.API_OPTIONS = options;\n this.path = path;\n this.bodyField = bodyField;\n this.method = method;\n this.ReqType = ReqType;\n this.ResType = ResType;\n\n // Build the proto name map from the REQ type's field descriptors\n this.reqProtoNameMap = new Map<string, string>();\n this.reqFieldConstructorMap = new Map<string, FieldNodeConstructor>();\n const tempReq = new ReqType();\n tempReq.__meta.nodeFields.forEach(field => {\n this.reqProtoNameMap.set(field.fieldName, field.protoName);\n this.reqFieldConstructorMap.set(field.fieldName, field.FieldConstructor as FieldNodeConstructor);\n });\n\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n this.requestInit = {\n method: this.method,\n signal,\n headers: this.API_OPTIONS.headers,\n redirect: \"follow\",\n };\n\n this.timeout = this.API_OPTIONS.timeout ?? 300000;\n }\n\n public setRequestOptions(ri: RequestInit) {\n const { signal } = this.abortController;\n this.requestInit = {\n method: this.method,\n headers: this.API_OPTIONS.headers,\n signal,\n ...ri,\n };\n }\n\n public setHandlers(handlers: Handlers<REQ, RES>) {\n this.onResponse = handlers.onResponse;\n this.onResponseError = handlers.onResponseError;\n this.onRequestStarted = handlers.onRequestStarted;\n this.onRequestFinished = handlers.onRequestFinished;\n this.onRequestAborted = handlers.onRequestAborted;\n this.onResponseRaw = handlers.onResponseRaw;\n this.onResponseErrorRaw = handlers.onResponseErrorRaw;\n this.onResponseParseError = handlers.onResponseParseError;\n this.onResponseErrorParseError = handlers.onResponseErrorParseError;\n this.onFatalError = handlers.onFatalError;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public abortPendingRequest(reason: any): void {\n if (!this.isLoading) {\n return;\n }\n clearTimeout(this.timeoutId);\n this.isLoading = false;\n this.abortController.abort(reason);\n\n if (this.onRequestAborted) {\n this.onRequestAborted(reason as REQ);\n }\n }\n\n public invoke(rqo: REQ, options?: RequestInit): Promise<RES> {\n return new Promise((resolve, reject) => {\n if (this.isLoading) {\n this.abortPendingRequest(\"invoke triggered before response\");\n }\n\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n\n this.requestInit = {\n method: this.method,\n signal,\n headers: this.API_OPTIONS.headers,\n };\n\n if (options) {\n this.setRequestOptions(options);\n }\n\n this.isLoading = true;\n\n const { evaluatedPath, evaluatedBody } = this.buildPathAndBodyfield(this.path, this.bodyField, rqo);\n if (evaluatedBody) {\n this.requestInit.body = evaluatedBody;\n }\n\n clearTimeout(this.timeoutId);\n const request = new Request(evaluatedPath, this.requestInit);\n this.timeoutId = setTimeout(() => {\n this.abortController.abort(`Timeout of ${String(this.timeout)}ms reached`);\n if (this.onRequestAborted) {\n this.onRequestAborted(rqo);\n }\n\n console.error(`RequestService fetch aborted: Timeout of ${String(this.timeout)}ms reached`);\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(rqo);\n }, this.timeout);\n\n if (this.onRequestStarted) {\n this.onRequestStarted(rqo);\n }\n\n fetch(request)\n .then(response => {\n this._reworkRequest(response)\n .then(data => {\n resolve(data);\n })\n .catch(reject);\n if (this.onRequestFinished) {\n this.onRequestFinished(rqo);\n }\n })\n .catch((err: unknown) => {\n this.isLoading = false;\n\n if (err instanceof Error && err.name === \"AbortError\") {\n if (this.onRequestAborted) {\n this.onRequestAborted(rqo);\n }\n if (this.onRequestFinished) {\n this.onRequestFinished(rqo);\n }\n\n console.error(\"RequestService fetch aborted: \", err);\n } else {\n if (this.onRequestFinished) {\n this.onRequestFinished(rqo);\n }\n\n if (this.onFatalError) {\n this.onFatalError(err);\n }\n }\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n }\n\n _reworkRequest(response: Response): Promise<RES> {\n return new Promise((resolve, reject) => {\n this.isLoading = false;\n clearTimeout(this.timeoutId);\n const status = response.status;\n\n if (status === 0 || (status >= 200 && status < 300)) {\n this.lastResponse = response;\n\n if (this.onResponseRaw) {\n this.onResponseRaw(response);\n }\n\n this._parseResponse(response)\n .then(r => {\n resolve(r as RES);\n if (this.onResponse) {\n this.onResponse(r as RES, response);\n }\n })\n .catch((error: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(error);\n if (this.onResponseParseError) {\n this.onResponseParseError(error, response);\n }\n });\n } else {\n this.lastResponse = response;\n if (this.onResponseErrorRaw) {\n this.onResponseErrorRaw(response);\n }\n\n this._parseResponse(response)\n .then(r => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(r);\n if (this.onResponseError) {\n this.onResponseError(r, response);\n }\n })\n .catch((error: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(error);\n if (this.onResponseErrorParseError) {\n this.onResponseErrorParseError(error, response);\n }\n });\n }\n });\n }\n\n _parseResponse(response: Response) {\n return new Promise((resolve, reject) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\n if (response) {\n this.responseHandler.set(\"text/plain\", r => {\n r.text()\n .then(text => {\n resolve(text);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n\n this.responseHandler.set(\"text/html\", r => {\n r.text()\n .then(text => {\n resolve(text);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n\n this.responseHandler.set(\"application/json\", r => {\n r.json()\n .then(json => {\n if (this.API_OPTIONS.UseProtoNames) {\n // Use FieldNode-based conversion instead of generic Mapper\n const resNode = new this.ResType();\n resNode.__fromProtoNameJson(json);\n resolve(resNode.__toLiteral());\n } else {\n resolve(json);\n }\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n\n this.responseHandler.set(\"application/x-ndjson\", r => {\n const preserveProtoNames = this.API_OPTIONS.UseProtoNames;\n const ResTypeCtor = this.ResType;\n\n const reader = r.body?.getReader();\n if (!reader) {\n throw new Error(\"NDJSON response has no readable body\");\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const iterator = {\n async *[Symbol.asyncIterator](): AsyncGenerator<RES> {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- loop exits via break on done\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"\") {\n continue;\n }\n\n let parsed: RES;\n try {\n parsed = JSON.parse(trimmed) as RES;\n } catch {\n throw new Error(`Failed to parse NDJSON line: ${trimmed}`);\n }\n\n if (preserveProtoNames) {\n const resNode = new ResTypeCtor();\n resNode.__fromProtoNameJson(parsed);\n yield resNode.__toLiteral() as RES;\n } else {\n yield parsed;\n }\n }\n }\n\n if (buffer.trim() !== \"\") {\n try {\n const parsed = JSON.parse(buffer.trim()) as RES;\n if (preserveProtoNames) {\n const resNode = new ResTypeCtor();\n resNode.__fromProtoNameJson(parsed);\n yield resNode.__toLiteral() as RES;\n } else {\n yield parsed;\n }\n } catch {\n throw new Error(`Failed to parse final NDJSON line: ${buffer.trim()}`);\n }\n }\n },\n };\n\n resolve(iterator);\n });\n\n this.responseHandler.set(\"application/octet-stream\", r => {\n r.arrayBuffer()\n .then(buffer => {\n resolve(buffer);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n this.responseHandler.set(\"application/pdf\", r => {\n r.blob()\n .then(blob => {\n resolve(blob);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n this.responseHandler.set(\"image/jpeg\", r => {\n r.blob()\n .then(blob => {\n resolve(blob);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n\n const contentType = response.headers.get(\"content-type\");\n let handler = contentType?.split(\";\")[0].trim();\n handler ??= \"application/json\";\n let typeHandler = this.responseHandler.get(handler);\n\n if (typeHandler === undefined) {\n console.error(\"No parser for\", handler);\n typeHandler = this.responseHandler.get(\"application/json\");\n }\n\n if (typeHandler) {\n typeHandler(response);\n }\n } else {\n reject(new Error(\"no response\"));\n }\n });\n }\n\n private buildPathAndBodyfield(\n path: string,\n bodyField: keyof REQ | \"*\" | undefined,\n rqo: REQ\n ): {\n evaluatedPath: string;\n evaluatedBody: string | undefined;\n } {\n let evaluatedPath = path;\n let evaluatedBody;\n\n const keysForBodyOrQueryParams = new Map<string, keyof REQ>();\n Object.keys(rqo as object).forEach(key => {\n keysForBodyOrQueryParams.set(key, key as keyof REQ);\n });\n\n // Build a reverse map: protoName → camelCase fieldName for path template resolution\n const protoToFieldMap = new Map<string, string>();\n this.reqProtoNameMap.forEach((protoName, fieldName) => {\n protoToFieldMap.set(protoName, fieldName);\n });\n\n const fields = [...path.matchAll(/\\{([^}]+)}/g)];\n // Replace URL templates with values: /v1/cube/{cube_id} => /v1/cube/12\n // Path templates use proto names, but rqo uses camelCase keys\n fields.forEach(field => {\n const protoName = field[1];\n const camelKey = (protoToFieldMap.get(protoName) ?? protoName) as keyof REQ;\n const rqoValue = rqo[camelKey];\n evaluatedPath = evaluatedPath.replace(field[0], String(rqoValue));\n keysForBodyOrQueryParams.delete(camelKey as string);\n });\n\n if (bodyField === \"*\") {\n // Use FieldNode serialization for body when UseProtoNames is true\n if (this.API_OPTIONS.UseProtoNames) {\n const reqNode = new this.ReqType();\n // Build a literal from remaining keys\n const literalBody: Record<string, unknown> = {};\n keysForBodyOrQueryParams.forEach(key => {\n literalBody[key as string] = rqo[key];\n });\n reqNode.__fromLiteral(literalBody);\n evaluatedBody = JSON.stringify(reqNode.__toJson());\n } else {\n const body: Record<string, unknown> = {};\n keysForBodyOrQueryParams.forEach(key => {\n body[key as string] = rqo[key];\n });\n evaluatedBody = JSON.stringify(body);\n }\n } else {\n // Build query params\n const params: string[] = [];\n if (bodyField !== undefined) {\n keysForBodyOrQueryParams.delete(bodyField as string);\n }\n keysForBodyOrQueryParams.forEach(key => {\n // Use the reqProtoNameMap for proto name lookup instead of generic conversion\n const paramName = this.API_OPTIONS.UseProtoNamesForQueryParams ? (this.reqProtoNameMap.get(key as string) ?? (key as string)) : (key as string);\n if (Array.isArray(rqo[key])) {\n (rqo[key] as unknown[]).forEach(e => {\n params.push(`${paramName}=${String(e)}`);\n });\n } else {\n params.push(`${paramName}=${String(rqo[key])}`);\n }\n });\n if (params.length) {\n evaluatedPath = `${evaluatedPath}?${params.join(\"&\")}`;\n }\n\n if (bodyField !== undefined) {\n // Use FieldNode serialization for the named body field when UseProtoNames is true\n if (this.API_OPTIONS.UseProtoNames) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- FieldConstructor stored from meta is untyped\n const FieldCtor = this.reqFieldConstructorMap.get(bodyField as string);\n if (FieldCtor) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call -- FieldConstructor is dynamically resolved from meta\n const fieldNode = new FieldCtor(undefined) as FieldNode;\n fieldNode.__fromLiteral(rqo[bodyField]);\n evaluatedBody = JSON.stringify(fieldNode.__toJson());\n } else {\n evaluatedBody = JSON.stringify(rqo[bodyField]);\n }\n } else {\n evaluatedBody = JSON.stringify(rqo[bodyField]);\n }\n }\n }\n\n evaluatedPath = `${this.API_OPTIONS.serverAddr}${this.API_OPTIONS.ApiBaseURL}${evaluatedPath}`;\n\n return {\n evaluatedPath,\n evaluatedBody,\n };\n }\n\n onResponse?: (response: RES, serverResponse: Response) => void;\n onResponseError?: (parsedResponse: unknown, serverResponse: Response) => void;\n onRequestStarted?: (req: REQ) => void;\n onRequestFinished?: (req: REQ) => void;\n onRequestAborted?: (req: REQ) => void;\n onResponseRaw?: (serverResponse: Response) => void;\n onResponseErrorRaw?: (serverResponse: Response) => void;\n onResponseParseError?: (error: unknown, serverResponse: Response) => void;\n onResponseErrorParseError?: (error: unknown, serverResponse: Response) => void;\n onFatalError?: (error: unknown) => void;\n}\n"]}
|
package/dist/Validator.d.ts
CHANGED
package/dist/Validator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Validator.js","sourceRoot":"","sources":["../src/Validator.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,UAAU,GAAkC,IAAI,GAAG,
|
|
1
|
+
{"version":3,"file":"Validator.js","sourceRoot":"","sources":["../src/Validator.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,UAAU,GAAkC,IAAI,GAAG,EAA4B,CAAC;AAQ7F,MAAM,CAAC,MAAM,iBAAiB,GAAkC,IAAI,GAAG,EAA4B,CAAC","sourcesContent":["// Full qualified type name\nimport type { FieldConstraints } from \"./FieldConstraints\";\n\ntype typeName = string;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype validationFunc = (node: any) => void;\n\nexport const Validators: Map<typeName, validationFunc> = new Map<typeName, validationFunc>();\n\ntype constraintFunc = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n node: any,\n constraints?: FieldConstraints\n) => string[] | undefined; // return undefined if everything is OK\n\nexport const CustomConstraints: Map<typeName, constraintFunc> = new Map<typeName, constraintFunc>();\n"]}
|
package/dist/ValueState.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ValueState.js","sourceRoot":"","sources":["../src/ValueState.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAN,IAAY,UAmCX;AAnCD,WAAY,UAAU;IACpB;;;;OAIG;IACH,2BAAa,CAAA;IAEb;;;;OAIG;IACH,mCAAqB,CAAA;IAErB;;;;OAIG;IACH,mCAAqB,CAAA;IAErB;;;;OAIG;IACH,mCAAqB,CAAA;IAErB;;;;OAIG;IACH,yCAA2B,CAAA;AAC7B,CAAC,EAnCW,UAAU,KAAV,UAAU,QAmCrB","sourcesContent":["/**\n * Different types of ValueStates.\n * @readonly\n * @enum {string}\n */\nexport enum ValueState {\n /**\n *\n * @public\n * @typeName {None}\n */\n None =
|
|
1
|
+
{"version":3,"file":"ValueState.js","sourceRoot":"","sources":["../src/ValueState.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAN,IAAY,UAmCX;AAnCD,WAAY,UAAU;IACpB;;;;OAIG;IACH,2BAAa,CAAA;IAEb;;;;OAIG;IACH,mCAAqB,CAAA;IAErB;;;;OAIG;IACH,mCAAqB,CAAA;IAErB;;;;OAIG;IACH,mCAAqB,CAAA;IAErB;;;;OAIG;IACH,yCAA2B,CAAA;AAC7B,CAAC,EAnCW,UAAU,KAAV,UAAU,QAmCrB","sourcesContent":["/**\n * Different types of ValueStates.\n * @readonly\n * @enum {string}\n */\nexport enum ValueState {\n /**\n *\n * @public\n * @typeName {None}\n */\n None = \"None\",\n\n /**\n *\n * @public\n * @typeName {Positive}\n */\n Positive = \"Positive\",\n\n /**\n *\n * @public\n * @typeName {Critical}\n */\n Critical = \"Critical\",\n\n /**\n *\n * @public\n * @typeName {Negative}\n */\n Negative = \"Negative\",\n\n /**\n *\n * @public\n * @typeName {Information}\n */\n Information = \"Information\",\n}\n"]}
|
|
@@ -44,15 +44,17 @@ interface FieldNodeLike {
|
|
|
44
44
|
* const cubeModel = ModelBindings(CubeEntityModel.model);
|
|
45
45
|
*
|
|
46
46
|
* class MyComponent extends LitElement {
|
|
47
|
-
* //
|
|
47
|
+
* // Triggers re-render on any model update
|
|
48
|
+
* @cubeModel.bind()
|
|
49
|
+
* private _modelUpdated: unknown;
|
|
50
|
+
*
|
|
51
|
+
* // Triggers re-render when cube.length changes
|
|
48
52
|
* @cubeModel.bind("cube.length")
|
|
49
|
-
*
|
|
50
|
-
* private cubeLength: number = 0;
|
|
53
|
+
* private cubeLength: unknown;
|
|
51
54
|
*
|
|
52
|
-
* //
|
|
55
|
+
* // Triggers re-render on model validity changes
|
|
53
56
|
* @cubeModel.bind("__isValid", "validity-changed")
|
|
54
|
-
*
|
|
55
|
-
* private isValid: boolean = true;
|
|
57
|
+
* private isValid: unknown;
|
|
56
58
|
*
|
|
57
59
|
* // React to any field value change on the model
|
|
58
60
|
* @cubeModel.onEvent("field-value-changed")
|
|
@@ -73,13 +75,13 @@ interface FieldNodeLike {
|
|
|
73
75
|
*/
|
|
74
76
|
export declare function ModelBindings<TEventMap extends ModelEventMap = ModelEventMap>(model: FieldNodeLike): {
|
|
75
77
|
/**
|
|
76
|
-
*
|
|
77
|
-
* When
|
|
78
|
+
* Triggers a render update when a model event fires.
|
|
79
|
+
* When called without arguments, listens on the model root for the "update" event.
|
|
78
80
|
*
|
|
79
|
-
* @param path -
|
|
80
|
-
* @param eventType - Event to listen for (defaults to "
|
|
81
|
+
* @param path - Optional path to a field (e.g., "cube.length"). When omitted, listens on the model root.
|
|
82
|
+
* @param eventType - Event to listen for (defaults to "update")
|
|
81
83
|
*/
|
|
82
|
-
bind(path
|
|
84
|
+
bind(path?: string, eventType?: ModelEventType): (target: object, propertyKey: string) => void;
|
|
83
85
|
/**
|
|
84
86
|
* Binds a method to an event on the root model.
|
|
85
87
|
* When the event fires, the method is called.
|
|
@@ -23,15 +23,17 @@ const MODEL_EVENT_METHODS = Symbol.for("__modelEventMethods__");
|
|
|
23
23
|
* const cubeModel = ModelBindings(CubeEntityModel.model);
|
|
24
24
|
*
|
|
25
25
|
* class MyComponent extends LitElement {
|
|
26
|
-
* //
|
|
26
|
+
* // Triggers re-render on any model update
|
|
27
|
+
* @cubeModel.bind()
|
|
28
|
+
* private _modelUpdated: unknown;
|
|
29
|
+
*
|
|
30
|
+
* // Triggers re-render when cube.length changes
|
|
27
31
|
* @cubeModel.bind("cube.length")
|
|
28
|
-
*
|
|
29
|
-
* private cubeLength: number = 0;
|
|
32
|
+
* private cubeLength: unknown;
|
|
30
33
|
*
|
|
31
|
-
* //
|
|
34
|
+
* // Triggers re-render on model validity changes
|
|
32
35
|
* @cubeModel.bind("__isValid", "validity-changed")
|
|
33
|
-
*
|
|
34
|
-
* private isValid: boolean = true;
|
|
36
|
+
* private isValid: unknown;
|
|
35
37
|
*
|
|
36
38
|
* // React to any field value change on the model
|
|
37
39
|
* @cubeModel.onEvent("field-value-changed")
|
|
@@ -53,11 +55,11 @@ const MODEL_EVENT_METHODS = Symbol.for("__modelEventMethods__");
|
|
|
53
55
|
export function ModelBindings(model) {
|
|
54
56
|
return {
|
|
55
57
|
/**
|
|
56
|
-
*
|
|
57
|
-
* When
|
|
58
|
+
* Triggers a render update when a model event fires.
|
|
59
|
+
* When called without arguments, listens on the model root for the "update" event.
|
|
58
60
|
*
|
|
59
|
-
* @param path -
|
|
60
|
-
* @param eventType - Event to listen for (defaults to "
|
|
61
|
+
* @param path - Optional path to a field (e.g., "cube.length"). When omitted, listens on the model root.
|
|
62
|
+
* @param eventType - Event to listen for (defaults to "update")
|
|
61
63
|
*/
|
|
62
64
|
bind(path, eventType = "update") {
|
|
63
65
|
return function bindDecorator(target, propertyKey) {
|
|
@@ -132,26 +134,6 @@ function getFieldForPath(model, path) {
|
|
|
132
134
|
}
|
|
133
135
|
return model;
|
|
134
136
|
}
|
|
135
|
-
/**
|
|
136
|
-
* Get the value for a path from the model.
|
|
137
|
-
*/
|
|
138
|
-
function getValueForPath(model, path) {
|
|
139
|
-
if (path.startsWith("__")) {
|
|
140
|
-
// Direct property access for internal properties
|
|
141
|
-
return model[path];
|
|
142
|
-
}
|
|
143
|
-
if (!path.includes(".")) {
|
|
144
|
-
// Direct child field
|
|
145
|
-
const field = model[path];
|
|
146
|
-
return field?.value ?? field;
|
|
147
|
-
}
|
|
148
|
-
// Nested path - get the field and return its value
|
|
149
|
-
if (model.__getFieldNodeByPath) {
|
|
150
|
-
const field = model.__getFieldNodeByPath(path);
|
|
151
|
-
return field?.value ?? field;
|
|
152
|
-
}
|
|
153
|
-
return undefined;
|
|
154
|
-
}
|
|
155
137
|
/**
|
|
156
138
|
* Patch connectedCallback/disconnectedCallback for bind decorators.
|
|
157
139
|
*/
|
|
@@ -173,11 +155,9 @@ function patchBindLifecycle(ctor) {
|
|
|
173
155
|
const listeners = new Map();
|
|
174
156
|
this[MODEL_BIND_LISTENERS] = listeners;
|
|
175
157
|
metadata.forEach(({ model, path, eventType }, propKey) => {
|
|
176
|
-
const field = getFieldForPath(model, path);
|
|
177
|
-
// Set initial value
|
|
178
|
-
this[propKey] = getValueForPath(model, path);
|
|
158
|
+
const field = path ? getFieldForPath(model, path) : model;
|
|
179
159
|
const listener = () => {
|
|
180
|
-
this
|
|
160
|
+
this.requestUpdate();
|
|
181
161
|
};
|
|
182
162
|
listeners.set(propKey, { listener, field, eventType });
|
|
183
163
|
field.__addEventListener(eventType, listener);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelDecorators.js","sourceRoot":"","sources":["../../src/decorators/ModelDecorators.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, ReactiveElement } from \"lit\";\n\nimport type { ModelEventType } from \"@/FieldNode\";\n\n/**\n * Event map for FieldNode model events.\n * Most events don't have detail - they just notify that something changed.\n *\n * This may look like a copy of the ModelEventType, but is needed for the implementation.\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 = \"update\") {\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(eventType: keyof TEventMap & ModelEventType) {\n return function onEventDecorator(target: object, propertyKey: string, descriptor: PropertyDescriptor) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- descriptor.value is untyped by design\n const originalMethod: EventBindingMeta[\"method\"] = descriptor.value;\n const ctor = target.constructor as typeof ReactiveElement;\n\n let methods: EventBindingMeta[] = (ctor as unknown as Record<symbol, EventBindingMeta[]>)[MODEL_EVENT_METHODS];\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\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(path: string, eventType: keyof TEventMap & ModelEventType) {\n return function onFieldEventDecorator(target: object, propertyKey: string, descriptor: PropertyDescriptor) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- descriptor.value is untyped by design\n const originalMethod: EventBindingMeta[\"method\"] = descriptor.value;\n const ctor = target.constructor as typeof ReactiveElement;\n\n let methods: EventBindingMeta[] = (ctor as unknown as Record<symbol, EventBindingMeta[]>)[MODEL_EVENT_METHODS];\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\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)!;\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 // eslint-disable-next-line @typescript-eslint/unbound-method -- method is called with .call()\n const originalConnected = ctor.prototype.connectedCallback;\n // eslint-disable-next-line @typescript-eslint/unbound-method -- method is called with .call()\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\n originalConnected?.call(this);\n\n const metadata = bindingsMetadata.get(Object.getPrototypeOf(this) as object);\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\n if (listeners) {\n listeners.forEach(({ listener, field, eventType }) => {\n field.__removeEventListener(eventType, listener);\n });\n listeners.clear();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\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 // eslint-disable-next-line @typescript-eslint/unbound-method -- method is called with .call()\n const originalConnected = ctor.prototype.connectedCallback;\n // eslint-disable-next-line @typescript-eslint/unbound-method -- method is called with .call()\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\n originalConnected?.call(this);\n\n const methods = (this.constructor as unknown as Record<symbol, EventBindingMeta[]>)[MODEL_EVENT_METHODS];\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\n if (listeners) {\n listeners.forEach(({ listener, field, eventType }) => {\n field.__removeEventListener(eventType, listener);\n });\n listeners.clear();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\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":["import { LitElement, ReactiveElement } from \"lit\";\n\nimport type { ModelEventType } from \"@/FieldNode\";\n\n/**\n * Event map for FieldNode model events.\n * Most events don't have detail - they just notify that something changed.\n *\n * This may look like a copy of the ModelEventType, but is needed for the implementation.\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 | undefined;\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 * // Triggers re-render on any model update\n * @cubeModel.bind()\n * private _modelUpdated: unknown;\n *\n * // Triggers re-render when cube.length changes\n * @cubeModel.bind(\"cube.length\")\n * private cubeLength: unknown;\n *\n * // Triggers re-render on model validity changes\n * @cubeModel.bind(\"__isValid\", \"validity-changed\")\n * private isValid: unknown;\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 * Triggers a render update when a model event fires.\n * When called without arguments, listens on the model root for the \"update\" event.\n *\n * @param path - Optional path to a field (e.g., \"cube.length\"). When omitted, listens on the model root.\n * @param eventType - Event to listen for (defaults to \"update\")\n */\n bind(path?: string, eventType: ModelEventType = \"update\") {\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(eventType: keyof TEventMap & ModelEventType) {\n return function onEventDecorator(target: object, propertyKey: string, descriptor: PropertyDescriptor) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- descriptor.value is untyped by design\n const originalMethod: EventBindingMeta[\"method\"] = descriptor.value;\n const ctor = target.constructor as typeof ReactiveElement;\n\n let methods: EventBindingMeta[] = (ctor as unknown as Record<symbol, EventBindingMeta[]>)[MODEL_EVENT_METHODS];\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\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(path: string, eventType: keyof TEventMap & ModelEventType) {\n return function onFieldEventDecorator(target: object, propertyKey: string, descriptor: PropertyDescriptor) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- descriptor.value is untyped by design\n const originalMethod: EventBindingMeta[\"method\"] = descriptor.value;\n const ctor = target.constructor as typeof ReactiveElement;\n\n let methods: EventBindingMeta[] = (ctor as unknown as Record<symbol, EventBindingMeta[]>)[MODEL_EVENT_METHODS];\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\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)!;\n }\n return model;\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 // eslint-disable-next-line @typescript-eslint/unbound-method -- method is called with .call()\n const originalConnected = ctor.prototype.connectedCallback;\n // eslint-disable-next-line @typescript-eslint/unbound-method -- method is called with .call()\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\n originalConnected?.call(this);\n\n const metadata = bindingsMetadata.get(Object.getPrototypeOf(this) as object);\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 = path ? getFieldForPath(model, path) : model;\n\n const listener = () => {\n this.requestUpdate();\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\n if (listeners) {\n listeners.forEach(({ listener, field, eventType }) => {\n field.__removeEventListener(eventType, listener);\n });\n listeners.clear();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\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 // eslint-disable-next-line @typescript-eslint/unbound-method -- method is called with .call()\n const originalConnected = ctor.prototype.connectedCallback;\n // eslint-disable-next-line @typescript-eslint/unbound-method -- method is called with .call()\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\n originalConnected?.call(this);\n\n const methods = (this.constructor as unknown as Record<symbol, EventBindingMeta[]>)[MODEL_EVENT_METHODS];\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\n if (listeners) {\n listeners.forEach(({ listener, field, eventType }) => {\n field.__removeEventListener(eventType, listener);\n });\n listeners.clear();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\n originalDisconnected?.call(this);\n };\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,52 +1,53 @@
|
|
|
1
|
-
export { FieldNode, type ValueStateSummary, type ModelEventType } from
|
|
2
|
-
export { Registry } from
|
|
3
|
-
export { ValueState } from
|
|
4
|
-
export { OPEN_MODELS_OPTIONS } from
|
|
5
|
-
export { ToString, ValueOf } from
|
|
6
|
-
export type { FieldConstraints } from
|
|
7
|
-
export { BOOLEAN } from
|
|
8
|
-
export { ENUM } from
|
|
9
|
-
export { INT32 } from
|
|
10
|
-
export { INT64 } from
|
|
11
|
-
export { SINT32 } from
|
|
12
|
-
export { SINT64 } from
|
|
13
|
-
export { UINT32 } from
|
|
14
|
-
export { UINT64 } from
|
|
15
|
-
export { STRING } from
|
|
16
|
-
export { BYTES } from
|
|
17
|
-
export { DOUBLE } from
|
|
18
|
-
export { FLOAT } from
|
|
19
|
-
export { EMPTY } from
|
|
20
|
-
export { ANY } from
|
|
21
|
-
export { Int32Value } from
|
|
22
|
-
export { Int64Value } from
|
|
23
|
-
export { UInt32Value } from
|
|
24
|
-
export { UInt64Value } from
|
|
25
|
-
export { DoubleValue } from
|
|
26
|
-
export { FloatValue } from
|
|
27
|
-
export { BoolValue } from
|
|
28
|
-
export { BytesValue } from
|
|
29
|
-
export { StringValue } from
|
|
30
|
-
export { Timestamp } from
|
|
31
|
-
export { Struct } from
|
|
32
|
-
export
|
|
33
|
-
export type {
|
|
34
|
-
export {
|
|
35
|
-
export {
|
|
36
|
-
export {
|
|
37
|
-
export {
|
|
38
|
-
export {
|
|
39
|
-
export {
|
|
40
|
-
export {
|
|
41
|
-
export {
|
|
42
|
-
export
|
|
43
|
-
export {
|
|
44
|
-
export {
|
|
45
|
-
export
|
|
46
|
-
export type {
|
|
47
|
-
export {
|
|
48
|
-
export
|
|
1
|
+
export { FieldNode, type ValueStateSummary, type ModelEventType } from "./FieldNode.js";
|
|
2
|
+
export { Registry } from "./Registry.js";
|
|
3
|
+
export { ValueState } from "./ValueState.js";
|
|
4
|
+
export { OPEN_MODELS_OPTIONS } from "./OPEN_MODELS_OPTIONS.js";
|
|
5
|
+
export { ToString, ValueOf } from "./CustomPrototypes.js";
|
|
6
|
+
export type { FieldConstraints } from "./FieldConstraints.js";
|
|
7
|
+
export { BOOLEAN } from "./primitives/BOOLEAN.js";
|
|
8
|
+
export { ENUM } from "./primitives/ENUM.js";
|
|
9
|
+
export { INT32 } from "./primitives/INT32.js";
|
|
10
|
+
export { INT64 } from "./primitives/INT64.js";
|
|
11
|
+
export { SINT32 } from "./primitives/SINT32.js";
|
|
12
|
+
export { SINT64 } from "./primitives/SINT64.js";
|
|
13
|
+
export { UINT32 } from "./primitives/UINT32.js";
|
|
14
|
+
export { UINT64 } from "./primitives/UINT64.js";
|
|
15
|
+
export { STRING } from "./primitives/STRING.js";
|
|
16
|
+
export { BYTES } from "./primitives/BYTES.js";
|
|
17
|
+
export { DOUBLE } from "./primitives/DOUBLE.js";
|
|
18
|
+
export { FLOAT } from "./primitives/FLOAT.js";
|
|
19
|
+
export { EMPTY } from "./well_known/EMPTY.js";
|
|
20
|
+
export { ANY } from "./well_known/ANY.js";
|
|
21
|
+
export { Int32Value } from "./well_known/Int32Value.js";
|
|
22
|
+
export { Int64Value } from "./well_known/Int64Value.js";
|
|
23
|
+
export { UInt32Value } from "./well_known/UInt32Value.js";
|
|
24
|
+
export { UInt64Value } from "./well_known/UInt64Value.js";
|
|
25
|
+
export { DoubleValue } from "./well_known/DoubleValue.js";
|
|
26
|
+
export { FloatValue } from "./well_known/FloatValue.js";
|
|
27
|
+
export { BoolValue } from "./well_known/BoolValue.js";
|
|
28
|
+
export { BytesValue } from "./well_known/BytesValue.js";
|
|
29
|
+
export { StringValue } from "./well_known/StringValue.js";
|
|
30
|
+
export { Timestamp } from "./well_known/Timestamp.js";
|
|
31
|
+
export { Struct } from "./well_known/Struct.js";
|
|
32
|
+
export { ListValue } from "./well_known/ListValue.js";
|
|
33
|
+
export type { JSONValue } from "./well_known/Struct.js";
|
|
34
|
+
export type { JSONObject } from "./well_known/Struct.js";
|
|
35
|
+
export { Duration } from "./well_known/Duration.js";
|
|
36
|
+
export { FieldMask } from "./well_known/FieldMask.js";
|
|
37
|
+
export { ARRAY } from "./proxies/ARRAY.js";
|
|
38
|
+
export { MAP } from "./proxies/MAP.js";
|
|
39
|
+
export { RECURSION } from "./proxies/RECURSION.js";
|
|
40
|
+
export { ServiceBindings } from "./decorators/ServiceDecorators.js";
|
|
41
|
+
export { ModelBindings } from "./decorators/ModelDecorators.js";
|
|
42
|
+
export { fieldBindings } from "./decorators/FieldBindings.js";
|
|
43
|
+
export type { BindableComponent, FieldNodeLike } from "./decorators/FieldBindings.js";
|
|
44
|
+
export { SchemaBuilder } from "./decorators/SchemaBuilder.js";
|
|
45
|
+
export { DefaultServiceEventHandlers, CreateDispatch } from "./decorators/DefaultServiceEventHandlers.js";
|
|
46
|
+
export type { EntityServiceEventType, TypedEntityService } from "./decorators/EntityServiceTypes.js";
|
|
47
|
+
export type { EntityServiceEventMap } from "./decorators/EntityServiceTypes.js";
|
|
48
|
+
export { StrictFetcher } from "./StrictFetcher.js";
|
|
49
|
+
export type { IApiOptions as IStrictApiOptions } from "./StrictFetcher.js";
|
|
49
50
|
export interface IAny {
|
|
50
|
-
|
|
51
|
+
"@type": string;
|
|
51
52
|
[key: string]: unknown;
|
|
52
53
|
}
|