@iamjulianacosta/mobx-data 1.1.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +273 -102
- package/dist/{CacheHandler-BTU_rYkv.js → CacheHandler-BhfbVHed.js} +17 -20
- package/dist/CacheHandler-BhfbVHed.js.map +1 -0
- package/dist/{CacheHandler-CXgY9IJo.cjs → CacheHandler-Q5VXOgh9.cjs} +2 -2
- package/dist/CacheHandler-Q5VXOgh9.cjs.map +1 -0
- package/dist/EmbeddedRecordsMixin-6mSCXsJ3.js +173 -0
- package/dist/EmbeddedRecordsMixin-6mSCXsJ3.js.map +1 -0
- package/dist/EmbeddedRecordsMixin-BkF7MdbY.cjs +2 -0
- package/dist/EmbeddedRecordsMixin-BkF7MdbY.cjs.map +1 -0
- package/dist/{JsonApiSerializer-BLoE046A.js → JsonApiSerializer-BV61cFAZ.js} +3 -3
- package/dist/JsonApiSerializer-BV61cFAZ.js.map +1 -0
- package/dist/{JsonApiSerializer-DKemcyw-.cjs → JsonApiSerializer-Dt_Y_FIo.cjs} +2 -2
- package/dist/JsonApiSerializer-Dt_Y_FIo.cjs.map +1 -0
- package/dist/JsonSerializer-BzUCyUSf.cjs +2 -0
- package/dist/JsonSerializer-BzUCyUSf.cjs.map +1 -0
- package/dist/JsonSerializer-CFqo6GjC.js +98 -0
- package/dist/JsonSerializer-CFqo6GjC.js.map +1 -0
- package/dist/MdqlMemoryExecutor-BUlsalKm.cjs +2 -0
- package/dist/MdqlMemoryExecutor-BUlsalKm.cjs.map +1 -0
- package/dist/MdqlMemoryExecutor-BWMP31zG.js +127 -0
- package/dist/MdqlMemoryExecutor-BWMP31zG.js.map +1 -0
- package/dist/{MemoryAdapter-Bp-BGHH3.js → MemoryAdapter-BW1HKixm.js} +2 -2
- package/dist/{MemoryAdapter-Bp-BGHH3.js.map → MemoryAdapter-BW1HKixm.js.map} +1 -1
- package/dist/{MemoryAdapter-DH-gzSSl.cjs → MemoryAdapter-C8iXAa2v.cjs} +2 -2
- package/dist/{MemoryAdapter-DH-gzSSl.cjs.map → MemoryAdapter-C8iXAa2v.cjs.map} +1 -1
- package/dist/{ODataAdapter-RQUjVTcf.js → ODataAdapter-CeBJblLQ.js} +25 -22
- package/dist/ODataAdapter-CeBJblLQ.js.map +1 -0
- package/dist/{ODataAdapter-CrDFvBEZ.cjs → ODataAdapter-DdE6MWkG.cjs} +2 -2
- package/dist/ODataAdapter-DdE6MWkG.cjs.map +1 -0
- package/dist/RestAdapter-D7GSrsJo.cjs +2 -0
- package/dist/RestAdapter-D7GSrsJo.cjs.map +1 -0
- package/dist/{RestAdapter-D6bGIHZT.js → RestAdapter-DYUoyV5h.js} +112 -77
- package/dist/RestAdapter-DYUoyV5h.js.map +1 -0
- package/dist/SchemaService-C_pkh-vI.js +180 -0
- package/dist/SchemaService-C_pkh-vI.js.map +1 -0
- package/dist/SchemaService-DbJLoYb9.cjs +2 -0
- package/dist/SchemaService-DbJLoYb9.cjs.map +1 -0
- package/dist/Serializer-Bap9U-kR.cjs +2 -0
- package/dist/Serializer-Bap9U-kR.cjs.map +1 -0
- package/dist/{Serializer-FxJbsZ50.js → Serializer-Ca6w_QNQ.js} +63 -49
- package/dist/Serializer-Ca6w_QNQ.js.map +1 -0
- package/dist/adapter/index.cjs +1 -1
- package/dist/adapter/index.js +2 -2
- package/dist/createStore-7PecKT54.cjs +2 -0
- package/dist/createStore-7PecKT54.cjs.map +1 -0
- package/dist/createStore-BfmRfZ_2.js +1229 -0
- package/dist/createStore-BfmRfZ_2.js.map +1 -0
- package/dist/date-Bj4O2W1F.js.map +1 -1
- package/dist/date-CRCe-9gf.cjs.map +1 -1
- package/dist/decorators-CKneHgoF.js +56 -0
- package/dist/decorators-CKneHgoF.js.map +1 -0
- package/dist/decorators-DCVYKzrL.cjs +2 -0
- package/dist/decorators-DCVYKzrL.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +100 -90
- package/dist/index.js.map +1 -1
- package/dist/inspector/ConsoleInspector.d.ts +49 -0
- package/dist/inspector/ConsoleInspector.d.ts.map +1 -0
- package/dist/inspector/DevToolsBridge.d.ts +21 -0
- package/dist/inspector/DevToolsBridge.d.ts.map +1 -0
- package/dist/inspector/QueryParser.d.ts +21 -0
- package/dist/inspector/QueryParser.d.ts.map +1 -0
- package/dist/inspector/StoreInspector.d.ts +31 -0
- package/dist/inspector/StoreInspector.d.ts.map +1 -0
- package/dist/inspector/index.cjs +17 -0
- package/dist/inspector/index.cjs.map +1 -0
- package/dist/inspector/index.d.ts +9 -0
- package/dist/inspector/index.d.ts.map +1 -0
- package/dist/inspector/index.js +896 -0
- package/dist/inspector/index.js.map +1 -0
- package/dist/inspector/integration.d.ts +15 -0
- package/dist/inspector/integration.d.ts.map +1 -0
- package/dist/inspector/serialization.d.ts +7 -0
- package/dist/inspector/serialization.d.ts.map +1 -0
- package/dist/inspector/types.d.ts +139 -0
- package/dist/inspector/types.d.ts.map +1 -0
- package/dist/json-api/index.cjs +1 -1
- package/dist/json-api/index.js +1 -1
- package/dist/mdql/MdqlMemoryExecutor.d.ts +17 -0
- package/dist/mdql/MdqlMemoryExecutor.d.ts.map +1 -0
- package/dist/mdql/MdqlQueryBuilder.d.ts +38 -0
- package/dist/mdql/MdqlQueryBuilder.d.ts.map +1 -0
- package/dist/mdql/MdqlValidator.d.ts +13 -0
- package/dist/mdql/MdqlValidator.d.ts.map +1 -0
- package/dist/mdql/index.d.ts +6 -0
- package/dist/mdql/index.d.ts.map +1 -0
- package/dist/mdql/types.d.ts +48 -0
- package/dist/mdql/types.d.ts.map +1 -0
- package/dist/model/Model.d.ts +4 -0
- package/dist/model/Model.d.ts.map +1 -1
- package/dist/model/Snapshot.d.ts +2 -0
- package/dist/model/Snapshot.d.ts.map +1 -1
- package/dist/model/index.cjs +1 -1
- package/dist/model/index.js +1 -1
- package/dist/odata/ODataAdapter.d.ts.map +1 -1
- package/dist/odata/index.cjs +1 -1
- package/dist/odata/index.js +1 -1
- package/dist/relationships-BgM0NKdb.cjs +2 -0
- package/dist/relationships-BgM0NKdb.cjs.map +1 -0
- package/dist/{relationships-BEXANmWg.js → relationships-DvSi8fVN.js} +37 -28
- package/dist/relationships-DvSi8fVN.js.map +1 -0
- package/dist/request/CacheHandler.d.ts.map +1 -1
- package/dist/request/index.cjs +1 -1
- package/dist/request/index.js +1 -1
- package/dist/schema/SchemaService.d.ts +38 -1
- package/dist/schema/SchemaService.d.ts.map +1 -1
- package/dist/schema/decorators.d.ts +20 -1
- package/dist/schema/decorators.d.ts.map +1 -1
- package/dist/schema/index.cjs +1 -1
- package/dist/schema/index.d.ts +1 -1
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +10 -8
- package/dist/schema/types.d.ts +31 -0
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/serializer/JsonSerializer.d.ts +2 -0
- package/dist/serializer/JsonSerializer.d.ts.map +1 -1
- package/dist/serializer/Serializer.d.ts +9 -0
- package/dist/serializer/Serializer.d.ts.map +1 -1
- package/dist/serializer/index.cjs +1 -1
- package/dist/serializer/index.js +6 -5
- package/dist/serializer/index.js.map +1 -1
- package/dist/store/Store.d.ts +3 -0
- package/dist/store/Store.d.ts.map +1 -1
- package/dist/store/createStore.d.ts +12 -0
- package/dist/store/createStore.d.ts.map +1 -0
- package/dist/store/index.cjs +1 -1
- package/dist/store/index.d.ts +1 -0
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +5 -4
- package/dist/types-CC2fG3FP.js +8 -0
- package/dist/types-CC2fG3FP.js.map +1 -0
- package/dist/types-DCLy5XYj.cjs +2 -0
- package/dist/types-DCLy5XYj.cjs.map +1 -0
- package/package.json +7 -1
- package/src/index.ts +3 -0
- package/src/inspector/ConsoleInspector.ts +470 -0
- package/src/inspector/DevToolsBridge.ts +214 -0
- package/src/inspector/QueryParser.ts +343 -0
- package/src/inspector/StoreInspector.ts +162 -0
- package/src/inspector/index.ts +20 -0
- package/src/inspector/integration.ts +56 -0
- package/src/inspector/serialization.ts +100 -0
- package/src/inspector/types.ts +161 -0
- package/src/mdql/MdqlMemoryExecutor.ts +229 -0
- package/src/mdql/MdqlQueryBuilder.ts +170 -0
- package/src/mdql/MdqlValidator.ts +193 -0
- package/src/mdql/index.ts +21 -0
- package/src/mdql/types.ts +107 -0
- package/src/model/Model.ts +15 -0
- package/src/model/Snapshot.ts +3 -0
- package/src/odata/ODataAdapter.ts +4 -1
- package/src/request/CacheHandler.ts +2 -6
- package/src/schema/SchemaService.ts +123 -1
- package/src/schema/decorators.ts +29 -0
- package/src/schema/index.ts +1 -1
- package/src/schema/types.ts +34 -0
- package/src/serializer/JsonSerializer.ts +14 -2
- package/src/serializer/Serializer.ts +24 -1
- package/src/store/Store.ts +57 -14
- package/src/store/createStore.ts +39 -0
- package/src/store/index.ts +1 -0
- package/dist/CacheHandler-BTU_rYkv.js.map +0 -1
- package/dist/CacheHandler-CXgY9IJo.cjs.map +0 -1
- package/dist/EmbeddedRecordsMixin-CBvqNdgC.cjs +0 -2
- package/dist/EmbeddedRecordsMixin-CBvqNdgC.cjs.map +0 -1
- package/dist/EmbeddedRecordsMixin-VoHluHCT.js +0 -261
- package/dist/EmbeddedRecordsMixin-VoHluHCT.js.map +0 -1
- package/dist/JsonApiSerializer-BLoE046A.js.map +0 -1
- package/dist/JsonApiSerializer-DKemcyw-.cjs.map +0 -1
- package/dist/ODataAdapter-CrDFvBEZ.cjs.map +0 -1
- package/dist/ODataAdapter-RQUjVTcf.js.map +0 -1
- package/dist/RestAdapter-CSoJg7D2.cjs +0 -2
- package/dist/RestAdapter-CSoJg7D2.cjs.map +0 -1
- package/dist/RestAdapter-D6bGIHZT.js.map +0 -1
- package/dist/SchemaService-DZwkFgZu.js +0 -102
- package/dist/SchemaService-DZwkFgZu.js.map +0 -1
- package/dist/SchemaService-Di_yjVzU.cjs +0 -2
- package/dist/SchemaService-Di_yjVzU.cjs.map +0 -1
- package/dist/Serializer-95gi5edy.cjs +0 -2
- package/dist/Serializer-95gi5edy.cjs.map +0 -1
- package/dist/Serializer-FxJbsZ50.js.map +0 -1
- package/dist/Store-Bm5JivTc.js +0 -957
- package/dist/Store-Bm5JivTc.js.map +0 -1
- package/dist/Store-DX9D0Mmy.cjs +0 -2
- package/dist/Store-DX9D0Mmy.cjs.map +0 -1
- package/dist/cache-utils-B2wFhisx.js +0 -39
- package/dist/cache-utils-B2wFhisx.js.map +0 -1
- package/dist/cache-utils-CSwsqOi3.cjs +0 -2
- package/dist/cache-utils-CSwsqOi3.cjs.map +0 -1
- package/dist/decorators-HQ1KnRdh.cjs +0 -2
- package/dist/decorators-HQ1KnRdh.cjs.map +0 -1
- package/dist/decorators-Zr35qr6A.js +0 -50
- package/dist/decorators-Zr35qr6A.js.map +0 -1
- package/dist/relationships-B55LBaCW.cjs +0 -2
- package/dist/relationships-B55LBaCW.cjs.map +0 -1
- package/dist/relationships-BEXANmWg.js.map +0 -1
- package/dist/types-C9NB2gRj.js +0 -7
- package/dist/types-C9NB2gRj.js.map +0 -1
- package/dist/types-uWOXMPWW.cjs +0 -2
- package/dist/types-uWOXMPWW.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/inspector/QueryParser.ts","../../src/inspector/serialization.ts","../../src/inspector/StoreInspector.ts","../../src/inspector/ConsoleInspector.ts","../../src/inspector/DevToolsBridge.ts","../../src/inspector/integration.ts"],"sourcesContent":["import type {\r\n MdqlQueryObject,\r\n MdqlFilterNode,\r\n MdqlCondition,\r\n MdqlLogicalGroup,\r\n MdqlOperator,\r\n MdqlOrderByClause,\r\n MdqlSortDirection,\r\n} from '@mobx-data/mdql';\r\n\r\ninterface Token {\r\n type: 'keyword' | 'operator' | 'string' | 'number' | 'identifier' | 'null' | 'bracket';\r\n value: string;\r\n raw: unknown;\r\n}\r\n\r\nconst KEYWORD_SET = new Set([\r\n 'where', 'and', 'or', 'not', 'order', 'by', 'sort',\r\n 'limit', 'offset', 'is', 'null', 'in', 'between',\r\n 'asc', 'desc', 'contains', 'startswith', 'endswith',\r\n]);\r\n\r\nconst OPERATOR_MAP: Record<string, MdqlOperator> = {\r\n '=': 'equals',\r\n '==': 'equals',\r\n '!=': 'notEquals',\r\n '<>': 'notEquals',\r\n '>': 'greaterThan',\r\n '>=': 'greaterThanOrEquals',\r\n '<': 'lessThan',\r\n '<=': 'lessThanOrEquals',\r\n '~': 'contains',\r\n '^=': 'startsWith',\r\n '$=': 'endsWith',\r\n 'contains': 'contains',\r\n 'startswith': 'startsWith',\r\n 'endswith': 'endsWith',\r\n};\r\n\r\nconst OPERATOR_CHARS = new Set(['=', '!', '<', '>', '~', '^', '$']);\r\n\r\nexport class QueryParser {\r\n static parse(input: string): MdqlQueryObject {\r\n const parser = new QueryParser(input);\r\n return parser.parseQuery();\r\n }\r\n\r\n private tokens: Token[];\r\n private position: number;\r\n\r\n private constructor(input: string) {\r\n this.tokens = QueryParser.tokenize(input);\r\n this.position = 0;\r\n }\r\n\r\n private static tokenize(input: string): Token[] {\r\n const tokens: Token[] = [];\r\n let index = 0;\r\n\r\n while (index < input.length) {\r\n if (input[index] === ' ' || input[index] === '\\t') {\r\n index++;\r\n continue;\r\n }\r\n\r\n if (input[index] === '[' || input[index] === ']' || input[index] === ',') {\r\n tokens.push({ type: 'bracket', value: input[index]!, raw: input[index] });\r\n index++;\r\n continue;\r\n }\r\n\r\n if (input[index] === '\"' || input[index] === \"'\") {\r\n const quote = input[index]!;\r\n let value = '';\r\n index++;\r\n while (index < input.length && input[index] !== quote) {\r\n if (input[index] === '\\\\' && index + 1 < input.length) {\r\n index++;\r\n }\r\n value += input[index];\r\n index++;\r\n }\r\n index++;\r\n tokens.push({ type: 'string', value, raw: value });\r\n continue;\r\n }\r\n\r\n if (OPERATOR_CHARS.has(input[index]!)) {\r\n let operator = '';\r\n while (index < input.length && OPERATOR_CHARS.has(input[index]!)) {\r\n operator += input[index];\r\n index++;\r\n }\r\n tokens.push({ type: 'operator', value: operator, raw: operator });\r\n continue;\r\n }\r\n\r\n let word = '';\r\n while (index < input.length && input[index] !== ' ' && input[index] !== '\\t'\r\n && !OPERATOR_CHARS.has(input[index]!) && input[index] !== '[' && input[index] !== ']' && input[index] !== ',') {\r\n word += input[index];\r\n index++;\r\n }\r\n\r\n if (word === '') {\r\n index++;\r\n continue;\r\n }\r\n\r\n const lower = word.toLowerCase();\r\n\r\n if (lower === 'null') {\r\n tokens.push({ type: 'null', value: 'null', raw: null });\r\n } else if (KEYWORD_SET.has(lower)) {\r\n tokens.push({ type: 'keyword', value: lower, raw: word });\r\n } else {\r\n const numberValue = Number(word);\r\n if (!Number.isNaN(numberValue) && word !== '') {\r\n tokens.push({ type: 'number', value: word, raw: numberValue });\r\n } else {\r\n tokens.push({ type: 'identifier', value: word, raw: word });\r\n }\r\n }\r\n }\r\n\r\n return tokens;\r\n }\r\n\r\n private peek(): Token | null {\r\n return this.tokens[this.position] ?? null;\r\n }\r\n\r\n private advance(): Token | null {\r\n const token = this.tokens[this.position] ?? null;\r\n this.position++;\r\n return token;\r\n }\r\n\r\n private expect(type: string, value?: string): Token {\r\n const token = this.advance();\r\n if (!token || token.type !== type || (value !== undefined && token.value !== value)) {\r\n const got = token ? `${token.type}:${token.value}` : 'end of input';\r\n throw new Error(`Expected ${type}${value ? `:${value}` : ''}, got ${got}`);\r\n }\r\n return token;\r\n }\r\n\r\n private expectNullToken(): void {\r\n const token = this.advance();\r\n if (!token || (token.type !== 'null' && token.value !== 'null')) {\r\n const got = token ? `${token.type}:${token.value}` : 'end of input';\r\n throw new Error(`Expected null, got ${got}`);\r\n }\r\n }\r\n\r\n private matchKeyword(keyword: string): boolean {\r\n const token = this.peek();\r\n if (token?.type === 'keyword' && token.value === keyword) {\r\n this.advance();\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n private parseQuery(): MdqlQueryObject {\r\n const modelToken = this.advance();\r\n if (!modelToken) throw new Error('Expected model name');\r\n const modelName = modelToken.value;\r\n\r\n let filters: MdqlLogicalGroup = { kind: 'and', children: [] };\r\n const orderBy: MdqlOrderByClause[] = [];\r\n let limit: number | null = null;\r\n let offset: number | null = null;\r\n\r\n if (this.matchKeyword('where')) {\r\n filters = this.parseFilterExpression();\r\n }\r\n\r\n if (this.matchKeyword('order')) {\r\n this.expect('keyword', 'by');\r\n this.parseOrderBy(orderBy);\r\n } else if (this.matchKeyword('sort')) {\r\n this.parseOrderBy(orderBy);\r\n }\r\n\r\n if (this.matchKeyword('limit')) {\r\n const token = this.expect('number');\r\n limit = token.raw as number;\r\n }\r\n\r\n if (this.matchKeyword('offset')) {\r\n const token = this.expect('number');\r\n offset = token.raw as number;\r\n }\r\n\r\n return { modelName, filters, orderBy, limit, offset, includes: [] };\r\n }\r\n\r\n private parseFilterExpression(): MdqlLogicalGroup {\r\n const first = this.parseCondition();\r\n const children: MdqlFilterNode[] = [first];\r\n let groupKind: 'and' | 'or' = 'and';\r\n\r\n while (this.peek()) {\r\n const token = this.peek()!;\r\n if (token.type === 'keyword' && token.value === 'and') {\r\n this.advance();\r\n groupKind = 'and';\r\n children.push(this.parseCondition());\r\n } else if (token.type === 'keyword' && token.value === 'or') {\r\n this.advance();\r\n groupKind = 'or';\r\n children.push(this.parseCondition());\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n if (children.length === 1 && first.kind !== 'condition') {\r\n return first as MdqlLogicalGroup;\r\n }\r\n\r\n return { kind: groupKind, children };\r\n }\r\n\r\n private parseCondition(): MdqlFilterNode {\r\n if (this.matchKeyword('not')) {\r\n const child = this.parseCondition();\r\n return { kind: 'not', children: [child] };\r\n }\r\n\r\n const fieldToken = this.advance();\r\n if (!fieldToken) throw new Error('Expected field name');\r\n const field = fieldToken.value;\r\n\r\n if (this.peek()?.type === 'keyword' && this.peek()?.value === 'is') {\r\n this.advance();\r\n if (this.matchKeyword('not')) {\r\n this.expectNullToken();\r\n return { kind: 'condition', field, operator: 'isNotNull', value: undefined };\r\n }\r\n this.expectNullToken();\r\n return { kind: 'condition', field, operator: 'isNull', value: undefined };\r\n }\r\n\r\n if (this.peek()?.type === 'keyword' && this.peek()?.value === 'in') {\r\n this.advance();\r\n const values = this.parseArray();\r\n return { kind: 'condition', field, operator: 'in', value: values };\r\n }\r\n\r\n if (this.peek()?.type === 'keyword' && this.peek()?.value === 'between') {\r\n this.advance();\r\n const low = this.parseValue();\r\n const high = this.parseValue();\r\n return { kind: 'condition', field, operator: 'between', value: [low, high] };\r\n }\r\n\r\n const operatorToken = this.advance();\r\n if (!operatorToken) throw new Error(`Expected operator after field \"${field}\"`);\r\n\r\n let operator: MdqlOperator;\r\n if (operatorToken.type === 'operator') {\r\n operator = OPERATOR_MAP[operatorToken.value] as MdqlOperator;\r\n if (!operator) throw new Error(`Unknown operator: ${operatorToken.value}`);\r\n } else if (operatorToken.type === 'keyword' && OPERATOR_MAP[operatorToken.value]) {\r\n operator = OPERATOR_MAP[operatorToken.value] as MdqlOperator;\r\n } else {\r\n throw new Error(`Expected operator, got ${operatorToken.type}:${operatorToken.value}`);\r\n }\r\n\r\n const value = this.parseValue();\r\n\r\n return { kind: 'condition', field, operator, value } as MdqlCondition;\r\n }\r\n\r\n private parseOrderBy(orderBy: MdqlOrderByClause[]): void {\r\n const fieldToken = this.advance();\r\n if (!fieldToken) throw new Error('Expected field name after order by / sort');\r\n orderBy.push({\r\n field: fieldToken.value,\r\n direction: this.parseDirection(),\r\n });\r\n\r\n while (this.peek()?.type === 'bracket' && this.peek()?.value === ',') {\r\n this.advance();\r\n const nextField = this.advance();\r\n if (!nextField) break;\r\n orderBy.push({\r\n field: nextField.value,\r\n direction: this.parseDirection(),\r\n });\r\n }\r\n }\r\n\r\n private parseDirection(): MdqlSortDirection {\r\n const token = this.peek();\r\n if (token?.type === 'keyword' && (token.value === 'asc' || token.value === 'desc')) {\r\n this.advance();\r\n return token.value as MdqlSortDirection;\r\n }\r\n return 'asc';\r\n }\r\n\r\n private parseValue(): unknown {\r\n const token = this.advance();\r\n if (!token) throw new Error('Expected value');\r\n\r\n if (token.type === 'string') return token.raw;\r\n if (token.type === 'number') return token.raw;\r\n if (token.type === 'null') return null;\r\n if (token.type === 'keyword' && token.value === 'null') return null;\r\n if (token.type === 'identifier') return token.value;\r\n\r\n throw new Error(`Unexpected value token: ${token.type}:${token.value}`);\r\n }\r\n\r\n private parseArray(): unknown[] {\r\n const values: unknown[] = [];\r\n if (this.peek()?.type === 'bracket' && this.peek()?.value === '[') {\r\n this.advance();\r\n while (this.peek() && !(this.peek()?.type === 'bracket' && this.peek()?.value === ']')) {\r\n if (this.peek()?.type === 'bracket' && this.peek()?.value === ',') {\r\n this.advance();\r\n continue;\r\n }\r\n values.push(this.parseValue());\r\n }\r\n if (this.peek()?.type === 'bracket' && this.peek()?.value === ']') {\r\n this.advance();\r\n }\r\n } else {\r\n while (this.peek() && this.peek()?.type !== 'keyword') {\r\n if (this.peek()?.type === 'bracket' && this.peek()?.value === ',') {\r\n this.advance();\r\n continue;\r\n }\r\n values.push(this.parseValue());\r\n }\r\n }\r\n return values;\r\n }\r\n}\r\n","import type { Model, RelationshipRef } from '@mobx-data/model';\r\nimport type { Store } from '@mobx-data/store';\r\nimport type { RecordSummary, RecordDetail, SchemaInfo } from './types.js';\r\n\r\ninterface ModelInternals {\r\n _data: Record<string, unknown>;\r\n _originalData: Record<string, unknown>;\r\n _relationships: Map<string, RelationshipRef>;\r\n _clientId: string;\r\n}\r\n\r\nfunction internals(record: Model): ModelInternals {\r\n return record as unknown as ModelInternals;\r\n}\r\n\r\nexport function summarizeRecord(record: Model): RecordSummary {\r\n return {\r\n modelName: record.modelName,\r\n id: record.id,\r\n clientId: internals(record)._clientId,\r\n currentState: record.currentState,\r\n isNew: record.isNew,\r\n isDirty: record.isDirty,\r\n isDeleted: record.isDeleted,\r\n isError: record.isError,\r\n isLoading: record.isLoading,\r\n isSaving: record.isSaving,\r\n hasDirtyAttributes: record.hasDirtyAttributes,\r\n hasErrors: !record.isValid,\r\n };\r\n}\r\n\r\nexport function detailRecord(record: Model): RecordDetail {\r\n const internal = internals(record);\r\n const relationships: Record<string, unknown> = {};\r\n if (internal._relationships) {\r\n for (const [name, reference] of internal._relationships) {\r\n relationships[name] = reference;\r\n }\r\n }\r\n\r\n const errors: Array<{ attribute: string; messages: string[] }> = [];\r\n for (const [attribute, errorMessages] of record.errors) {\r\n errors.push({\r\n attribute,\r\n messages: errorMessages.map((e) => e.message),\r\n });\r\n }\r\n\r\n const attributes = Object.create(null) as Record<string, unknown>;\r\n for (const key of Object.keys(internal._data)) {\r\n if (key === '__proto__' || key === 'constructor') continue;\r\n attributes[key] = internal._data[key];\r\n }\r\n const originalAttributes = Object.create(null) as Record<string, unknown>;\r\n for (const key of Object.keys(internal._originalData)) {\r\n if (key === '__proto__' || key === 'constructor') continue;\r\n originalAttributes[key] = internal._originalData[key];\r\n }\r\n\r\n return {\r\n ...summarizeRecord(record),\r\n attributes,\r\n originalAttributes,\r\n changedAttributes: record.changedAttributes(),\r\n relationships,\r\n errors,\r\n };\r\n}\r\n\r\nexport function extractSchemaInfo(store: Store, modelName: string): SchemaInfo {\r\n const attributeDefinitions = store.schema.attributesDefinitionFor(modelName);\r\n const relationshipDefinitions = store.schema.relationshipsDefinitionFor(modelName);\r\n const discriminator = store.schema.discriminatorFor(modelName);\r\n\r\n const attributes: SchemaInfo['attributes'] = [];\r\n for (const [name, definition] of attributeDefinitions) {\r\n attributes.push({ name, type: definition.type });\r\n }\r\n\r\n const relationships: SchemaInfo['relationships'] = [];\r\n for (const [name, definition] of relationshipDefinitions) {\r\n relationships.push({\r\n name,\r\n kind: definition.kind,\r\n type: definition.type,\r\n async: definition.options.async ?? false,\r\n inverse: definition.options.inverse ?? null,\r\n polymorphic: definition.options.polymorphic ?? false,\r\n });\r\n }\r\n\r\n return {\r\n modelName,\r\n isAbstract: store.schema.isAbstract(modelName),\r\n discriminator: discriminator ? { key: discriminator.key } : null,\r\n attributes,\r\n relationships,\r\n };\r\n}\r\n","import { reaction } from 'mobx';\r\nimport type { Model } from '@mobx-data/model';\r\nimport type { Store } from '@mobx-data/store';\r\nimport type { MdqlQueryObject } from '@mobx-data/mdql';\r\nimport { MdqlMemoryExecutor } from '../mdql/MdqlMemoryExecutor.js';\r\nimport { QueryParser } from './QueryParser.js';\r\nimport type {\r\n StoreSummary,\r\n RecordSummary,\r\n RecordDetail,\r\n SchemaInfo,\r\n InspectorChangeEvent,\r\n} from './types.js';\r\nimport { summarizeRecord, detailRecord, extractSchemaInfo } from './serialization.js';\r\n\r\nexport class StoreInspector {\r\n private readonly store: Store;\r\n\r\n constructor(store: Store) {\r\n this.store = store;\r\n }\r\n\r\n summary(): StoreSummary {\r\n const types: StoreSummary['types'] = [];\r\n let totalRecords = 0;\r\n for (const modelName of this.store.schema.registeredNames()) {\r\n const count = this.store.peekAll(modelName).length;\r\n if (count > 0) {\r\n types.push({ modelName, count });\r\n }\r\n totalRecords += count;\r\n }\r\n types.sort((a, b) => a.modelName.localeCompare(b.modelName));\r\n return { types, totalRecords };\r\n }\r\n\r\n records(modelName: string): RecordSummary[] {\r\n return this.store.peekAll(modelName).toArray().map(summarizeRecord);\r\n }\r\n\r\n record(modelName: string, id: string): RecordDetail | null {\r\n const found = this.store.identityMap.get(modelName, id);\r\n if (!found) {\r\n return null;\r\n }\r\n return detailRecord(found);\r\n }\r\n\r\n dirty(): RecordSummary[] {\r\n return this.allRecordsWhere((r) => r.isDirty);\r\n }\r\n\r\n newRecords(): RecordSummary[] {\r\n return this.allRecordsWhere((r) => r.isNew);\r\n }\r\n\r\n errored(): RecordSummary[] {\r\n return this.allRecordsWhere((r) => r.isError || !r.isValid);\r\n }\r\n\r\n saving(): RecordSummary[] {\r\n return this.allRecordsWhere((r) => r.isSaving);\r\n }\r\n\r\n schema(modelName: string): SchemaInfo {\r\n return extractSchemaInfo(this.store, modelName);\r\n }\r\n\r\n types(): string[] {\r\n return this.store.schema.registeredNames().sort();\r\n }\r\n\r\n query(text: string): Model[] {\r\n const queryObject = QueryParser.parse(text);\r\n const items = this.store.peekAll(queryObject.modelName).toArray();\r\n return MdqlMemoryExecutor.executeMany(items, queryObject);\r\n }\r\n\r\n queryWithMeta(text: string): { modelName: string; results: Model[] } {\r\n const queryObject = QueryParser.parse(text);\r\n const items = this.store.peekAll(queryObject.modelName).toArray();\r\n return {\r\n modelName: queryObject.modelName,\r\n results: MdqlMemoryExecutor.executeMany(items, queryObject),\r\n };\r\n }\r\n\r\n liveModels(modelName: string): Model[] {\r\n return this.store.peekAll(modelName).toArray();\r\n }\r\n\r\n liveModel(modelName: string, id: string): Model | null {\r\n return this.store.peekRecord(modelName, id);\r\n }\r\n\r\n snapshot(): { records: Record<string, unknown[]> } {\r\n return this.store.serialize();\r\n }\r\n\r\n observe(callback: (event: InspectorChangeEvent) => void): () => void {\r\n let previousState = this.captureState();\r\n\r\n return reaction(\r\n () => this.captureState(),\r\n (currentState) => {\r\n this.diffAndEmit(previousState, currentState, callback);\r\n previousState = currentState;\r\n },\r\n { delay: 100 },\r\n );\r\n }\r\n\r\n private allRecordsWhere(predicate: (record: Model) => boolean): RecordSummary[] {\r\n const results: RecordSummary[] = [];\r\n for (const modelName of this.store.schema.registeredNames()) {\r\n for (const record of this.store.peekAll(modelName).toArray()) {\r\n if (predicate(record)) {\r\n results.push(summarizeRecord(record));\r\n }\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n private captureState(): Map<string, Map<string, string>> {\r\n const state = new Map<string, Map<string, string>>();\r\n for (const [modelName, bucket] of this.store.identityMap._buckets) {\r\n const records = new Map<string, string>();\r\n for (const [id, record] of bucket) {\r\n records.set(id, record.currentState);\r\n }\r\n state.set(modelName, records);\r\n }\r\n return state;\r\n }\r\n\r\n private diffAndEmit(\r\n previous: Map<string, Map<string, string>>,\r\n current: Map<string, Map<string, string>>,\r\n callback: (event: InspectorChangeEvent) => void,\r\n ): void {\r\n for (const [modelName, currentBucket] of current) {\r\n const previousBucket = previous.get(modelName);\r\n for (const [id, currentStateValue] of currentBucket) {\r\n if (!previousBucket?.has(id)) {\r\n callback({ type: 'added', modelName, id });\r\n } else if (previousBucket.get(id) !== currentStateValue) {\r\n callback({ type: 'updated', modelName, id });\r\n }\r\n }\r\n }\r\n\r\n for (const [modelName, previousBucket] of previous) {\r\n const currentBucket = current.get(modelName);\r\n for (const [id] of previousBucket) {\r\n if (!currentBucket?.has(id)) {\r\n callback({ type: 'removed', modelName, id });\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import type { Model } from '@mobx-data/model';\r\nimport type { Store } from '@mobx-data/store';\r\nimport { StoreInspector } from './StoreInspector.js';\r\nimport { summarizeRecord, detailRecord } from './serialization.js';\r\nimport type { RecordSummary, RecordDetail, StoreSummary, SchemaInfo } from './types.js';\r\n\r\nconst STYLE_HEADER = 'color: #2196f3; font-weight: bold';\r\nconst STYLE_DIRTY = 'color: #ff9800; font-weight: bold';\r\nconst STYLE_ERROR = 'color: #f44336; font-weight: bold';\r\nconst STYLE_SAVED = 'color: #4caf50';\r\nconst STYLE_RESET = 'color: inherit';\r\n\r\nfunction stateLabel(record: RecordSummary): string {\r\n if (record.isError) return 'ERROR';\r\n if (record.isSaving) return 'SAVING';\r\n if (record.isNew) return 'NEW';\r\n if (record.isDirty) return 'DIRTY';\r\n if (record.isDeleted) return 'DELETED';\r\n if (record.isLoading) return 'LOADING';\r\n return 'SAVED';\r\n}\r\n\r\nfunction stateStyle(record: RecordSummary): string {\r\n if (record.isError || record.hasErrors) return STYLE_ERROR;\r\n if (record.isDirty || record.isNew) return STYLE_DIRTY;\r\n return STYLE_SAVED;\r\n}\r\n\r\nexport type RecordResult = Model & {\r\n show(): void;\r\n toJSON(): Record<string, unknown>;\r\n inspect(): RecordDetail;\r\n summary(): RecordSummary;\r\n};\r\n\r\nconst INSPECTOR_METHODS = new Set(['show', 'toJSON', 'inspect', 'summary']);\r\n\r\nfunction createRecordResult(\r\n model: Model,\r\n renderDetail: (model: Model) => void,\r\n): RecordResult {\r\n const extensions: Record<string, unknown> = {\r\n show() { renderDetail(model); },\r\n toJSON() {\r\n const detail = detailRecord(model);\r\n return { ...detail.attributes, id: detail.id, _state: detail.currentState };\r\n },\r\n inspect() { return detailRecord(model); },\r\n summary() { return summarizeRecord(model); },\r\n };\r\n\r\n return new Proxy(model, {\r\n get(target, property) {\r\n if (typeof property === 'string' && INSPECTOR_METHODS.has(property)) {\r\n return extensions[property];\r\n }\r\n return Reflect.get(target, property);\r\n },\r\n has(target, property) {\r\n if (typeof property === 'string' && INSPECTOR_METHODS.has(property)) return true;\r\n return Reflect.has(target, property);\r\n },\r\n }) as RecordResult;\r\n}\r\n\r\nexport type ResultSet = RecordResult[] & {\r\n show(): void;\r\n toJSON(): Array<Record<string, unknown>>;\r\n};\r\n\r\ninterface Showable {\r\n show(): void;\r\n}\r\n\r\nexport class ConsoleInspector {\r\n private readonly inspector: StoreInspector;\r\n private readonly storeName: string;\r\n\r\n constructor(store: Store, name: string = 'default') {\r\n this.inspector = new StoreInspector(store);\r\n this.storeName = name;\r\n }\r\n\r\n summary(): StoreSummary & Showable {\r\n const data = this.inspector.summary();\r\n const self = this;\r\n return Object.assign(data, {\r\n show() {\r\n self.renderSummary(data);\r\n },\r\n });\r\n }\r\n\r\n records(modelName: string): ResultSet {\r\n const models = this.inspector.liveModels(modelName);\r\n return this.createResultSet(models, () => this.renderRecords(modelName, this.inspector.records(modelName)));\r\n }\r\n\r\n record(modelName: string, id: string): RecordResult | null {\r\n const model = this.inspector.liveModel(modelName, id);\r\n if (!model) return null;\r\n return this.wrapModel(model);\r\n }\r\n\r\n query(text: string): ResultSet {\r\n const { modelName, results } = this.inspector.queryWithMeta(text);\r\n return this.createResultSet(results, () => {\r\n const allRecords = this.inspector.records(modelName);\r\n const recordIndex = new Map(allRecords.map((s) => [s.id, s]));\r\n const summaries = results\r\n .map((r) => recordIndex.get((r as unknown as { id: string }).id))\r\n .filter(Boolean) as RecordSummary[];\r\n this.renderRecords(`${modelName} (query)`, summaries.length > 0 ? summaries : allRecords);\r\n });\r\n }\r\n\r\n dirty(): ResultSet {\r\n const models = this.collectModels((model) => model.isDirty);\r\n return this.createResultSet(models, () => this.renderFilteredRecords('Dirty records', models.map(summarizeRecord)));\r\n }\r\n\r\n newRecords(): ResultSet {\r\n const models = this.collectModels((model) => model.isNew);\r\n return this.createResultSet(models, () => this.renderFilteredRecords('New records', models.map(summarizeRecord)));\r\n }\r\n\r\n saving(): ResultSet {\r\n const models = this.collectModels((model) => model.isSaving);\r\n return this.createResultSet(models, () => this.renderFilteredRecords('Saving records', models.map(summarizeRecord)));\r\n }\r\n\r\n errored(): ResultSet {\r\n const models = this.collectModels((model) => model.isError || !model.isValid);\r\n return this.createResultSet(models, () => this.renderFilteredRecords('Errored records', models.map(summarizeRecord)));\r\n }\r\n\r\n private collectModels(predicate: (model: Model) => boolean): Model[] {\r\n const models: Model[] = [];\r\n for (const name of this.inspector.types()) {\r\n for (const model of this.inspector.liveModels(name)) {\r\n if (predicate(model)) {\r\n models.push(model);\r\n }\r\n }\r\n }\r\n return models;\r\n }\r\n\r\n schema(modelName: string): SchemaInfo & Showable {\r\n const data = this.inspector.schema(modelName);\r\n const self = this;\r\n return Object.assign(data, {\r\n show() {\r\n self.renderSchema(modelName, data);\r\n },\r\n });\r\n }\r\n\r\n types(): string[] & Showable {\r\n const names = this.inspector.types();\r\n const self = this;\r\n const result = [...names] as string[] & Showable;\r\n result.show = () => {\r\n const summaryData = self.inspector.summary();\r\n const countMap = new Map(summaryData.types.map((t) => [t.modelName, t.count]));\r\n console.log(`%c[mobx-data] Registered types (${names.length})`, STYLE_HEADER);\r\n for (const name of names) {\r\n console.log(` ${name} (${countMap.get(name) ?? 0})`);\r\n }\r\n };\r\n return result;\r\n }\r\n\r\n snapshot(): unknown {\r\n return this.inspector.snapshot();\r\n }\r\n\r\n observe(): () => void {\r\n console.log('%c[mobx-data] Live observation started. Call the returned function to stop.', STYLE_HEADER);\r\n return this.inspector.observe((event) => {\r\n const style = event.type === 'removed' ? STYLE_ERROR\r\n : event.type === 'added' ? STYLE_SAVED\r\n : STYLE_DIRTY;\r\n const label = event.type.toUpperCase();\r\n const identifier = event.id ?? '(new)';\r\n const stateInfo = event.record ? ` [${stateLabel(event.record)}]` : '';\r\n console.log(`%c[mobx-data] %c${label}%c ${event.modelName}:${identifier}${stateInfo}`, STYLE_HEADER, style, STYLE_RESET);\r\n });\r\n }\r\n\r\n raw(): StoreInspector {\r\n return this.inspector;\r\n }\r\n\r\n command(input: string): unknown {\r\n const trimmed = input.trim();\r\n\r\n if (this.isQueryCommand(trimmed)) {\r\n const result = this.query(trimmed);\r\n result.show();\r\n return result;\r\n }\r\n\r\n const parts = trimmed.split(/\\s+/);\r\n const cmd = parts[0]?.toLowerCase() ?? '';\r\n const argument1 = parts[1];\r\n\r\n switch (cmd) {\r\n case 'help': case 'h': case '?':\r\n this.help();\r\n return undefined;\r\n case 'summary': case 's': {\r\n const result = this.summary();\r\n result.show();\r\n return result;\r\n }\r\n case 'types': case 't': {\r\n const result = this.types();\r\n result.show();\r\n return result;\r\n }\r\n case 'dirty': case 'd': {\r\n const result = this.dirty();\r\n result.show();\r\n return result;\r\n }\r\n case 'saving': {\r\n const result = this.saving();\r\n result.show();\r\n return result;\r\n }\r\n case 'errored': case 'errors': case 'e': {\r\n const result = this.errored();\r\n result.show();\r\n return result;\r\n }\r\n case 'schema':\r\n if (argument1) {\r\n const result = this.schema(argument1);\r\n result.show();\r\n return result;\r\n }\r\n console.log('%c[mobx-data] Usage: schema <type>', STYLE_ERROR);\r\n return undefined;\r\n case 'snap': case 'snapshot':\r\n return this.snapshot();\r\n case 'watch': case 'observe':\r\n return this.observe();\r\n default:\r\n return this.resolveModelCommand(cmd, argument1);\r\n }\r\n }\r\n\r\n help(): void {\r\n console.log(`%c[mobx-data] CLI commands:`, STYLE_HEADER);\r\n console.log(`\r\n %c$m('help')%c Show this help\r\n %c$m('summary')%c Overview of all types and counts\r\n %c$m('types')%c List registered model names\r\n %c$m('user')%c All records (returns live refs)\r\n %c$m('user 1')%c Single record (live ref)\r\n %c$m('user where age > 25')%c Query with filters\r\n %c$m('user where name ~ \"Al\"')%c Contains search\r\n %c$m('post where title ~ h sort title')%c Query + sort\r\n %c$m('dirty')%c All dirty records\r\n %c$m('saving')%c All records being saved\r\n %c$m('errored')%c All records with errors\r\n %c$m('schema user')%c Attribute/relationship metadata\r\n %c$m('snapshot')%c Full store snapshot\r\n %c$m('watch')%c Live change logging (returns stop fn)\r\n`,\r\n STYLE_DIRTY, STYLE_RESET,\r\n STYLE_DIRTY, STYLE_RESET,\r\n STYLE_DIRTY, STYLE_RESET,\r\n STYLE_DIRTY, STYLE_RESET,\r\n STYLE_DIRTY, STYLE_RESET,\r\n STYLE_DIRTY, STYLE_RESET,\r\n STYLE_DIRTY, STYLE_RESET,\r\n STYLE_DIRTY, STYLE_RESET,\r\n STYLE_DIRTY, STYLE_RESET,\r\n STYLE_DIRTY, STYLE_RESET,\r\n STYLE_DIRTY, STYLE_RESET,\r\n STYLE_DIRTY, STYLE_RESET,\r\n STYLE_DIRTY, STYLE_RESET,\r\n STYLE_DIRTY, STYLE_RESET,\r\n );\r\n console.log('%c Operators: = != > >= < <= ~ (contains) ^= (startsWith) $= (endsWith) in between is null', STYLE_SAVED);\r\n console.log('%c All methods return live objects. Use .show() to render, [0] for refs.', STYLE_SAVED);\r\n console.log('%c Shortcuts: s=summary, t=types, d=dirty, e=errored, h=help', STYLE_SAVED);\r\n }\r\n\r\n private isQueryCommand(input: string): boolean {\r\n const lower = input.toLowerCase();\r\n return lower.includes(' where ')\r\n || lower.includes(' sort ')\r\n || / order by /i.test(lower)\r\n || / limit /i.test(lower)\r\n || / offset /i.test(lower);\r\n }\r\n\r\n private resolveModelCommand(cmd: string, argument1?: string): unknown {\r\n const registeredTypes = this.inspector.types();\r\n const resolvedType = registeredTypes.includes(cmd) ? cmd\r\n : registeredTypes.includes(`${cmd}s`) ? `${cmd}s`\r\n : null;\r\n\r\n if (resolvedType) {\r\n if (argument1) {\r\n const result = this.record(resolvedType, argument1);\r\n if (result) {\r\n result.show();\r\n } else {\r\n console.log(`%c[mobx-data] ${resolvedType}:${argument1} not found`, STYLE_ERROR);\r\n }\r\n return result;\r\n }\r\n const result = this.records(resolvedType);\r\n result.show();\r\n return result;\r\n }\r\n\r\n if (cmd === '') {\r\n const result = this.summary();\r\n result.show();\r\n return result;\r\n }\r\n\r\n console.log(`%c[mobx-data] Unknown command: \"${cmd}\". Try $m('help')`, STYLE_ERROR);\r\n return undefined;\r\n }\r\n\r\n private wrapModel(model: Model): RecordResult {\r\n return createRecordResult(model, (m) => {\r\n const detail = detailRecord(m);\r\n this.renderRecordDetail(detail.modelName, detail.id ?? detail.clientId, detail);\r\n });\r\n }\r\n\r\n private createResultSet(models: Model[], showFunction: () => void): ResultSet {\r\n const wrapped = models.map((m) => this.wrapModel(m));\r\n const result = wrapped as ResultSet;\r\n result.show = showFunction;\r\n result.toJSON = () => wrapped.map((r) => r.toJSON());\r\n return result;\r\n }\r\n\r\n private renderSummary(data: StoreSummary): void {\r\n console.log(`%c[mobx-data] Store \"${this.storeName}\" — ${data.totalRecords} records`, STYLE_HEADER);\r\n if (data.types.length === 0) {\r\n console.log(' (empty)');\r\n return;\r\n }\r\n console.table(\r\n data.types.reduce<Record<string, { count: number }>>((accumulator, entry) => {\r\n accumulator[entry.modelName] = { count: entry.count };\r\n return accumulator;\r\n }, {}),\r\n );\r\n }\r\n\r\n private renderRecords(label: string, data: RecordSummary[]): void {\r\n console.log(`%c[mobx-data] ${label} — ${data.length} records`, STYLE_HEADER);\r\n if (data.length === 0) {\r\n console.log(' (none)');\r\n return;\r\n }\r\n console.table(\r\n data.map((record) => ({\r\n id: record.id ?? record.clientId,\r\n state: stateLabel(record),\r\n isDirty: record.isDirty,\r\n isNew: record.isNew,\r\n isSaving: record.isSaving,\r\n hasErrors: record.hasErrors,\r\n })),\r\n );\r\n }\r\n\r\n private renderRecordDetail(modelName: string, id: string, data: RecordDetail): void {\r\n const label = stateLabel(data);\r\n const style = stateStyle(data);\r\n console.groupCollapsed(`%c[mobx-data] %c${modelName}:${id}%c — %c${label}%c (${data.currentState})`, STYLE_HEADER, STYLE_RESET, STYLE_RESET, style, STYLE_RESET);\r\n\r\n console.groupCollapsed('Attributes');\r\n const changedKeys = new Set(Object.keys(data.changedAttributes));\r\n const attributeTable: Record<string, { current: unknown; original: unknown; changed: string }> = {};\r\n for (const [key, value] of Object.entries(data.attributes)) {\r\n attributeTable[key] = {\r\n current: value,\r\n original: data.originalAttributes[key],\r\n changed: changedKeys.has(key) ? 'YES' : '',\r\n };\r\n }\r\n console.table(attributeTable);\r\n console.groupEnd();\r\n\r\n if (Object.keys(data.relationships).length > 0) {\r\n console.groupCollapsed('Relationships');\r\n for (const [name, reference] of Object.entries(data.relationships)) {\r\n const referenceData = (reference as { data?: unknown })?.data;\r\n if (Array.isArray(referenceData)) {\r\n const ids = referenceData.map((r: { type: string; id: string }) => `${r.type}:${r.id}`);\r\n console.log(` ${name} → [${ids.join(', ')}]`);\r\n } else if (referenceData && typeof referenceData === 'object') {\r\n const typed = referenceData as { type: string; id: string };\r\n console.log(` ${name} → ${typed.type}:${typed.id}`);\r\n } else {\r\n console.log(` ${name} → null`);\r\n }\r\n }\r\n console.groupEnd();\r\n }\r\n\r\n if (data.errors.length > 0) {\r\n console.groupCollapsed(`%cErrors (${data.errors.length})`, STYLE_ERROR);\r\n for (const entry of data.errors) {\r\n console.log(` ${entry.attribute}: ${entry.messages.join(', ')}`);\r\n }\r\n console.groupEnd();\r\n }\r\n\r\n console.groupEnd();\r\n }\r\n\r\n private renderSchema(modelName: string, data: SchemaInfo): void {\r\n console.log(`%c[mobx-data] Schema: ${modelName}${data.isAbstract ? ' (abstract)' : ''}`, STYLE_HEADER);\r\n\r\n if (data.discriminator) {\r\n console.log(` Discriminator key: ${data.discriminator.key}`);\r\n }\r\n\r\n if (data.attributes.length > 0) {\r\n console.log('%cAttributes:', STYLE_HEADER);\r\n console.table(\r\n data.attributes.map((a) => ({ name: a.name, type: a.type ?? '(untyped)' })),\r\n );\r\n }\r\n\r\n if (data.relationships.length > 0) {\r\n console.log('%cRelationships:', STYLE_HEADER);\r\n console.table(\r\n data.relationships.map((r) => ({\r\n name: r.name,\r\n kind: r.kind,\r\n type: r.type,\r\n async: r.async,\r\n inverse: r.inverse ?? '(none)',\r\n })),\r\n );\r\n }\r\n }\r\n\r\n private renderFilteredRecords(label: string, data: RecordSummary[]): void {\r\n console.log(`%c[mobx-data] ${label} — ${data.length} total`, STYLE_HEADER);\r\n if (data.length === 0) {\r\n console.log(' (none)');\r\n return;\r\n }\r\n console.table(\r\n data.map((record) => ({\r\n type: record.modelName,\r\n id: record.id ?? record.clientId,\r\n state: stateLabel(record),\r\n isDirty: record.isDirty,\r\n isNew: record.isNew,\r\n hasErrors: record.hasErrors,\r\n })),\r\n );\r\n }\r\n}\r\n","import type { Store } from '@mobx-data/store';\r\nimport { StoreInspector } from './StoreInspector.js';\r\nimport type { DevToolsMessage, DevToolsPayload } from './types.js';\r\n\r\nexport interface DevToolsHook {\r\n stores: Map<string, StoreInspector>;\r\n version: string;\r\n registerStore(storeId: string, store: Store): void;\r\n unregisterStore(storeId: string): void;\r\n}\r\n\r\nconst HOOK_KEY = '__MOBX_DATA_DEVTOOLS_HOOK__';\r\nconst SOURCE = 'mobx-data-devtools' as const;\r\nconst VERSION = '1.4.0';\r\n\r\nfunction getGlobal(): Record<string, unknown> {\r\n if (typeof globalThis !== 'undefined') return globalThis as unknown as Record<string, unknown>;\r\n if (typeof window !== 'undefined') return window as unknown as Record<string, unknown>;\r\n return {};\r\n}\r\n\r\nfunction getEventTarget(): {\r\n addEventListener?(type: string, handler: (event: unknown) => void): void;\r\n removeEventListener?(type: string, handler: (event: unknown) => void): void;\r\n postMessage?(data: unknown, origin?: string): void;\r\n} | null {\r\n const global = getGlobal();\r\n if (typeof global.addEventListener === 'function') return global as unknown as typeof window;\r\n return null;\r\n}\r\n\r\nexport class DevToolsBridge {\r\n private readonly stores = new Map<string, StoreInspector>();\r\n private readonly disposers = new Map<string, () => void>();\r\n private messageHandler: ((event: unknown) => void) | null = null;\r\n\r\n install(): void {\r\n const global = getGlobal();\r\n\r\n const hook: DevToolsHook = {\r\n stores: this.stores,\r\n version: VERSION,\r\n registerStore: (storeId, store) => this.registerStore(storeId, store),\r\n unregisterStore: (storeId) => this.unregisterStore(storeId),\r\n };\r\n\r\n Object.defineProperty(global, HOOK_KEY, {\r\n value: hook,\r\n writable: true,\r\n enumerable: false,\r\n configurable: true,\r\n });\r\n\r\n const eventTarget = getEventTarget();\r\n if (eventTarget?.addEventListener) {\r\n this.messageHandler = (event: unknown) => {\r\n const messageEvent = event as MessageEvent;\r\n if (messageEvent.origin && typeof location !== 'undefined' && messageEvent.origin !== location.origin) return;\r\n if (messageEvent.data?.source !== SOURCE || messageEvent.data?.direction !== 'panel-to-page') return;\r\n if (!this.isValidPayload(messageEvent.data?.payload)) return;\r\n this.handleMessage(messageEvent as MessageEvent<DevToolsMessage>);\r\n };\r\n eventTarget.addEventListener('message', this.messageHandler);\r\n }\r\n }\r\n\r\n registerStore(storeId: string, store: Store): void {\r\n const inspector = new StoreInspector(store);\r\n this.stores.set(storeId, inspector);\r\n\r\n const disposer = inspector.observe((event) => {\r\n this.sendToPanel({\r\n type: 'changeEvent',\r\n storeId,\r\n event,\r\n });\r\n });\r\n this.disposers.set(storeId, disposer);\r\n\r\n this.sendToPanel({\r\n type: 'init',\r\n storeId,\r\n storeCount: this.stores.size,\r\n version: VERSION,\r\n });\r\n }\r\n\r\n unregisterStore(storeId: string): void {\r\n const disposer = this.disposers.get(storeId);\r\n if (disposer) {\r\n disposer();\r\n this.disposers.delete(storeId);\r\n }\r\n this.stores.delete(storeId);\r\n }\r\n\r\n destroy(): void {\r\n for (const disposer of this.disposers.values()) {\r\n disposer();\r\n }\r\n this.disposers.clear();\r\n this.stores.clear();\r\n\r\n const eventTarget = getEventTarget();\r\n if (eventTarget?.removeEventListener && this.messageHandler) {\r\n eventTarget.removeEventListener('message', this.messageHandler);\r\n this.messageHandler = null;\r\n }\r\n\r\n const global = getGlobal();\r\n delete global[HOOK_KEY];\r\n }\r\n\r\n private handleMessage(event: MessageEvent<DevToolsMessage>): void {\r\n const { payload } = event.data;\r\n const storeId = 'storeId' in payload ? payload.storeId : undefined;\r\n const inspector = storeId ? this.stores.get(storeId) : undefined;\r\n\r\n switch (payload.type) {\r\n case 'requestSummary': {\r\n if (!inspector) return;\r\n this.sendToPanel({ type: 'summary', storeId: storeId!, data: inspector.summary() });\r\n break;\r\n }\r\n case 'requestRecords': {\r\n if (!inspector || !('modelName' in payload)) return;\r\n this.sendToPanel({\r\n type: 'records',\r\n storeId: storeId!,\r\n modelName: payload.modelName,\r\n data: inspector.records(payload.modelName),\r\n });\r\n break;\r\n }\r\n case 'requestRecordDetail': {\r\n if (!inspector || !('modelName' in payload) || !('id' in payload)) return;\r\n const detail = inspector.record(payload.modelName, payload.id);\r\n if (!detail) return;\r\n this.sendToPanel({\r\n type: 'recordDetail',\r\n storeId: storeId!,\r\n modelName: payload.modelName,\r\n id: payload.id,\r\n data: detail,\r\n });\r\n break;\r\n }\r\n case 'requestSchema': {\r\n if (!inspector || !('modelName' in payload)) return;\r\n this.sendToPanel({\r\n type: 'schema',\r\n storeId: storeId!,\r\n modelName: payload.modelName,\r\n data: inspector.schema(payload.modelName),\r\n });\r\n break;\r\n }\r\n case 'requestSnapshot': {\r\n if (!inspector) return;\r\n this.sendToPanel({ type: 'snapshot', storeId: storeId!, data: inspector.snapshot() });\r\n break;\r\n }\r\n case 'requestQuery': {\r\n if (!inspector || !('queryText' in payload)) return;\r\n const queryText = (payload as { queryText: string }).queryText;\r\n try {\r\n const { modelName, results } = inspector.queryWithMeta(queryText);\r\n const allRecords = inspector.records(modelName);\r\n const recordIndex = new Map(allRecords.map((s) => [s.id, s]));\r\n const summaries = results\r\n .map((record) => recordIndex.get((record as unknown as { id: string }).id))\r\n .filter(Boolean) as import('./types.js').RecordSummary[];\r\n this.sendToPanel({\r\n type: 'queryResult',\r\n storeId: storeId!,\r\n queryText,\r\n data: summaries,\r\n error: null,\r\n });\r\n } catch (error) {\r\n this.sendToPanel({\r\n type: 'queryResult',\r\n storeId: storeId!,\r\n queryText,\r\n data: [],\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n }\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n private isValidPayload(payload: unknown): boolean {\r\n if (!payload || typeof payload !== 'object') return false;\r\n const typed = payload as Record<string, unknown>;\r\n const validTypes = ['requestSummary', 'requestRecords', 'requestRecordDetail', 'requestSchema', 'requestSnapshot', 'requestQuery'];\r\n return typeof typed.type === 'string' && validTypes.includes(typed.type) && typeof typed.storeId === 'string';\r\n }\r\n\r\n private sendToPanel(payload: DevToolsPayload): void {\r\n const eventTarget = getEventTarget();\r\n if (!eventTarget?.postMessage) return;\r\n const message: DevToolsMessage = {\r\n source: SOURCE,\r\n direction: 'page-to-panel',\r\n payload,\r\n };\r\n const origin = typeof location !== 'undefined' ? location.origin : '*';\r\n eventTarget.postMessage(message, origin);\r\n }\r\n}\r\n","import type { Store } from '@mobx-data/store';\r\nimport { ConsoleInspector } from './ConsoleInspector.js';\r\nimport { DevToolsBridge } from './DevToolsBridge.js';\r\n\r\nlet bridge: DevToolsBridge | null = null;\r\nlet storeCounter = 0;\r\n\r\ndeclare global {\r\n interface Window {\r\n $mobxData?: ConsoleInspector;\r\n $m?: (input: string) => unknown;\r\n }\r\n}\r\n\r\nexport function enableConsoleInspector(\r\n store: Store,\r\n name: string = 'default',\r\n): ConsoleInspector {\r\n const inspector = new ConsoleInspector(store, name);\r\n if (typeof window !== 'undefined') {\r\n window.$mobxData = inspector;\r\n window.$m = (input: string) => inspector.command(input);\r\n }\r\n return inspector;\r\n}\r\n\r\nexport function enableDevTools(\r\n store: Store,\r\n storeId?: string,\r\n): () => void {\r\n if (typeof window === 'undefined') {\r\n return () => {};\r\n }\r\n\r\n if (!bridge) {\r\n bridge = new DevToolsBridge();\r\n bridge.install();\r\n }\r\n\r\n storeCounter += 1;\r\n const resolvedId = storeId ?? `store-${storeCounter}`;\r\n bridge.registerStore(resolvedId, store);\r\n\r\n return () => {\r\n bridge?.unregisterStore(resolvedId);\r\n };\r\n}\r\n\r\nexport function enableInspector(\r\n store: Store,\r\n name: string = 'default',\r\n): { consoleInspector: ConsoleInspector; cleanup: () => void } {\r\n const consoleInspector = enableConsoleInspector(store, name);\r\n const cleanup = enableDevTools(store, name);\r\n return { consoleInspector, cleanup };\r\n}\r\n"],"names":["KEYWORD_SET","OPERATOR_MAP","OPERATOR_CHARS","QueryParser","input","tokens","index","quote","value","operator","word","lower","numberValue","token","type","got","keyword","modelToken","modelName","filters","orderBy","limit","offset","first","children","groupKind","fieldToken","field","_a","_b","_c","_d","values","_e","_f","low","high","operatorToken","nextField","_g","_h","_i","_j","_k","summarizeRecord","record","detailRecord","internal","relationships","name","reference","errors","attribute","errorMessages","e","attributes","key","originalAttributes","extractSchemaInfo","store","attributeDefinitions","relationshipDefinitions","discriminator","definition","StoreInspector","types","totalRecords","count","a","b","id","found","r","text","queryObject","items","MdqlMemoryExecutor","callback","previousState","reaction","currentState","predicate","results","state","bucket","records","previous","current","currentBucket","previousBucket","currentStateValue","STYLE_HEADER","STYLE_DIRTY","STYLE_ERROR","STYLE_SAVED","STYLE_RESET","stateLabel","stateStyle","INSPECTOR_METHODS","createRecordResult","model","renderDetail","extensions","detail","target","property","ConsoleInspector","data","self","models","allRecords","recordIndex","s","summaries","names","result","summaryData","countMap","t","event","style","label","identifier","stateInfo","trimmed","parts","cmd","argument1","registeredTypes","resolvedType","m","showFunction","wrapped","accumulator","entry","changedKeys","attributeTable","referenceData","ids","typed","HOOK_KEY","SOURCE","VERSION","getGlobal","getEventTarget","global","DevToolsBridge","hook","storeId","eventTarget","messageEvent","inspector","disposer","payload","queryText","error","validTypes","message","origin","bridge","storeCounter","enableConsoleInspector","enableDevTools","resolvedId","enableInspector","consoleInspector","cleanup"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { StoreInspector } from './StoreInspector.js';
|
|
2
|
+
export { ConsoleInspector } from './ConsoleInspector.js';
|
|
3
|
+
export type { ResultSet, RecordResult } from './ConsoleInspector.js';
|
|
4
|
+
export { QueryParser } from './QueryParser.js';
|
|
5
|
+
export { DevToolsBridge } from './DevToolsBridge.js';
|
|
6
|
+
export type { DevToolsHook } from './DevToolsBridge.js';
|
|
7
|
+
export { enableConsoleInspector, enableDevTools, enableInspector, } from './integration.js';
|
|
8
|
+
export type { StoreSummary, RecordSummary, RecordDetail, SchemaInfo, InspectorChangeEvent, DevToolsMessage, DevToolsPayload, } from './types.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/inspector/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC"}
|