From d97ee9c8bef2da626344422c0f62832debd00875 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Thu, 18 Dec 2025 14:02:01 -0800 Subject: [PATCH 1/3] Specify sizes and ranges of DAP integers - Generally types/IDs that were only specified as `integer`s are now int32s. I only defined minimums on those that previously had ">0" behavior - Lines and columns are uint64 since they're only ever >0 and we should be able to express more than (u)int32-sized files. With these and other 64-bit types, I set the `minimum` and `maximum` to the max safe floating point integers so as to ensure compatibility with floating-point-based runtimes, like JavaScript and Lua (<=5.2) - variablesReference is defined as uint32 because we consistently define behavior as "when variablesReference is >0" and "<0" is undefined - systemProcessId is an int32. While research shows there are some exotic systems where it _can_ be an int64 (Solaris) it is practically still an int32 (even 64 bit Linux limits to 2^22) and we have already defined it as such elsewhere - Memory-related offset/count is defined as int64 - namedVariables/indexedVariables are counts, but they were previously specified as having a max value of `2147483647` so I kept them as int32's with a `minimum` value in the schema I would greatly appreciate folks that use various DAP clients to try this out and let me know if you run into issues or see things that should be changed. I'll keep this PR open for a while before merging it to gather feedback. Closes #422 Closes #551 --- debugAdapterProtocol.json | 245 +++++++++- spec-generator/generator.ts | 32 +- spec-generator/json_schema.d.ts | 13 +- spec-generator/package-lock.json | 765 ++++++++++++++++++++++++++++++- spec-generator/package.json | 6 +- 5 files changed, 1031 insertions(+), 30 deletions(-) diff --git a/debugAdapterProtocol.json b/debugAdapterProtocol.json index 150d8da..7dfa3fc 100644 --- a/debugAdapterProtocol.json +++ b/debugAdapterProtocol.json @@ -14,6 +14,8 @@ "properties": { "seq": { "type": "integer", + "format": "int32", + "minimum": 1, "description": "Sequence number of the message (also known as message ID). The `seq` for the first message sent by a client or debug adapter is 1, and for each subsequent message is 1 greater than the previous message sent by that actor. `seq` can be used to order requests, responses, and events, and to associate requests with their corresponding responses. For protocol messages of type `request` the sequence number can be used to cancel the request." }, "type": { @@ -80,6 +82,8 @@ }, "request_seq": { "type": "integer", + "format": "int32", + "minimum": 1, "description": "Sequence number of the corresponding request." }, "success": { @@ -150,6 +154,8 @@ "properties": { "requestId": { "type": "integer", + "format": "int32", + "minimum": 1, "description": "The ID (attribute `seq`) of the request to cancel. If missing no request is cancelled.\nBoth a `requestId` and a `progressId` can be specified in one request." }, "progressId": { @@ -203,6 +209,7 @@ }, "threadId": { "type": "integer", + "format": "int32", "description": "The thread which was stopped." }, "preserveFocusHint": { @@ -220,7 +227,8 @@ "hitBreakpointIds": { "type": "array", "items": { - "type": "integer" + "type": "integer", + "format": "int32" }, "description": "Ids of the breakpoints that triggered the event. In most cases there is only a single breakpoint but here are some examples for multiple breakpoints:\n- Different types of breakpoints map to the same location.\n- Multiple source breakpoints get collapsed to the same instruction by the compiler/runtime.\n- Multiple function breakpoints with different function names map to the same location." } @@ -246,6 +254,7 @@ "properties": { "threadId": { "type": "integer", + "format": "int32", "description": "The thread which was continued." }, "allThreadsContinued": { @@ -274,6 +283,7 @@ "properties": { "exitCode": { "type": "integer", + "format": "int32", "description": "The exit code returned from the debuggee." } }, @@ -326,6 +336,7 @@ }, "threadId": { "type": "integer", + "format": "int32", "description": "The identifier of the thread." } }, @@ -376,6 +387,7 @@ }, "variablesReference": { "type": "integer", + "format": "uint32", "description": "If an attribute `variablesReference` exists and its value is > 0, the output contains objects which can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details." }, "source": { @@ -384,10 +396,14 @@ }, "line": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The source location's line where the output was produced." }, "column": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The position in `line` where the output was produced. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." }, "data": { @@ -396,6 +412,7 @@ }, "locationReference": { "type": "integer", + "format": "int32", "description": "A reference that allows the client to request the location where the new value is declared. For example, if the logged value is function pointer, the adapter may be able to look up the function's location. This should be present only if the adapter is likely to be able to resolve the location.\n\nThis reference shares the same lifetime as the `variablesReference`. See 'Lifetime of Object References' in the Overview section for details." } }, @@ -513,6 +530,7 @@ }, "systemProcessId": { "type": "integer", + "format": "int32", "description": "The process ID of the debugged process, as assigned by the operating system. This property should be omitted for logical processes that do not map to operating system processes on the machine." }, "isLocalProcess": { @@ -531,6 +549,7 @@ }, "pointerSize": { "type": "integer", + "format": "uint32", "description": "The size of a pointer or address for this process, in bits. This value may be used by clients when formatting addresses for display." } }, @@ -588,6 +607,8 @@ }, "requestId": { "type": "integer", + "format": "int32", + "minimum": 1, "description": "The request ID that this progress report is related to. If specified a debug adapter is expected to emit progress events for the long running request until the request has been either completed or cancelled.\nIf the request ID is omitted, the progress report is assumed to be related to some general activity of the debug adapter." }, "cancellable": { @@ -600,7 +621,9 @@ }, "percentage": { "type": "number", - "description": "Progress percentage to display (value range: 0 to 100). If omitted no percentage is shown." + "minimum": 0, + "maximum": 100, + "description": "Progress percentage to display. If omitted no percentage is shown." } }, "required": [ "progressId", "title" ] @@ -632,7 +655,9 @@ }, "percentage": { "type": "number", - "description": "Progress percentage to display (value range: 0 to 100). If omitted no percentage is shown." + "minimum": 0, + "maximum": 100, + "description": "Progress percentage to display. If omitted no percentage is shown." } }, "required": [ "progressId" ] @@ -691,10 +716,12 @@ }, "threadId": { "type": "integer", + "format": "int32", "description": "If specified, the client only needs to refetch data related to this thread." }, "stackFrameId": { "type": "integer", + "format": "int32", "description": "If specified, the client only needs to refetch data related to this stack frame (and the `threadId` is ignored)." } } @@ -722,10 +749,15 @@ }, "offset": { "type": "integer", + "format": "int64", + "maximum": 9007199254740991, + "minimum": -9007199254740991, "description": "Starting offset in bytes where memory has been updated. Can be negative." }, "count": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "Number of bytes updated." } }, @@ -802,11 +834,13 @@ "properties": { "processId": { "type": "integer", - "description": "The process ID. The value should be less than or equal to 2147483647 (2^31-1)." + "format": "int32", + "description": "The process ID." }, "shellProcessId": { "type": "integer", - "description": "The process ID of the terminal shell. The value should be less than or equal to 2147483647 (2^31-1)." + "format": "int32", + "description": "The process ID of the terminal shell." } } } @@ -1216,18 +1250,26 @@ }, "line": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "Start line of range to search possible breakpoint locations in. If only the line is specified, the request returns all possible locations in that line." }, "column": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "Start position within `line` to search possible breakpoint locations in. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. If no column is given, the first position in the start line is assumed." }, "endLine": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "End line of range to search possible breakpoint locations in. If no end line is given, then the end line is assumed to be the start line." }, "endColumn": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "End position within `endLine` to search possible breakpoint locations in. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. If no end column is given, the last position in the end line is assumed." } }, @@ -1290,7 +1332,9 @@ "lines": { "type": "array", "items": { - "type": "integer" + "type": "integer", + "format": "uint64", + "maximum": 9007199254740991 }, "description": "Deprecated: The code locations of the breakpoints." }, @@ -1464,6 +1508,7 @@ "properties": { "variablesReference": { "type": "integer", + "format": "uint32", "description": "Reference to the variable container if the data breakpoint is requested for a child of the container. The `variablesReference` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details." }, "name": { @@ -1472,10 +1517,12 @@ }, "frameId": { "type": "integer", + "format": "int32", "description": "When `name` is an expression, evaluate it in the scope of this stack frame. If not specified, the expression is evaluated in the global scope. When `variablesReference` is specified, this property has no effect." }, "bytes": { "type": "integer", + "format": "uint32", "description": "If specified, a debug adapter should return information for the range of memory extending `bytes` number of bytes from the address or variable specified by `name`. Breakpoints set using the resulting data ID should pause on data access anywhere within that range.\n\nClients may set this property only if the `supportsDataBreakpointBytes` capability is true." }, "asAddress": { @@ -1656,6 +1703,7 @@ "properties": { "threadId": { "type": "integer", + "format": "int32", "description": "Specifies the active thread. If the debug adapter supports single thread execution (see `supportsSingleThreadExecutionRequests`) and the argument `singleThread` is true, only the thread with this ID is resumed." }, "singleThread": { @@ -1706,6 +1754,7 @@ "properties": { "threadId": { "type": "integer", + "format": "int32", "description": "Specifies the thread for which to resume execution for one step (of the given granularity)." }, "singleThread": { @@ -1748,6 +1797,7 @@ "properties": { "threadId": { "type": "integer", + "format": "int32", "description": "Specifies the thread for which to resume execution for one step-into (of the given granularity)." }, "singleThread": { @@ -1756,6 +1806,7 @@ }, "targetId": { "type": "integer", + "format": "int32", "description": "Id of the target to step into." }, "granularity": { @@ -1794,6 +1845,7 @@ "properties": { "threadId": { "type": "integer", + "format": "int32", "description": "Specifies the thread for which to resume execution for one step-out (of the given granularity)." }, "singleThread": { @@ -1836,6 +1888,7 @@ "properties": { "threadId": { "type": "integer", + "format": "int32", "description": "Specifies the thread for which to resume execution for one step backwards (of the given granularity)." }, "singleThread": { @@ -1878,6 +1931,7 @@ "properties": { "threadId": { "type": "integer", + "format": "int32", "description": "Specifies the active thread. If the debug adapter supports single thread execution (see `supportsSingleThreadExecutionRequests`) and the `singleThread` argument is true, only the thread with this ID is resumed." }, "singleThread": { @@ -1917,6 +1971,7 @@ "properties": { "frameId": { "type": "integer", + "format": "int32", "description": "Restart the stack frame identified by `frameId`. The `frameId` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details." } }, @@ -1951,10 +2006,12 @@ "properties": { "threadId": { "type": "integer", + "format": "int32", "description": "Set the goto target for this thread." }, "targetId": { "type": "integer", + "format": "int32", "description": "The location where the debuggee will continue to run." } }, @@ -1989,6 +2046,7 @@ "properties": { "threadId": { "type": "integer", + "format": "int32", "description": "Pause execution for this thread." } }, @@ -2023,14 +2081,17 @@ "properties": { "threadId": { "type": "integer", + "format": "int32", "description": "Retrieve the stacktrace for this thread." }, "startFrame": { "type": "integer", + "format": "uint32", "description": "The index of the first frame to return; if omitted frames start at 0." }, "levels": { "type": "integer", + "format": "uint32", "description": "The maximum number of frames to return. If levels is not specified or 0, all frames are returned." }, "format": { @@ -2057,6 +2118,7 @@ }, "totalFrames": { "type": "integer", + "format": "uint32", "description": "The total number of frames available in the stack. If omitted or if `totalFrames` is larger than the available frames, a client is expected to request frames until a request returns less frames than requested (which indicates the end of the stack). Returning monotonically increasing `totalFrames` values for subsequent requests can be used to enforce paging in the client." } }, @@ -2089,6 +2151,7 @@ "properties": { "frameId": { "type": "integer", + "format": "int32", "description": "Retrieve the scopes for the stack frame identified by `frameId`. The `frameId` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details." } }, @@ -2139,6 +2202,7 @@ "properties": { "variablesReference": { "type": "integer", + "format": "uint32", "description": "The variable for which to retrieve its children. The `variablesReference` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details." }, "filter": { @@ -2148,10 +2212,12 @@ }, "start": { "type": "integer", + "format": "uint32", "description": "The index of the first variable to return; if omitted children start at 0. If the value of `start` exceeeds the number of available variables, the debug adapter should return an empty array.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsVariablePaging` is true." }, "count": { "type": "integer", + "format": "uint32", "description": "The number of variables to return. If count is missing or 0, all variables are returned. If fewer than `count` variables are returned, the client should assume no further variables are available.\nThe attribute is only honored by a debug adapter if the corresponding capability `supportsVariablePaging` is true." }, "format": { @@ -2206,6 +2272,7 @@ "properties": { "variablesReference": { "type": "integer", + "format": "uint32", "description": "The reference of the variable container. The `variablesReference` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details." }, "name": { @@ -2241,14 +2308,19 @@ }, "variablesReference": { "type": "integer", + "format": "uint32", "description": "If `variablesReference` is > 0, the new value is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details.\n\nIf this property is included in the response, any `variablesReference` previously associated with the updated variable, and those of its children, are no longer valid." }, "namedVariables": { "type": "integer", + "format": "int32", + "minimum": 0, "description": "The number of named child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1)." }, "indexedVariables": { "type": "integer", + "format": "int32", + "minimum": 0, "description": "The number of indexed child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1)." }, "memoryReference": { @@ -2257,6 +2329,7 @@ }, "valueLocationReference": { "type": "integer", + "format": "int32", "description": "A reference that allows the client to request the location where the new value is declared. For example, if the new value is function pointer, the adapter may be able to look up the function's location. This should be present only if the adapter is likely to be able to resolve the location.\n\nThis reference shares the same lifetime as the `variablesReference`. See 'Lifetime of Object References' in the Overview section for details." } }, @@ -2293,6 +2366,8 @@ }, "sourceReference": { "type": "integer", + "format": "int32", + "minimum": 0, "description": "The reference to the source. This is the same as `source.sourceReference`.\nThis is provided for backward compatibility since old clients do not understand the `source` attribute." } }, @@ -2381,7 +2456,8 @@ "threadIds": { "type": "array", "items": { - "type": "integer" + "type": "integer", + "format": "int32" }, "description": "Ids of threads to be terminated." } @@ -2416,10 +2492,12 @@ "properties": { "startModule": { "type": "integer", + "format": "int32", "description": "The index of the first module to return; if omitted modules start at 0." }, "moduleCount": { "type": "integer", + "format": "uint32", "description": "The number of modules to return. If `moduleCount` is not specified or 0, all modules are returned." } } @@ -2441,6 +2519,8 @@ }, "totalModules": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The total number of modules available." } }, @@ -2520,14 +2600,19 @@ }, "frameId": { "type": "integer", + "format": "int32", "description": "Evaluate the expression in the scope of this stack frame. If not specified, the expression is evaluated in the global scope." }, "line": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The contextual line where the expression should be evaluated. In the 'hover' context, this should be set to the start of the expression being hovered." }, "column": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The contextual column where the expression should be evaluated. This may be provided if `line` is also provided.\n\nIt is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." }, "source": { @@ -2575,14 +2660,19 @@ }, "variablesReference": { "type": "integer", + "format": "uint32", "description": "If `variablesReference` is > 0, the evaluate result is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details." }, "namedVariables": { "type": "integer", + "format": "int32", + "minimum": 0, "description": "The number of named child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1)." }, "indexedVariables": { "type": "integer", + "format": "int32", + "minimum": 0, "description": "The number of indexed child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1)." }, "memoryReference": { @@ -2591,6 +2681,7 @@ }, "valueLocationReference": { "type": "integer", + "format": "int32", "description": "A reference that allows the client to request the location where the returned value is declared. For example, if a function pointer is returned, the adapter may be able to look up the function's location. This should be present only if the adapter is likely to be able to resolve the location.\n\nThis reference shares the same lifetime as the `variablesReference`. See 'Lifetime of Object References' in the Overview section for details." } }, @@ -2631,6 +2722,7 @@ }, "frameId": { "type": "integer", + "format": "int32", "description": "Evaluate the expressions in the scope of this stack frame. If not specified, the expressions are evaluated in the global scope." }, "format": { @@ -2662,14 +2754,19 @@ }, "variablesReference": { "type": "integer", + "format": "uint32", "description": "If `variablesReference` is > 0, the evaluate result is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details." }, "namedVariables": { "type": "integer", + "format": "int32", + "minimum": 0, "description": "The number of named child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1)." }, "indexedVariables": { "type": "integer", + "format": "int32", + "minimum": 0, "description": "The number of indexed child variables.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks.\nThe value should be less than or equal to 2147483647 (2^31-1)." }, "memoryReference": { @@ -2678,6 +2775,7 @@ }, "valueLocationReference": { "type": "integer", + "format": "int32", "description": "A reference that allows the client to request the location where the new value is declared. For example, if the new value is function pointer, the adapter may be able to look up the function's location. This should be present only if the adapter is likely to be able to resolve the location.\n\nThis reference shares the same lifetime as the `variablesReference`. See 'Lifetime of Object References' in the Overview section for details." } }, @@ -2710,6 +2808,7 @@ "properties": { "frameId": { "type": "integer", + "format": "int32", "description": "The stack frame for which to retrieve the possible step-in targets." } }, @@ -2764,10 +2863,14 @@ }, "line": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The line location for which the goto targets are determined." }, "column": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The position within `line` for which the goto targets are determined. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." } }, @@ -2818,6 +2921,7 @@ "properties": { "frameId": { "type": "integer", + "format": "int32", "description": "Returns completions in the scope of this stack frame. If not specified, the completions are returned for the global scope." }, "text": { @@ -2826,10 +2930,14 @@ }, "column": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The position within `text` for which to determine the completion proposals. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." }, "line": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "A line for which to determine the completion proposals. If missing the first line of the text is assumed." } }, @@ -2880,6 +2988,7 @@ "properties": { "threadId": { "type": "integer", + "format": "int32", "description": "Thread for which exception information should be retrieved." } }, @@ -2943,10 +3052,15 @@ }, "offset": { "type": "integer", + "format": "int64", + "maximum": 9007199254740991, + "minimum": -9007199254740991, "description": "Offset (in bytes) to be applied to the reference location before reading data. Can be negative." }, "count": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "Number of bytes to read at the specified location and offset." } }, @@ -2966,6 +3080,8 @@ }, "unreadableBytes": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The number of unreadable bytes encountered after the last successfully read byte.\nThis can be used to determine the number of bytes that should be skipped before a subsequent `readMemory` request succeeds." }, "data": { @@ -3005,6 +3121,9 @@ }, "offset": { "type": "integer", + "format": "int64", + "maximum": 9007199254740991, + "minimum": -9007199254740991, "description": "Offset (in bytes) to be applied to the reference location before writing data. Can be negative." }, "allowPartial": { @@ -3028,10 +3147,14 @@ "properties": { "offset": { "type": "integer", + "format": "int64", + "maximum": 9007199254740991, + "minimum": -9007199254740991, "description": "Property that should be returned when `allowPartial` is true to indicate the offset of the first byte of data successfully written. Can be negative." }, "bytesWritten": { "type": "integer", + "format": "uint32", "description": "Property that should be returned when `allowPartial` is true to indicate the number of bytes starting from address that were successfully written." } } @@ -3066,14 +3189,21 @@ }, "offset": { "type": "integer", + "format": "int64", + "maximum": 9007199254740991, + "minimum": -9007199254740991, "description": "Offset (in bytes) to be applied to the reference location before disassembling. Can be negative." }, "instructionOffset": { "type": "integer", + "format": "int64", + "maximum": 9007199254740991, + "minimum": -9007199254740991, "description": "Offset (in instructions) to be applied after the byte offset (if any) before disassembling. Can be negative." }, "instructionCount": { "type": "integer", + "format": "uint32", "description": "Number of instructions to disassemble starting at the specified location and offset.\nAn adapter must return exactly this number of instructions - any unavailable instructions should be replaced with an implementation-defined 'invalid instruction' value." }, "resolveSymbols": { @@ -3127,6 +3257,7 @@ "properties": { "locationReference": { "type": "integer", + "format": "int32", "description": "Location reference to resolve." } }, @@ -3146,18 +3277,26 @@ }, "line": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The line number of the location. The client capability `linesStartAt1` determines whether it is 0- or 1-based." }, "column": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "Position of the location within the `line`. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. If no column is given, the first position in the start line is assumed." }, "endLine": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "End line of the location, present if the location refers to a range. The client capability `linesStartAt1` determines whether it is 0- or 1-based." }, "endColumn": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "End position of the location within `endLine`, present if the location refers to a range. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." } }, @@ -3396,6 +3535,8 @@ "properties": { "id": { "type": "integer", + "format": "int32", + "minimum": 1, "description": "Unique (within a debug adapter implementation) identifier for the message. The purpose of these error IDs is to help extension authors that have the requirement that every user visible error message needs a corresponding error number, so that users or customer support can find information about the specific error more easily." }, "format": { @@ -3501,6 +3642,7 @@ }, "width": { "type": "integer", + "format": "uint32", "description": "Width of this column in characters (hint only)." } }, @@ -3513,6 +3655,7 @@ "properties": { "id": { "type": "integer", + "format": "int32", "description": "Unique identifier for the thread." }, "name": { @@ -3537,6 +3680,8 @@ }, "sourceReference": { "type": "integer", + "format": "int32", + "minimum": 0, "description": "If the value > 0 the contents of the source must be retrieved through the `source` request (even if a path is specified).\nSince a `sourceReference` is only valid for a session, it can not be used to persist a source.\nThe value should be less than or equal to 2147483647 (2^31-1)." }, "presentationHint": { @@ -3575,6 +3720,7 @@ "properties": { "id": { "type": "integer", + "format": "int32", "description": "An identifier for the stack frame. It must be unique across all threads.\nThis id can be used to retrieve the scopes of the frame with the `scopes` request or to restart the execution of a stack frame." }, "name": { @@ -3587,18 +3733,26 @@ }, "line": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The line within the source of the frame. If the source attribute is missing or doesn't exist, `line` is 0 and should be ignored by the client." }, "column": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "Start position of the range covered by the stack frame. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. If attribute `source` is missing or doesn't exist, `column` is 0 and should be ignored by the client." }, "endLine": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The end line of the range covered by the stack frame." }, "endColumn": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "End position of the range covered by the stack frame. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." }, "canRestart": { @@ -3643,14 +3797,19 @@ }, "variablesReference": { "type": "integer", + "format": "uint32", "description": "The variables of this scope can be retrieved by passing the value of `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details." }, "namedVariables": { "type": "integer", + "format": "int32", + "minimum": 0, "description": "The number of named variables in this scope.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks." }, "indexedVariables": { "type": "integer", + "format": "int32", + "minimum": 0, "description": "The number of indexed variables in this scope.\nThe client can use this information to present the variables in a paged UI and fetch them in chunks." }, "expensive": { @@ -3663,18 +3822,26 @@ }, "line": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The start line of the range covered by this scope." }, "column": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "Start position of the range covered by the scope. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." }, "endLine": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The end line of the range covered by this scope." }, "endColumn": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "End position of the range covered by the scope. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." } }, @@ -3707,14 +3874,19 @@ }, "variablesReference": { "type": "integer", + "format": "uint32", "description": "If `variablesReference` is > 0, the variable is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details." }, "namedVariables": { "type": "integer", + "format": "int32", + "minimum": 0, "description": "The number of named child variables.\nThe client can use this information to present the children in a paged UI and fetch them in chunks." }, "indexedVariables": { "type": "integer", + "format": "int32", + "minimum": 0, "description": "The number of indexed child variables.\nThe client can use this information to present the children in a paged UI and fetch them in chunks." }, "memoryReference": { @@ -3723,10 +3895,12 @@ }, "declarationLocationReference": { "type": "integer", + "format": "int32", "description": "A reference that allows the client to request the location where the variable is declared. This should be present only if the adapter is likely to be able to resolve the location.\n\nThis reference shares the same lifetime as the `variablesReference`. See 'Lifetime of Object References' in the Overview section for details." }, "valueLocationReference": { "type": "integer", + "format": "int32", "description": "A reference that allows the client to request the location where the variable's value is declared. For example, if the variable contains a function pointer, the adapter may be able to look up the function's location. This should be present only if the adapter is likely to be able to resolve the location.\n\nThis reference shares the same lifetime as the `variablesReference`. See 'Lifetime of Object References' in the Overview section for details." } }, @@ -3791,18 +3965,26 @@ "properties": { "line": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "Start line of breakpoint location." }, "column": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The start position of a breakpoint location. Position is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." }, "endLine": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The end line of breakpoint location if the location covers a range." }, "endColumn": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The end position of a breakpoint location (if the location covers a range). Position is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." } }, @@ -3815,10 +3997,14 @@ "properties": { "line": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The source line of the breakpoint or logpoint." }, "column": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "Start position within source line of the breakpoint or logpoint. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." }, "condition": { @@ -3901,6 +4087,9 @@ }, "offset": { "type": "integer", + "format": "int64", + "maximum": 9007199254740991, + "minimum": -9007199254740991, "description": "The offset from the instruction reference in bytes.\nThis can be negative." }, "condition": { @@ -3925,6 +4114,7 @@ "properties": { "id": { "type": "integer", + "format": "int32", "description": "The identifier for the breakpoint. It is needed if breakpoint events are used to update or remove breakpoints." }, "verified": { @@ -3941,18 +4131,26 @@ }, "line": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The start line of the actual range covered by the breakpoint." }, "column": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "Start position of the source range covered by the breakpoint. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." }, "endLine": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The end line of the actual range covered by the breakpoint." }, "endColumn": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "End position of the source range covered by the breakpoint. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based.\nIf no end line is given, then the end column is assumed to be in the start line." }, "instructionReference": { @@ -3961,6 +4159,9 @@ }, "offset": { "type": "integer", + "format": "int64", + "maximum": 9007199254740991, + "minimum": -9007199254740991, "description": "The offset from the instruction reference.\nThis can be negative." }, "reason": { @@ -3989,6 +4190,7 @@ "properties": { "id": { "type": "integer", + "format": "int32", "description": "Unique identifier for a step-in target." }, "label": { @@ -3997,18 +4199,26 @@ }, "line": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The line of the step-in target." }, "column": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "Start position of the range covered by the step in target. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." }, "endLine": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The end line of the range covered by the step-in target." }, "endColumn": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "End position of the range covered by the step in target. It is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based." } }, @@ -4021,6 +4231,7 @@ "properties": { "id": { "type": "integer", + "format": "int32", "description": "Unique identifier for a goto target. This is used in the `goto` request." }, "label": { @@ -4029,18 +4240,26 @@ }, "line": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The line of the goto target." }, "column": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The column of the goto target." }, "endLine": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The end line of the range covered by the goto target." }, "endColumn": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The end column of the range covered by the goto target." }, "instructionPointerReference": { @@ -4077,18 +4296,22 @@ }, "start": { "type": "integer", + "format": "uint32", "description": "Start position (within the `text` attribute of the `completions` request) where the completion text is added. The position is measured in UTF-16 code units and the client capability `columnsStartAt1` determines whether it is 0- or 1-based. If the start position is omitted the text is added at the location specified by the `column` attribute of the `completions` request." }, "length": { "type": "integer", + "format": "uint32", "description": "Length determines how many characters are overwritten by the completion text and it is measured in UTF-16 code units. If missing the value 0 is assumed which results in the completion text being inserted." }, "selectionStart": { "type": "integer", + "format": "uint32", "description": "Determines the start of the new selection after the text has been inserted (or replaced). `selectionStart` is measured in UTF-16 code units and must be in the range 0 and length of the completion text. If omitted the selection starts at the end of the completion text." }, "selectionLength": { "type": "integer", + "format": "uint32", "description": "Determines the length of the new selection after the text has been inserted (or replaced) and it is measured in UTF-16 code units. The selection can not extend beyond the bounds of the completion text. If omitted the length is assumed to be 0." } }, @@ -4295,18 +4518,26 @@ }, "line": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The line within the source location that corresponds to this instruction, if any." }, "column": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The column within the line that corresponds to this instruction, if any." }, "endLine": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The end line of the range that corresponds to this instruction, if any." }, "endColumn": { "type": "integer", + "format": "uint64", + "maximum": 9007199254740991, "description": "The end column of the range that corresponds to this instruction, if any." }, "presentationHint": { diff --git a/spec-generator/generator.ts b/spec-generator/generator.ts index 23b9200..70074c9 100644 --- a/spec-generator/generator.ts +++ b/spec-generator/generator.ts @@ -246,7 +246,7 @@ function enumDescriptions(c: P.Commentable, markdown: boolean) { return description; } -function comment(c: P.Commentable): string { +function comment(c: P.PropertyType): string { let description = c.description || ''; @@ -255,6 +255,30 @@ function comment(c: P.Commentable): string { c = (c).items; } + if (c.type === 'integer') { + if (!c.format) { + throw new Error('missing format on integer: ' + JSON.stringify(c)); + } + if (c.format.endsWith('64')) { + if (!c.minimum && !c.format.startsWith('u')) { + throw new Error('missing minimum on 64 bit integer: ' + JSON.stringify(c)); + } + if (!c.maximum) { + throw new Error('missing maximum on 64 bit integer: ' + JSON.stringify(c)); + } + } + } + + if (c.type === 'number' || c.type === 'integer') { + description += '\n@format ' + c.format; + if (c.minimum !== undefined) { + description += `\n@minimum ${c.minimum}`; + } + if (c.maximum !== undefined) { + description += `\n@maximum ${c.maximum}`; + } + } + if (description) { if (numIndents === 0) { @@ -436,8 +460,8 @@ function line(str?: string, newline?: boolean, indnt?: boolean): string { /// Main -const debugProtocolSchema = JSON.parse(fs.readFileSync('./debugAdapterProtocol.json').toString()); +const debugProtocolSchema = JSON.parse(fs.readFileSync(__dirname + '/../debugAdapterProtocol.json').toString()); -fs.writeFileSync(`specification.md`, MarkDown(debugProtocolSchema), { encoding: 'utf-8'}); +fs.writeFileSync(`${__dirname}/../specification.md`, MarkDown(debugProtocolSchema), { encoding: 'utf-8'}); -fs.writeFileSync(`_data/specification-toc.yml`, outline.dump(), { encoding: 'utf-8'}); +fs.writeFileSync(`${__dirname}/../_data/specification-toc.yml`, outline.dump(), { encoding: 'utf-8'}); diff --git a/spec-generator/json_schema.d.ts b/spec-generator/json_schema.d.ts index b2f6de1..02db09b 100644 --- a/spec-generator/json_schema.d.ts +++ b/spec-generator/json_schema.d.ts @@ -22,10 +22,10 @@ export module Protocol { } export type Definition2 = Definition | AllOf | StringType; - type PropertyType = PrimitiveType | StringType | ObjectType | ArrayType; + export type PropertyType = PrimitiveType | StringType | ObjectType | ArrayType | NumericType; export interface PrimitiveType extends BaseType { - type: "number" | "integer" | "boolean" + type: "boolean" } export interface Commentable { @@ -39,6 +39,13 @@ export module Protocol { _enum?: string[] } + export interface NumericType extends BaseType, Commentable { + type: "number" | "integer" + minimum?: number + maximum?: number + format?: string + } + export interface StringType extends BaseType, Commentable { type: "string" /** Possible values of a string. */ @@ -77,4 +84,4 @@ export module Protocol { /** Description of the type */ description?: string } -} \ No newline at end of file +} diff --git a/spec-generator/package-lock.json b/spec-generator/package-lock.json index 561d4b0..50b056b 100644 --- a/spec-generator/package-lock.json +++ b/spec-generator/package-lock.json @@ -9,7 +9,423 @@ "version": "0.0.1", "devDependencies": { "@types/node": "^16.0.0", - "typescript": "^4.5.5" + "tsx": "^4.21.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, "node_modules/@types/node": { @@ -18,32 +434,357 @@ "integrity": "sha512-DYNtJWauMQ9RNpesl4aVothr97/tIJM8HbyOXJ0AYT1Z2bEjLHyfjOBPAQQVMLf8h3kSShYfNk8Wnto8B2zHUA==", "dev": true }, - "node_modules/typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", "dev": true, + "hasInstallScript": true, "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=4.2.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" } } }, "dependencies": { + "@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "dev": true, + "optional": true + }, + "@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "dev": true, + "optional": true + }, "@types/node": { "version": "16.11.22", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.22.tgz", "integrity": "sha512-DYNtJWauMQ9RNpesl4aVothr97/tIJM8HbyOXJ0AYT1Z2bEjLHyfjOBPAQQVMLf8h3kSShYfNk8Wnto8B2zHUA==", "dev": true }, - "typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "requires": { + "resolve-pkg-maps": "^1.0.0" + } + }, + "resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true + }, + "tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "requires": { + "esbuild": "~0.27.0", + "fsevents": "~2.3.3", + "get-tsconfig": "^4.7.5" + } } } } diff --git a/spec-generator/package.json b/spec-generator/package.json index 643c9aa..4e0ffb4 100644 --- a/spec-generator/package.json +++ b/spec-generator/package.json @@ -6,7 +6,6 @@ "name": "Microsoft Corporation", "email": "aweinand@microsoft.com" }, - "main": "out/generator.js", "private": true, "repository": { "type": "git", @@ -17,10 +16,9 @@ }, "devDependencies": { "@types/node": "^16.0.0", - "typescript": "^4.5.5" + "tsx": "^4.21.0" }, "scripts": { - "compile": "tsc -p .", - "watch": "tsc -w -p ." + "compile": "tsx generator.ts" } } From ed7c2a7d5b4146e554065ebfddfb6be42bcaacec Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Fri, 19 Dec 2025 13:09:47 -0800 Subject: [PATCH 2/3] variablesReference -> int32 --- debugAdapterProtocol.json | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/debugAdapterProtocol.json b/debugAdapterProtocol.json index 7dfa3fc..031f6dd 100644 --- a/debugAdapterProtocol.json +++ b/debugAdapterProtocol.json @@ -387,7 +387,8 @@ }, "variablesReference": { "type": "integer", - "format": "uint32", + "format": "int32", + "minimum": 0, "description": "If an attribute `variablesReference` exists and its value is > 0, the output contains objects which can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details." }, "source": { @@ -1508,7 +1509,8 @@ "properties": { "variablesReference": { "type": "integer", - "format": "uint32", + "format": "int32", + "minimum": 0, "description": "Reference to the variable container if the data breakpoint is requested for a child of the container. The `variablesReference` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details." }, "name": { @@ -2202,7 +2204,8 @@ "properties": { "variablesReference": { "type": "integer", - "format": "uint32", + "format": "int32", + "minimum": 0, "description": "The variable for which to retrieve its children. The `variablesReference` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details." }, "filter": { @@ -2272,7 +2275,8 @@ "properties": { "variablesReference": { "type": "integer", - "format": "uint32", + "format": "int32", + "minimum": 0, "description": "The reference of the variable container. The `variablesReference` must have been obtained in the current suspended state. See 'Lifetime of Object References' in the Overview section for details." }, "name": { @@ -2308,7 +2312,8 @@ }, "variablesReference": { "type": "integer", - "format": "uint32", + "format": "int32", + "minimum": 0, "description": "If `variablesReference` is > 0, the new value is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details.\n\nIf this property is included in the response, any `variablesReference` previously associated with the updated variable, and those of its children, are no longer valid." }, "namedVariables": { @@ -2660,7 +2665,8 @@ }, "variablesReference": { "type": "integer", - "format": "uint32", + "format": "int32", + "minimum": 0, "description": "If `variablesReference` is > 0, the evaluate result is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details." }, "namedVariables": { @@ -2754,7 +2760,8 @@ }, "variablesReference": { "type": "integer", - "format": "uint32", + "format": "int32", + "minimum": 0, "description": "If `variablesReference` is > 0, the evaluate result is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details." }, "namedVariables": { @@ -3797,7 +3804,8 @@ }, "variablesReference": { "type": "integer", - "format": "uint32", + "format": "int32", + "minimum": 0, "description": "The variables of this scope can be retrieved by passing the value of `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details." }, "namedVariables": { @@ -3874,7 +3882,8 @@ }, "variablesReference": { "type": "integer", - "format": "uint32", + "format": "int32", + "minimum": 0, "description": "If `variablesReference` is > 0, the variable is structured and its children can be retrieved by passing `variablesReference` to the `variables` request as long as execution remains suspended. See 'Lifetime of Object References' in the Overview section for details." }, "namedVariables": { From 0e038043de6d8e2d88571a93e249f3d15e91c718 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Sat, 20 Dec 2025 13:19:57 -0800 Subject: [PATCH 3/3] rm bad min --- debugAdapterProtocol.json | 1 - 1 file changed, 1 deletion(-) diff --git a/debugAdapterProtocol.json b/debugAdapterProtocol.json index 031f6dd..2d8589d 100644 --- a/debugAdapterProtocol.json +++ b/debugAdapterProtocol.json @@ -3543,7 +3543,6 @@ "id": { "type": "integer", "format": "int32", - "minimum": 1, "description": "Unique (within a debug adapter implementation) identifier for the message. The purpose of these error IDs is to help extension authors that have the requirement that every user visible error message needs a corresponding error number, so that users or customer support can find information about the specific error more easily." }, "format": {