philipgreat commited on
Commit
cc483d7
·
verified ·
1 Parent(s): aa89cb5

Remove superseded source snapshots

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. source/browser-sqlite/assist/create-customer.md +0 -82
  2. source/browser-sqlite/assist/create-customer_order.md +0 -92
  3. source/browser-sqlite/assist/create-order_item.md +0 -86
  4. source/browser-sqlite/assist/debug.md +0 -101
  5. source/browser-sqlite/assist/expression-customer_order.md +0 -135
  6. source/browser-sqlite/assist/query-customer_order.md +0 -104
  7. source/browser-sqlite/assist/query-customer_order.order_item_list.md +0 -66
  8. source/browser-sqlite/assist/query-customer_order.status.md +0 -72
  9. source/browser-sqlite/assist/query-order_item.md +0 -97
  10. source/browser-sqlite/assist/query-order_status.customer_order_list.md +0 -66
  11. source/browser-sqlite/assist/query-order_status.md +0 -104
  12. source/browser-sqlite/index.html +0 -44
  13. source/browser-sqlite/order-model.xml +0 -21
  14. source/browser-sqlite/orders-lib/package.json +0 -15
  15. source/browser-sqlite/orders-lib/src/generated-bootstrap.ts +0 -69
  16. source/browser-sqlite/orders-lib/src/generated-search-models.ts +0 -124
  17. source/browser-sqlite/orders-lib/src/generated/E.ts +0 -859
  18. source/browser-sqlite/orders-lib/src/generated/Q.ts +0 -44
  19. source/browser-sqlite/orders-lib/src/generated/models/Customer.ts +0 -252
  20. source/browser-sqlite/orders-lib/src/generated/models/CustomerOrder.ts +0 -305
  21. source/browser-sqlite/orders-lib/src/generated/models/OrderItem.ts +0 -231
  22. source/browser-sqlite/orders-lib/src/generated/models/OrderStatus.ts +0 -279
  23. source/browser-sqlite/orders-lib/src/generated/models/Platform.ts +0 -276
  24. source/browser-sqlite/orders-lib/src/generated/requests/CustomerOrderRequest.ts +0 -1206
  25. source/browser-sqlite/orders-lib/src/generated/requests/CustomerRequest.ts +0 -795
  26. source/browser-sqlite/orders-lib/src/generated/requests/OrderItemRequest.ts +0 -909
  27. source/browser-sqlite/orders-lib/src/generated/requests/OrderStatusRequest.ts +0 -1162
  28. source/browser-sqlite/orders-lib/src/generated/requests/PlatformRequest.ts +0 -791
  29. source/browser-sqlite/orders-lib/src/runtime-module.ts +0 -150
  30. source/browser-sqlite/orders-lib/src/teaql-schemas.ts +0 -34
  31. source/browser-sqlite/orders-lib/src/teaql-ts.ts +0 -308
  32. source/browser-sqlite/orders-lib/teaql-i18n.json +0 -128
  33. source/browser-sqlite/orders-lib/tsconfig.json +0 -12
  34. source/browser-sqlite/package-lock.json +0 -1624
  35. source/browser-sqlite/package.json +0 -20
  36. source/browser-sqlite/scripts/smoke.mjs +0 -130
  37. source/browser-sqlite/src/main.ts +0 -185
  38. source/browser-sqlite/src/sqlite.worker.ts +0 -4
  39. source/browser-sqlite/src/style.css +0 -14
  40. source/runtime/LICENSE +0 -202
  41. source/runtime/package-lock.json +0 -0
  42. source/runtime/package.json +0 -188
  43. source/runtime/scripts/build-esm.mjs +0 -28
  44. source/runtime/scripts/fixtures/checker-overlap-command.sh +0 -13
  45. source/runtime/scripts/generate-query-parser.mjs +0 -9
  46. source/runtime/scripts/run-checker-overlap.sh +0 -32
  47. source/runtime/scripts/test-checker-overlap-guard.sh +0 -32
  48. source/runtime/scripts/verify-checker-overlap.sh +0 -20
  49. source/runtime/scripts/verify-current-aggregate.sh +0 -21
  50. source/runtime/scripts/verify-examples.sh +0 -80
source/browser-sqlite/assist/create-customer.md DELETED
@@ -1,82 +0,0 @@
1
- <!-- ephemeral -->
2
-
3
- # TypeScript Assist — Create `Customer`
4
-
5
- Use the exact generated `Q.customers()` entry point. The
6
- trusted `UserContext` supplies actor, tenant, policy, provider, and audit sink;
7
- none of those values may be accepted from the writable input.
8
-
9
- ```typescript
10
- import { UserContext } from '../teaql-ts';
11
- import { Q } from './Q';
12
- import { Customer } from './models/Customer';
13
-
14
- export interface CreateCustomerInput {
15
- platform: string | number;
16
- name: string;
17
-
18
- }
19
-
20
- export async function createCustomer(
21
- input: CreateCustomerInput,
22
- context: UserContext,
23
- ): Promise<Customer> {
24
- const entity = Q.customers()
25
- .comment('what: initialize Customer')
26
- .purpose('why: create Customer')
27
- .newEntity(context);
28
-
29
- entity.updatePlatform(input.platform);
30
- entity.updateName(input.name);
31
-
32
- await entity
33
- .auditAs('Create Customer for the requested business operation')
34
- .save(context);
35
- return entity;
36
- }
37
- ```
38
-
39
- Only the generated updater methods above are writable. Constant relation
40
- candidates, when present, are also generated and must be copied exactly:
41
-
42
- Compile the result unchanged. Test persistence and query-back, and prove that
43
- blank/missing intent, blank/missing audit reason, unknown fields, and attempted
44
- trusted-context overrides fail. Do not edit generated sources.
45
-
46
-
47
- ---
48
-
49
- ## TeaQL seven-language assist contract
50
-
51
- Apply the verified Rust semantic ceiling while using only the exact TYPESCRIPT generated and
52
- runtime APIs. Discover APIs through the generated application AGENTS.md and progressive
53
- model-aware Assist. Do not inspect generated domain-library source.
54
-
55
- - Do not create plurals by appending `s` or `es`; use the centralized generated plural.
56
- - Human and non-human entities use different generated predicate vocabularies. Preserve
57
- forms such as “who are active” and “whose email is”; never infer them from English.
58
- - Configure filters, projection, paging, and other query options before `purpose(...)`.
59
- Comment may appear anywhere in the chain. Purpose enters the executable stage; execution
60
- requires both values, but comment does not have to immediately precede purpose.
61
- - Every execute/list/stream and every save accepts exactly one context argument:
62
- `UserContext`. Name that argument `context`, never `runtime`; data services and global
63
- policy are injected when the context is built. Reserve `runtime` for process-level
64
- runtime ownership, provider/pool setup, and module assembly.
65
- - Tenant, merchant, identity, permissions, request policy, purpose policy, hard limit,
66
- and continuous-page cursor policy come only from trusted context, never dynamic JSON or TFP.
67
- - If the required operation is absent after current entity/action and required field
68
- Assist, stop that path and report MISSING_ASSIST. Do not guess an API or search the
69
- generated library as a fallback.
70
- - Create each application-owned source file once. After its first compile attempt,
71
- repair only the smallest block identified by the exact compiler or test diagnostic.
72
- Preserve unrelated code; do not rewrite the complete file as an error-recovery loop.
73
- - Before a repair that would replace more than 25% of an existing application file,
74
- stop and report LARGE_REWRITE_REQUEST with the file, exact diagnostic, reason, and
75
- estimated scope. Initial creation and model-driven regeneration are not repairs.
76
-
77
- Capability: `create`.
78
-
79
- - Validate and allow-list writable business fields; never mass-assign dynamic JSON.
80
- - Create through the generated request/entity API, attach a non-empty audit reason,
81
- save with the same UserContext, and return the runtime's native save result.
82
- - Add a negative test proving a missing audit reason cannot write.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/assist/create-customer_order.md DELETED
@@ -1,92 +0,0 @@
1
- <!-- ephemeral -->
2
-
3
- # TypeScript Assist — Create `Customer Order`
4
-
5
- Use the exact generated `Q.customerOrders()` entry point. The
6
- trusted `UserContext` supplies actor, tenant, policy, provider, and audit sink;
7
- none of those values may be accepted from the writable input.
8
-
9
- ```typescript
10
- import { UserContext } from '../teaql-ts';
11
- import { Q } from './Q';
12
- import { CustomerOrder } from './models/CustomerOrder';
13
-
14
- export interface CreateCustomerOrderInput {
15
- customer: string | number;
16
- status: string | number;
17
- orderNumber: string;
18
- orderDate: string;
19
- totalAmount: number;
20
-
21
- }
22
-
23
- export async function createCustomerOrder(
24
- input: CreateCustomerOrderInput,
25
- context: UserContext,
26
- ): Promise<CustomerOrder> {
27
- const entity = Q.customerOrders()
28
- .comment('what: initialize Customer Order')
29
- .purpose('why: create Customer Order')
30
- .newEntity(context);
31
-
32
- entity.updateCustomer(input.customer);
33
- entity.updateStatus(input.status);
34
- entity.updateOrderNumber(input.orderNumber);
35
- entity.updateOrderDate(input.orderDate);
36
- entity.updateTotalAmount(input.totalAmount);
37
-
38
- await entity
39
- .auditAs('Create Customer Order for the requested business operation')
40
- .save(context);
41
- return entity;
42
- }
43
- ```
44
-
45
- Only the generated updater methods above are writable. Constant relation
46
- candidates, when present, are also generated and must be copied exactly:
47
- - `updateStatusToNew()`
48
- - `updateStatusToPaid()`
49
- - `updateStatusToCancelled()`
50
-
51
-
52
- Compile the result unchanged. Test persistence and query-back, and prove that
53
- blank/missing intent, blank/missing audit reason, unknown fields, and attempted
54
- trusted-context overrides fail. Do not edit generated sources.
55
-
56
-
57
- ---
58
-
59
- ## TeaQL seven-language assist contract
60
-
61
- Apply the verified Rust semantic ceiling while using only the exact TYPESCRIPT generated and
62
- runtime APIs. Discover APIs through the generated application AGENTS.md and progressive
63
- model-aware Assist. Do not inspect generated domain-library source.
64
-
65
- - Do not create plurals by appending `s` or `es`; use the centralized generated plural.
66
- - Human and non-human entities use different generated predicate vocabularies. Preserve
67
- forms such as “who are active” and “whose email is”; never infer them from English.
68
- - Configure filters, projection, paging, and other query options before `purpose(...)`.
69
- Comment may appear anywhere in the chain. Purpose enters the executable stage; execution
70
- requires both values, but comment does not have to immediately precede purpose.
71
- - Every execute/list/stream and every save accepts exactly one context argument:
72
- `UserContext`. Name that argument `context`, never `runtime`; data services and global
73
- policy are injected when the context is built. Reserve `runtime` for process-level
74
- runtime ownership, provider/pool setup, and module assembly.
75
- - Tenant, merchant, identity, permissions, request policy, purpose policy, hard limit,
76
- and continuous-page cursor policy come only from trusted context, never dynamic JSON or TFP.
77
- - If the required operation is absent after current entity/action and required field
78
- Assist, stop that path and report MISSING_ASSIST. Do not guess an API or search the
79
- generated library as a fallback.
80
- - Create each application-owned source file once. After its first compile attempt,
81
- repair only the smallest block identified by the exact compiler or test diagnostic.
82
- Preserve unrelated code; do not rewrite the complete file as an error-recovery loop.
83
- - Before a repair that would replace more than 25% of an existing application file,
84
- stop and report LARGE_REWRITE_REQUEST with the file, exact diagnostic, reason, and
85
- estimated scope. Initial creation and model-driven regeneration are not repairs.
86
-
87
- Capability: `create`.
88
-
89
- - Validate and allow-list writable business fields; never mass-assign dynamic JSON.
90
- - Create through the generated request/entity API, attach a non-empty audit reason,
91
- save with the same UserContext, and return the runtime's native save result.
92
- - Add a negative test proving a missing audit reason cannot write.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/assist/create-order_item.md DELETED
@@ -1,86 +0,0 @@
1
- <!-- ephemeral -->
2
-
3
- # TypeScript Assist — Create `Order Item`
4
-
5
- Use the exact generated `Q.orderItems()` entry point. The
6
- trusted `UserContext` supplies actor, tenant, policy, provider, and audit sink;
7
- none of those values may be accepted from the writable input.
8
-
9
- ```typescript
10
- import { UserContext } from '../teaql-ts';
11
- import { Q } from './Q';
12
- import { OrderItem } from './models/OrderItem';
13
-
14
- export interface CreateOrderItemInput {
15
- customerOrder: string | number;
16
- productName: string;
17
- quantity: number;
18
- unitPrice: number;
19
-
20
- }
21
-
22
- export async function createOrderItem(
23
- input: CreateOrderItemInput,
24
- context: UserContext,
25
- ): Promise<OrderItem> {
26
- const entity = Q.orderItems()
27
- .comment('what: initialize Order Item')
28
- .purpose('why: create Order Item')
29
- .newEntity(context);
30
-
31
- entity.updateCustomerOrder(input.customerOrder);
32
- entity.updateProductName(input.productName);
33
- entity.updateQuantity(input.quantity);
34
- entity.updateUnitPrice(input.unitPrice);
35
-
36
- await entity
37
- .auditAs('Create Order Item for the requested business operation')
38
- .save(context);
39
- return entity;
40
- }
41
- ```
42
-
43
- Only the generated updater methods above are writable. Constant relation
44
- candidates, when present, are also generated and must be copied exactly:
45
-
46
- Compile the result unchanged. Test persistence and query-back, and prove that
47
- blank/missing intent, blank/missing audit reason, unknown fields, and attempted
48
- trusted-context overrides fail. Do not edit generated sources.
49
-
50
-
51
- ---
52
-
53
- ## TeaQL seven-language assist contract
54
-
55
- Apply the verified Rust semantic ceiling while using only the exact TYPESCRIPT generated and
56
- runtime APIs. Discover APIs through the generated application AGENTS.md and progressive
57
- model-aware Assist. Do not inspect generated domain-library source.
58
-
59
- - Do not create plurals by appending `s` or `es`; use the centralized generated plural.
60
- - Human and non-human entities use different generated predicate vocabularies. Preserve
61
- forms such as “who are active” and “whose email is”; never infer them from English.
62
- - Configure filters, projection, paging, and other query options before `purpose(...)`.
63
- Comment may appear anywhere in the chain. Purpose enters the executable stage; execution
64
- requires both values, but comment does not have to immediately precede purpose.
65
- - Every execute/list/stream and every save accepts exactly one context argument:
66
- `UserContext`. Name that argument `context`, never `runtime`; data services and global
67
- policy are injected when the context is built. Reserve `runtime` for process-level
68
- runtime ownership, provider/pool setup, and module assembly.
69
- - Tenant, merchant, identity, permissions, request policy, purpose policy, hard limit,
70
- and continuous-page cursor policy come only from trusted context, never dynamic JSON or TFP.
71
- - If the required operation is absent after current entity/action and required field
72
- Assist, stop that path and report MISSING_ASSIST. Do not guess an API or search the
73
- generated library as a fallback.
74
- - Create each application-owned source file once. After its first compile attempt,
75
- repair only the smallest block identified by the exact compiler or test diagnostic.
76
- Preserve unrelated code; do not rewrite the complete file as an error-recovery loop.
77
- - Before a repair that would replace more than 25% of an existing application file,
78
- stop and report LARGE_REWRITE_REQUEST with the file, exact diagnostic, reason, and
79
- estimated scope. Initial creation and model-driven regeneration are not repairs.
80
-
81
- Capability: `create`.
82
-
83
- - Validate and allow-list writable business fields; never mass-assign dynamic JSON.
84
- - Create through the generated request/entity API, attach a non-empty audit reason,
85
- save with the same UserContext, and return the runtime's native save result.
86
- - Add a negative test proving a missing audit reason cannot write.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/assist/debug.md DELETED
@@ -1,101 +0,0 @@
1
- <!-- ephemeral -->
2
-
3
- # TeaQL safe SQL execution evidence (TypeScript)
4
-
5
- Attach a trusted evidence store to the server-created SQL client and project
6
- only bounded fields before returning diagnostics to an application or Coding
7
- Agent.
8
-
9
- ```typescript
10
- import type { SQLExecutionMetadata, SQLExecutionOperation } from 'teaql-ts/sql/core';
11
-
12
- export type SafeSQLExecutionEvidence = Readonly<{
13
- operation: SQLExecutionOperation;
14
- parameterizedSQL: string;
15
- parameterCount: number;
16
- elapsedMicros: number;
17
- resultCount?: number;
18
- affectedRows?: number;
19
- resultSummary: string;
20
- traceChain?: SQLExecutionMetadata['traceChain'];
21
- tracePath: SQLExecutionMetadata['tracePath'];
22
- }>;
23
-
24
- export function safeSQLEvidence(
25
- entries: readonly SQLExecutionMetadata[],
26
- ): readonly SafeSQLExecutionEvidence[] {
27
- return entries.map(entry => Object.freeze({
28
- operation: entry.operation,
29
- parameterizedSQL: entry.parameterizedSQL,
30
- parameterCount: entry.parameters.length,
31
- elapsedMicros: entry.elapsedMicros,
32
- resultCount: entry.resultCount,
33
- affectedRows: entry.affectedRows,
34
- resultSummary: entry.resultSummary,
35
- traceChain: entry.traceChain,
36
- tracePath: entry.tracePath,
37
- }));
38
- }
39
- ```
40
-
41
- Create `SQLExecutionEvidenceStore`, attach it with
42
- `client.setRuntimeTelemetrySink(store)`, and select `enableAll`, `enableSelect`,
43
- `enableMutation`, or `disable`. Mode changes clear earlier entries. Raw
44
- parameters, credentials, connection strings, and interpolated SQL remain inside
45
- the trusted boundary and are intentionally absent above.
46
-
47
- Query and mutation logs, including the text diagnostic sink, are enabled by default.
48
- The default sink is `new TextDiagnosticSQLLogSink()` and may be
49
- replaced with `client.setDiagnosticSQLLogSink(...)`. Disable the two operation
50
- families independently with
51
- `client.setQueryLoggingEnabled(false)` and
52
- `client.setMutationLoggingEnabled(false)`; passing `undefined` to
53
- `setDiagnosticSQLLogSink` removes operator output entirely. Each metadata entry
54
- retains structured `comment`, `purpose`, `auditReason`, typed multi-level
55
- `tracePath`, business `traceChain`, parameterized SQL, copy-paste `debugSQL`, elapsed
56
- time, result count, and affected rows. `traceChain` follows the root purpose and
57
- request-parent comments, preserving both the native Q operation and a nested
58
- explicit/default comment. `tracePath` describes the physical provider/SQL route;
59
- do not derive one from the other or reconstruct either from SQL text. Runtime
60
- evidence is policy-projected by default; keep that projection when exposing it.
61
- Explicit debug plaintext is not ordinary telemetry and must not leave the trusted
62
- debugging boundary.
63
-
64
-
65
- ---
66
-
67
- ## TeaQL seven-language assist contract
68
-
69
- Apply the verified Rust semantic ceiling while using only the exact TYPESCRIPT generated and
70
- runtime APIs. Discover APIs through the generated application AGENTS.md and progressive
71
- model-aware Assist. Do not inspect generated domain-library source.
72
-
73
- - Do not create plurals by appending `s` or `es`; use the centralized generated plural.
74
- - Human and non-human entities use different generated predicate vocabularies. Preserve
75
- forms such as “who are active” and “whose email is”; never infer them from English.
76
- - Configure filters, projection, paging, and other query options before `purpose(...)`.
77
- Comment may appear anywhere in the chain. Purpose enters the executable stage; execution
78
- requires both values, but comment does not have to immediately precede purpose.
79
- - Every execute/list/stream and every save accepts exactly one context argument:
80
- `UserContext`. Name that argument `context`, never `runtime`; data services and global
81
- policy are injected when the context is built. Reserve `runtime` for process-level
82
- runtime ownership, provider/pool setup, and module assembly.
83
- - Tenant, merchant, identity, permissions, request policy, purpose policy, hard limit,
84
- and continuous-page cursor policy come only from trusted context, never dynamic JSON or TFP.
85
- - If the required operation is absent after current entity/action and required field
86
- Assist, stop that path and report MISSING_ASSIST. Do not guess an API or search the
87
- generated library as a fallback.
88
- - Create each application-owned source file once. After its first compile attempt,
89
- repair only the smallest block identified by the exact compiler or test diagnostic.
90
- Preserve unrelated code; do not rewrite the complete file as an error-recovery loop.
91
- - Before a repair that would replace more than 25% of an existing application file,
92
- stop and report LARGE_REWRITE_REQUEST with the file, exact diagnostic, reason, and
93
- estimated scope. Initial creation and model-driven regeneration are not repairs.
94
-
95
- Capability: `debug`.
96
-
97
- - Capture purpose, comment, trace/correlation id, parameterized SQL summary,
98
- duration, row count, provider, and the runtime's native response when available.
99
- - Preserve the immutable row audit event and the customizable App Audit Sink as
100
- separate paths. Redact credentials, tokens, connection strings, and customer data.
101
- - Document only switches and hooks present in the selected runtime source.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/assist/expression-customer_order.md DELETED
@@ -1,135 +0,0 @@
1
- <!-- ephemeral -->
2
-
3
- # TypeScript Assist — Expression `Customer Order`
4
-
5
- The generated E facade preserves Value, loaded null/undefined, and NotLoaded.
6
- `eval()` returns a native value for the first two and throws
7
- `TeaQLNotLoadedError` for the third. `orElse` is nullish-only and never hides
8
- NotLoaded.
9
-
10
- ```typescript
11
- import { E } from './E';
12
- import { CustomerOrder } from './models/CustomerOrder';
13
-
14
- export function extractId(entity: CustomerOrder) {
15
- return E.customerOrder(entity).id().eval();
16
- }
17
-
18
- export function extractIdOrElse(
19
- entity: CustomerOrder, fallback: NonNullable<CustomerOrder['id']>,
20
- ) {
21
- return E.customerOrder(entity).id().orElse(fallback);
22
- }
23
-
24
- export function extractOrderNumber(entity: CustomerOrder) {
25
- return E.customerOrder(entity).orderNumber().eval();
26
- }
27
-
28
- export function extractOrderNumberOrElse(
29
- entity: CustomerOrder, fallback: NonNullable<CustomerOrder['orderNumber']>,
30
- ) {
31
- return E.customerOrder(entity).orderNumber().orElse(fallback);
32
- }
33
-
34
- export function extractOrderDate(entity: CustomerOrder) {
35
- return E.customerOrder(entity).orderDate().eval();
36
- }
37
-
38
- export function extractOrderDateOrElse(
39
- entity: CustomerOrder, fallback: NonNullable<CustomerOrder['orderDate']>,
40
- ) {
41
- return E.customerOrder(entity).orderDate().orElse(fallback);
42
- }
43
-
44
- export function extractTotalAmount(entity: CustomerOrder) {
45
- return E.customerOrder(entity).totalAmount().eval();
46
- }
47
-
48
- export function extractTotalAmountOrElse(
49
- entity: CustomerOrder, fallback: NonNullable<CustomerOrder['totalAmount']>,
50
- ) {
51
- return E.customerOrder(entity).totalAmount().orElse(fallback);
52
- }
53
-
54
- export function extractVersion(entity: CustomerOrder) {
55
- return E.customerOrder(entity).version().eval();
56
- }
57
-
58
- export function extractVersionOrElse(
59
- entity: CustomerOrder, fallback: NonNullable<CustomerOrder['version']>,
60
- ) {
61
- return E.customerOrder(entity).version().orElse(fallback);
62
- }
63
-
64
- export function extractCustomerId(entity: CustomerOrder) {
65
- return E.customerOrder(entity).customerId().eval();
66
- }
67
-
68
- export function traverseCustomer(entity: CustomerOrder) {
69
- return E.customerOrder(entity).customer().eval();
70
- }
71
-
72
- export function extractStatusId(entity: CustomerOrder) {
73
- return E.customerOrder(entity).statusId().eval();
74
- }
75
-
76
- export function traverseStatus(entity: CustomerOrder) {
77
- return E.customerOrder(entity).status().eval();
78
- }
79
-
80
- export function aggregateOrderItemListSize(entity: CustomerOrder) {
81
- return E.customerOrder(entity).orderItemList().size().eval();
82
- }
83
-
84
- export function firstOrderItemListId(entity: CustomerOrder) {
85
- return E.customerOrder(entity).orderItemList().first().id().eval();
86
- }
87
-
88
- export function getOrderItemListId(entity: CustomerOrder, index: number) {
89
- return E.customerOrder(entity).orderItemList().get(index).id().eval();
90
- }
91
-
92
-
93
- ```
94
-
95
- Select every traversed field and relation. Never catch
96
- `TeaQLNotLoadedError` merely to supply a default, and never replace generated E
97
- accessors with optional chaining.
98
-
99
-
100
- ---
101
-
102
- ## TeaQL seven-language assist contract
103
-
104
- Apply the verified Rust semantic ceiling while using only the exact TYPESCRIPT generated and
105
- runtime APIs. Discover APIs through the generated application AGENTS.md and progressive
106
- model-aware Assist. Do not inspect generated domain-library source.
107
-
108
- - Do not create plurals by appending `s` or `es`; use the centralized generated plural.
109
- - Human and non-human entities use different generated predicate vocabularies. Preserve
110
- forms such as “who are active” and “whose email is”; never infer them from English.
111
- - Configure filters, projection, paging, and other query options before `purpose(...)`.
112
- Comment may appear anywhere in the chain. Purpose enters the executable stage; execution
113
- requires both values, but comment does not have to immediately precede purpose.
114
- - Every execute/list/stream and every save accepts exactly one context argument:
115
- `UserContext`. Name that argument `context`, never `runtime`; data services and global
116
- policy are injected when the context is built. Reserve `runtime` for process-level
117
- runtime ownership, provider/pool setup, and module assembly.
118
- - Tenant, merchant, identity, permissions, request policy, purpose policy, hard limit,
119
- and continuous-page cursor policy come only from trusted context, never dynamic JSON or TFP.
120
- - If the required operation is absent after current entity/action and required field
121
- Assist, stop that path and report MISSING_ASSIST. Do not guess an API or search the
122
- generated library as a fallback.
123
- - Create each application-owned source file once. After its first compile attempt,
124
- repair only the smallest block identified by the exact compiler or test diagnostic.
125
- Preserve unrelated code; do not rewrite the complete file as an error-recovery loop.
126
- - Before a repair that would replace more than 25% of an existing application file,
127
- stop and report LARGE_REWRITE_REQUEST with the file, exact diagnostic, reason, and
128
- estimated scope. Initial creation and model-driven regeneration are not repairs.
129
-
130
- Capability: `expression`.
131
-
132
- - Distinguish a loaded null from a field or relation that was not projected. A
133
- NotLoaded/coding error must remain visible; do not turn it into an ordinary null.
134
- - Select every traversed relation first and use the generated E/expression API for
135
- scalar, object, and list traversal. Do not translate Java accessor names by guess.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/assist/query-customer_order.md DELETED
@@ -1,104 +0,0 @@
1
- <!-- ephemeral -->
2
-
3
- # TypeScript Assist — Query `Customer Order`
4
-
5
- Use the exact generated `Q.customerOrdersWithMinimalFields()`
6
- entry point. Trusted runtime and policy state comes only from `UserContext`.
7
-
8
- ```typescript
9
- import { Q } from './Q';
10
- import { CustomerOrder } from './models/CustomerOrder';
11
- import { SmartList, UserContext } from '../teaql-ts';
12
-
13
- export async function queryCustomerOrderById(
14
- context: UserContext,
15
- entityId: string,
16
- ): Promise<SmartList<CustomerOrder>> {
17
- return Q.customerOrdersWithMinimalFields()
18
- .withIdIs(entityId)
19
- .orderByIdAscending()
20
- .limit(20)
21
- .comment('what: load the requested Customer Order row')
22
- .purpose('why: serve the authorized Customer Order view')
23
- .executeForList(context);
24
- }
25
- ```
26
-
27
- Compile and execute this source unchanged. Use only generated projection,
28
- predicate, ordering, and relation-selection APIs. Missing or blank intent,
29
- unknown fields, unbounded reads, and trusted-context inputs must fail. Use generated
30
- relation loading rather than handwritten child-query loops; never guess a plural.
31
-
32
-
33
- ## Field-specific Query Assist
34
-
35
- Use the canonical KSML field name from this list. Do not substitute a language member name, JSON name, or database column.
36
-
37
- | KSML field | Type | Field help |
38
- | --- | --- | --- |
39
- | `id` | `id` | `typescript-assist-query/customer_order.id` |
40
- | `customer` | `relation<customer>` | `typescript-assist-query/customer_order.customer` |
41
- | `status` | `relation<order_status>` | `typescript-assist-query/customer_order.status` |
42
- | `order_number` | `string` | `typescript-assist-query/customer_order.order_number` |
43
- | `order_date` | `date` | `typescript-assist-query/customer_order.order_date` |
44
- | `total_amount` | `number` | `typescript-assist-query/customer_order.total_amount` |
45
- | `version` | `version` | `typescript-assist-query/customer_order.version` |
46
-
47
- Generated reverse relations are derived from referencing KSML fields. Use their exact generated location for relation selection and access:
48
-
49
- | Generated reverse relation | Child entity | Field help |
50
- | --- | --- | --- |
51
- | `order_item_list` | `order_item` | `typescript-assist-query/customer_order.order_item_list` |
52
-
53
-
54
- ---
55
-
56
- ## TeaQL seven-language assist contract
57
-
58
- Apply the verified Rust semantic ceiling while using only the exact TYPESCRIPT generated and
59
- runtime APIs. Discover APIs through the generated application AGENTS.md and progressive
60
- model-aware Assist. Do not inspect generated domain-library source.
61
-
62
- - Do not create plurals by appending `s` or `es`; use the centralized generated plural.
63
- - Human and non-human entities use different generated predicate vocabularies. Preserve
64
- forms such as “who are active” and “whose email is”; never infer them from English.
65
- - Configure filters, projection, paging, and other query options before `purpose(...)`.
66
- Comment may appear anywhere in the chain. Purpose enters the executable stage; execution
67
- requires both values, but comment does not have to immediately precede purpose.
68
- - Every execute/list/stream and every save accepts exactly one context argument:
69
- `UserContext`. Name that argument `context`, never `runtime`; data services and global
70
- policy are injected when the context is built. Reserve `runtime` for process-level
71
- runtime ownership, provider/pool setup, and module assembly.
72
- - Tenant, merchant, identity, permissions, request policy, purpose policy, hard limit,
73
- and continuous-page cursor policy come only from trusted context, never dynamic JSON or TFP.
74
- - If the required operation is absent after current entity/action and required field
75
- Assist, stop that path and report MISSING_ASSIST. Do not guess an API or search the
76
- generated library as a fallback.
77
- - Create each application-owned source file once. After its first compile attempt,
78
- repair only the smallest block identified by the exact compiler or test diagnostic.
79
- Preserve unrelated code; do not rewrite the complete file as an error-recovery loop.
80
- - Before a repair that would replace more than 25% of an existing application file,
81
- stop and report LARGE_REWRITE_REQUEST with the file, exact diagnostic, reason, and
82
- estimated scope. Initial creation and model-driven regeneration are not repairs.
83
-
84
- Capability: `query`.
85
-
86
- - Use generated projection, relation, predicate, sort, and aggregate APIs; never
87
- concatenate application SQL or silently ignore an unsupported filter.
88
- - Rows, record count, facets, and aggregates must share the same active filter.
89
- - Add negative tests for missing purpose/comment and forbidden dynamic fields.
90
-
91
- ### Optional per-parent Top-N optimization
92
-
93
- - Configure `topNProbeParentThreshold(threshold)` on the nested child request before its intent/execution
94
- stage. Use the field-specific relation Assist for the exact generated selector.
95
- - Give the child a per-parent limit and deterministic ordering with an ID tie-breaker;
96
- bound the parent query separately. A single-parent detail query is not batch Top-N.
97
- - Server providers default to a window query (`threshold = 0`). A positive threshold
98
- permits bounded probes only when the already-loaded parent count is at or below it;
99
- above it, use the window plan. SQLite uses its internal AlwaysProbe policy by default.
100
- - Measure before opting in. Do not infer a threshold from table size or execute COUNT
101
- or statistics queries to choose a plan. Keep an index on foreign key + sort + ID.
102
- - Inspect selected-plan, parent-count, per-parent-limit and probe-count telemetry.
103
- Runtime-managed probes are not application-owned N+1 loops; neither strategy changes
104
- authorization, loaded-state semantics or the required comment/purpose.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/assist/query-customer_order.order_item_list.md DELETED
@@ -1,66 +0,0 @@
1
- <!-- ephemeral -->
2
-
3
- # Query Reverse-Relation Assist — `customer_order.order_item_list`
4
-
5
- KSML entity: `customer_order`
6
- Derived reverse relation: `order_item_list`
7
- Child entity: `order_item`
8
-
9
- | Capability | Generated API |
10
- | --- | --- |
11
- | Select | `.selectOrderItemListWith(Q.orderItemsWithMinimalFields())` |
12
-
13
- Reverse relations are model-derived and never perform an implicit database query. Select the relation explicitly before expression access. Apply query methods before the executable purpose stage, then execute with exactly one trusted context.
14
-
15
-
16
- ---
17
-
18
- ## TeaQL seven-language assist contract
19
-
20
- Apply the verified Rust semantic ceiling while using only the exact TYPESCRIPT generated and
21
- runtime APIs. Discover APIs through the generated application AGENTS.md and progressive
22
- model-aware Assist. Do not inspect generated domain-library source.
23
-
24
- - Do not create plurals by appending `s` or `es`; use the centralized generated plural.
25
- - Human and non-human entities use different generated predicate vocabularies. Preserve
26
- forms such as “who are active” and “whose email is”; never infer them from English.
27
- - Configure filters, projection, paging, and other query options before `purpose(...)`.
28
- Comment may appear anywhere in the chain. Purpose enters the executable stage; execution
29
- requires both values, but comment does not have to immediately precede purpose.
30
- - Every execute/list/stream and every save accepts exactly one context argument:
31
- `UserContext`. Name that argument `context`, never `runtime`; data services and global
32
- policy are injected when the context is built. Reserve `runtime` for process-level
33
- runtime ownership, provider/pool setup, and module assembly.
34
- - Tenant, merchant, identity, permissions, request policy, purpose policy, hard limit,
35
- and continuous-page cursor policy come only from trusted context, never dynamic JSON or TFP.
36
- - If the required operation is absent after current entity/action and required field
37
- Assist, stop that path and report MISSING_ASSIST. Do not guess an API or search the
38
- generated library as a fallback.
39
- - Create each application-owned source file once. After its first compile attempt,
40
- repair only the smallest block identified by the exact compiler or test diagnostic.
41
- Preserve unrelated code; do not rewrite the complete file as an error-recovery loop.
42
- - Before a repair that would replace more than 25% of an existing application file,
43
- stop and report LARGE_REWRITE_REQUEST with the file, exact diagnostic, reason, and
44
- estimated scope. Initial creation and model-driven regeneration are not repairs.
45
-
46
- Capability: `query`.
47
-
48
- - Use generated projection, relation, predicate, sort, and aggregate APIs; never
49
- concatenate application SQL or silently ignore an unsupported filter.
50
- - Rows, record count, facets, and aggregates must share the same active filter.
51
- - Add negative tests for missing purpose/comment and forbidden dynamic fields.
52
-
53
- ### Optional per-parent Top-N optimization
54
-
55
- - Configure `topNProbeParentThreshold(threshold)` on the nested child request before its intent/execution
56
- stage. Use the field-specific relation Assist for the exact generated selector.
57
- - Give the child a per-parent limit and deterministic ordering with an ID tie-breaker;
58
- bound the parent query separately. A single-parent detail query is not batch Top-N.
59
- - Server providers default to a window query (`threshold = 0`). A positive threshold
60
- permits bounded probes only when the already-loaded parent count is at or below it;
61
- above it, use the window plan. SQLite uses its internal AlwaysProbe policy by default.
62
- - Measure before opting in. Do not infer a threshold from table size or execute COUNT
63
- or statistics queries to choose a plan. Keep an index on foreign key + sort + ID.
64
- - Inspect selected-plan, parent-count, per-parent-limit and probe-count telemetry.
65
- Runtime-managed probes are not application-owned N+1 loops; neither strategy changes
66
- authorization, loaded-state semantics or the required comment/purpose.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/assist/query-customer_order.status.md DELETED
@@ -1,72 +0,0 @@
1
- <!-- ephemeral -->
2
-
3
- # TypeScript Query Field Assist — `customer_order.status`
4
-
5
- KSML entity: `Customer Order`
6
- KSML field: `Order Status`
7
- Type: `Order Status`
8
-
9
- | Capability | Generated API |
10
- | --- | --- |
11
- | Select | `selectStatusWith(request)`` |
12
- | Filter identity | `withStatusIs(id)`, `withStatusIn(ids)` |
13
- | Filter nested request | `withStatusMatching(request)`, `withoutStatusMatching(request)` |
14
- | Constant | `withStatusIs()` |
15
- | Constant | `withStatusIs()` |
16
- | Constant | `withStatusIs()` |
17
- | Group | `groupByStatus()`, `groupByStatusAs(alias)` |
18
- | Facet | `facetByStatusAs(name, request, includeAllFacets)` |
19
- Execution requires `comment(...)`, `purpose(...)`, and exactly one `context`.
20
-
21
-
22
- ---
23
-
24
- ## TeaQL seven-language assist contract
25
-
26
- Apply the verified Rust semantic ceiling while using only the exact TYPESCRIPT generated and
27
- runtime APIs. Discover APIs through the generated application AGENTS.md and progressive
28
- model-aware Assist. Do not inspect generated domain-library source.
29
-
30
- - Do not create plurals by appending `s` or `es`; use the centralized generated plural.
31
- - Human and non-human entities use different generated predicate vocabularies. Preserve
32
- forms such as “who are active” and “whose email is”; never infer them from English.
33
- - Configure filters, projection, paging, and other query options before `purpose(...)`.
34
- Comment may appear anywhere in the chain. Purpose enters the executable stage; execution
35
- requires both values, but comment does not have to immediately precede purpose.
36
- - Every execute/list/stream and every save accepts exactly one context argument:
37
- `UserContext`. Name that argument `context`, never `runtime`; data services and global
38
- policy are injected when the context is built. Reserve `runtime` for process-level
39
- runtime ownership, provider/pool setup, and module assembly.
40
- - Tenant, merchant, identity, permissions, request policy, purpose policy, hard limit,
41
- and continuous-page cursor policy come only from trusted context, never dynamic JSON or TFP.
42
- - If the required operation is absent after current entity/action and required field
43
- Assist, stop that path and report MISSING_ASSIST. Do not guess an API or search the
44
- generated library as a fallback.
45
- - Create each application-owned source file once. After its first compile attempt,
46
- repair only the smallest block identified by the exact compiler or test diagnostic.
47
- Preserve unrelated code; do not rewrite the complete file as an error-recovery loop.
48
- - Before a repair that would replace more than 25% of an existing application file,
49
- stop and report LARGE_REWRITE_REQUEST with the file, exact diagnostic, reason, and
50
- estimated scope. Initial creation and model-driven regeneration are not repairs.
51
-
52
- Capability: `query`.
53
-
54
- - Use generated projection, relation, predicate, sort, and aggregate APIs; never
55
- concatenate application SQL or silently ignore an unsupported filter.
56
- - Rows, record count, facets, and aggregates must share the same active filter.
57
- - Add negative tests for missing purpose/comment and forbidden dynamic fields.
58
-
59
- ### Optional per-parent Top-N optimization
60
-
61
- - Configure `topNProbeParentThreshold(threshold)` on the nested child request before its intent/execution
62
- stage. Use the field-specific relation Assist for the exact generated selector.
63
- - Give the child a per-parent limit and deterministic ordering with an ID tie-breaker;
64
- bound the parent query separately. A single-parent detail query is not batch Top-N.
65
- - Server providers default to a window query (`threshold = 0`). A positive threshold
66
- permits bounded probes only when the already-loaded parent count is at or below it;
67
- above it, use the window plan. SQLite uses its internal AlwaysProbe policy by default.
68
- - Measure before opting in. Do not infer a threshold from table size or execute COUNT
69
- or statistics queries to choose a plan. Keep an index on foreign key + sort + ID.
70
- - Inspect selected-plan, parent-count, per-parent-limit and probe-count telemetry.
71
- Runtime-managed probes are not application-owned N+1 loops; neither strategy changes
72
- authorization, loaded-state semantics or the required comment/purpose.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/assist/query-order_item.md DELETED
@@ -1,97 +0,0 @@
1
- <!-- ephemeral -->
2
-
3
- # TypeScript Assist — Query `Order Item`
4
-
5
- Use the exact generated `Q.orderItemsWithMinimalFields()`
6
- entry point. Trusted runtime and policy state comes only from `UserContext`.
7
-
8
- ```typescript
9
- import { Q } from './Q';
10
- import { OrderItem } from './models/OrderItem';
11
- import { SmartList, UserContext } from '../teaql-ts';
12
-
13
- export async function queryOrderItemById(
14
- context: UserContext,
15
- entityId: string,
16
- ): Promise<SmartList<OrderItem>> {
17
- return Q.orderItemsWithMinimalFields()
18
- .withIdIs(entityId)
19
- .orderByIdAscending()
20
- .limit(20)
21
- .comment('what: load the requested Order Item row')
22
- .purpose('why: serve the authorized Order Item view')
23
- .executeForList(context);
24
- }
25
- ```
26
-
27
- Compile and execute this source unchanged. Use only generated projection,
28
- predicate, ordering, and relation-selection APIs. Missing or blank intent,
29
- unknown fields, unbounded reads, and trusted-context inputs must fail. Use generated
30
- relation loading rather than handwritten child-query loops; never guess a plural.
31
-
32
-
33
- ## Field-specific Query Assist
34
-
35
- Use the canonical KSML field name from this list. Do not substitute a language member name, JSON name, or database column.
36
-
37
- | KSML field | Type | Field help |
38
- | --- | --- | --- |
39
- | `id` | `id` | `typescript-assist-query/order_item.id` |
40
- | `customer_order` | `relation<customer_order>` | `typescript-assist-query/order_item.customer_order` |
41
- | `product_name` | `string` | `typescript-assist-query/order_item.product_name` |
42
- | `quantity` | `integer` | `typescript-assist-query/order_item.quantity` |
43
- | `unit_price` | `number` | `typescript-assist-query/order_item.unit_price` |
44
- | `version` | `version` | `typescript-assist-query/order_item.version` |
45
-
46
-
47
- ---
48
-
49
- ## TeaQL seven-language assist contract
50
-
51
- Apply the verified Rust semantic ceiling while using only the exact TYPESCRIPT generated and
52
- runtime APIs. Discover APIs through the generated application AGENTS.md and progressive
53
- model-aware Assist. Do not inspect generated domain-library source.
54
-
55
- - Do not create plurals by appending `s` or `es`; use the centralized generated plural.
56
- - Human and non-human entities use different generated predicate vocabularies. Preserve
57
- forms such as “who are active” and “whose email is”; never infer them from English.
58
- - Configure filters, projection, paging, and other query options before `purpose(...)`.
59
- Comment may appear anywhere in the chain. Purpose enters the executable stage; execution
60
- requires both values, but comment does not have to immediately precede purpose.
61
- - Every execute/list/stream and every save accepts exactly one context argument:
62
- `UserContext`. Name that argument `context`, never `runtime`; data services and global
63
- policy are injected when the context is built. Reserve `runtime` for process-level
64
- runtime ownership, provider/pool setup, and module assembly.
65
- - Tenant, merchant, identity, permissions, request policy, purpose policy, hard limit,
66
- and continuous-page cursor policy come only from trusted context, never dynamic JSON or TFP.
67
- - If the required operation is absent after current entity/action and required field
68
- Assist, stop that path and report MISSING_ASSIST. Do not guess an API or search the
69
- generated library as a fallback.
70
- - Create each application-owned source file once. After its first compile attempt,
71
- repair only the smallest block identified by the exact compiler or test diagnostic.
72
- Preserve unrelated code; do not rewrite the complete file as an error-recovery loop.
73
- - Before a repair that would replace more than 25% of an existing application file,
74
- stop and report LARGE_REWRITE_REQUEST with the file, exact diagnostic, reason, and
75
- estimated scope. Initial creation and model-driven regeneration are not repairs.
76
-
77
- Capability: `query`.
78
-
79
- - Use generated projection, relation, predicate, sort, and aggregate APIs; never
80
- concatenate application SQL or silently ignore an unsupported filter.
81
- - Rows, record count, facets, and aggregates must share the same active filter.
82
- - Add negative tests for missing purpose/comment and forbidden dynamic fields.
83
-
84
- ### Optional per-parent Top-N optimization
85
-
86
- - Configure `topNProbeParentThreshold(threshold)` on the nested child request before its intent/execution
87
- stage. Use the field-specific relation Assist for the exact generated selector.
88
- - Give the child a per-parent limit and deterministic ordering with an ID tie-breaker;
89
- bound the parent query separately. A single-parent detail query is not batch Top-N.
90
- - Server providers default to a window query (`threshold = 0`). A positive threshold
91
- permits bounded probes only when the already-loaded parent count is at or below it;
92
- above it, use the window plan. SQLite uses its internal AlwaysProbe policy by default.
93
- - Measure before opting in. Do not infer a threshold from table size or execute COUNT
94
- or statistics queries to choose a plan. Keep an index on foreign key + sort + ID.
95
- - Inspect selected-plan, parent-count, per-parent-limit and probe-count telemetry.
96
- Runtime-managed probes are not application-owned N+1 loops; neither strategy changes
97
- authorization, loaded-state semantics or the required comment/purpose.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/assist/query-order_status.customer_order_list.md DELETED
@@ -1,66 +0,0 @@
1
- <!-- ephemeral -->
2
-
3
- # Query Reverse-Relation Assist — `order_status.customer_order_list`
4
-
5
- KSML entity: `order_status`
6
- Derived reverse relation: `customer_order_list`
7
- Child entity: `customer_order`
8
-
9
- | Capability | Generated API |
10
- | --- | --- |
11
- | Select | `.selectCustomerOrderListWith(Q.customerOrdersWithMinimalFields())` |
12
-
13
- Reverse relations are model-derived and never perform an implicit database query. Select the relation explicitly before expression access. Apply query methods before the executable purpose stage, then execute with exactly one trusted context.
14
-
15
-
16
- ---
17
-
18
- ## TeaQL seven-language assist contract
19
-
20
- Apply the verified Rust semantic ceiling while using only the exact TYPESCRIPT generated and
21
- runtime APIs. Discover APIs through the generated application AGENTS.md and progressive
22
- model-aware Assist. Do not inspect generated domain-library source.
23
-
24
- - Do not create plurals by appending `s` or `es`; use the centralized generated plural.
25
- - Human and non-human entities use different generated predicate vocabularies. Preserve
26
- forms such as “who are active” and “whose email is”; never infer them from English.
27
- - Configure filters, projection, paging, and other query options before `purpose(...)`.
28
- Comment may appear anywhere in the chain. Purpose enters the executable stage; execution
29
- requires both values, but comment does not have to immediately precede purpose.
30
- - Every execute/list/stream and every save accepts exactly one context argument:
31
- `UserContext`. Name that argument `context`, never `runtime`; data services and global
32
- policy are injected when the context is built. Reserve `runtime` for process-level
33
- runtime ownership, provider/pool setup, and module assembly.
34
- - Tenant, merchant, identity, permissions, request policy, purpose policy, hard limit,
35
- and continuous-page cursor policy come only from trusted context, never dynamic JSON or TFP.
36
- - If the required operation is absent after current entity/action and required field
37
- Assist, stop that path and report MISSING_ASSIST. Do not guess an API or search the
38
- generated library as a fallback.
39
- - Create each application-owned source file once. After its first compile attempt,
40
- repair only the smallest block identified by the exact compiler or test diagnostic.
41
- Preserve unrelated code; do not rewrite the complete file as an error-recovery loop.
42
- - Before a repair that would replace more than 25% of an existing application file,
43
- stop and report LARGE_REWRITE_REQUEST with the file, exact diagnostic, reason, and
44
- estimated scope. Initial creation and model-driven regeneration are not repairs.
45
-
46
- Capability: `query`.
47
-
48
- - Use generated projection, relation, predicate, sort, and aggregate APIs; never
49
- concatenate application SQL or silently ignore an unsupported filter.
50
- - Rows, record count, facets, and aggregates must share the same active filter.
51
- - Add negative tests for missing purpose/comment and forbidden dynamic fields.
52
-
53
- ### Optional per-parent Top-N optimization
54
-
55
- - Configure `topNProbeParentThreshold(threshold)` on the nested child request before its intent/execution
56
- stage. Use the field-specific relation Assist for the exact generated selector.
57
- - Give the child a per-parent limit and deterministic ordering with an ID tie-breaker;
58
- bound the parent query separately. A single-parent detail query is not batch Top-N.
59
- - Server providers default to a window query (`threshold = 0`). A positive threshold
60
- permits bounded probes only when the already-loaded parent count is at or below it;
61
- above it, use the window plan. SQLite uses its internal AlwaysProbe policy by default.
62
- - Measure before opting in. Do not infer a threshold from table size or execute COUNT
63
- or statistics queries to choose a plan. Keep an index on foreign key + sort + ID.
64
- - Inspect selected-plan, parent-count, per-parent-limit and probe-count telemetry.
65
- Runtime-managed probes are not application-owned N+1 loops; neither strategy changes
66
- authorization, loaded-state semantics or the required comment/purpose.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/assist/query-order_status.md DELETED
@@ -1,104 +0,0 @@
1
- <!-- ephemeral -->
2
-
3
- # TypeScript Assist — Query `Order Status`
4
-
5
- Use the exact generated `Q.orderStatusesWithMinimalFields()`
6
- entry point. Trusted runtime and policy state comes only from `UserContext`.
7
-
8
- ```typescript
9
- import { Q } from './Q';
10
- import { OrderStatus } from './models/OrderStatus';
11
- import { SmartList, UserContext } from '../teaql-ts';
12
-
13
- export async function queryOrderStatusById(
14
- context: UserContext,
15
- entityId: string,
16
- ): Promise<SmartList<OrderStatus>> {
17
- return Q.orderStatusesWithMinimalFields()
18
- .withIdIs(entityId)
19
- .orderByIdAscending()
20
- .limit(20)
21
- .comment('what: load the requested Order Status row')
22
- .purpose('why: serve the authorized Order Status view')
23
- .executeForList(context);
24
- }
25
- ```
26
-
27
- Compile and execute this source unchanged. Use only generated projection,
28
- predicate, ordering, and relation-selection APIs. Missing or blank intent,
29
- unknown fields, unbounded reads, and trusted-context inputs must fail. Use generated
30
- relation loading rather than handwritten child-query loops; never guess a plural.
31
-
32
-
33
- ## Field-specific Query Assist
34
-
35
- Use the canonical KSML field name from this list. Do not substitute a language member name, JSON name, or database column.
36
-
37
- | KSML field | Type | Field help |
38
- | --- | --- | --- |
39
- | `platform` | `relation<platform>` | `typescript-assist-query/order_status.platform` |
40
- | `id` | `id` | `typescript-assist-query/order_status.id` |
41
- | `name` | `string` | `typescript-assist-query/order_status.name` |
42
- | `code` | `string` | `typescript-assist-query/order_status.code` |
43
- | `color` | `string` | `typescript-assist-query/order_status.color` |
44
- | `display_order` | `integer` | `typescript-assist-query/order_status.display_order` |
45
- | `version` | `version` | `typescript-assist-query/order_status.version` |
46
-
47
- Generated reverse relations are derived from referencing KSML fields. Use their exact generated location for relation selection and access:
48
-
49
- | Generated reverse relation | Child entity | Field help |
50
- | --- | --- | --- |
51
- | `customer_order_list` | `customer_order` | `typescript-assist-query/order_status.customer_order_list` |
52
-
53
-
54
- ---
55
-
56
- ## TeaQL seven-language assist contract
57
-
58
- Apply the verified Rust semantic ceiling while using only the exact TYPESCRIPT generated and
59
- runtime APIs. Discover APIs through the generated application AGENTS.md and progressive
60
- model-aware Assist. Do not inspect generated domain-library source.
61
-
62
- - Do not create plurals by appending `s` or `es`; use the centralized generated plural.
63
- - Human and non-human entities use different generated predicate vocabularies. Preserve
64
- forms such as “who are active” and “whose email is”; never infer them from English.
65
- - Configure filters, projection, paging, and other query options before `purpose(...)`.
66
- Comment may appear anywhere in the chain. Purpose enters the executable stage; execution
67
- requires both values, but comment does not have to immediately precede purpose.
68
- - Every execute/list/stream and every save accepts exactly one context argument:
69
- `UserContext`. Name that argument `context`, never `runtime`; data services and global
70
- policy are injected when the context is built. Reserve `runtime` for process-level
71
- runtime ownership, provider/pool setup, and module assembly.
72
- - Tenant, merchant, identity, permissions, request policy, purpose policy, hard limit,
73
- and continuous-page cursor policy come only from trusted context, never dynamic JSON or TFP.
74
- - If the required operation is absent after current entity/action and required field
75
- Assist, stop that path and report MISSING_ASSIST. Do not guess an API or search the
76
- generated library as a fallback.
77
- - Create each application-owned source file once. After its first compile attempt,
78
- repair only the smallest block identified by the exact compiler or test diagnostic.
79
- Preserve unrelated code; do not rewrite the complete file as an error-recovery loop.
80
- - Before a repair that would replace more than 25% of an existing application file,
81
- stop and report LARGE_REWRITE_REQUEST with the file, exact diagnostic, reason, and
82
- estimated scope. Initial creation and model-driven regeneration are not repairs.
83
-
84
- Capability: `query`.
85
-
86
- - Use generated projection, relation, predicate, sort, and aggregate APIs; never
87
- concatenate application SQL or silently ignore an unsupported filter.
88
- - Rows, record count, facets, and aggregates must share the same active filter.
89
- - Add negative tests for missing purpose/comment and forbidden dynamic fields.
90
-
91
- ### Optional per-parent Top-N optimization
92
-
93
- - Configure `topNProbeParentThreshold(threshold)` on the nested child request before its intent/execution
94
- stage. Use the field-specific relation Assist for the exact generated selector.
95
- - Give the child a per-parent limit and deterministic ordering with an ID tie-breaker;
96
- bound the parent query separately. A single-parent detail query is not batch Top-N.
97
- - Server providers default to a window query (`threshold = 0`). A positive threshold
98
- permits bounded probes only when the already-loaded parent count is at or below it;
99
- above it, use the window plan. SQLite uses its internal AlwaysProbe policy by default.
100
- - Measure before opting in. Do not infer a threshold from table size or execute COUNT
101
- or statistics queries to choose a plan. Keep an index on foreign key + sort + ID.
102
- - Inspect selected-plan, parent-count, per-parent-limit and probe-count telemetry.
103
- Runtime-managed probes are not application-owned N+1 loops; neither strategy changes
104
- authorization, loaded-state semantics or the required comment/purpose.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/index.html DELETED
@@ -1,44 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <link rel="icon" href="data:," />
7
- <title>TeaQL browser order TraceChain</title>
8
- </head>
9
- <body>
10
- <main>
11
- <p class="eyebrow">GENERATED Q + E · SQLITE/WASM · NO BACKEND</p>
12
- <h1>Order query evidence</h1>
13
- <p>One filtered page, named total, status facets and bounded item previews.</p>
14
- <p>Entirely browser-local · SQLite/WASM · Generated typed Order Q/E APIs</p>
15
- <p><a href="https://github.com/teaql/teaql-ts">Runtime source</a> · <a href="https://huggingface.co/spaces/teaql/browser-sqlite-playground/tree/main/source">This demo's source snapshot</a></p>
16
- <div class="controls">
17
- <label><input id="persist" type="checkbox" /> Persist locally with OPFS <span id="opfs-note"></span></label>
18
- <label><input id="logging" type="checkbox" checked /> Diagnostic logging</label>
19
- <button id="reset">Reset demo data</button>
20
- </div>
21
- <label for="example">Example query</label>
22
- <select id="example"><option value="filtered">Filtered order page</option><option value="all">All orders</option></select>
23
- <label for="search">Editable generated TypeScript Q API, parsed into a controlled AST</label>
24
- <textarea id="search" rows="20" spellcheck="false" style="display:block;width:100%;margin:12px 0"></textarea>
25
- <p>No eval, imports, assignments or arbitrary JavaScript execution.</p>
26
- <button id="query">Run query</button>
27
- <button id="preset">Restore example search</button>
28
- <p id="status">Starting SQLite/WASM…</p>
29
- <h2>Response data and metadata</h2>
30
- <pre id="result"></pre>
31
- <h2>SQL execution evidence</h2>
32
- <p>Time is the recorded execution duration. Identity is the request entity from tracePath, not a user or object ID.</p>
33
- <div class="evidence-scroll">
34
- <table class="evidence-table">
35
- <thead><tr><th scope="col">Time</th><th scope="col">Identity</th><th scope="col">Trace chain</th><th scope="col">SQL</th></tr></thead>
36
- <tbody id="evidence-rows"></tbody>
37
- </table>
38
- </div>
39
- <details><summary>Business TraceChain as text</summary><pre id="trace"></pre></details>
40
- <details><summary>Runtime metadata and physical tracePath</summary><pre id="sql"></pre></details>
41
- </main>
42
- <script type="module" src="/src/main.ts"></script>
43
- </body>
44
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/order-model.xml DELETED
@@ -1,21 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <root name="request-tree-order-service" org="example" data_service="sqlite" _module_key="root">
3
- <platform _name="Commerce Platform" _module="Commerce" _module_key="commerce"
4
- name="Commerce Test Platform"/>
5
- <order_status _name="Order Status" _module="Commerce" _module_key="commerce"
6
- platform="platform()" id="id()" name="string()" code="string()"
7
- color="string()" display_order="1" _constant="true" _identifier="code">
8
- <_value id="1001" name="New" code="NEW" color="#94A3B8" display_order="1"/>
9
- <_value id="1002" name="Paid" code="PAID" color="#22C55E" display_order="2"/>
10
- <_value id="1003" name="Cancelled" code="CANCELLED" color="#EF4444" display_order="3"/>
11
- </order_status>
12
- <customer _name="Customer" _module="Commerce" _module_key="commerce"
13
- platform="platform()" name="North Star Retail"/>
14
- <customer_order _name="Customer Order" _module="Commerce" _module_key="commerce"
15
- customer="customer()" status="order_status()"
16
- order_number="CO-20261011-000001" order_date="2026-10-11"
17
- total_amount="100.00"/>
18
- <order_item _name="Order Item" _module="Commerce" _module_key="commerce"
19
- customer_order="customer_order()" product_name="Packing Box"
20
- quantity="5" unit_price="20.00"/>
21
- </root>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/package.json DELETED
@@ -1,15 +0,0 @@
1
- {
2
- "name" : "request-tree-order-service-lib",
3
- "version" : "1.0.0",
4
- "description" : "Generated typescript library",
5
- "main" : "src/generated/Q.ts",
6
- "scripts" : {
7
- "build" : "tsc --noEmit"
8
- },
9
- "dependencies" : {
10
- "teaql-ts" : "file:../../.."
11
- },
12
- "devDependencies" : {
13
- "typescript" : "^5.0.0"
14
- }
15
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/src/generated-bootstrap.ts DELETED
@@ -1,69 +0,0 @@
1
- import { UserContext } from './teaql-ts';
2
- import { Q } from './generated/Q';
3
- import { Platform } from './generated/models/Platform';
4
- import { OrderStatus } from './generated/models/OrderStatus';
5
-
6
- /** @internal Generated typed Mutation bootstrap; never call from application code. */
7
- export async function ensureGeneratedBootstrap(context: UserContext): Promise<void> {
8
- let domainRoot = (await Q.platforms().withIdIs('1').comment('what: locate generated Domain Root').purpose('why: idempotent runtime bootstrap').executeForList(context))[0];
9
- if (!domainRoot) {
10
- domainRoot = Platform.teaqlBootstrapNew('1');
11
- domainRoot.updateName("Commerce Test Platform");
12
- await domainRoot.auditAs('create generated Domain Root Platform').save(context);
13
- }
14
- context.withActiveRoot({ entity: 'Platform', id: domainRoot.id! });
15
- let constantOrderStatus1001 = (await Q.orderStatuses().withIdIs("1001").comment('what: locate generated constant OrderStatus(1001)').purpose('why: idempotent runtime bootstrap').executeForList(context))[0];
16
- if (!constantOrderStatus1001) {
17
- constantOrderStatus1001 = OrderStatus.teaqlBootstrapNew("1001");
18
- constantOrderStatus1001.updatePlatform(domainRoot);
19
- constantOrderStatus1001.updateName("New");
20
- constantOrderStatus1001.updateCode("NEW");
21
- constantOrderStatus1001.updateColor("#94A3B8");
22
- constantOrderStatus1001.updateDisplayOrder(1);
23
- await constantOrderStatus1001.auditAs('create model constant OrderStatus(1001)').save(context);
24
- } else {
25
- let changed = false;
26
- if (String((constantOrderStatus1001.platform as any)?.id ?? constantOrderStatus1001.platform) !== String(domainRoot.id)) { constantOrderStatus1001.updatePlatform(domainRoot); changed = true; }
27
- if (constantOrderStatus1001.name !== "New") { constantOrderStatus1001.updateName("New"); changed = true; }
28
- if (constantOrderStatus1001.code !== "NEW") { constantOrderStatus1001.updateCode("NEW"); changed = true; }
29
- if (constantOrderStatus1001.color !== "#94A3B8") { constantOrderStatus1001.updateColor("#94A3B8"); changed = true; }
30
- if (constantOrderStatus1001.displayOrder !== 1) { constantOrderStatus1001.updateDisplayOrder(1); changed = true; }
31
- if (changed) await constantOrderStatus1001.auditAs('reconcile model constant OrderStatus(1001)').save(context);
32
- }
33
- let constantOrderStatus1002 = (await Q.orderStatuses().withIdIs("1002").comment('what: locate generated constant OrderStatus(1002)').purpose('why: idempotent runtime bootstrap').executeForList(context))[0];
34
- if (!constantOrderStatus1002) {
35
- constantOrderStatus1002 = OrderStatus.teaqlBootstrapNew("1002");
36
- constantOrderStatus1002.updatePlatform(domainRoot);
37
- constantOrderStatus1002.updateName("Paid");
38
- constantOrderStatus1002.updateCode("PAID");
39
- constantOrderStatus1002.updateColor("#22C55E");
40
- constantOrderStatus1002.updateDisplayOrder(2);
41
- await constantOrderStatus1002.auditAs('create model constant OrderStatus(1002)').save(context);
42
- } else {
43
- let changed = false;
44
- if (String((constantOrderStatus1002.platform as any)?.id ?? constantOrderStatus1002.platform) !== String(domainRoot.id)) { constantOrderStatus1002.updatePlatform(domainRoot); changed = true; }
45
- if (constantOrderStatus1002.name !== "Paid") { constantOrderStatus1002.updateName("Paid"); changed = true; }
46
- if (constantOrderStatus1002.code !== "PAID") { constantOrderStatus1002.updateCode("PAID"); changed = true; }
47
- if (constantOrderStatus1002.color !== "#22C55E") { constantOrderStatus1002.updateColor("#22C55E"); changed = true; }
48
- if (constantOrderStatus1002.displayOrder !== 2) { constantOrderStatus1002.updateDisplayOrder(2); changed = true; }
49
- if (changed) await constantOrderStatus1002.auditAs('reconcile model constant OrderStatus(1002)').save(context);
50
- }
51
- let constantOrderStatus1003 = (await Q.orderStatuses().withIdIs("1003").comment('what: locate generated constant OrderStatus(1003)').purpose('why: idempotent runtime bootstrap').executeForList(context))[0];
52
- if (!constantOrderStatus1003) {
53
- constantOrderStatus1003 = OrderStatus.teaqlBootstrapNew("1003");
54
- constantOrderStatus1003.updatePlatform(domainRoot);
55
- constantOrderStatus1003.updateName("Cancelled");
56
- constantOrderStatus1003.updateCode("CANCELLED");
57
- constantOrderStatus1003.updateColor("#EF4444");
58
- constantOrderStatus1003.updateDisplayOrder(3);
59
- await constantOrderStatus1003.auditAs('create model constant OrderStatus(1003)').save(context);
60
- } else {
61
- let changed = false;
62
- if (String((constantOrderStatus1003.platform as any)?.id ?? constantOrderStatus1003.platform) !== String(domainRoot.id)) { constantOrderStatus1003.updatePlatform(domainRoot); changed = true; }
63
- if (constantOrderStatus1003.name !== "Cancelled") { constantOrderStatus1003.updateName("Cancelled"); changed = true; }
64
- if (constantOrderStatus1003.code !== "CANCELLED") { constantOrderStatus1003.updateCode("CANCELLED"); changed = true; }
65
- if (constantOrderStatus1003.color !== "#EF4444") { constantOrderStatus1003.updateColor("#EF4444"); changed = true; }
66
- if (constantOrderStatus1003.displayOrder !== 3) { constantOrderStatus1003.updateDisplayOrder(3); changed = true; }
67
- if (changed) await constantOrderStatus1003.auditAs('reconcile model constant OrderStatus(1003)').save(context);
68
- }
69
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/src/generated-search-models.ts DELETED
@@ -1,124 +0,0 @@
1
- import type { GeneratedSearchModel } from "teaql-ts";
2
-
3
- /** Generated trusted naming/type metadata. No query execution or authorization lives here. */
4
- export const GENERATED_SEARCH_MODELS: Readonly<Record<string, GeneratedSearchModel>> = Object.freeze({
5
- "Platform": Object.freeze({
6
- fields: Object.freeze({
7
- "id": "integer" as const,
8
- "name": "string" as const,
9
- "version": "integer" as const,
10
- }),
11
- queryFields: Object.freeze({
12
- "id": "id",
13
- "name": "name",
14
- "version": "version",
15
- }),
16
- relations: Object.freeze({
17
- "orderStatusList": "OrderStatus",
18
- "customerList": "Customer",
19
- }),
20
- }),
21
- "OrderStatus": Object.freeze({
22
- fields: Object.freeze({
23
- "platform": "integer" as const,
24
- "id": "integer" as const,
25
- "name": "string" as const,
26
- "code": "string" as const,
27
- "color": "string" as const,
28
- "display_order": "integer" as const,
29
- "displayOrder": "integer" as const,
30
- "version": "integer" as const,
31
- }),
32
- queryFields: Object.freeze({
33
- "platform": "platform",
34
- "id": "id",
35
- "name": "name",
36
- "code": "code",
37
- "color": "color",
38
- "display_order": "displayOrder",
39
- "displayOrder": "displayOrder",
40
- "version": "version",
41
- }),
42
- relations: Object.freeze({
43
- "platform": "Platform",
44
- "customerOrderList": "CustomerOrder",
45
- }),
46
- }),
47
- "Customer": Object.freeze({
48
- fields: Object.freeze({
49
- "id": "integer" as const,
50
- "platform": "integer" as const,
51
- "name": "string" as const,
52
- "version": "integer" as const,
53
- }),
54
- queryFields: Object.freeze({
55
- "id": "id",
56
- "platform": "platform",
57
- "name": "name",
58
- "version": "version",
59
- }),
60
- relations: Object.freeze({
61
- "platform": "Platform",
62
- "customerOrderList": "CustomerOrder",
63
- }),
64
- }),
65
- "CustomerOrder": Object.freeze({
66
- fields: Object.freeze({
67
- "id": "integer" as const,
68
- "customer": "integer" as const,
69
- "status": "integer" as const,
70
- "order_number": "string" as const,
71
- "orderNumber": "string" as const,
72
- "order_date": "date" as const,
73
- "orderDate": "date" as const,
74
- "total_amount": "decimal" as const,
75
- "totalAmount": "decimal" as const,
76
- "version": "integer" as const,
77
- }),
78
- queryFields: Object.freeze({
79
- "id": "id",
80
- "customer": "customer",
81
- "status": "status",
82
- "order_number": "orderNumber",
83
- "orderNumber": "orderNumber",
84
- "order_date": "orderDate",
85
- "orderDate": "orderDate",
86
- "total_amount": "totalAmount",
87
- "totalAmount": "totalAmount",
88
- "version": "version",
89
- }),
90
- relations: Object.freeze({
91
- "customer": "Customer",
92
- "status": "OrderStatus",
93
- "orderItemList": "OrderItem",
94
- }),
95
- }),
96
- "OrderItem": Object.freeze({
97
- fields: Object.freeze({
98
- "id": "integer" as const,
99
- "customer_order": "integer" as const,
100
- "customerOrder": "integer" as const,
101
- "product_name": "string" as const,
102
- "productName": "string" as const,
103
- "quantity": "integer" as const,
104
- "unit_price": "decimal" as const,
105
- "unitPrice": "decimal" as const,
106
- "version": "integer" as const,
107
- }),
108
- queryFields: Object.freeze({
109
- "id": "id",
110
- "customer_order": "customerOrder",
111
- "customerOrder": "customerOrder",
112
- "product_name": "productName",
113
- "productName": "productName",
114
- "quantity": "quantity",
115
- "unit_price": "unitPrice",
116
- "unitPrice": "unitPrice",
117
- "version": "version",
118
- }),
119
- relations: Object.freeze({
120
- "customer_order": "CustomerOrder",
121
- "customerOrder": "CustomerOrder",
122
- }),
123
- }),
124
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/src/generated/E.ts DELETED
@@ -1,859 +0,0 @@
1
- import { Platform } from './models/Platform';
2
- import { OrderStatus } from './models/OrderStatus';
3
- import { Customer } from './models/Customer';
4
- import { CustomerOrder } from './models/CustomerOrder';
5
- import { OrderItem } from './models/OrderItem';
6
-
7
- export class TeaQLNotLoadedError extends Error {
8
- readonly details: Record<string, unknown>;
9
-
10
- constructor(
11
- readonly root: string,
12
- readonly accessPath: string,
13
- readonly breakPoint: string,
14
- ) {
15
- const suggestedFix = `select${breakPoint.charAt(0).toUpperCase()}${breakPoint.slice(1)}(...)`;
16
- const details = {
17
- error: 'TeaQLNotLoadedError',
18
- root,
19
- accessPath: accessPath.split('.'),
20
- breakPoint,
21
- missingPreload: [breakPoint],
22
- suggestedFix,
23
- severity: 'error',
24
- humanMessage: `访问 ${root}.${accessPath} 时缺少预加载。请在查询中加入 ${suggestedFix}`,
25
- };
26
- super(JSON.stringify(details));
27
- this.name = 'TeaQLNotLoadedError';
28
- this.details = details;
29
- }
30
- }
31
-
32
- function expressionPath(prefix: string, field: string): string {
33
- return prefix ? `${prefix}.${field}` : field;
34
- }
35
-
36
- export class ValueExpression<T> {
37
- constructor(
38
- private readonly value: T | null | undefined,
39
- private readonly present = true,
40
- private readonly notLoaded?: TeaQLNotLoadedError,
41
- ) {}
42
-
43
- static missing<T>(): ValueExpression<T> {
44
- return new ValueExpression<T>(undefined, false);
45
- }
46
-
47
- static notLoaded<T>(error: TeaQLNotLoadedError): ValueExpression<T> {
48
- return new ValueExpression<T>(undefined, false, error);
49
- }
50
-
51
- eval(): T | null | undefined {
52
- if (this.notLoaded) throw this.notLoaded;
53
- return this.present ? this.value : undefined;
54
- }
55
-
56
- isPresent(): boolean {
57
- if (this.notLoaded) throw this.notLoaded;
58
- return this.present;
59
- }
60
-
61
- orElse(fallback: T): T {
62
- const value = this.eval();
63
- return this.present && value != null ? value : fallback;
64
- }
65
- }
66
-
67
- export class PlatformExpression {
68
- constructor(
69
- private readonly value: Platform | null | undefined,
70
- private readonly root = 'Platform(null)',
71
- private readonly path = '',
72
- private readonly notLoaded?: TeaQLNotLoadedError,
73
- ) {}
74
-
75
- eval(): Platform | null | undefined {
76
- if (this.notLoaded) throw this.notLoaded;
77
- return this.value;
78
- }
79
-
80
- id(): ValueExpression<string> {
81
- if (this.notLoaded) return ValueExpression.notLoaded<string>(this.notLoaded);
82
- if (!this.value) return ValueExpression.missing<string>();
83
- const path = expressionPath(this.path, 'id');
84
- if (!this.value.isLoaded('id')) {
85
- return ValueExpression.notLoaded<string>(
86
- new TeaQLNotLoadedError(this.root, path, 'id'),
87
- );
88
- }
89
- return new ValueExpression<string>(this.value.id);
90
- }
91
-
92
- name(): ValueExpression<string> {
93
- if (this.notLoaded) return ValueExpression.notLoaded<string>(this.notLoaded);
94
- if (!this.value) return ValueExpression.missing<string>();
95
- const path = expressionPath(this.path, 'name');
96
- if (!this.value.isLoaded('name')) {
97
- return ValueExpression.notLoaded<string>(
98
- new TeaQLNotLoadedError(this.root, path, 'name'),
99
- );
100
- }
101
- return new ValueExpression<string>(this.value.name);
102
- }
103
-
104
- version(): ValueExpression<number> {
105
- if (this.notLoaded) return ValueExpression.notLoaded<number>(this.notLoaded);
106
- if (!this.value) return ValueExpression.missing<number>();
107
- const path = expressionPath(this.path, 'version');
108
- if (!this.value.isLoaded('version')) {
109
- return ValueExpression.notLoaded<number>(
110
- new TeaQLNotLoadedError(this.root, path, 'version'),
111
- );
112
- }
113
- return new ValueExpression<number>(this.value.version);
114
- }
115
-
116
-
117
-
118
- orderStatusList(): OrderStatusListExpression {
119
- const path = expressionPath(this.path, 'orderStatusList');
120
- if (this.notLoaded) {
121
- return new OrderStatusListExpression([], this.root, path, false, this.notLoaded);
122
- }
123
- if (!this.value) return OrderStatusListExpression.missing(this.root, path);
124
- if (!this.value.isLoaded('orderStatusList')) {
125
- return new OrderStatusListExpression([], this.root, path, false,
126
- new TeaQLNotLoadedError(this.root, path, 'orderStatusList'));
127
- }
128
- return new OrderStatusListExpression(
129
- this.value.orderStatusList(), this.root, path,
130
- );
131
- }
132
-
133
- customerList(): CustomerListExpression {
134
- const path = expressionPath(this.path, 'customerList');
135
- if (this.notLoaded) {
136
- return new CustomerListExpression([], this.root, path, false, this.notLoaded);
137
- }
138
- if (!this.value) return CustomerListExpression.missing(this.root, path);
139
- if (!this.value.isLoaded('customerList')) {
140
- return new CustomerListExpression([], this.root, path, false,
141
- new TeaQLNotLoadedError(this.root, path, 'customerList'));
142
- }
143
- return new CustomerListExpression(
144
- this.value.customerList(), this.root, path,
145
- );
146
- }
147
- }
148
-
149
- export class OrderStatusExpression {
150
- constructor(
151
- private readonly value: OrderStatus | null | undefined,
152
- private readonly root = 'OrderStatus(null)',
153
- private readonly path = '',
154
- private readonly notLoaded?: TeaQLNotLoadedError,
155
- ) {}
156
-
157
- eval(): OrderStatus | null | undefined {
158
- if (this.notLoaded) throw this.notLoaded;
159
- return this.value;
160
- }
161
-
162
- id(): ValueExpression<string> {
163
- if (this.notLoaded) return ValueExpression.notLoaded<string>(this.notLoaded);
164
- if (!this.value) return ValueExpression.missing<string>();
165
- const path = expressionPath(this.path, 'id');
166
- if (!this.value.isLoaded('id')) {
167
- return ValueExpression.notLoaded<string>(
168
- new TeaQLNotLoadedError(this.root, path, 'id'),
169
- );
170
- }
171
- return new ValueExpression<string>(this.value.id);
172
- }
173
-
174
- name(): ValueExpression<string> {
175
- if (this.notLoaded) return ValueExpression.notLoaded<string>(this.notLoaded);
176
- if (!this.value) return ValueExpression.missing<string>();
177
- const path = expressionPath(this.path, 'name');
178
- if (!this.value.isLoaded('name')) {
179
- return ValueExpression.notLoaded<string>(
180
- new TeaQLNotLoadedError(this.root, path, 'name'),
181
- );
182
- }
183
- return new ValueExpression<string>(this.value.name);
184
- }
185
-
186
- code(): ValueExpression<string> {
187
- if (this.notLoaded) return ValueExpression.notLoaded<string>(this.notLoaded);
188
- if (!this.value) return ValueExpression.missing<string>();
189
- const path = expressionPath(this.path, 'code');
190
- if (!this.value.isLoaded('code')) {
191
- return ValueExpression.notLoaded<string>(
192
- new TeaQLNotLoadedError(this.root, path, 'code'),
193
- );
194
- }
195
- return new ValueExpression<string>(this.value.code);
196
- }
197
-
198
- color(): ValueExpression<string> {
199
- if (this.notLoaded) return ValueExpression.notLoaded<string>(this.notLoaded);
200
- if (!this.value) return ValueExpression.missing<string>();
201
- const path = expressionPath(this.path, 'color');
202
- if (!this.value.isLoaded('color')) {
203
- return ValueExpression.notLoaded<string>(
204
- new TeaQLNotLoadedError(this.root, path, 'color'),
205
- );
206
- }
207
- return new ValueExpression<string>(this.value.color);
208
- }
209
-
210
- displayOrder(): ValueExpression<number> {
211
- if (this.notLoaded) return ValueExpression.notLoaded<number>(this.notLoaded);
212
- if (!this.value) return ValueExpression.missing<number>();
213
- const path = expressionPath(this.path, 'displayOrder');
214
- if (!this.value.isLoaded('displayOrder')) {
215
- return ValueExpression.notLoaded<number>(
216
- new TeaQLNotLoadedError(this.root, path, 'displayOrder'),
217
- );
218
- }
219
- return new ValueExpression<number>(this.value.displayOrder);
220
- }
221
-
222
- version(): ValueExpression<number> {
223
- if (this.notLoaded) return ValueExpression.notLoaded<number>(this.notLoaded);
224
- if (!this.value) return ValueExpression.missing<number>();
225
- const path = expressionPath(this.path, 'version');
226
- if (!this.value.isLoaded('version')) {
227
- return ValueExpression.notLoaded<number>(
228
- new TeaQLNotLoadedError(this.root, path, 'version'),
229
- );
230
- }
231
- return new ValueExpression<number>(this.value.version);
232
- }
233
-
234
- platformId(): ValueExpression<string | number> {
235
- if (this.notLoaded) return ValueExpression.notLoaded<string | number>(this.notLoaded);
236
- if (!this.value) return ValueExpression.missing<string | number>();
237
- const path = expressionPath(this.path, 'platform');
238
- if (!this.value.isLoaded('platform')) {
239
- return ValueExpression.notLoaded<string | number>(
240
- new TeaQLNotLoadedError(this.root, path, 'platform'),
241
- );
242
- }
243
- return new ValueExpression<string | number>(
244
- this.value.platform as string | number | undefined,
245
- );
246
- }
247
-
248
- platform(): PlatformExpression {
249
- const path = expressionPath(this.path, 'platform');
250
- if (this.notLoaded) {
251
- return new PlatformExpression(undefined, this.root, path, this.notLoaded);
252
- }
253
- if (!this.value) return new PlatformExpression(undefined, this.root, path);
254
- if (!this.value.isLoaded('platform')) {
255
- return new PlatformExpression(undefined, this.root, path,
256
- new TeaQLNotLoadedError(this.root, path, 'platform'));
257
- }
258
- const relation = this.value.platform;
259
- const target = relation == null
260
- ? undefined
261
- : relation instanceof Platform
262
- ? relation
263
- : Platform.fromRecord({ id: relation });
264
- return new PlatformExpression(target, this.root, path);
265
- }
266
-
267
- customerOrderList(): CustomerOrderListExpression {
268
- const path = expressionPath(this.path, 'customerOrderList');
269
- if (this.notLoaded) {
270
- return new CustomerOrderListExpression([], this.root, path, false, this.notLoaded);
271
- }
272
- if (!this.value) return CustomerOrderListExpression.missing(this.root, path);
273
- if (!this.value.isLoaded('customerOrderList')) {
274
- return new CustomerOrderListExpression([], this.root, path, false,
275
- new TeaQLNotLoadedError(this.root, path, 'customerOrderList'));
276
- }
277
- return new CustomerOrderListExpression(
278
- this.value.customerOrderList(), this.root, path,
279
- );
280
- }
281
- }
282
-
283
- export class CustomerExpression {
284
- constructor(
285
- private readonly value: Customer | null | undefined,
286
- private readonly root = 'Customer(null)',
287
- private readonly path = '',
288
- private readonly notLoaded?: TeaQLNotLoadedError,
289
- ) {}
290
-
291
- eval(): Customer | null | undefined {
292
- if (this.notLoaded) throw this.notLoaded;
293
- return this.value;
294
- }
295
-
296
- id(): ValueExpression<string> {
297
- if (this.notLoaded) return ValueExpression.notLoaded<string>(this.notLoaded);
298
- if (!this.value) return ValueExpression.missing<string>();
299
- const path = expressionPath(this.path, 'id');
300
- if (!this.value.isLoaded('id')) {
301
- return ValueExpression.notLoaded<string>(
302
- new TeaQLNotLoadedError(this.root, path, 'id'),
303
- );
304
- }
305
- return new ValueExpression<string>(this.value.id);
306
- }
307
-
308
- name(): ValueExpression<string> {
309
- if (this.notLoaded) return ValueExpression.notLoaded<string>(this.notLoaded);
310
- if (!this.value) return ValueExpression.missing<string>();
311
- const path = expressionPath(this.path, 'name');
312
- if (!this.value.isLoaded('name')) {
313
- return ValueExpression.notLoaded<string>(
314
- new TeaQLNotLoadedError(this.root, path, 'name'),
315
- );
316
- }
317
- return new ValueExpression<string>(this.value.name);
318
- }
319
-
320
- version(): ValueExpression<number> {
321
- if (this.notLoaded) return ValueExpression.notLoaded<number>(this.notLoaded);
322
- if (!this.value) return ValueExpression.missing<number>();
323
- const path = expressionPath(this.path, 'version');
324
- if (!this.value.isLoaded('version')) {
325
- return ValueExpression.notLoaded<number>(
326
- new TeaQLNotLoadedError(this.root, path, 'version'),
327
- );
328
- }
329
- return new ValueExpression<number>(this.value.version);
330
- }
331
-
332
- platformId(): ValueExpression<string | number> {
333
- if (this.notLoaded) return ValueExpression.notLoaded<string | number>(this.notLoaded);
334
- if (!this.value) return ValueExpression.missing<string | number>();
335
- const path = expressionPath(this.path, 'platform');
336
- if (!this.value.isLoaded('platform')) {
337
- return ValueExpression.notLoaded<string | number>(
338
- new TeaQLNotLoadedError(this.root, path, 'platform'),
339
- );
340
- }
341
- return new ValueExpression<string | number>(
342
- this.value.platform as string | number | undefined,
343
- );
344
- }
345
-
346
- platform(): PlatformExpression {
347
- const path = expressionPath(this.path, 'platform');
348
- if (this.notLoaded) {
349
- return new PlatformExpression(undefined, this.root, path, this.notLoaded);
350
- }
351
- if (!this.value) return new PlatformExpression(undefined, this.root, path);
352
- if (!this.value.isLoaded('platform')) {
353
- return new PlatformExpression(undefined, this.root, path,
354
- new TeaQLNotLoadedError(this.root, path, 'platform'));
355
- }
356
- const relation = this.value.platform;
357
- const target = relation == null
358
- ? undefined
359
- : relation instanceof Platform
360
- ? relation
361
- : Platform.fromRecord({ id: relation });
362
- return new PlatformExpression(target, this.root, path);
363
- }
364
-
365
- customerOrderList(): CustomerOrderListExpression {
366
- const path = expressionPath(this.path, 'customerOrderList');
367
- if (this.notLoaded) {
368
- return new CustomerOrderListExpression([], this.root, path, false, this.notLoaded);
369
- }
370
- if (!this.value) return CustomerOrderListExpression.missing(this.root, path);
371
- if (!this.value.isLoaded('customerOrderList')) {
372
- return new CustomerOrderListExpression([], this.root, path, false,
373
- new TeaQLNotLoadedError(this.root, path, 'customerOrderList'));
374
- }
375
- return new CustomerOrderListExpression(
376
- this.value.customerOrderList(), this.root, path,
377
- );
378
- }
379
- }
380
-
381
- export class CustomerOrderExpression {
382
- constructor(
383
- private readonly value: CustomerOrder | null | undefined,
384
- private readonly root = 'CustomerOrder(null)',
385
- private readonly path = '',
386
- private readonly notLoaded?: TeaQLNotLoadedError,
387
- ) {}
388
-
389
- eval(): CustomerOrder | null | undefined {
390
- if (this.notLoaded) throw this.notLoaded;
391
- return this.value;
392
- }
393
-
394
- id(): ValueExpression<string> {
395
- if (this.notLoaded) return ValueExpression.notLoaded<string>(this.notLoaded);
396
- if (!this.value) return ValueExpression.missing<string>();
397
- const path = expressionPath(this.path, 'id');
398
- if (!this.value.isLoaded('id')) {
399
- return ValueExpression.notLoaded<string>(
400
- new TeaQLNotLoadedError(this.root, path, 'id'),
401
- );
402
- }
403
- return new ValueExpression<string>(this.value.id);
404
- }
405
-
406
- orderNumber(): ValueExpression<string> {
407
- if (this.notLoaded) return ValueExpression.notLoaded<string>(this.notLoaded);
408
- if (!this.value) return ValueExpression.missing<string>();
409
- const path = expressionPath(this.path, 'orderNumber');
410
- if (!this.value.isLoaded('orderNumber')) {
411
- return ValueExpression.notLoaded<string>(
412
- new TeaQLNotLoadedError(this.root, path, 'orderNumber'),
413
- );
414
- }
415
- return new ValueExpression<string>(this.value.orderNumber);
416
- }
417
-
418
- orderDate(): ValueExpression<string> {
419
- if (this.notLoaded) return ValueExpression.notLoaded<string>(this.notLoaded);
420
- if (!this.value) return ValueExpression.missing<string>();
421
- const path = expressionPath(this.path, 'orderDate');
422
- if (!this.value.isLoaded('orderDate')) {
423
- return ValueExpression.notLoaded<string>(
424
- new TeaQLNotLoadedError(this.root, path, 'orderDate'),
425
- );
426
- }
427
- return new ValueExpression<string>(this.value.orderDate);
428
- }
429
-
430
- totalAmount(): ValueExpression<number> {
431
- if (this.notLoaded) return ValueExpression.notLoaded<number>(this.notLoaded);
432
- if (!this.value) return ValueExpression.missing<number>();
433
- const path = expressionPath(this.path, 'totalAmount');
434
- if (!this.value.isLoaded('totalAmount')) {
435
- return ValueExpression.notLoaded<number>(
436
- new TeaQLNotLoadedError(this.root, path, 'totalAmount'),
437
- );
438
- }
439
- return new ValueExpression<number>(this.value.totalAmount);
440
- }
441
-
442
- version(): ValueExpression<number> {
443
- if (this.notLoaded) return ValueExpression.notLoaded<number>(this.notLoaded);
444
- if (!this.value) return ValueExpression.missing<number>();
445
- const path = expressionPath(this.path, 'version');
446
- if (!this.value.isLoaded('version')) {
447
- return ValueExpression.notLoaded<number>(
448
- new TeaQLNotLoadedError(this.root, path, 'version'),
449
- );
450
- }
451
- return new ValueExpression<number>(this.value.version);
452
- }
453
-
454
- customerId(): ValueExpression<string | number> {
455
- if (this.notLoaded) return ValueExpression.notLoaded<string | number>(this.notLoaded);
456
- if (!this.value) return ValueExpression.missing<string | number>();
457
- const path = expressionPath(this.path, 'customer');
458
- if (!this.value.isLoaded('customer')) {
459
- return ValueExpression.notLoaded<string | number>(
460
- new TeaQLNotLoadedError(this.root, path, 'customer'),
461
- );
462
- }
463
- return new ValueExpression<string | number>(
464
- this.value.customer as string | number | undefined,
465
- );
466
- }
467
-
468
- statusId(): ValueExpression<string | number> {
469
- if (this.notLoaded) return ValueExpression.notLoaded<string | number>(this.notLoaded);
470
- if (!this.value) return ValueExpression.missing<string | number>();
471
- const path = expressionPath(this.path, 'status');
472
- if (!this.value.isLoaded('status')) {
473
- return ValueExpression.notLoaded<string | number>(
474
- new TeaQLNotLoadedError(this.root, path, 'status'),
475
- );
476
- }
477
- return new ValueExpression<string | number>(
478
- this.value.status as string | number | undefined,
479
- );
480
- }
481
-
482
- customer(): CustomerExpression {
483
- const path = expressionPath(this.path, 'customer');
484
- if (this.notLoaded) {
485
- return new CustomerExpression(undefined, this.root, path, this.notLoaded);
486
- }
487
- if (!this.value) return new CustomerExpression(undefined, this.root, path);
488
- if (!this.value.isLoaded('customer')) {
489
- return new CustomerExpression(undefined, this.root, path,
490
- new TeaQLNotLoadedError(this.root, path, 'customer'));
491
- }
492
- const relation = this.value.customer;
493
- const target = relation == null
494
- ? undefined
495
- : relation instanceof Customer
496
- ? relation
497
- : Customer.fromRecord({ id: relation });
498
- return new CustomerExpression(target, this.root, path);
499
- }
500
-
501
- status(): OrderStatusExpression {
502
- const path = expressionPath(this.path, 'status');
503
- if (this.notLoaded) {
504
- return new OrderStatusExpression(undefined, this.root, path, this.notLoaded);
505
- }
506
- if (!this.value) return new OrderStatusExpression(undefined, this.root, path);
507
- if (!this.value.isLoaded('status')) {
508
- return new OrderStatusExpression(undefined, this.root, path,
509
- new TeaQLNotLoadedError(this.root, path, 'status'));
510
- }
511
- const relation = this.value.status;
512
- const target = relation == null
513
- ? undefined
514
- : relation instanceof OrderStatus
515
- ? relation
516
- : OrderStatus.fromRecord({ id: relation });
517
- return new OrderStatusExpression(target, this.root, path);
518
- }
519
-
520
- orderItemList(): OrderItemListExpression {
521
- const path = expressionPath(this.path, 'orderItemList');
522
- if (this.notLoaded) {
523
- return new OrderItemListExpression([], this.root, path, false, this.notLoaded);
524
- }
525
- if (!this.value) return OrderItemListExpression.missing(this.root, path);
526
- if (!this.value.isLoaded('orderItemList')) {
527
- return new OrderItemListExpression([], this.root, path, false,
528
- new TeaQLNotLoadedError(this.root, path, 'orderItemList'));
529
- }
530
- return new OrderItemListExpression(
531
- this.value.orderItemList(), this.root, path,
532
- );
533
- }
534
- }
535
-
536
- export class OrderItemExpression {
537
- constructor(
538
- private readonly value: OrderItem | null | undefined,
539
- private readonly root = 'OrderItem(null)',
540
- private readonly path = '',
541
- private readonly notLoaded?: TeaQLNotLoadedError,
542
- ) {}
543
-
544
- eval(): OrderItem | null | undefined {
545
- if (this.notLoaded) throw this.notLoaded;
546
- return this.value;
547
- }
548
-
549
- id(): ValueExpression<string> {
550
- if (this.notLoaded) return ValueExpression.notLoaded<string>(this.notLoaded);
551
- if (!this.value) return ValueExpression.missing<string>();
552
- const path = expressionPath(this.path, 'id');
553
- if (!this.value.isLoaded('id')) {
554
- return ValueExpression.notLoaded<string>(
555
- new TeaQLNotLoadedError(this.root, path, 'id'),
556
- );
557
- }
558
- return new ValueExpression<string>(this.value.id);
559
- }
560
-
561
- productName(): ValueExpression<string> {
562
- if (this.notLoaded) return ValueExpression.notLoaded<string>(this.notLoaded);
563
- if (!this.value) return ValueExpression.missing<string>();
564
- const path = expressionPath(this.path, 'productName');
565
- if (!this.value.isLoaded('productName')) {
566
- return ValueExpression.notLoaded<string>(
567
- new TeaQLNotLoadedError(this.root, path, 'productName'),
568
- );
569
- }
570
- return new ValueExpression<string>(this.value.productName);
571
- }
572
-
573
- quantity(): ValueExpression<number> {
574
- if (this.notLoaded) return ValueExpression.notLoaded<number>(this.notLoaded);
575
- if (!this.value) return ValueExpression.missing<number>();
576
- const path = expressionPath(this.path, 'quantity');
577
- if (!this.value.isLoaded('quantity')) {
578
- return ValueExpression.notLoaded<number>(
579
- new TeaQLNotLoadedError(this.root, path, 'quantity'),
580
- );
581
- }
582
- return new ValueExpression<number>(this.value.quantity);
583
- }
584
-
585
- unitPrice(): ValueExpression<number> {
586
- if (this.notLoaded) return ValueExpression.notLoaded<number>(this.notLoaded);
587
- if (!this.value) return ValueExpression.missing<number>();
588
- const path = expressionPath(this.path, 'unitPrice');
589
- if (!this.value.isLoaded('unitPrice')) {
590
- return ValueExpression.notLoaded<number>(
591
- new TeaQLNotLoadedError(this.root, path, 'unitPrice'),
592
- );
593
- }
594
- return new ValueExpression<number>(this.value.unitPrice);
595
- }
596
-
597
- version(): ValueExpression<number> {
598
- if (this.notLoaded) return ValueExpression.notLoaded<number>(this.notLoaded);
599
- if (!this.value) return ValueExpression.missing<number>();
600
- const path = expressionPath(this.path, 'version');
601
- if (!this.value.isLoaded('version')) {
602
- return ValueExpression.notLoaded<number>(
603
- new TeaQLNotLoadedError(this.root, path, 'version'),
604
- );
605
- }
606
- return new ValueExpression<number>(this.value.version);
607
- }
608
-
609
- customerOrderId(): ValueExpression<string | number> {
610
- if (this.notLoaded) return ValueExpression.notLoaded<string | number>(this.notLoaded);
611
- if (!this.value) return ValueExpression.missing<string | number>();
612
- const path = expressionPath(this.path, 'customerOrder');
613
- if (!this.value.isLoaded('customerOrder')) {
614
- return ValueExpression.notLoaded<string | number>(
615
- new TeaQLNotLoadedError(this.root, path, 'customerOrder'),
616
- );
617
- }
618
- return new ValueExpression<string | number>(
619
- this.value.customerOrder as string | number | undefined,
620
- );
621
- }
622
-
623
- customerOrder(): CustomerOrderExpression {
624
- const path = expressionPath(this.path, 'customerOrder');
625
- if (this.notLoaded) {
626
- return new CustomerOrderExpression(undefined, this.root, path, this.notLoaded);
627
- }
628
- if (!this.value) return new CustomerOrderExpression(undefined, this.root, path);
629
- if (!this.value.isLoaded('customerOrder')) {
630
- return new CustomerOrderExpression(undefined, this.root, path,
631
- new TeaQLNotLoadedError(this.root, path, 'customerOrder'));
632
- }
633
- const relation = this.value.customerOrder;
634
- const target = relation == null
635
- ? undefined
636
- : relation instanceof CustomerOrder
637
- ? relation
638
- : CustomerOrder.fromRecord({ id: relation });
639
- return new CustomerOrderExpression(target, this.root, path);
640
- }
641
-
642
- }
643
-
644
- export class PlatformListExpression {
645
- constructor(
646
- private readonly items: readonly Platform[],
647
- private readonly root = 'Platform(null)',
648
- private readonly path = '',
649
- private readonly present = true,
650
- private readonly notLoaded?: TeaQLNotLoadedError,
651
- ) {}
652
-
653
- static missing(root?: string, path = ''): PlatformListExpression {
654
- return new PlatformListExpression([], root, path, false);
655
- }
656
-
657
- size(): ValueExpression<number> {
658
- if (this.notLoaded) return ValueExpression.notLoaded<number>(this.notLoaded);
659
- return this.present
660
- ? new ValueExpression<number>(this.items.length)
661
- : ValueExpression.missing<number>();
662
- }
663
-
664
- first(): PlatformExpression {
665
- return this.get(0);
666
- }
667
-
668
- get(index: number): PlatformExpression {
669
- const itemPath = expressionPath(this.path, `get(${index})`);
670
- if (this.notLoaded) {
671
- return new PlatformExpression(undefined, this.root, itemPath, this.notLoaded);
672
- }
673
- return !this.present || index < 0 || index >= this.items.length
674
- ? new PlatformExpression(undefined, this.root, itemPath)
675
- : new PlatformExpression(this.items[index], this.root, itemPath);
676
- }
677
- }
678
-
679
- export class OrderStatusListExpression {
680
- constructor(
681
- private readonly items: readonly OrderStatus[],
682
- private readonly root = 'OrderStatus(null)',
683
- private readonly path = '',
684
- private readonly present = true,
685
- private readonly notLoaded?: TeaQLNotLoadedError,
686
- ) {}
687
-
688
- static missing(root?: string, path = ''): OrderStatusListExpression {
689
- return new OrderStatusListExpression([], root, path, false);
690
- }
691
-
692
- size(): ValueExpression<number> {
693
- if (this.notLoaded) return ValueExpression.notLoaded<number>(this.notLoaded);
694
- return this.present
695
- ? new ValueExpression<number>(this.items.length)
696
- : ValueExpression.missing<number>();
697
- }
698
-
699
- first(): OrderStatusExpression {
700
- return this.get(0);
701
- }
702
-
703
- get(index: number): OrderStatusExpression {
704
- const itemPath = expressionPath(this.path, `get(${index})`);
705
- if (this.notLoaded) {
706
- return new OrderStatusExpression(undefined, this.root, itemPath, this.notLoaded);
707
- }
708
- return !this.present || index < 0 || index >= this.items.length
709
- ? new OrderStatusExpression(undefined, this.root, itemPath)
710
- : new OrderStatusExpression(this.items[index], this.root, itemPath);
711
- }
712
- }
713
-
714
- export class CustomerListExpression {
715
- constructor(
716
- private readonly items: readonly Customer[],
717
- private readonly root = 'Customer(null)',
718
- private readonly path = '',
719
- private readonly present = true,
720
- private readonly notLoaded?: TeaQLNotLoadedError,
721
- ) {}
722
-
723
- static missing(root?: string, path = ''): CustomerListExpression {
724
- return new CustomerListExpression([], root, path, false);
725
- }
726
-
727
- size(): ValueExpression<number> {
728
- if (this.notLoaded) return ValueExpression.notLoaded<number>(this.notLoaded);
729
- return this.present
730
- ? new ValueExpression<number>(this.items.length)
731
- : ValueExpression.missing<number>();
732
- }
733
-
734
- first(): CustomerExpression {
735
- return this.get(0);
736
- }
737
-
738
- get(index: number): CustomerExpression {
739
- const itemPath = expressionPath(this.path, `get(${index})`);
740
- if (this.notLoaded) {
741
- return new CustomerExpression(undefined, this.root, itemPath, this.notLoaded);
742
- }
743
- return !this.present || index < 0 || index >= this.items.length
744
- ? new CustomerExpression(undefined, this.root, itemPath)
745
- : new CustomerExpression(this.items[index], this.root, itemPath);
746
- }
747
- }
748
-
749
- export class CustomerOrderListExpression {
750
- constructor(
751
- private readonly items: readonly CustomerOrder[],
752
- private readonly root = 'CustomerOrder(null)',
753
- private readonly path = '',
754
- private readonly present = true,
755
- private readonly notLoaded?: TeaQLNotLoadedError,
756
- ) {}
757
-
758
- static missing(root?: string, path = ''): CustomerOrderListExpression {
759
- return new CustomerOrderListExpression([], root, path, false);
760
- }
761
-
762
- size(): ValueExpression<number> {
763
- if (this.notLoaded) return ValueExpression.notLoaded<number>(this.notLoaded);
764
- return this.present
765
- ? new ValueExpression<number>(this.items.length)
766
- : ValueExpression.missing<number>();
767
- }
768
-
769
- first(): CustomerOrderExpression {
770
- return this.get(0);
771
- }
772
-
773
- get(index: number): CustomerOrderExpression {
774
- const itemPath = expressionPath(this.path, `get(${index})`);
775
- if (this.notLoaded) {
776
- return new CustomerOrderExpression(undefined, this.root, itemPath, this.notLoaded);
777
- }
778
- return !this.present || index < 0 || index >= this.items.length
779
- ? new CustomerOrderExpression(undefined, this.root, itemPath)
780
- : new CustomerOrderExpression(this.items[index], this.root, itemPath);
781
- }
782
- }
783
-
784
- export class OrderItemListExpression {
785
- constructor(
786
- private readonly items: readonly OrderItem[],
787
- private readonly root = 'OrderItem(null)',
788
- private readonly path = '',
789
- private readonly present = true,
790
- private readonly notLoaded?: TeaQLNotLoadedError,
791
- ) {}
792
-
793
- static missing(root?: string, path = ''): OrderItemListExpression {
794
- return new OrderItemListExpression([], root, path, false);
795
- }
796
-
797
- size(): ValueExpression<number> {
798
- if (this.notLoaded) return ValueExpression.notLoaded<number>(this.notLoaded);
799
- return this.present
800
- ? new ValueExpression<number>(this.items.length)
801
- : ValueExpression.missing<number>();
802
- }
803
-
804
- first(): OrderItemExpression {
805
- return this.get(0);
806
- }
807
-
808
- get(index: number): OrderItemExpression {
809
- const itemPath = expressionPath(this.path, `get(${index})`);
810
- if (this.notLoaded) {
811
- return new OrderItemExpression(undefined, this.root, itemPath, this.notLoaded);
812
- }
813
- return !this.present || index < 0 || index >= this.items.length
814
- ? new OrderItemExpression(undefined, this.root, itemPath)
815
- : new OrderItemExpression(this.items[index], this.root, itemPath);
816
- }
817
- }
818
-
819
- export class E {
820
- static platform(
821
- value: Platform | null | undefined,
822
- ): PlatformExpression {
823
- return new PlatformExpression(
824
- value, `Platform(id=${value?.id ?? 'null'})`,
825
- );
826
- }
827
-
828
- static orderStatus(
829
- value: OrderStatus | null | undefined,
830
- ): OrderStatusExpression {
831
- return new OrderStatusExpression(
832
- value, `OrderStatus(id=${value?.id ?? 'null'})`,
833
- );
834
- }
835
-
836
- static customer(
837
- value: Customer | null | undefined,
838
- ): CustomerExpression {
839
- return new CustomerExpression(
840
- value, `Customer(id=${value?.id ?? 'null'})`,
841
- );
842
- }
843
-
844
- static customerOrder(
845
- value: CustomerOrder | null | undefined,
846
- ): CustomerOrderExpression {
847
- return new CustomerOrderExpression(
848
- value, `CustomerOrder(id=${value?.id ?? 'null'})`,
849
- );
850
- }
851
-
852
- static orderItem(
853
- value: OrderItem | null | undefined,
854
- ): OrderItemExpression {
855
- return new OrderItemExpression(
856
- value, `OrderItem(id=${value?.id ?? 'null'})`,
857
- );
858
- }
859
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/src/generated/Q.ts DELETED
@@ -1,44 +0,0 @@
1
- import { TeaQLClient } from '../teaql-ts';
2
- import { PlatformRequest } from './requests/PlatformRequest';
3
- import { OrderStatusRequest } from './requests/OrderStatusRequest';
4
- import { CustomerRequest } from './requests/CustomerRequest';
5
- import { CustomerOrderRequest } from './requests/CustomerOrderRequest';
6
- import { OrderItemRequest } from './requests/OrderItemRequest';
7
-
8
- export class Q {
9
- static platforms(): PlatformRequest {
10
- return new PlatformRequest(false);
11
- }
12
-
13
- static platformsWithMinimalFields(): PlatformRequest {
14
- return new PlatformRequest(true);
15
- }
16
- static orderStatuses(): OrderStatusRequest {
17
- return new OrderStatusRequest(false);
18
- }
19
-
20
- static orderStatusesWithMinimalFields(): OrderStatusRequest {
21
- return new OrderStatusRequest(true);
22
- }
23
- static customers(): CustomerRequest {
24
- return new CustomerRequest(false);
25
- }
26
-
27
- static customersWithMinimalFields(): CustomerRequest {
28
- return new CustomerRequest(true);
29
- }
30
- static customerOrders(): CustomerOrderRequest {
31
- return new CustomerOrderRequest(false);
32
- }
33
-
34
- static customerOrdersWithMinimalFields(): CustomerOrderRequest {
35
- return new CustomerOrderRequest(true);
36
- }
37
- static orderItems(): OrderItemRequest {
38
- return new OrderItemRequest(false);
39
- }
40
-
41
- static orderItemsWithMinimalFields(): OrderItemRequest {
42
- return new OrderItemRequest(true);
43
- }
44
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/src/generated/models/Customer.ts DELETED
@@ -1,252 +0,0 @@
1
- import { CheckException, EntityKey, EntityRoot, GraphMutationSession, LoadedScalarSnapshot, MutationIntent, MutationTraceScope, ObjectLocation, TeaQLDataService, UserContext } from '../../teaql-ts';
2
- import { Platform } from './Platform';
3
- import { CustomerOrder } from './CustomerOrder';
4
-
5
- export class Customer {
6
- private static teaqlTemporaryId = 0;
7
- id?: string;
8
- platform?: Platform | string;
9
- name?: string;
10
- version?: number;
11
-
12
- constructor(init?: Partial<Customer>) {
13
- Object.defineProperty(this, "_action", { value: init && init.id ? "Update" : "Create", writable: true, enumerable: false });
14
- Object.defineProperty(this, "_comment", { value: undefined, writable: true, enumerable: false });
15
- Object.defineProperty(this, "_fullyLoaded", { value: !init || !init.id, writable: true, enumerable: false });
16
- Object.defineProperty(this, "_loadedFields", { value: new Set(Object.keys(init || {})), writable: true, enumerable: false });
17
- Object.defineProperty(this, "_root", { value: new EntityRoot(), writable: true, enumerable: false });
18
- Object.defineProperty(this, "_ledgerId", { value: init?.id ?? --Customer.teaqlTemporaryId, writable: true, enumerable: false });
19
- Object.defineProperty(this, "_customerOrderList", { value: [], writable: true, enumerable: false });
20
- if (init) {
21
- const fields: Record<string, unknown> = { ...(init as Record<string, unknown>) };
22
- delete fields["customerOrderList"];
23
- Object.assign(this, fields);
24
- if ((init as any).platform && typeof (init as any).platform === "object") {
25
- this.platform = (init as any).platform instanceof Platform
26
- ? (init as any).platform
27
- : Platform.fromRecord((init as any).platform);
28
- this.markLoaded("platform");
29
- }
30
- if (Array.isArray((init as any).customerOrderList)) {
31
- (this as any)._customerOrderList = (init as any).customerOrderList.map(
32
- (child: unknown) => child instanceof CustomerOrder
33
- ? child
34
- : CustomerOrder.fromRecord(child as Record<string, unknown>),
35
- );
36
- this.markLoaded("customerOrderList");
37
- }
38
- }
39
- const key = this.teaqlEntityKey();
40
- if ((this as any)._action === "Create") (this as any)._root.markAsNew(key);
41
- else if ((this as any).version !== undefined) (this as any)._root.setOriginalVersion(key, Number((this as any).version));
42
- }
43
-
44
- private teaqlEntityKey(): EntityKey { return { entity: "Customer", id: (this as any)._ledgerId }; }
45
- private teaqlAttachRoot(root: EntityRoot): this {
46
- if ((this as any)._root !== root) { root.mergeFrom((this as any)._root); (this as any)._root = root; }
47
- for (const child of (this as any)._customerOrderList) child.teaqlAttachRoot(root);
48
- return this;
49
- }
50
-
51
- static fromRecord(record: Record<string, unknown>, root?: EntityRoot): Customer {
52
- const entity = new Customer(record as Partial<Customer>);
53
- return root ? entity.teaqlAttachRoot(root) : entity;
54
- }
55
-
56
- isLoaded(field: string): boolean {
57
- return (this as any)._fullyLoaded || (this as any)._loadedFields.has(field);
58
- }
59
-
60
- markLoaded(...fields: string[]): this {
61
- for (const field of fields) (this as any)._loadedFields.add(field);
62
- return this;
63
- }
64
-
65
- markLoadedOnly(...fields: string[]): this {
66
- (this as any)._fullyLoaded = false;
67
- (this as any)._loadedFields = new Set(fields);
68
- return this;
69
- }
70
-
71
- static refer(id: string | number): Customer {
72
- return new Customer({ id: String(id) } as Partial<Customer>);
73
- }
74
-
75
- /** @internal Generated Runtime Module fixed-ID construction capability. */
76
- static teaqlBootstrapNew(id: string | number): Customer {
77
- return new Customer().updateId(String(id));
78
- }
79
-
80
- markForDeletion(): this {
81
- (this as any)._action = "Delete";
82
- (this as any)._root.markAsDeleted(this.teaqlEntityKey());
83
- return this;
84
- }
85
-
86
- auditAs(comment: string): this {
87
- if (!comment?.trim()) {
88
- throw new Error("Security audit failure: auditAs() requires a non-empty reason");
89
- }
90
- (this as any)._comment = comment;
91
- return this;
92
- }
93
-
94
- async save(context: UserContext): Promise<Customer> {
95
- const service = context.requireResource<TeaQLDataService>("dataService");
96
- return service.executeGraphSave(new MutationIntent((this as any)._comment), async (graph) => {
97
- this.teaqlPreflightGraph(context, service, graph);
98
- return this.teaqlSaveWithinGraph(context, service, graph);
99
- });
100
- }
101
-
102
- /** @internal Validates and fixes the complete graph before its first mutation. */
103
- teaqlPreflightGraph(context: UserContext, service: TeaQLDataService, graph: GraphMutationSession, parent?: MutationTraceScope): void {
104
- if (!parent && !(this as any)._comment?.trim()) {
105
- throw new Error("Security audit failure: auditAs() must be called before save()");
106
- }
107
- const action = (this as any)._action;
108
- if (action === "Update") {
109
- const notLoaded = [{ member: "id", canonical: "id" }, { member: "platform", canonical: "platform" }, { member: "name", canonical: "name" }, { member: "version", canonical: "version" }]
110
- .find(field => !this.isLoaded(field.member));
111
- if (notLoaded) {
112
- throw new CheckException([{
113
- ruleId: "invalid_type",
114
- location: ObjectLocation.property(notLoaded.canonical),
115
- message: "Mutation requires a fully loaded entity",
116
- }]);
117
- }
118
- }
119
- const request = graph.request({
120
- entity: "Customer", action,
121
- payload: action === "Update"
122
- ? (this as any)._root.change(this.teaqlEntityKey())
123
- : this.teaqlMutationPayload(),
124
- id: (this as any).id, version: (this as any).version,
125
- comment: (this as any)._comment,
126
- ledgerKey: this.teaqlEntityKey(), ledgerRoot: (this as any)._root,
127
- }, parent, (this as any)._comment).withLoadedSnapshot(new LoadedScalarSnapshot(this.teaqlMutationPayload()));
128
- service.preflightMutation(request);
129
- const scope = request.scopeFor(this.teaqlEntityKey());
130
- for (const [index, child] of (this as any)._customerOrderList.entries()) {
131
- child.teaqlAttachRoot((this as any)._root);
132
- child.updateCustomer(this);
133
- try { child.teaqlPreflightGraph(context, service, graph, scope); }
134
- catch (error) {
135
- if (!(error instanceof CheckException)) throw error;
136
- const prefix = ObjectLocation.property("customer_order_list").index(index);
137
- throw new CheckException(error.violations.map(violation => ({
138
- ...violation, location: violation.location.prefixedBy(prefix),
139
- })));
140
- }
141
- }
142
- }
143
-
144
- /** @internal Used by generated relation cascades inside the root graph transaction. */
145
- async teaqlSaveWithinGraph(context: UserContext, service: TeaQLDataService, graph: GraphMutationSession, parent?: MutationTraceScope): Promise<Customer> {
146
- if (!parent && !(this as any)._comment?.trim()) {
147
- throw new Error("Security audit failure: auditAs() must be called before save()");
148
- }
149
- const action = (this as any)._action;
150
- const ledgerPayload = (this as any)._root.change(this.teaqlEntityKey());
151
- const mutation = {
152
- entity: "Customer",
153
- action: (this as any)._action,
154
- payload: action === "Update" ? ledgerPayload : this.teaqlMutationPayload(),
155
- id: (this as any).id,
156
- version: (this as any).version,
157
- comment: (this as any)._comment
158
- ,ledgerKey: this.teaqlEntityKey()
159
- ,ledgerRoot: (this as any)._root
160
- };
161
- const request = graph.request(mutation, parent, (this as any)._comment)
162
- .withLoadedSnapshot(new LoadedScalarSnapshot(this.teaqlMutationPayload()));
163
- const result = await service.executeMutation(request);
164
- for (const [field, value] of Object.entries(mutation.payload as Record<string, unknown>)) {
165
- if (field !== "id" && field !== "version") (this as any)._root.set(this.teaqlEntityKey(), field, value);
166
- }
167
- if (!result.persistedRecord) {
168
- throw new Error("Mutation did not return the authoritative persisted record");
169
- }
170
- const rollbackState = {
171
- payload: this.teaqlMutationPayload(),
172
- ledgerId: (this as any)._ledgerId,
173
- action: (this as any)._action,
174
- loadedFields: new Set((this as any)._loadedFields),
175
- fullyLoaded: (this as any)._fullyLoaded,
176
- };
177
- const oldKey = this.teaqlEntityKey();
178
- Object.assign(this, result.persistedRecord);
179
- (this as any)._ledgerId = (this as any).id ?? (this as any)._ledgerId;
180
- const newKey = this.teaqlEntityKey();
181
- (this as any)._root.rekey(oldKey, newKey);
182
- service.afterGraphRollback(() => {
183
- Object.assign(this, rollbackState.payload);
184
- (this as any)._ledgerId = rollbackState.ledgerId;
185
- (this as any)._action = rollbackState.action;
186
- (this as any)._loadedFields = rollbackState.loadedFields;
187
- (this as any)._fullyLoaded = rollbackState.fullyLoaded;
188
- (this as any)._root.rekey(newKey, oldKey);
189
- });
190
- (this as any)._loadedFields = new Set(Object.keys(result.persistedRecord));
191
- (this as any)._fullyLoaded = false;
192
- if (mutation.action !== "Delete") (this as any)._action = "Update";
193
- const scope = request.scopeFor(newKey);
194
- for (const [index, child] of (this as any)._customerOrderList.entries()) {
195
- child.teaqlAttachRoot((this as any)._root);
196
- child.updateCustomer(this);
197
- try { await child.teaqlSaveWithinGraph(context, service, graph, scope); }
198
- catch (error) {
199
- if (!(error instanceof CheckException)) throw error;
200
- const prefix = ObjectLocation.property("customer_order_list").index(index);
201
- throw new CheckException(error.violations.map(violation => ({
202
- ...violation, location: violation.location.prefixedBy(prefix),
203
- })));
204
- }
205
- }
206
- service.afterGraphCommit(() => {
207
- (this as any)._root.clearEntity(newKey);
208
- if ((this as any).version !== undefined) (this as any)._root.acceptCommittedVersion(newKey, Number((this as any).version));
209
- });
210
- return this;
211
- }
212
-
213
- private teaqlMutationPayload(): Record<string, unknown> {
214
- return {
215
- "id": this.id,
216
- "platform": this.platform,
217
- "name": this.name,
218
- "version": this.version
219
- };
220
- }
221
-
222
- updateId(value: string): this {
223
- this.id = value;
224
- this.markLoaded("id");
225
- (this as any)._root.set(this.teaqlEntityKey(), "id", value);
226
- return this;
227
- }
228
-
229
- updateName(value: string): this {
230
- this.name = value;
231
- this.markLoaded("name");
232
- (this as any)._root.set(this.teaqlEntityKey(), "name", value);
233
- return this;
234
- }
235
-
236
- updateVersion(value: number): this {
237
- this.version = value;
238
- this.markLoaded("version");
239
- (this as any)._root.set(this.teaqlEntityKey(), "version", value);
240
- return this;
241
- }
242
- updatePlatform(value: any): this {
243
- this.platform = value?.id ?? value;
244
- this.markLoaded("platform");
245
- (this as any)._root.set(this.teaqlEntityKey(), "platform", this.platform);
246
- return this;
247
- }
248
-
249
- customerOrderList(): CustomerOrder[] {
250
- return (this as any)._customerOrderList;
251
- }
252
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/src/generated/models/CustomerOrder.ts DELETED
@@ -1,305 +0,0 @@
1
- import { CheckException, EntityKey, EntityRoot, GraphMutationSession, LoadedScalarSnapshot, MutationIntent, MutationTraceScope, ObjectLocation, TeaQLDataService, UserContext } from '../../teaql-ts';
2
- import { Customer } from './Customer';
3
- import { OrderStatus } from './OrderStatus';
4
- import { OrderItem } from './OrderItem';
5
-
6
- export class CustomerOrder {
7
- private static teaqlTemporaryId = 0;
8
- id?: string;
9
- customer?: Customer | string;
10
- status?: OrderStatus | string;
11
- orderNumber?: string;
12
- orderDate?: string;
13
- totalAmount?: number;
14
- version?: number;
15
-
16
- constructor(init?: Partial<CustomerOrder>) {
17
- Object.defineProperty(this, "_action", { value: init && init.id ? "Update" : "Create", writable: true, enumerable: false });
18
- Object.defineProperty(this, "_comment", { value: undefined, writable: true, enumerable: false });
19
- Object.defineProperty(this, "_fullyLoaded", { value: !init || !init.id, writable: true, enumerable: false });
20
- Object.defineProperty(this, "_loadedFields", { value: new Set(Object.keys(init || {})), writable: true, enumerable: false });
21
- Object.defineProperty(this, "_root", { value: new EntityRoot(), writable: true, enumerable: false });
22
- Object.defineProperty(this, "_ledgerId", { value: init?.id ?? --CustomerOrder.teaqlTemporaryId, writable: true, enumerable: false });
23
- Object.defineProperty(this, "_orderItemList", { value: [], writable: true, enumerable: false });
24
- if (init) {
25
- const fields: Record<string, unknown> = { ...(init as Record<string, unknown>) };
26
- delete fields["orderItemList"];
27
- Object.assign(this, fields);
28
- if ((init as any).customer && typeof (init as any).customer === "object") {
29
- this.customer = (init as any).customer instanceof Customer
30
- ? (init as any).customer
31
- : Customer.fromRecord((init as any).customer);
32
- this.markLoaded("customer");
33
- }
34
- if ((init as any).status && typeof (init as any).status === "object") {
35
- this.status = (init as any).status instanceof OrderStatus
36
- ? (init as any).status
37
- : OrderStatus.fromRecord((init as any).status);
38
- this.markLoaded("status");
39
- }
40
- if (Array.isArray((init as any).orderItemList)) {
41
- (this as any)._orderItemList = (init as any).orderItemList.map(
42
- (child: unknown) => child instanceof OrderItem
43
- ? child
44
- : OrderItem.fromRecord(child as Record<string, unknown>),
45
- );
46
- this.markLoaded("orderItemList");
47
- }
48
- }
49
- const key = this.teaqlEntityKey();
50
- if ((this as any)._action === "Create") (this as any)._root.markAsNew(key);
51
- else if ((this as any).version !== undefined) (this as any)._root.setOriginalVersion(key, Number((this as any).version));
52
- }
53
-
54
- private teaqlEntityKey(): EntityKey { return { entity: "CustomerOrder", id: (this as any)._ledgerId }; }
55
- private teaqlAttachRoot(root: EntityRoot): this {
56
- if ((this as any)._root !== root) { root.mergeFrom((this as any)._root); (this as any)._root = root; }
57
- for (const child of (this as any)._orderItemList) child.teaqlAttachRoot(root);
58
- return this;
59
- }
60
-
61
- static fromRecord(record: Record<string, unknown>, root?: EntityRoot): CustomerOrder {
62
- const entity = new CustomerOrder(record as Partial<CustomerOrder>);
63
- return root ? entity.teaqlAttachRoot(root) : entity;
64
- }
65
-
66
- isLoaded(field: string): boolean {
67
- return (this as any)._fullyLoaded || (this as any)._loadedFields.has(field);
68
- }
69
-
70
- markLoaded(...fields: string[]): this {
71
- for (const field of fields) (this as any)._loadedFields.add(field);
72
- return this;
73
- }
74
-
75
- markLoadedOnly(...fields: string[]): this {
76
- (this as any)._fullyLoaded = false;
77
- (this as any)._loadedFields = new Set(fields);
78
- return this;
79
- }
80
-
81
- static refer(id: string | number): CustomerOrder {
82
- return new CustomerOrder({ id: String(id) } as Partial<CustomerOrder>);
83
- }
84
-
85
- /** @internal Generated Runtime Module fixed-ID construction capability. */
86
- static teaqlBootstrapNew(id: string | number): CustomerOrder {
87
- return new CustomerOrder().updateId(String(id));
88
- }
89
-
90
- markForDeletion(): this {
91
- (this as any)._action = "Delete";
92
- (this as any)._root.markAsDeleted(this.teaqlEntityKey());
93
- return this;
94
- }
95
-
96
- auditAs(comment: string): this {
97
- if (!comment?.trim()) {
98
- throw new Error("Security audit failure: auditAs() requires a non-empty reason");
99
- }
100
- (this as any)._comment = comment;
101
- return this;
102
- }
103
-
104
- async save(context: UserContext): Promise<CustomerOrder> {
105
- const service = context.requireResource<TeaQLDataService>("dataService");
106
- return service.executeGraphSave(new MutationIntent((this as any)._comment), async (graph) => {
107
- this.teaqlPreflightGraph(context, service, graph);
108
- return this.teaqlSaveWithinGraph(context, service, graph);
109
- });
110
- }
111
-
112
- /** @internal Validates and fixes the complete graph before its first mutation. */
113
- teaqlPreflightGraph(context: UserContext, service: TeaQLDataService, graph: GraphMutationSession, parent?: MutationTraceScope): void {
114
- if (!parent && !(this as any)._comment?.trim()) {
115
- throw new Error("Security audit failure: auditAs() must be called before save()");
116
- }
117
- const action = (this as any)._action;
118
- if (action === "Update") {
119
- const notLoaded = [{ member: "id", canonical: "id" }, { member: "customer", canonical: "customer" }, { member: "status", canonical: "status" }, { member: "orderNumber", canonical: "order_number" }, { member: "orderDate", canonical: "order_date" }, { member: "totalAmount", canonical: "total_amount" }, { member: "version", canonical: "version" }]
120
- .find(field => !this.isLoaded(field.member));
121
- if (notLoaded) {
122
- throw new CheckException([{
123
- ruleId: "invalid_type",
124
- location: ObjectLocation.property(notLoaded.canonical),
125
- message: "Mutation requires a fully loaded entity",
126
- }]);
127
- }
128
- }
129
- const request = graph.request({
130
- entity: "CustomerOrder", action,
131
- payload: action === "Update"
132
- ? (this as any)._root.change(this.teaqlEntityKey())
133
- : this.teaqlMutationPayload(),
134
- id: (this as any).id, version: (this as any).version,
135
- comment: (this as any)._comment,
136
- ledgerKey: this.teaqlEntityKey(), ledgerRoot: (this as any)._root,
137
- }, parent, (this as any)._comment).withLoadedSnapshot(new LoadedScalarSnapshot(this.teaqlMutationPayload()));
138
- service.preflightMutation(request);
139
- const scope = request.scopeFor(this.teaqlEntityKey());
140
- for (const [index, child] of (this as any)._orderItemList.entries()) {
141
- child.teaqlAttachRoot((this as any)._root);
142
- child.updateCustomerOrder(this);
143
- try { child.teaqlPreflightGraph(context, service, graph, scope); }
144
- catch (error) {
145
- if (!(error instanceof CheckException)) throw error;
146
- const prefix = ObjectLocation.property("order_item_list").index(index);
147
- throw new CheckException(error.violations.map(violation => ({
148
- ...violation, location: violation.location.prefixedBy(prefix),
149
- })));
150
- }
151
- }
152
- }
153
-
154
- /** @internal Used by generated relation cascades inside the root graph transaction. */
155
- async teaqlSaveWithinGraph(context: UserContext, service: TeaQLDataService, graph: GraphMutationSession, parent?: MutationTraceScope): Promise<CustomerOrder> {
156
- if (!parent && !(this as any)._comment?.trim()) {
157
- throw new Error("Security audit failure: auditAs() must be called before save()");
158
- }
159
- const action = (this as any)._action;
160
- const ledgerPayload = (this as any)._root.change(this.teaqlEntityKey());
161
- const mutation = {
162
- entity: "CustomerOrder",
163
- action: (this as any)._action,
164
- payload: action === "Update" ? ledgerPayload : this.teaqlMutationPayload(),
165
- id: (this as any).id,
166
- version: (this as any).version,
167
- comment: (this as any)._comment
168
- ,ledgerKey: this.teaqlEntityKey()
169
- ,ledgerRoot: (this as any)._root
170
- };
171
- const request = graph.request(mutation, parent, (this as any)._comment)
172
- .withLoadedSnapshot(new LoadedScalarSnapshot(this.teaqlMutationPayload()));
173
- const result = await service.executeMutation(request);
174
- for (const [field, value] of Object.entries(mutation.payload as Record<string, unknown>)) {
175
- if (field !== "id" && field !== "version") (this as any)._root.set(this.teaqlEntityKey(), field, value);
176
- }
177
- if (!result.persistedRecord) {
178
- throw new Error("Mutation did not return the authoritative persisted record");
179
- }
180
- const rollbackState = {
181
- payload: this.teaqlMutationPayload(),
182
- ledgerId: (this as any)._ledgerId,
183
- action: (this as any)._action,
184
- loadedFields: new Set((this as any)._loadedFields),
185
- fullyLoaded: (this as any)._fullyLoaded,
186
- };
187
- const oldKey = this.teaqlEntityKey();
188
- Object.assign(this, result.persistedRecord);
189
- (this as any)._ledgerId = (this as any).id ?? (this as any)._ledgerId;
190
- const newKey = this.teaqlEntityKey();
191
- (this as any)._root.rekey(oldKey, newKey);
192
- service.afterGraphRollback(() => {
193
- Object.assign(this, rollbackState.payload);
194
- (this as any)._ledgerId = rollbackState.ledgerId;
195
- (this as any)._action = rollbackState.action;
196
- (this as any)._loadedFields = rollbackState.loadedFields;
197
- (this as any)._fullyLoaded = rollbackState.fullyLoaded;
198
- (this as any)._root.rekey(newKey, oldKey);
199
- });
200
- (this as any)._loadedFields = new Set(Object.keys(result.persistedRecord));
201
- (this as any)._fullyLoaded = false;
202
- if (mutation.action !== "Delete") (this as any)._action = "Update";
203
- const scope = request.scopeFor(newKey);
204
- for (const [index, child] of (this as any)._orderItemList.entries()) {
205
- child.teaqlAttachRoot((this as any)._root);
206
- child.updateCustomerOrder(this);
207
- try { await child.teaqlSaveWithinGraph(context, service, graph, scope); }
208
- catch (error) {
209
- if (!(error instanceof CheckException)) throw error;
210
- const prefix = ObjectLocation.property("order_item_list").index(index);
211
- throw new CheckException(error.violations.map(violation => ({
212
- ...violation, location: violation.location.prefixedBy(prefix),
213
- })));
214
- }
215
- }
216
- service.afterGraphCommit(() => {
217
- (this as any)._root.clearEntity(newKey);
218
- if ((this as any).version !== undefined) (this as any)._root.acceptCommittedVersion(newKey, Number((this as any).version));
219
- });
220
- return this;
221
- }
222
-
223
- private teaqlMutationPayload(): Record<string, unknown> {
224
- return {
225
- "id": this.id,
226
- "customer": this.customer,
227
- "status": this.status,
228
- "order_number": this.orderNumber,
229
- "order_date": this.orderDate,
230
- "total_amount": this.totalAmount,
231
- "version": this.version
232
- };
233
- }
234
-
235
- updateId(value: string): this {
236
- this.id = value;
237
- this.markLoaded("id");
238
- (this as any)._root.set(this.teaqlEntityKey(), "id", value);
239
- return this;
240
- }
241
-
242
- updateOrderNumber(value: string): this {
243
- this.orderNumber = value;
244
- this.markLoaded("orderNumber");
245
- (this as any)._root.set(this.teaqlEntityKey(), "order_number", value);
246
- return this;
247
- }
248
-
249
- updateOrderDate(value: string): this {
250
- this.orderDate = value;
251
- this.markLoaded("orderDate");
252
- (this as any)._root.set(this.teaqlEntityKey(), "order_date", value);
253
- return this;
254
- }
255
-
256
- updateTotalAmount(value: number): this {
257
- this.totalAmount = value;
258
- this.markLoaded("totalAmount");
259
- (this as any)._root.set(this.teaqlEntityKey(), "total_amount", value);
260
- return this;
261
- }
262
-
263
- updateVersion(value: number): this {
264
- this.version = value;
265
- this.markLoaded("version");
266
- (this as any)._root.set(this.teaqlEntityKey(), "version", value);
267
- return this;
268
- }
269
- updateCustomer(value: any): this {
270
- this.customer = value?.id ?? value;
271
- this.markLoaded("customer");
272
- (this as any)._root.set(this.teaqlEntityKey(), "customer", this.customer);
273
- return this;
274
- }
275
-
276
-
277
- updateStatus(value: any): this {
278
- this.status = value?.id ?? value;
279
- this.markLoaded("status");
280
- (this as any)._root.set(this.teaqlEntityKey(), "status", this.status);
281
- return this;
282
- }
283
- public updateStatusToNew(): CustomerOrder {
284
- this.status = "1001";
285
- this.markLoaded("status");
286
- (this as any)._root.set(this.teaqlEntityKey(), "status", this.status);
287
- return this;
288
- }
289
- public updateStatusToPaid(): CustomerOrder {
290
- this.status = "1002";
291
- this.markLoaded("status");
292
- (this as any)._root.set(this.teaqlEntityKey(), "status", this.status);
293
- return this;
294
- }
295
- public updateStatusToCancelled(): CustomerOrder {
296
- this.status = "1003";
297
- this.markLoaded("status");
298
- (this as any)._root.set(this.teaqlEntityKey(), "status", this.status);
299
- return this;
300
- }
301
-
302
- orderItemList(): OrderItem[] {
303
- return (this as any)._orderItemList;
304
- }
305
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/src/generated/models/OrderItem.ts DELETED
@@ -1,231 +0,0 @@
1
- import { CheckException, EntityKey, EntityRoot, GraphMutationSession, LoadedScalarSnapshot, MutationIntent, MutationTraceScope, ObjectLocation, TeaQLDataService, UserContext } from '../../teaql-ts';
2
- import { CustomerOrder } from './CustomerOrder';
3
-
4
- export class OrderItem {
5
- private static teaqlTemporaryId = 0;
6
- id?: string;
7
- customerOrder?: CustomerOrder | string;
8
- productName?: string;
9
- quantity?: number;
10
- unitPrice?: number;
11
- version?: number;
12
-
13
- constructor(init?: Partial<OrderItem>) {
14
- Object.defineProperty(this, "_action", { value: init && init.id ? "Update" : "Create", writable: true, enumerable: false });
15
- Object.defineProperty(this, "_comment", { value: undefined, writable: true, enumerable: false });
16
- Object.defineProperty(this, "_fullyLoaded", { value: !init || !init.id, writable: true, enumerable: false });
17
- Object.defineProperty(this, "_loadedFields", { value: new Set(Object.keys(init || {})), writable: true, enumerable: false });
18
- Object.defineProperty(this, "_root", { value: new EntityRoot(), writable: true, enumerable: false });
19
- Object.defineProperty(this, "_ledgerId", { value: init?.id ?? --OrderItem.teaqlTemporaryId, writable: true, enumerable: false });
20
- if (init) {
21
- const fields: Record<string, unknown> = { ...(init as Record<string, unknown>) };
22
- Object.assign(this, fields);
23
- if ((init as any).customerOrder && typeof (init as any).customerOrder === "object") {
24
- this.customerOrder = (init as any).customerOrder instanceof CustomerOrder
25
- ? (init as any).customerOrder
26
- : CustomerOrder.fromRecord((init as any).customerOrder);
27
- this.markLoaded("customerOrder");
28
- }
29
- }
30
- const key = this.teaqlEntityKey();
31
- if ((this as any)._action === "Create") (this as any)._root.markAsNew(key);
32
- else if ((this as any).version !== undefined) (this as any)._root.setOriginalVersion(key, Number((this as any).version));
33
- }
34
-
35
- private teaqlEntityKey(): EntityKey { return { entity: "OrderItem", id: (this as any)._ledgerId }; }
36
- private teaqlAttachRoot(root: EntityRoot): this {
37
- if ((this as any)._root !== root) { root.mergeFrom((this as any)._root); (this as any)._root = root; }
38
- return this;
39
- }
40
-
41
- static fromRecord(record: Record<string, unknown>, root?: EntityRoot): OrderItem {
42
- const entity = new OrderItem(record as Partial<OrderItem>);
43
- return root ? entity.teaqlAttachRoot(root) : entity;
44
- }
45
-
46
- isLoaded(field: string): boolean {
47
- return (this as any)._fullyLoaded || (this as any)._loadedFields.has(field);
48
- }
49
-
50
- markLoaded(...fields: string[]): this {
51
- for (const field of fields) (this as any)._loadedFields.add(field);
52
- return this;
53
- }
54
-
55
- markLoadedOnly(...fields: string[]): this {
56
- (this as any)._fullyLoaded = false;
57
- (this as any)._loadedFields = new Set(fields);
58
- return this;
59
- }
60
-
61
- static refer(id: string | number): OrderItem {
62
- return new OrderItem({ id: String(id) } as Partial<OrderItem>);
63
- }
64
-
65
- /** @internal Generated Runtime Module fixed-ID construction capability. */
66
- static teaqlBootstrapNew(id: string | number): OrderItem {
67
- return new OrderItem().updateId(String(id));
68
- }
69
-
70
- markForDeletion(): this {
71
- (this as any)._action = "Delete";
72
- (this as any)._root.markAsDeleted(this.teaqlEntityKey());
73
- return this;
74
- }
75
-
76
- auditAs(comment: string): this {
77
- if (!comment?.trim()) {
78
- throw new Error("Security audit failure: auditAs() requires a non-empty reason");
79
- }
80
- (this as any)._comment = comment;
81
- return this;
82
- }
83
-
84
- async save(context: UserContext): Promise<OrderItem> {
85
- const service = context.requireResource<TeaQLDataService>("dataService");
86
- return service.executeGraphSave(new MutationIntent((this as any)._comment), async (graph) => {
87
- this.teaqlPreflightGraph(context, service, graph);
88
- return this.teaqlSaveWithinGraph(context, service, graph);
89
- });
90
- }
91
-
92
- /** @internal Validates and fixes the complete graph before its first mutation. */
93
- teaqlPreflightGraph(context: UserContext, service: TeaQLDataService, graph: GraphMutationSession, parent?: MutationTraceScope): void {
94
- if (!parent && !(this as any)._comment?.trim()) {
95
- throw new Error("Security audit failure: auditAs() must be called before save()");
96
- }
97
- const action = (this as any)._action;
98
- if (action === "Update") {
99
- const notLoaded = [{ member: "id", canonical: "id" }, { member: "customerOrder", canonical: "customer_order" }, { member: "productName", canonical: "product_name" }, { member: "quantity", canonical: "quantity" }, { member: "unitPrice", canonical: "unit_price" }, { member: "version", canonical: "version" }]
100
- .find(field => !this.isLoaded(field.member));
101
- if (notLoaded) {
102
- throw new CheckException([{
103
- ruleId: "invalid_type",
104
- location: ObjectLocation.property(notLoaded.canonical),
105
- message: "Mutation requires a fully loaded entity",
106
- }]);
107
- }
108
- }
109
- const request = graph.request({
110
- entity: "OrderItem", action,
111
- payload: action === "Update"
112
- ? (this as any)._root.change(this.teaqlEntityKey())
113
- : this.teaqlMutationPayload(),
114
- id: (this as any).id, version: (this as any).version,
115
- comment: (this as any)._comment,
116
- ledgerKey: this.teaqlEntityKey(), ledgerRoot: (this as any)._root,
117
- }, parent, (this as any)._comment).withLoadedSnapshot(new LoadedScalarSnapshot(this.teaqlMutationPayload()));
118
- service.preflightMutation(request);
119
- const scope = request.scopeFor(this.teaqlEntityKey());
120
- }
121
-
122
- /** @internal Used by generated relation cascades inside the root graph transaction. */
123
- async teaqlSaveWithinGraph(context: UserContext, service: TeaQLDataService, graph: GraphMutationSession, parent?: MutationTraceScope): Promise<OrderItem> {
124
- if (!parent && !(this as any)._comment?.trim()) {
125
- throw new Error("Security audit failure: auditAs() must be called before save()");
126
- }
127
- const action = (this as any)._action;
128
- const ledgerPayload = (this as any)._root.change(this.teaqlEntityKey());
129
- const mutation = {
130
- entity: "OrderItem",
131
- action: (this as any)._action,
132
- payload: action === "Update" ? ledgerPayload : this.teaqlMutationPayload(),
133
- id: (this as any).id,
134
- version: (this as any).version,
135
- comment: (this as any)._comment
136
- ,ledgerKey: this.teaqlEntityKey()
137
- ,ledgerRoot: (this as any)._root
138
- };
139
- const request = graph.request(mutation, parent, (this as any)._comment)
140
- .withLoadedSnapshot(new LoadedScalarSnapshot(this.teaqlMutationPayload()));
141
- const result = await service.executeMutation(request);
142
- for (const [field, value] of Object.entries(mutation.payload as Record<string, unknown>)) {
143
- if (field !== "id" && field !== "version") (this as any)._root.set(this.teaqlEntityKey(), field, value);
144
- }
145
- if (!result.persistedRecord) {
146
- throw new Error("Mutation did not return the authoritative persisted record");
147
- }
148
- const rollbackState = {
149
- payload: this.teaqlMutationPayload(),
150
- ledgerId: (this as any)._ledgerId,
151
- action: (this as any)._action,
152
- loadedFields: new Set((this as any)._loadedFields),
153
- fullyLoaded: (this as any)._fullyLoaded,
154
- };
155
- const oldKey = this.teaqlEntityKey();
156
- Object.assign(this, result.persistedRecord);
157
- (this as any)._ledgerId = (this as any).id ?? (this as any)._ledgerId;
158
- const newKey = this.teaqlEntityKey();
159
- (this as any)._root.rekey(oldKey, newKey);
160
- service.afterGraphRollback(() => {
161
- Object.assign(this, rollbackState.payload);
162
- (this as any)._ledgerId = rollbackState.ledgerId;
163
- (this as any)._action = rollbackState.action;
164
- (this as any)._loadedFields = rollbackState.loadedFields;
165
- (this as any)._fullyLoaded = rollbackState.fullyLoaded;
166
- (this as any)._root.rekey(newKey, oldKey);
167
- });
168
- (this as any)._loadedFields = new Set(Object.keys(result.persistedRecord));
169
- (this as any)._fullyLoaded = false;
170
- if (mutation.action !== "Delete") (this as any)._action = "Update";
171
- const scope = request.scopeFor(newKey);
172
- service.afterGraphCommit(() => {
173
- (this as any)._root.clearEntity(newKey);
174
- if ((this as any).version !== undefined) (this as any)._root.acceptCommittedVersion(newKey, Number((this as any).version));
175
- });
176
- return this;
177
- }
178
-
179
- private teaqlMutationPayload(): Record<string, unknown> {
180
- return {
181
- "id": this.id,
182
- "customer_order": this.customerOrder,
183
- "product_name": this.productName,
184
- "quantity": this.quantity,
185
- "unit_price": this.unitPrice,
186
- "version": this.version
187
- };
188
- }
189
-
190
- updateId(value: string): this {
191
- this.id = value;
192
- this.markLoaded("id");
193
- (this as any)._root.set(this.teaqlEntityKey(), "id", value);
194
- return this;
195
- }
196
-
197
- updateProductName(value: string): this {
198
- this.productName = value;
199
- this.markLoaded("productName");
200
- (this as any)._root.set(this.teaqlEntityKey(), "product_name", value);
201
- return this;
202
- }
203
-
204
- updateQuantity(value: number): this {
205
- this.quantity = value;
206
- this.markLoaded("quantity");
207
- (this as any)._root.set(this.teaqlEntityKey(), "quantity", value);
208
- return this;
209
- }
210
-
211
- updateUnitPrice(value: number): this {
212
- this.unitPrice = value;
213
- this.markLoaded("unitPrice");
214
- (this as any)._root.set(this.teaqlEntityKey(), "unit_price", value);
215
- return this;
216
- }
217
-
218
- updateVersion(value: number): this {
219
- this.version = value;
220
- this.markLoaded("version");
221
- (this as any)._root.set(this.teaqlEntityKey(), "version", value);
222
- return this;
223
- }
224
- updateCustomerOrder(value: any): this {
225
- this.customerOrder = value?.id ?? value;
226
- this.markLoaded("customerOrder");
227
- (this as any)._root.set(this.teaqlEntityKey(), "customer_order", this.customerOrder);
228
- return this;
229
- }
230
-
231
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/src/generated/models/OrderStatus.ts DELETED
@@ -1,279 +0,0 @@
1
- import { CheckException, EntityKey, EntityRoot, GraphMutationSession, LoadedScalarSnapshot, MutationIntent, MutationTraceScope, ObjectLocation, TeaQLDataService, UserContext } from '../../teaql-ts';
2
- import { Platform } from './Platform';
3
- import { CustomerOrder } from './CustomerOrder';
4
-
5
- export class OrderStatus {
6
- private static teaqlTemporaryId = 0;
7
- platform?: Platform | string;
8
- id?: string;
9
- name?: string;
10
- code?: string;
11
- color?: string;
12
- displayOrder?: number;
13
- version?: number;
14
-
15
- constructor(init?: Partial<OrderStatus>) {
16
- Object.defineProperty(this, "_action", { value: init && init.id ? "Update" : "Create", writable: true, enumerable: false });
17
- Object.defineProperty(this, "_comment", { value: undefined, writable: true, enumerable: false });
18
- Object.defineProperty(this, "_fullyLoaded", { value: !init || !init.id, writable: true, enumerable: false });
19
- Object.defineProperty(this, "_loadedFields", { value: new Set(Object.keys(init || {})), writable: true, enumerable: false });
20
- Object.defineProperty(this, "_root", { value: new EntityRoot(), writable: true, enumerable: false });
21
- Object.defineProperty(this, "_ledgerId", { value: init?.id ?? --OrderStatus.teaqlTemporaryId, writable: true, enumerable: false });
22
- Object.defineProperty(this, "_customerOrderList", { value: [], writable: true, enumerable: false });
23
- if (init) {
24
- const fields: Record<string, unknown> = { ...(init as Record<string, unknown>) };
25
- delete fields["customerOrderList"];
26
- Object.assign(this, fields);
27
- if ((init as any).platform && typeof (init as any).platform === "object") {
28
- this.platform = (init as any).platform instanceof Platform
29
- ? (init as any).platform
30
- : Platform.fromRecord((init as any).platform);
31
- this.markLoaded("platform");
32
- }
33
- if (Array.isArray((init as any).customerOrderList)) {
34
- (this as any)._customerOrderList = (init as any).customerOrderList.map(
35
- (child: unknown) => child instanceof CustomerOrder
36
- ? child
37
- : CustomerOrder.fromRecord(child as Record<string, unknown>),
38
- );
39
- this.markLoaded("customerOrderList");
40
- }
41
- }
42
- const key = this.teaqlEntityKey();
43
- if ((this as any)._action === "Create") (this as any)._root.markAsNew(key);
44
- else if ((this as any).version !== undefined) (this as any)._root.setOriginalVersion(key, Number((this as any).version));
45
- }
46
-
47
- private teaqlEntityKey(): EntityKey { return { entity: "OrderStatus", id: (this as any)._ledgerId }; }
48
- private teaqlAttachRoot(root: EntityRoot): this {
49
- if ((this as any)._root !== root) { root.mergeFrom((this as any)._root); (this as any)._root = root; }
50
- for (const child of (this as any)._customerOrderList) child.teaqlAttachRoot(root);
51
- return this;
52
- }
53
-
54
- static fromRecord(record: Record<string, unknown>, root?: EntityRoot): OrderStatus {
55
- const entity = new OrderStatus(record as Partial<OrderStatus>);
56
- return root ? entity.teaqlAttachRoot(root) : entity;
57
- }
58
-
59
- isLoaded(field: string): boolean {
60
- return (this as any)._fullyLoaded || (this as any)._loadedFields.has(field);
61
- }
62
-
63
- markLoaded(...fields: string[]): this {
64
- for (const field of fields) (this as any)._loadedFields.add(field);
65
- return this;
66
- }
67
-
68
- markLoadedOnly(...fields: string[]): this {
69
- (this as any)._fullyLoaded = false;
70
- (this as any)._loadedFields = new Set(fields);
71
- return this;
72
- }
73
-
74
- static refer(id: string | number): OrderStatus {
75
- return new OrderStatus({ id: String(id) } as Partial<OrderStatus>);
76
- }
77
-
78
- /** @internal Generated Runtime Module fixed-ID construction capability. */
79
- static teaqlBootstrapNew(id: string | number): OrderStatus {
80
- return new OrderStatus().updateId(String(id));
81
- }
82
-
83
- markForDeletion(): this {
84
- (this as any)._action = "Delete";
85
- (this as any)._root.markAsDeleted(this.teaqlEntityKey());
86
- return this;
87
- }
88
-
89
- auditAs(comment: string): this {
90
- if (!comment?.trim()) {
91
- throw new Error("Security audit failure: auditAs() requires a non-empty reason");
92
- }
93
- (this as any)._comment = comment;
94
- return this;
95
- }
96
-
97
- async save(context: UserContext): Promise<OrderStatus> {
98
- const service = context.requireResource<TeaQLDataService>("dataService");
99
- return service.executeGraphSave(new MutationIntent((this as any)._comment), async (graph) => {
100
- this.teaqlPreflightGraph(context, service, graph);
101
- return this.teaqlSaveWithinGraph(context, service, graph);
102
- });
103
- }
104
-
105
- /** @internal Validates and fixes the complete graph before its first mutation. */
106
- teaqlPreflightGraph(context: UserContext, service: TeaQLDataService, graph: GraphMutationSession, parent?: MutationTraceScope): void {
107
- if (!parent && !(this as any)._comment?.trim()) {
108
- throw new Error("Security audit failure: auditAs() must be called before save()");
109
- }
110
- const action = (this as any)._action;
111
- if (action === "Update") {
112
- const notLoaded = [{ member: "platform", canonical: "platform" }, { member: "id", canonical: "id" }, { member: "name", canonical: "name" }, { member: "code", canonical: "code" }, { member: "color", canonical: "color" }, { member: "displayOrder", canonical: "display_order" }, { member: "version", canonical: "version" }]
113
- .find(field => !this.isLoaded(field.member));
114
- if (notLoaded) {
115
- throw new CheckException([{
116
- ruleId: "invalid_type",
117
- location: ObjectLocation.property(notLoaded.canonical),
118
- message: "Mutation requires a fully loaded entity",
119
- }]);
120
- }
121
- }
122
- const request = graph.request({
123
- entity: "OrderStatus", action,
124
- payload: action === "Update"
125
- ? (this as any)._root.change(this.teaqlEntityKey())
126
- : this.teaqlMutationPayload(),
127
- id: (this as any).id, version: (this as any).version,
128
- comment: (this as any)._comment,
129
- ledgerKey: this.teaqlEntityKey(), ledgerRoot: (this as any)._root,
130
- }, parent, (this as any)._comment).withLoadedSnapshot(new LoadedScalarSnapshot(this.teaqlMutationPayload()));
131
- service.preflightMutation(request);
132
- const scope = request.scopeFor(this.teaqlEntityKey());
133
- for (const [index, child] of (this as any)._customerOrderList.entries()) {
134
- child.teaqlAttachRoot((this as any)._root);
135
- child.updateStatus(this);
136
- try { child.teaqlPreflightGraph(context, service, graph, scope); }
137
- catch (error) {
138
- if (!(error instanceof CheckException)) throw error;
139
- const prefix = ObjectLocation.property("customer_order_list").index(index);
140
- throw new CheckException(error.violations.map(violation => ({
141
- ...violation, location: violation.location.prefixedBy(prefix),
142
- })));
143
- }
144
- }
145
- }
146
-
147
- /** @internal Used by generated relation cascades inside the root graph transaction. */
148
- async teaqlSaveWithinGraph(context: UserContext, service: TeaQLDataService, graph: GraphMutationSession, parent?: MutationTraceScope): Promise<OrderStatus> {
149
- if (!parent && !(this as any)._comment?.trim()) {
150
- throw new Error("Security audit failure: auditAs() must be called before save()");
151
- }
152
- const action = (this as any)._action;
153
- const ledgerPayload = (this as any)._root.change(this.teaqlEntityKey());
154
- const mutation = {
155
- entity: "OrderStatus",
156
- action: (this as any)._action,
157
- payload: action === "Update" ? ledgerPayload : this.teaqlMutationPayload(),
158
- id: (this as any).id,
159
- version: (this as any).version,
160
- comment: (this as any)._comment
161
- ,ledgerKey: this.teaqlEntityKey()
162
- ,ledgerRoot: (this as any)._root
163
- };
164
- const request = graph.request(mutation, parent, (this as any)._comment)
165
- .withLoadedSnapshot(new LoadedScalarSnapshot(this.teaqlMutationPayload()));
166
- const result = await service.executeMutation(request);
167
- for (const [field, value] of Object.entries(mutation.payload as Record<string, unknown>)) {
168
- if (field !== "id" && field !== "version") (this as any)._root.set(this.teaqlEntityKey(), field, value);
169
- }
170
- if (!result.persistedRecord) {
171
- throw new Error("Mutation did not return the authoritative persisted record");
172
- }
173
- const rollbackState = {
174
- payload: this.teaqlMutationPayload(),
175
- ledgerId: (this as any)._ledgerId,
176
- action: (this as any)._action,
177
- loadedFields: new Set((this as any)._loadedFields),
178
- fullyLoaded: (this as any)._fullyLoaded,
179
- };
180
- const oldKey = this.teaqlEntityKey();
181
- Object.assign(this, result.persistedRecord);
182
- (this as any)._ledgerId = (this as any).id ?? (this as any)._ledgerId;
183
- const newKey = this.teaqlEntityKey();
184
- (this as any)._root.rekey(oldKey, newKey);
185
- service.afterGraphRollback(() => {
186
- Object.assign(this, rollbackState.payload);
187
- (this as any)._ledgerId = rollbackState.ledgerId;
188
- (this as any)._action = rollbackState.action;
189
- (this as any)._loadedFields = rollbackState.loadedFields;
190
- (this as any)._fullyLoaded = rollbackState.fullyLoaded;
191
- (this as any)._root.rekey(newKey, oldKey);
192
- });
193
- (this as any)._loadedFields = new Set(Object.keys(result.persistedRecord));
194
- (this as any)._fullyLoaded = false;
195
- if (mutation.action !== "Delete") (this as any)._action = "Update";
196
- const scope = request.scopeFor(newKey);
197
- for (const [index, child] of (this as any)._customerOrderList.entries()) {
198
- child.teaqlAttachRoot((this as any)._root);
199
- child.updateStatus(this);
200
- try { await child.teaqlSaveWithinGraph(context, service, graph, scope); }
201
- catch (error) {
202
- if (!(error instanceof CheckException)) throw error;
203
- const prefix = ObjectLocation.property("customer_order_list").index(index);
204
- throw new CheckException(error.violations.map(violation => ({
205
- ...violation, location: violation.location.prefixedBy(prefix),
206
- })));
207
- }
208
- }
209
- service.afterGraphCommit(() => {
210
- (this as any)._root.clearEntity(newKey);
211
- if ((this as any).version !== undefined) (this as any)._root.acceptCommittedVersion(newKey, Number((this as any).version));
212
- });
213
- return this;
214
- }
215
-
216
- private teaqlMutationPayload(): Record<string, unknown> {
217
- return {
218
- "platform": this.platform,
219
- "id": this.id,
220
- "name": this.name,
221
- "code": this.code,
222
- "color": this.color,
223
- "display_order": this.displayOrder,
224
- "version": this.version
225
- };
226
- }
227
-
228
- updateId(value: string): this {
229
- this.id = value;
230
- this.markLoaded("id");
231
- (this as any)._root.set(this.teaqlEntityKey(), "id", value);
232
- return this;
233
- }
234
-
235
- updateName(value: string): this {
236
- this.name = value;
237
- this.markLoaded("name");
238
- (this as any)._root.set(this.teaqlEntityKey(), "name", value);
239
- return this;
240
- }
241
-
242
- updateCode(value: string): this {
243
- this.code = value;
244
- this.markLoaded("code");
245
- (this as any)._root.set(this.teaqlEntityKey(), "code", value);
246
- return this;
247
- }
248
-
249
- updateColor(value: string): this {
250
- this.color = value;
251
- this.markLoaded("color");
252
- (this as any)._root.set(this.teaqlEntityKey(), "color", value);
253
- return this;
254
- }
255
-
256
- updateDisplayOrder(value: number): this {
257
- this.displayOrder = value;
258
- this.markLoaded("displayOrder");
259
- (this as any)._root.set(this.teaqlEntityKey(), "display_order", value);
260
- return this;
261
- }
262
-
263
- updateVersion(value: number): this {
264
- this.version = value;
265
- this.markLoaded("version");
266
- (this as any)._root.set(this.teaqlEntityKey(), "version", value);
267
- return this;
268
- }
269
- updatePlatform(value: any): this {
270
- this.platform = value?.id ?? value;
271
- this.markLoaded("platform");
272
- (this as any)._root.set(this.teaqlEntityKey(), "platform", this.platform);
273
- return this;
274
- }
275
-
276
- customerOrderList(): CustomerOrder[] {
277
- return (this as any)._customerOrderList;
278
- }
279
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/src/generated/models/Platform.ts DELETED
@@ -1,276 +0,0 @@
1
- import { CheckException, EntityKey, EntityRoot, GraphMutationSession, LoadedScalarSnapshot, MutationIntent, MutationTraceScope, ObjectLocation, TeaQLDataService, UserContext } from '../../teaql-ts';
2
- import { OrderStatus } from './OrderStatus';
3
- import { Customer } from './Customer';
4
-
5
- export class Platform {
6
- private static teaqlTemporaryId = 0;
7
- id?: string;
8
- name?: string;
9
- version?: number;
10
-
11
- constructor(init?: Partial<Platform>) {
12
- Object.defineProperty(this, "_action", { value: init && init.id ? "Update" : "Create", writable: true, enumerable: false });
13
- Object.defineProperty(this, "_comment", { value: undefined, writable: true, enumerable: false });
14
- Object.defineProperty(this, "_fullyLoaded", { value: !init || !init.id, writable: true, enumerable: false });
15
- Object.defineProperty(this, "_loadedFields", { value: new Set(Object.keys(init || {})), writable: true, enumerable: false });
16
- Object.defineProperty(this, "_root", { value: new EntityRoot(), writable: true, enumerable: false });
17
- Object.defineProperty(this, "_ledgerId", { value: init?.id ?? --Platform.teaqlTemporaryId, writable: true, enumerable: false });
18
- Object.defineProperty(this, "_orderStatusList", { value: [], writable: true, enumerable: false });
19
- Object.defineProperty(this, "_customerList", { value: [], writable: true, enumerable: false });
20
- if (init) {
21
- const fields: Record<string, unknown> = { ...(init as Record<string, unknown>) };
22
- delete fields["orderStatusList"];
23
- delete fields["customerList"];
24
- Object.assign(this, fields);
25
- if (Array.isArray((init as any).orderStatusList)) {
26
- (this as any)._orderStatusList = (init as any).orderStatusList.map(
27
- (child: unknown) => child instanceof OrderStatus
28
- ? child
29
- : OrderStatus.fromRecord(child as Record<string, unknown>),
30
- );
31
- this.markLoaded("orderStatusList");
32
- }
33
- if (Array.isArray((init as any).customerList)) {
34
- (this as any)._customerList = (init as any).customerList.map(
35
- (child: unknown) => child instanceof Customer
36
- ? child
37
- : Customer.fromRecord(child as Record<string, unknown>),
38
- );
39
- this.markLoaded("customerList");
40
- }
41
- }
42
- const key = this.teaqlEntityKey();
43
- if ((this as any)._action === "Create") (this as any)._root.markAsNew(key);
44
- else if ((this as any).version !== undefined) (this as any)._root.setOriginalVersion(key, Number((this as any).version));
45
- }
46
-
47
- private teaqlEntityKey(): EntityKey { return { entity: "Platform", id: (this as any)._ledgerId }; }
48
- private teaqlAttachRoot(root: EntityRoot): this {
49
- if ((this as any)._root !== root) { root.mergeFrom((this as any)._root); (this as any)._root = root; }
50
- for (const child of (this as any)._orderStatusList) child.teaqlAttachRoot(root);
51
- for (const child of (this as any)._customerList) child.teaqlAttachRoot(root);
52
- return this;
53
- }
54
-
55
- static fromRecord(record: Record<string, unknown>, root?: EntityRoot): Platform {
56
- const entity = new Platform(record as Partial<Platform>);
57
- return root ? entity.teaqlAttachRoot(root) : entity;
58
- }
59
-
60
- isLoaded(field: string): boolean {
61
- return (this as any)._fullyLoaded || (this as any)._loadedFields.has(field);
62
- }
63
-
64
- markLoaded(...fields: string[]): this {
65
- for (const field of fields) (this as any)._loadedFields.add(field);
66
- return this;
67
- }
68
-
69
- markLoadedOnly(...fields: string[]): this {
70
- (this as any)._fullyLoaded = false;
71
- (this as any)._loadedFields = new Set(fields);
72
- return this;
73
- }
74
-
75
- static refer(id: string | number): Platform {
76
- return new Platform({ id: String(id) } as Partial<Platform>);
77
- }
78
-
79
- /** @internal Generated Runtime Module fixed-ID construction capability. */
80
- static teaqlBootstrapNew(id: string | number): Platform {
81
- return new Platform().updateId(String(id));
82
- }
83
-
84
- markForDeletion(): this {
85
- (this as any)._action = "Delete";
86
- (this as any)._root.markAsDeleted(this.teaqlEntityKey());
87
- return this;
88
- }
89
-
90
- auditAs(comment: string): this {
91
- if (!comment?.trim()) {
92
- throw new Error("Security audit failure: auditAs() requires a non-empty reason");
93
- }
94
- (this as any)._comment = comment;
95
- return this;
96
- }
97
-
98
- async save(context: UserContext): Promise<Platform> {
99
- const service = context.requireResource<TeaQLDataService>("dataService");
100
- return service.executeGraphSave(new MutationIntent((this as any)._comment), async (graph) => {
101
- this.teaqlPreflightGraph(context, service, graph);
102
- return this.teaqlSaveWithinGraph(context, service, graph);
103
- });
104
- }
105
-
106
- /** @internal Validates and fixes the complete graph before its first mutation. */
107
- teaqlPreflightGraph(context: UserContext, service: TeaQLDataService, graph: GraphMutationSession, parent?: MutationTraceScope): void {
108
- if (!parent && !(this as any)._comment?.trim()) {
109
- throw new Error("Security audit failure: auditAs() must be called before save()");
110
- }
111
- const action = (this as any)._action;
112
- if (action === "Update") {
113
- const notLoaded = [{ member: "id", canonical: "id" }, { member: "name", canonical: "name" }, { member: "version", canonical: "version" }]
114
- .find(field => !this.isLoaded(field.member));
115
- if (notLoaded) {
116
- throw new CheckException([{
117
- ruleId: "invalid_type",
118
- location: ObjectLocation.property(notLoaded.canonical),
119
- message: "Mutation requires a fully loaded entity",
120
- }]);
121
- }
122
- }
123
- const request = graph.request({
124
- entity: "Platform", action,
125
- payload: action === "Update"
126
- ? (this as any)._root.change(this.teaqlEntityKey())
127
- : this.teaqlMutationPayload(),
128
- id: (this as any).id, version: (this as any).version,
129
- comment: (this as any)._comment,
130
- ledgerKey: this.teaqlEntityKey(), ledgerRoot: (this as any)._root,
131
- }, parent, (this as any)._comment).withLoadedSnapshot(new LoadedScalarSnapshot(this.teaqlMutationPayload()));
132
- service.preflightMutation(request);
133
- const scope = request.scopeFor(this.teaqlEntityKey());
134
- for (const [index, child] of (this as any)._orderStatusList.entries()) {
135
- child.teaqlAttachRoot((this as any)._root);
136
- child.updatePlatform(this);
137
- try { child.teaqlPreflightGraph(context, service, graph, scope); }
138
- catch (error) {
139
- if (!(error instanceof CheckException)) throw error;
140
- const prefix = ObjectLocation.property("order_status_list").index(index);
141
- throw new CheckException(error.violations.map(violation => ({
142
- ...violation, location: violation.location.prefixedBy(prefix),
143
- })));
144
- }
145
- }
146
- for (const [index, child] of (this as any)._customerList.entries()) {
147
- child.teaqlAttachRoot((this as any)._root);
148
- child.updatePlatform(this);
149
- try { child.teaqlPreflightGraph(context, service, graph, scope); }
150
- catch (error) {
151
- if (!(error instanceof CheckException)) throw error;
152
- const prefix = ObjectLocation.property("customer_list").index(index);
153
- throw new CheckException(error.violations.map(violation => ({
154
- ...violation, location: violation.location.prefixedBy(prefix),
155
- })));
156
- }
157
- }
158
- }
159
-
160
- /** @internal Used by generated relation cascades inside the root graph transaction. */
161
- async teaqlSaveWithinGraph(context: UserContext, service: TeaQLDataService, graph: GraphMutationSession, parent?: MutationTraceScope): Promise<Platform> {
162
- if (!parent && !(this as any)._comment?.trim()) {
163
- throw new Error("Security audit failure: auditAs() must be called before save()");
164
- }
165
- const action = (this as any)._action;
166
- const ledgerPayload = (this as any)._root.change(this.teaqlEntityKey());
167
- const mutation = {
168
- entity: "Platform",
169
- action: (this as any)._action,
170
- payload: action === "Update" ? ledgerPayload : this.teaqlMutationPayload(),
171
- id: (this as any).id,
172
- version: (this as any).version,
173
- comment: (this as any)._comment
174
- ,ledgerKey: this.teaqlEntityKey()
175
- ,ledgerRoot: (this as any)._root
176
- };
177
- const request = graph.request(mutation, parent, (this as any)._comment)
178
- .withLoadedSnapshot(new LoadedScalarSnapshot(this.teaqlMutationPayload()));
179
- const result = await service.executeMutation(request);
180
- for (const [field, value] of Object.entries(mutation.payload as Record<string, unknown>)) {
181
- if (field !== "id" && field !== "version") (this as any)._root.set(this.teaqlEntityKey(), field, value);
182
- }
183
- if (!result.persistedRecord) {
184
- throw new Error("Mutation did not return the authoritative persisted record");
185
- }
186
- const rollbackState = {
187
- payload: this.teaqlMutationPayload(),
188
- ledgerId: (this as any)._ledgerId,
189
- action: (this as any)._action,
190
- loadedFields: new Set((this as any)._loadedFields),
191
- fullyLoaded: (this as any)._fullyLoaded,
192
- };
193
- const oldKey = this.teaqlEntityKey();
194
- Object.assign(this, result.persistedRecord);
195
- (this as any)._ledgerId = (this as any).id ?? (this as any)._ledgerId;
196
- const newKey = this.teaqlEntityKey();
197
- (this as any)._root.rekey(oldKey, newKey);
198
- service.afterGraphRollback(() => {
199
- Object.assign(this, rollbackState.payload);
200
- (this as any)._ledgerId = rollbackState.ledgerId;
201
- (this as any)._action = rollbackState.action;
202
- (this as any)._loadedFields = rollbackState.loadedFields;
203
- (this as any)._fullyLoaded = rollbackState.fullyLoaded;
204
- (this as any)._root.rekey(newKey, oldKey);
205
- });
206
- (this as any)._loadedFields = new Set(Object.keys(result.persistedRecord));
207
- (this as any)._fullyLoaded = false;
208
- if (mutation.action !== "Delete") (this as any)._action = "Update";
209
- const scope = request.scopeFor(newKey);
210
- for (const [index, child] of (this as any)._orderStatusList.entries()) {
211
- child.teaqlAttachRoot((this as any)._root);
212
- child.updatePlatform(this);
213
- try { await child.teaqlSaveWithinGraph(context, service, graph, scope); }
214
- catch (error) {
215
- if (!(error instanceof CheckException)) throw error;
216
- const prefix = ObjectLocation.property("order_status_list").index(index);
217
- throw new CheckException(error.violations.map(violation => ({
218
- ...violation, location: violation.location.prefixedBy(prefix),
219
- })));
220
- }
221
- }
222
- for (const [index, child] of (this as any)._customerList.entries()) {
223
- child.teaqlAttachRoot((this as any)._root);
224
- child.updatePlatform(this);
225
- try { await child.teaqlSaveWithinGraph(context, service, graph, scope); }
226
- catch (error) {
227
- if (!(error instanceof CheckException)) throw error;
228
- const prefix = ObjectLocation.property("customer_list").index(index);
229
- throw new CheckException(error.violations.map(violation => ({
230
- ...violation, location: violation.location.prefixedBy(prefix),
231
- })));
232
- }
233
- }
234
- service.afterGraphCommit(() => {
235
- (this as any)._root.clearEntity(newKey);
236
- if ((this as any).version !== undefined) (this as any)._root.acceptCommittedVersion(newKey, Number((this as any).version));
237
- });
238
- return this;
239
- }
240
-
241
- private teaqlMutationPayload(): Record<string, unknown> {
242
- return {
243
- "id": this.id,
244
- "name": this.name,
245
- "version": this.version
246
- };
247
- }
248
-
249
- updateId(value: string): this {
250
- this.id = value;
251
- this.markLoaded("id");
252
- (this as any)._root.set(this.teaqlEntityKey(), "id", value);
253
- return this;
254
- }
255
-
256
- updateName(value: string): this {
257
- this.name = value;
258
- this.markLoaded("name");
259
- (this as any)._root.set(this.teaqlEntityKey(), "name", value);
260
- return this;
261
- }
262
-
263
- updateVersion(value: number): this {
264
- this.version = value;
265
- this.markLoaded("version");
266
- (this as any)._root.set(this.teaqlEntityKey(), "version", value);
267
- return this;
268
- }
269
- orderStatusList(): OrderStatus[] {
270
- return (this as any)._orderStatusList;
271
- }
272
-
273
- customerList(): Customer[] {
274
- return (this as any)._customerList;
275
- }
276
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/src/generated/requests/CustomerOrderRequest.ts DELETED
@@ -1,1206 +0,0 @@
1
- import { EntityRoot, SelectQuery, SmartList, TeaQLDataService, TeaQLPage, UserContext, executeRelationFacets } from '../../teaql-ts';
2
- import { CustomerOrder } from '../models/CustomerOrder';
3
- import { mergeGeneratedScalarSearch, DynamicSearchWarning } from 'teaql-ts';
4
- import { GENERATED_SEARCH_MODELS } from '../../generated-search-models';
5
-
6
-
7
-
8
- export class CustomerOrderRequest {
9
- private query: SelectQuery;
10
- private filters: any[] = [];
11
- private _purpose: string | undefined;
12
- private _comment: string | undefined;
13
- private _pageCountAlias: string | undefined;
14
- private _pageCountMethod: "count" | "countAs" | undefined;
15
- private _dynamicSearchWarnings: DynamicSearchWarning[] = [];
16
-
17
- constructor(minimal = false) {
18
- this.query = new SelectQuery("CustomerOrder");
19
- this.filters.push({ version: { "$gte": 1 } });
20
- if (minimal) {
21
- this.selectId();
22
- this.selectVersion();
23
- }
24
- else this.selectSelfFields();
25
- }
26
-
27
- comment(c: string): this {
28
- this.query.comment(c);
29
- this._comment = c;
30
- return this;
31
- }
32
-
33
- filterByJson(source: unknown, warn?: (warning: DynamicSearchWarning) => void): this {
34
- const base = this.query.clone();
35
- if (this.filters.length > 0) base.filter({ "$and": this.filters });
36
- const merged = mergeGeneratedScalarSearch(base, source, GENERATED_SEARCH_MODELS, warn);
37
- this.query = merged.query as SelectQuery;
38
- this.filters = this.query.filterCondition ? [this.query.filterCondition] : [];
39
- this._dynamicSearchWarnings.push(...merged.warnings);
40
- return this;
41
- }
42
-
43
- get dynamicSearchWarnings(): readonly DynamicSearchWarning[] {
44
- return this._dynamicSearchWarnings.map(warning => ({ ...warning }));
45
- }
46
-
47
- purpose(p: string): ExecutableCustomerOrderRequest {
48
- this.query.purpose(p);
49
- this._purpose = p;
50
- return new ExecutableCustomerOrderRequest(
51
- (context) => this.executeForListInternal(context),
52
- (context) => this.executeForRowsInternal(context),
53
- (context, offset, limit) => this.executeForPageInternal(context, offset, limit),
54
- (context, chunkSize) => this.executeForStreamInternal(context, chunkSize),
55
- () => this.limit(1),
56
- (c) => this.comment(c),
57
- () => this.ensureIntent());
58
- }
59
-
60
- optimizeForContinuousPageFetch(): this {
61
- this.query.optimizeForContinuousPageFetch();
62
- return this;
63
- }
64
-
65
- optimizeForContinuousPageFetchWith(namespace: string, ttlSeconds: number): this {
66
- this.query.optimizeForContinuousPageFetchWith(namespace, ttlSeconds);
67
- return this;
68
- }
69
-
70
- optimizePaginationWithIdSet(): this {
71
- this.query.optimizePaginationWithIdSet();
72
- return this;
73
- }
74
-
75
- optimizePaginationWithIdSetConfig(namespace: string, ttlSeconds: number, maxIds: number): this {
76
- this.query.optimizePaginationWithIdSetConfig(namespace, ttlSeconds, maxIds);
77
- return this;
78
- }
79
-
80
- topNProbeParentThreshold(threshold: number): this {
81
- this.query.topNProbeParentThreshold(threshold);
82
- return this;
83
- }
84
-
85
- limit(n: number): this {
86
- this.query.limit(n);
87
- return this;
88
- }
89
-
90
- offset(n: number): this {
91
- this.query.offset(n);
92
- return this;
93
- }
94
-
95
- toQuery(): SelectQuery {
96
- if (this.filters.length > 0) {
97
- this.query.filter({ "$and": this.filters });
98
- }
99
- return this.query;
100
- }
101
-
102
- withDeletedRows(): this {
103
- this.filters = this.filters.filter(filter => !("version" in filter));
104
- return this;
105
- }
106
-
107
- deletedRowsOnly(): this {
108
- this.withDeletedRows();
109
- this.filters.push({ version: { "$lte": -1 } });
110
- return this;
111
- }
112
-
113
- selectSelfFields(): this {
114
- this.query.select(["id", "customer", "status", "orderNumber", "orderDate", "totalAmount", "version"]);
115
- return this;
116
- }
117
-
118
- selectId(): this {
119
- this.query.select(["id"]);
120
- return this;
121
- }
122
-
123
-
124
-
125
- selectOrderNumber(): this {
126
- this.query.select(["orderNumber"]);
127
- return this;
128
- }
129
-
130
- selectOrderDate(): this {
131
- this.query.select(["orderDate"]);
132
- return this;
133
- }
134
-
135
- selectTotalAmount(): this {
136
- this.query.select(["totalAmount"]);
137
- return this;
138
- }
139
-
140
- selectVersion(): this {
141
- this.query.select(["version"]);
142
- return this;
143
- }
144
-
145
-
146
- selectCustomerWith(request: { toQuery(): SelectQuery }): this {
147
- this.query.select(["customer"]);
148
- this.query.relationQuery(
149
- "customer", request.toQuery(), "customer", "id", false,
150
- { kind: "relation-select", method: "selectCustomerWith", relation: "customer" });
151
- return this;
152
- }
153
- selectStatusWith(request: { toQuery(): SelectQuery }): this {
154
- this.query.select(["status"]);
155
- this.query.relationQuery(
156
- "status", request.toQuery(), "status", "id", false,
157
- { kind: "relation-select", method: "selectStatusWith", relation: "status" });
158
- return this;
159
- }
160
-
161
- withCustomerMatching(request: { toQuery(): SelectQuery }): this {
162
- this.filters.push({
163
- "customer": {
164
- "$inSubquery": { query: request.toQuery(), field: "id" },
165
- },
166
- });
167
- return this;
168
- }
169
-
170
- withoutCustomerMatching(request: { toQuery(): SelectQuery }): this {
171
- this.filters.push({
172
- "customer": {
173
- "$notInSubquery": { query: request.toQuery(), field: "id" },
174
- },
175
- });
176
- return this;
177
- }
178
- withStatusMatching(request: { toQuery(): SelectQuery }): this {
179
- this.filters.push({
180
- "status": {
181
- "$inSubquery": { query: request.toQuery(), field: "id" },
182
- },
183
- });
184
- return this;
185
- }
186
-
187
- withoutStatusMatching(request: { toQuery(): SelectQuery }): this {
188
- this.filters.push({
189
- "status": {
190
- "$notInSubquery": { query: request.toQuery(), field: "id" },
191
- },
192
- });
193
- return this;
194
- }
195
-
196
- selectOrderItemListWith(request: { toQuery(): SelectQuery }): this {
197
- this.query.relationQuery(
198
- "orderItemList", request.toQuery(), "id", "customerOrder", true,
199
- { kind: "relation-select", method: "selectOrderItemListWith", relation: "orderItemList" });
200
- return this;
201
- }
202
-
203
- haveOrderItems(): this {
204
- return this.withOrderItemListMatching({
205
- toQuery: () => new SelectQuery("OrderItem"),
206
- });
207
- }
208
-
209
- haveNoOrderItems(): this {
210
- return this.withoutOrderItemListMatching({
211
- toQuery: () => new SelectQuery("OrderItem"),
212
- });
213
- }
214
-
215
- withOrderItemListMatching(request: { toQuery(): SelectQuery }): this {
216
- this.filters.push({
217
- "id": {
218
- "$inSubquery": {
219
- query: request.toQuery(), field: "customerOrder",
220
- },
221
- },
222
- });
223
- return this;
224
- }
225
-
226
- withoutOrderItemListMatching(request: { toQuery(): SelectQuery }): this {
227
- this.filters.push({
228
- "id": {
229
- "$notInSubquery": {
230
- query: request.toQuery(), field: "customerOrder",
231
- },
232
- },
233
- });
234
- return this;
235
- }
236
-
237
- countOrderItems(): this {
238
- return this.countOrderItemsAs("countOrderItems");
239
- }
240
-
241
- countOrderItemsAs(alias: string): this {
242
- const query = new SelectQuery("OrderItem").filter({ version: { "$gte": 1 } });
243
- this.countOrderItemsWith(alias, { toQuery: () => query });
244
- this.query.relationAggregates[this.query.relationAggregates.length - 1].operation = {
245
- kind: "relation-count", method: "countOrderItemsAs", relation: "orderItemList", alias };
246
- return this;
247
- }
248
-
249
- countOrderItemsWith(alias: string, child: { toQuery(): SelectQuery }): this {
250
- const query = child.toQuery().clone();
251
- query.aggregateItems = [];
252
- query.aggregate("Count", "id", alias);
253
- this.query.relationAggregate("orderItemList", alias, query, true,
254
- { kind: "relation-count", method: "countOrderItemsWith", relation: "orderItemList", alias });
255
- return this;
256
- }
257
-
258
- minQuantityOfOrderItems(): this {
259
- const query = new SelectQuery("OrderItem").filter({ version: { "$gte": 1 } });
260
- return this.minQuantityOfOrderItemsAs(
261
- "minOfQuantityOfOrderItems", { toQuery: () => query });
262
- }
263
-
264
- minQuantityOfOrderItemsAs(alias: string, child: { toQuery(): SelectQuery }): this {
265
- const query = child.toQuery().clone();
266
- query.aggregateItems = [];
267
- query.aggregate("min", "quantity", alias);
268
- this.query.relationAggregate("orderItemList", alias, query, true,
269
- { kind: "aggregate", method: "minQuantityOfOrderItemsAs", relation: "orderItemList", alias });
270
- return this;
271
- }
272
- maxQuantityOfOrderItems(): this {
273
- const query = new SelectQuery("OrderItem").filter({ version: { "$gte": 1 } });
274
- return this.maxQuantityOfOrderItemsAs(
275
- "maxOfQuantityOfOrderItems", { toQuery: () => query });
276
- }
277
-
278
- maxQuantityOfOrderItemsAs(alias: string, child: { toQuery(): SelectQuery }): this {
279
- const query = child.toQuery().clone();
280
- query.aggregateItems = [];
281
- query.aggregate("max", "quantity", alias);
282
- this.query.relationAggregate("orderItemList", alias, query, true,
283
- { kind: "aggregate", method: "maxQuantityOfOrderItemsAs", relation: "orderItemList", alias });
284
- return this;
285
- }
286
- sumQuantityOfOrderItems(): this {
287
- const query = new SelectQuery("OrderItem").filter({ version: { "$gte": 1 } });
288
- return this.sumQuantityOfOrderItemsAs(
289
- "sumOfQuantityOfOrderItems", { toQuery: () => query });
290
- }
291
-
292
- sumQuantityOfOrderItemsAs(alias: string, child: { toQuery(): SelectQuery }): this {
293
- const query = child.toQuery().clone();
294
- query.aggregateItems = [];
295
- query.aggregate("sum", "quantity", alias);
296
- this.query.relationAggregate("orderItemList", alias, query, true,
297
- { kind: "aggregate", method: "sumQuantityOfOrderItemsAs", relation: "orderItemList", alias });
298
- return this;
299
- }
300
- avgQuantityOfOrderItems(): this {
301
- const query = new SelectQuery("OrderItem").filter({ version: { "$gte": 1 } });
302
- return this.avgQuantityOfOrderItemsAs(
303
- "avgOfQuantityOfOrderItems", { toQuery: () => query });
304
- }
305
-
306
- avgQuantityOfOrderItemsAs(alias: string, child: { toQuery(): SelectQuery }): this {
307
- const query = child.toQuery().clone();
308
- query.aggregateItems = [];
309
- query.aggregate("avg", "quantity", alias);
310
- this.query.relationAggregate("orderItemList", alias, query, true,
311
- { kind: "aggregate", method: "avgQuantityOfOrderItemsAs", relation: "orderItemList", alias });
312
- return this;
313
- }
314
- standardDeviationQuantityOfOrderItems(): this {
315
- const query = new SelectQuery("OrderItem").filter({ version: { "$gte": 1 } });
316
- return this.standardDeviationQuantityOfOrderItemsAs(
317
- "standardDeviationOfQuantityOfOrderItems", { toQuery: () => query });
318
- }
319
-
320
- standardDeviationQuantityOfOrderItemsAs(alias: string, child: { toQuery(): SelectQuery }): this {
321
- const query = child.toQuery().clone();
322
- query.aggregateItems = [];
323
- query.aggregate("stddev", "quantity", alias);
324
- this.query.relationAggregate("orderItemList", alias, query, true,
325
- { kind: "aggregate", method: "standardDeviationQuantityOfOrderItemsAs", relation: "orderItemList", alias });
326
- return this;
327
- }
328
- squareRootOfPopulationStandardDeviationQuantityOfOrderItems(): this {
329
- const query = new SelectQuery("OrderItem").filter({ version: { "$gte": 1 } });
330
- return this.squareRootOfPopulationStandardDeviationQuantityOfOrderItemsAs(
331
- "squareRootOfPopulationStandardDeviationOfQuantityOfOrderItems", { toQuery: () => query });
332
- }
333
-
334
- squareRootOfPopulationStandardDeviationQuantityOfOrderItemsAs(alias: string, child: { toQuery(): SelectQuery }): this {
335
- const query = child.toQuery().clone();
336
- query.aggregateItems = [];
337
- query.aggregate("stddev_pop", "quantity", alias);
338
- this.query.relationAggregate("orderItemList", alias, query, true,
339
- { kind: "aggregate", method: "squareRootOfPopulationStandardDeviationQuantityOfOrderItemsAs", relation: "orderItemList", alias });
340
- return this;
341
- }
342
- sampleVarianceQuantityOfOrderItems(): this {
343
- const query = new SelectQuery("OrderItem").filter({ version: { "$gte": 1 } });
344
- return this.sampleVarianceQuantityOfOrderItemsAs(
345
- "sampleVarianceOfQuantityOfOrderItems", { toQuery: () => query });
346
- }
347
-
348
- sampleVarianceQuantityOfOrderItemsAs(alias: string, child: { toQuery(): SelectQuery }): this {
349
- const query = child.toQuery().clone();
350
- query.aggregateItems = [];
351
- query.aggregate("var_samp", "quantity", alias);
352
- this.query.relationAggregate("orderItemList", alias, query, true,
353
- { kind: "aggregate", method: "sampleVarianceQuantityOfOrderItemsAs", relation: "orderItemList", alias });
354
- return this;
355
- }
356
- samplePopulationVarianceQuantityOfOrderItems(): this {
357
- const query = new SelectQuery("OrderItem").filter({ version: { "$gte": 1 } });
358
- return this.samplePopulationVarianceQuantityOfOrderItemsAs(
359
- "samplePopulationVarianceOfQuantityOfOrderItems", { toQuery: () => query });
360
- }
361
-
362
- samplePopulationVarianceQuantityOfOrderItemsAs(alias: string, child: { toQuery(): SelectQuery }): this {
363
- const query = child.toQuery().clone();
364
- query.aggregateItems = [];
365
- query.aggregate("var_pop", "quantity", alias);
366
- this.query.relationAggregate("orderItemList", alias, query, true,
367
- { kind: "aggregate", method: "samplePopulationVarianceQuantityOfOrderItemsAs", relation: "orderItemList", alias });
368
- return this;
369
- }
370
- minUnitPriceOfOrderItems(): this {
371
- const query = new SelectQuery("OrderItem").filter({ version: { "$gte": 1 } });
372
- return this.minUnitPriceOfOrderItemsAs(
373
- "minOfUnitPriceOfOrderItems", { toQuery: () => query });
374
- }
375
-
376
- minUnitPriceOfOrderItemsAs(alias: string, child: { toQuery(): SelectQuery }): this {
377
- const query = child.toQuery().clone();
378
- query.aggregateItems = [];
379
- query.aggregate("min", "unitPrice", alias);
380
- this.query.relationAggregate("orderItemList", alias, query, true,
381
- { kind: "aggregate", method: "minUnitPriceOfOrderItemsAs", relation: "orderItemList", alias });
382
- return this;
383
- }
384
- maxUnitPriceOfOrderItems(): this {
385
- const query = new SelectQuery("OrderItem").filter({ version: { "$gte": 1 } });
386
- return this.maxUnitPriceOfOrderItemsAs(
387
- "maxOfUnitPriceOfOrderItems", { toQuery: () => query });
388
- }
389
-
390
- maxUnitPriceOfOrderItemsAs(alias: string, child: { toQuery(): SelectQuery }): this {
391
- const query = child.toQuery().clone();
392
- query.aggregateItems = [];
393
- query.aggregate("max", "unitPrice", alias);
394
- this.query.relationAggregate("orderItemList", alias, query, true,
395
- { kind: "aggregate", method: "maxUnitPriceOfOrderItemsAs", relation: "orderItemList", alias });
396
- return this;
397
- }
398
- sumUnitPriceOfOrderItems(): this {
399
- const query = new SelectQuery("OrderItem").filter({ version: { "$gte": 1 } });
400
- return this.sumUnitPriceOfOrderItemsAs(
401
- "sumOfUnitPriceOfOrderItems", { toQuery: () => query });
402
- }
403
-
404
- sumUnitPriceOfOrderItemsAs(alias: string, child: { toQuery(): SelectQuery }): this {
405
- const query = child.toQuery().clone();
406
- query.aggregateItems = [];
407
- query.aggregate("sum", "unitPrice", alias);
408
- this.query.relationAggregate("orderItemList", alias, query, true,
409
- { kind: "aggregate", method: "sumUnitPriceOfOrderItemsAs", relation: "orderItemList", alias });
410
- return this;
411
- }
412
- avgUnitPriceOfOrderItems(): this {
413
- const query = new SelectQuery("OrderItem").filter({ version: { "$gte": 1 } });
414
- return this.avgUnitPriceOfOrderItemsAs(
415
- "avgOfUnitPriceOfOrderItems", { toQuery: () => query });
416
- }
417
-
418
- avgUnitPriceOfOrderItemsAs(alias: string, child: { toQuery(): SelectQuery }): this {
419
- const query = child.toQuery().clone();
420
- query.aggregateItems = [];
421
- query.aggregate("avg", "unitPrice", alias);
422
- this.query.relationAggregate("orderItemList", alias, query, true,
423
- { kind: "aggregate", method: "avgUnitPriceOfOrderItemsAs", relation: "orderItemList", alias });
424
- return this;
425
- }
426
- standardDeviationUnitPriceOfOrderItems(): this {
427
- const query = new SelectQuery("OrderItem").filter({ version: { "$gte": 1 } });
428
- return this.standardDeviationUnitPriceOfOrderItemsAs(
429
- "standardDeviationOfUnitPriceOfOrderItems", { toQuery: () => query });
430
- }
431
-
432
- standardDeviationUnitPriceOfOrderItemsAs(alias: string, child: { toQuery(): SelectQuery }): this {
433
- const query = child.toQuery().clone();
434
- query.aggregateItems = [];
435
- query.aggregate("stddev", "unitPrice", alias);
436
- this.query.relationAggregate("orderItemList", alias, query, true,
437
- { kind: "aggregate", method: "standardDeviationUnitPriceOfOrderItemsAs", relation: "orderItemList", alias });
438
- return this;
439
- }
440
- squareRootOfPopulationStandardDeviationUnitPriceOfOrderItems(): this {
441
- const query = new SelectQuery("OrderItem").filter({ version: { "$gte": 1 } });
442
- return this.squareRootOfPopulationStandardDeviationUnitPriceOfOrderItemsAs(
443
- "squareRootOfPopulationStandardDeviationOfUnitPriceOfOrderItems", { toQuery: () => query });
444
- }
445
-
446
- squareRootOfPopulationStandardDeviationUnitPriceOfOrderItemsAs(alias: string, child: { toQuery(): SelectQuery }): this {
447
- const query = child.toQuery().clone();
448
- query.aggregateItems = [];
449
- query.aggregate("stddev_pop", "unitPrice", alias);
450
- this.query.relationAggregate("orderItemList", alias, query, true,
451
- { kind: "aggregate", method: "squareRootOfPopulationStandardDeviationUnitPriceOfOrderItemsAs", relation: "orderItemList", alias });
452
- return this;
453
- }
454
- sampleVarianceUnitPriceOfOrderItems(): this {
455
- const query = new SelectQuery("OrderItem").filter({ version: { "$gte": 1 } });
456
- return this.sampleVarianceUnitPriceOfOrderItemsAs(
457
- "sampleVarianceOfUnitPriceOfOrderItems", { toQuery: () => query });
458
- }
459
-
460
- sampleVarianceUnitPriceOfOrderItemsAs(alias: string, child: { toQuery(): SelectQuery }): this {
461
- const query = child.toQuery().clone();
462
- query.aggregateItems = [];
463
- query.aggregate("var_samp", "unitPrice", alias);
464
- this.query.relationAggregate("orderItemList", alias, query, true,
465
- { kind: "aggregate", method: "sampleVarianceUnitPriceOfOrderItemsAs", relation: "orderItemList", alias });
466
- return this;
467
- }
468
- samplePopulationVarianceUnitPriceOfOrderItems(): this {
469
- const query = new SelectQuery("OrderItem").filter({ version: { "$gte": 1 } });
470
- return this.samplePopulationVarianceUnitPriceOfOrderItemsAs(
471
- "samplePopulationVarianceOfUnitPriceOfOrderItems", { toQuery: () => query });
472
- }
473
-
474
- samplePopulationVarianceUnitPriceOfOrderItemsAs(alias: string, child: { toQuery(): SelectQuery }): this {
475
- const query = child.toQuery().clone();
476
- query.aggregateItems = [];
477
- query.aggregate("var_pop", "unitPrice", alias);
478
- this.query.relationAggregate("orderItemList", alias, query, true,
479
- { kind: "aggregate", method: "samplePopulationVarianceUnitPriceOfOrderItemsAs", relation: "orderItemList", alias });
480
- return this;
481
- }
482
-
483
- withIdIs(val: any): this {
484
- this.filters.push({ "id": { "$eq": val } });
485
- return this;
486
- }
487
-
488
- withIdIsNot(val: any): this {
489
- this.filters.push({ "id": { "$ne": val } });
490
- return this;
491
- }
492
-
493
- withIdIn(...vals: any[]): this {
494
- this.filters.push({ "id": { "$in": vals } });
495
- return this;
496
- }
497
-
498
- withIdNotIn(...vals: any[]): this {
499
- this.filters.push({ "id": { "$notIn": vals } });
500
- return this;
501
- }
502
-
503
- withIdGreaterThan(val: any): this {
504
- this.filters.push({ "id": { "$gt": val } });
505
- return this;
506
- }
507
-
508
- withIdGreaterThanOrEqualTo(val: any): this {
509
- this.filters.push({ "id": { "$gte": val } });
510
- return this;
511
- }
512
-
513
- withIdLessThan(val: any): this {
514
- this.filters.push({ "id": { "$lt": val } });
515
- return this;
516
- }
517
-
518
- withIdLessThanOrEqualTo(val: any): this {
519
- this.filters.push({ "id": { "$lte": val } });
520
- return this;
521
- }
522
-
523
- withIdBetween(lower: any, upper: any): this {
524
- this.filters.push({ "id": { "$between": [lower, upper] } });
525
- return this;
526
- }
527
-
528
- withIdIsKnown(): this {
529
- this.filters.push({ "id": { "$isNull": false } });
530
- return this;
531
- }
532
-
533
- withIdIsUnknown(): this {
534
- this.filters.push({ "id": { "$isNull": true } });
535
- return this;
536
- }
537
-
538
- filterByCustomer(val: any): this {
539
- this.filters.push({ "customer": { "$eq": val } });
540
- return this;
541
- }
542
-
543
- filterByCustomerIn(...vals: any[]): this {
544
- this.filters.push({ "customer": { "$in": vals } });
545
- return this;
546
- }
547
-
548
- withCustomerIsKnown(): this {
549
- this.filters.push({ "customer": { "$isNull": false } });
550
- return this;
551
- }
552
-
553
- withCustomerIsUnknown(): this {
554
- this.filters.push({ "customer": { "$isNull": true } });
555
- return this;
556
- }
557
-
558
- filterByStatus(val: any): this {
559
- this.filters.push({ "status": { "$eq": val } });
560
- return this;
561
- }
562
-
563
- filterByStatusIn(...vals: any[]): this {
564
- this.filters.push({ "status": { "$in": vals } });
565
- return this;
566
- }
567
-
568
- withStatusIsKnown(): this {
569
- this.filters.push({ "status": { "$isNull": false } });
570
- return this;
571
- }
572
-
573
- withStatusIsUnknown(): this {
574
- this.filters.push({ "status": { "$isNull": true } });
575
- return this;
576
- }
577
- withStatusIsNew(): this {
578
- this.filters.push({ "status": { "$eq": "1001" } });
579
- return this;
580
- }
581
- withStatusIsPaid(): this {
582
- this.filters.push({ "status": { "$eq": "1002" } });
583
- return this;
584
- }
585
- withStatusIsCancelled(): this {
586
- this.filters.push({ "status": { "$eq": "1003" } });
587
- return this;
588
- }
589
-
590
- withOrderNumberContaining(val: string): this {
591
- this.filters.push({ "orderNumber": { "$contains": val } });
592
- return this;
593
- }
594
-
595
- withOrderNumberIs(val: string): this {
596
- this.filters.push({ "orderNumber": { "$eq": val } });
597
- return this;
598
- }
599
-
600
- withOrderNumberIsNot(val: any): this {
601
- this.filters.push({ "orderNumber": { "$ne": val } });
602
- return this;
603
- }
604
-
605
- withOrderNumberIn(...vals: any[]): this {
606
- this.filters.push({ "orderNumber": { "$in": vals } });
607
- return this;
608
- }
609
-
610
- withOrderNumberNotIn(...vals: any[]): this {
611
- this.filters.push({ "orderNumber": { "$notIn": vals } });
612
- return this;
613
- }
614
-
615
- withOrderNumberGreaterThan(val: any): this {
616
- this.filters.push({ "orderNumber": { "$gt": val } });
617
- return this;
618
- }
619
-
620
- withOrderNumberGreaterThanOrEqualTo(val: any): this {
621
- this.filters.push({ "orderNumber": { "$gte": val } });
622
- return this;
623
- }
624
-
625
- withOrderNumberLessThan(val: any): this {
626
- this.filters.push({ "orderNumber": { "$lt": val } });
627
- return this;
628
- }
629
-
630
- withOrderNumberLessThanOrEqualTo(val: any): this {
631
- this.filters.push({ "orderNumber": { "$lte": val } });
632
- return this;
633
- }
634
-
635
- withOrderNumberBetween(lower: any, upper: any): this {
636
- this.filters.push({ "orderNumber": { "$between": [lower, upper] } });
637
- return this;
638
- }
639
-
640
- withOrderNumberIsKnown(): this {
641
- this.filters.push({ "orderNumber": { "$isNull": false } });
642
- return this;
643
- }
644
-
645
- withOrderNumberIsUnknown(): this {
646
- this.filters.push({ "orderNumber": { "$isNull": true } });
647
- return this;
648
- }
649
- withOrderNumberNotContaining(val: string): this {
650
- this.filters.push({ "orderNumber": { "$notContains": val } });
651
- return this;
652
- }
653
-
654
- withOrderNumberStartingWith(val: string): this {
655
- this.filters.push({ "orderNumber": { "$startsWith": val } });
656
- return this;
657
- }
658
-
659
- withOrderNumberNotStartingWith(val: string): this {
660
- this.filters.push({ "orderNumber": { "$notStartsWith": val } });
661
- return this;
662
- }
663
-
664
- withOrderNumberEndingWith(val: string): this {
665
- this.filters.push({ "orderNumber": { "$endsWith": val } });
666
- return this;
667
- }
668
-
669
- withOrderNumberNotEndingWith(val: string): this {
670
- this.filters.push({ "orderNumber": { "$notEndsWith": val } });
671
- return this;
672
- }
673
-
674
- withOrderNumberSoundingLike(val: string): this {
675
- this.filters.push({ "orderNumber": { "$soundLike": val } });
676
- return this;
677
- }
678
-
679
- withOrderDateIs(val: any): this {
680
- this.filters.push({ "orderDate": { "$eq": val } });
681
- return this;
682
- }
683
-
684
- withOrderDateIsNot(val: any): this {
685
- this.filters.push({ "orderDate": { "$ne": val } });
686
- return this;
687
- }
688
-
689
- withOrderDateIn(...vals: any[]): this {
690
- this.filters.push({ "orderDate": { "$in": vals } });
691
- return this;
692
- }
693
-
694
- withOrderDateNotIn(...vals: any[]): this {
695
- this.filters.push({ "orderDate": { "$notIn": vals } });
696
- return this;
697
- }
698
-
699
- withOrderDateGreaterThan(val: any): this {
700
- this.filters.push({ "orderDate": { "$gt": val } });
701
- return this;
702
- }
703
-
704
- withOrderDateGreaterThanOrEqualTo(val: any): this {
705
- this.filters.push({ "orderDate": { "$gte": val } });
706
- return this;
707
- }
708
-
709
- withOrderDateLessThan(val: any): this {
710
- this.filters.push({ "orderDate": { "$lt": val } });
711
- return this;
712
- }
713
-
714
- withOrderDateLessThanOrEqualTo(val: any): this {
715
- this.filters.push({ "orderDate": { "$lte": val } });
716
- return this;
717
- }
718
-
719
- withOrderDateBetween(lower: any, upper: any): this {
720
- this.filters.push({ "orderDate": { "$between": [lower, upper] } });
721
- return this;
722
- }
723
-
724
- withOrderDateIsKnown(): this {
725
- this.filters.push({ "orderDate": { "$isNull": false } });
726
- return this;
727
- }
728
-
729
- withOrderDateIsUnknown(): this {
730
- this.filters.push({ "orderDate": { "$isNull": true } });
731
- return this;
732
- }
733
-
734
- withTotalAmountIs(val: any): this {
735
- this.filters.push({ "totalAmount": { "$eq": val } });
736
- return this;
737
- }
738
-
739
- withTotalAmountIsNot(val: any): this {
740
- this.filters.push({ "totalAmount": { "$ne": val } });
741
- return this;
742
- }
743
-
744
- withTotalAmountIn(...vals: any[]): this {
745
- this.filters.push({ "totalAmount": { "$in": vals } });
746
- return this;
747
- }
748
-
749
- withTotalAmountNotIn(...vals: any[]): this {
750
- this.filters.push({ "totalAmount": { "$notIn": vals } });
751
- return this;
752
- }
753
-
754
- withTotalAmountGreaterThan(val: any): this {
755
- this.filters.push({ "totalAmount": { "$gt": val } });
756
- return this;
757
- }
758
-
759
- withTotalAmountGreaterThanOrEqualTo(val: any): this {
760
- this.filters.push({ "totalAmount": { "$gte": val } });
761
- return this;
762
- }
763
-
764
- withTotalAmountLessThan(val: any): this {
765
- this.filters.push({ "totalAmount": { "$lt": val } });
766
- return this;
767
- }
768
-
769
- withTotalAmountLessThanOrEqualTo(val: any): this {
770
- this.filters.push({ "totalAmount": { "$lte": val } });
771
- return this;
772
- }
773
-
774
- withTotalAmountBetween(lower: any, upper: any): this {
775
- this.filters.push({ "totalAmount": { "$between": [lower, upper] } });
776
- return this;
777
- }
778
-
779
- withTotalAmountIsKnown(): this {
780
- this.filters.push({ "totalAmount": { "$isNull": false } });
781
- return this;
782
- }
783
-
784
- withTotalAmountIsUnknown(): this {
785
- this.filters.push({ "totalAmount": { "$isNull": true } });
786
- return this;
787
- }
788
-
789
- withVersionIs(val: any): this {
790
- this.filters.push({ "version": { "$eq": val } });
791
- return this;
792
- }
793
-
794
- withVersionIsNot(val: any): this {
795
- this.filters.push({ "version": { "$ne": val } });
796
- return this;
797
- }
798
-
799
- withVersionIn(...vals: any[]): this {
800
- this.filters.push({ "version": { "$in": vals } });
801
- return this;
802
- }
803
-
804
- withVersionNotIn(...vals: any[]): this {
805
- this.filters.push({ "version": { "$notIn": vals } });
806
- return this;
807
- }
808
-
809
- withVersionGreaterThan(val: any): this {
810
- this.filters.push({ "version": { "$gt": val } });
811
- return this;
812
- }
813
-
814
- withVersionGreaterThanOrEqualTo(val: any): this {
815
- this.filters.push({ "version": { "$gte": val } });
816
- return this;
817
- }
818
-
819
- withVersionLessThan(val: any): this {
820
- this.filters.push({ "version": { "$lt": val } });
821
- return this;
822
- }
823
-
824
- withVersionLessThanOrEqualTo(val: any): this {
825
- this.filters.push({ "version": { "$lte": val } });
826
- return this;
827
- }
828
-
829
- withVersionBetween(lower: any, upper: any): this {
830
- this.filters.push({ "version": { "$between": [lower, upper] } });
831
- return this;
832
- }
833
-
834
- withVersionIsKnown(): this {
835
- this.filters.push({ "version": { "$isNull": false } });
836
- return this;
837
- }
838
-
839
- withVersionIsUnknown(): this {
840
- this.filters.push({ "version": { "$isNull": true } });
841
- return this;
842
- }
843
-
844
- orderByIdAscending(): this {
845
- this.query.orderBy("id", "asc");
846
- return this;
847
- }
848
-
849
- orderByIdDescending(): this {
850
- this.query.orderBy("id", "desc");
851
- return this;
852
- }
853
-
854
-
855
-
856
- orderByOrderNumberAscending(): this {
857
- this.query.orderBy("orderNumber", "asc");
858
- return this;
859
- }
860
-
861
- orderByOrderNumberDescending(): this {
862
- this.query.orderBy("orderNumber", "desc");
863
- return this;
864
- }
865
-
866
- orderByOrderDateAscending(): this {
867
- this.query.orderBy("orderDate", "asc");
868
- return this;
869
- }
870
-
871
- orderByOrderDateDescending(): this {
872
- this.query.orderBy("orderDate", "desc");
873
- return this;
874
- }
875
-
876
- orderByTotalAmountAscending(): this {
877
- this.query.orderBy("totalAmount", "asc");
878
- return this;
879
- }
880
-
881
- orderByTotalAmountDescending(): this {
882
- this.query.orderBy("totalAmount", "desc");
883
- return this;
884
- }
885
-
886
- orderByVersionAscending(): this {
887
- this.query.orderBy("version", "asc");
888
- return this;
889
- }
890
-
891
- orderByVersionDescending(): this {
892
- this.query.orderBy("version", "desc");
893
- return this;
894
- }
895
-
896
-
897
- // --- Aggregations ---
898
- count(): this {
899
- this.query.aggregate("Count", "id", "count");
900
- this._pageCountAlias = "count";
901
- this._pageCountMethod = "count";
902
- return this;
903
- }
904
-
905
- countAs(retName: string): this {
906
- this.query.aggregate("Count", "id", retName);
907
- this._pageCountAlias = retName;
908
- this._pageCountMethod = "countAs";
909
- return this;
910
- }
911
-
912
- minTotalAmount(): this {
913
- return this.minTotalAmountAs("minOfTotalAmount");
914
- }
915
-
916
- minTotalAmountAs(retName: string): this {
917
- this.query.aggregate("min", "totalAmount", retName);
918
- return this;
919
- }
920
- maxTotalAmount(): this {
921
- return this.maxTotalAmountAs("maxOfTotalAmount");
922
- }
923
-
924
- maxTotalAmountAs(retName: string): this {
925
- this.query.aggregate("max", "totalAmount", retName);
926
- return this;
927
- }
928
- sumTotalAmount(): this {
929
- return this.sumTotalAmountAs("sumOfTotalAmount");
930
- }
931
-
932
- sumTotalAmountAs(retName: string): this {
933
- this.query.aggregate("sum", "totalAmount", retName);
934
- return this;
935
- }
936
- avgTotalAmount(): this {
937
- return this.avgTotalAmountAs("avgOfTotalAmount");
938
- }
939
-
940
- avgTotalAmountAs(retName: string): this {
941
- this.query.aggregate("avg", "totalAmount", retName);
942
- return this;
943
- }
944
- standardDeviationTotalAmount(): this {
945
- return this.standardDeviationTotalAmountAs("standardDeviationOfTotalAmount");
946
- }
947
-
948
- standardDeviationTotalAmountAs(retName: string): this {
949
- this.query.aggregate("stddev", "totalAmount", retName);
950
- return this;
951
- }
952
- squareRootOfPopulationStandardDeviationTotalAmount(): this {
953
- return this.squareRootOfPopulationStandardDeviationTotalAmountAs("squareRootOfPopulationStandardDeviationOfTotalAmount");
954
- }
955
-
956
- squareRootOfPopulationStandardDeviationTotalAmountAs(retName: string): this {
957
- this.query.aggregate("stddev_pop", "totalAmount", retName);
958
- return this;
959
- }
960
- sampleVarianceTotalAmount(): this {
961
- return this.sampleVarianceTotalAmountAs("sampleVarianceOfTotalAmount");
962
- }
963
-
964
- sampleVarianceTotalAmountAs(retName: string): this {
965
- this.query.aggregate("var_samp", "totalAmount", retName);
966
- return this;
967
- }
968
- samplePopulationVarianceTotalAmount(): this {
969
- return this.samplePopulationVarianceTotalAmountAs("samplePopulationVarianceOfTotalAmount");
970
- }
971
-
972
- samplePopulationVarianceTotalAmountAs(retName: string): this {
973
- this.query.aggregate("var_pop", "totalAmount", retName);
974
- return this;
975
- }
976
-
977
- // --- Group By ---
978
- groupById(): this {
979
- this.query.groupBy("id");
980
- return this;
981
- }
982
-
983
- groupByIdAs(retName: string): this {
984
- this.query.groupBy("id"); // In TS we don't alias group by yet natively
985
- return this;
986
- }
987
- groupByCustomer(): this {
988
- this.query.groupBy("customer");
989
- return this;
990
- }
991
-
992
- groupByCustomerAs(retName: string): this {
993
- this.query.groupBy("customer"); // In TS we don't alias group by yet natively
994
- return this;
995
- }
996
- groupByStatus(): this {
997
- this.query.groupBy("status");
998
- return this;
999
- }
1000
-
1001
- groupByStatusAs(retName: string): this {
1002
- this.query.groupBy("status"); // In TS we don't alias group by yet natively
1003
- return this;
1004
- }
1005
- groupByOrderNumber(): this {
1006
- this.query.groupBy("orderNumber");
1007
- return this;
1008
- }
1009
-
1010
- groupByOrderNumberAs(retName: string): this {
1011
- this.query.groupBy("orderNumber"); // In TS we don't alias group by yet natively
1012
- return this;
1013
- }
1014
- groupByOrderDate(): this {
1015
- this.query.groupBy("orderDate");
1016
- return this;
1017
- }
1018
-
1019
- groupByOrderDateAs(retName: string): this {
1020
- this.query.groupBy("orderDate"); // In TS we don't alias group by yet natively
1021
- return this;
1022
- }
1023
- groupByTotalAmount(): this {
1024
- this.query.groupBy("totalAmount");
1025
- return this;
1026
- }
1027
-
1028
- groupByTotalAmountAs(retName: string): this {
1029
- this.query.groupBy("totalAmount"); // In TS we don't alias group by yet natively
1030
- return this;
1031
- }
1032
- groupByVersion(): this {
1033
- this.query.groupBy("version");
1034
- return this;
1035
- }
1036
-
1037
- groupByVersionAs(retName: string): this {
1038
- this.query.groupBy("version"); // In TS we don't alias group by yet natively
1039
- return this;
1040
- }
1041
-
1042
- // --- Facets ---
1043
- facetByCustomerAs(
1044
- facetName: string,
1045
- request: { toQuery(): SelectQuery },
1046
- includeAllFacets = true,
1047
- ): this {
1048
- this.query.facetBy(facetName, "customer", request, includeAllFacets,
1049
- { kind: "facet", method: "facetByCustomerAs", relation: "customer", alias: facetName });
1050
- return this;
1051
- }
1052
-
1053
- facetByStatusAs(
1054
- facetName: string,
1055
- request: { toQuery(): SelectQuery },
1056
- includeAllFacets = true,
1057
- ): this {
1058
- this.query.facetBy(facetName, "status", request, includeAllFacets,
1059
- { kind: "facet", method: "facetByStatusAs", relation: "status", alias: facetName });
1060
- return this;
1061
- }
1062
-
1063
-
1064
- private async executeForListInternal(context: UserContext): Promise<SmartList<CustomerOrder>> {
1065
- this.ensureIntent();
1066
- if (this.filters.length > 0) {
1067
- this.query.filter({ "$and": this.filters });
1068
- }
1069
-
1070
- const service = context.requireResource<TeaQLDataService>("dataService");
1071
- const rows = await service.executeQuery(context.prepareQuery(this.query));
1072
- const queryRoot = new EntityRoot();
1073
- const aggregateOnly = this.query.aggregateItems.length > 0 && this.query.groupByItems.length === 0;
1074
- const data = aggregateOnly ? [] : rows.map((row: unknown) =>
1075
- row instanceof CustomerOrder
1076
- ? row
1077
- : CustomerOrder.fromRecord(row as Record<string, unknown>, queryRoot));
1078
- const result = new SmartList<CustomerOrder>(data);
1079
- if (aggregateOnly && rows[0]) Object.assign(result.aggregations, rows[0]);
1080
-
1081
- if (this.query.facets.length > 0) {
1082
- result.facets = await executeRelationFacets(
1083
- service, (query: any) => context.prepareQuery(query), this.query, this.query.facets);
1084
- }
1085
-
1086
- return result;
1087
- }
1088
-
1089
- private async executeForRowsInternal(context: UserContext): Promise<SmartList<Record<string, unknown>>> {
1090
- this.ensureIntent();
1091
- if (this.filters.length > 0) this.query.filter({ "$and": this.filters });
1092
- const service = context.requireResource<TeaQLDataService>("dataService");
1093
- return new SmartList<Record<string, unknown>>(
1094
- await service.executeQuery(context.prepareQuery(this.query)) as Record<string, unknown>[]);
1095
- }
1096
-
1097
- private async executeForPageInternal(
1098
- context: UserContext, offset: number, limit: number,
1099
- ): Promise<TeaQLPage<CustomerOrder>> {
1100
- this.ensureIntent();
1101
- this.query.offset(offset).limit(limit);
1102
- if (this.filters.length > 0) this.query.filter({ "$and": this.filters });
1103
- const service = context.requireResource<TeaQLDataService>("dataService");
1104
- const useIdSet = this.query.localIdSetPaginationOptions() !== undefined;
1105
- const countOperation = { kind: "named-count" as const,
1106
- method: this._pageCountMethod ?? "count",
1107
- ...(this._pageCountMethod === "countAs" ? { alias: this._pageCountAlias } : {}) };
1108
- const totalCountBeforeRows = useIdSet ? undefined : await service.executeCount(
1109
- this.query, this._pageCountAlias, countOperation);
1110
- const pageQuery = this.query.clone();
1111
- // A page count describes the full filtered set, not an aggregate-only page row.
1112
- pageQuery.aggregateItems = pageQuery.aggregateItems.filter(item =>
1113
- !(String(item.function).toLowerCase() === "count" && item.alias === this._pageCountAlias));
1114
- const rows = await service.executeQuery(context.prepareQuery(pageQuery));
1115
- const totalCount = useIdSet && context.idSetPaginationCountAccuracy === "EXACT"
1116
- ? context.idSetPaginationCount!
1117
- : (totalCountBeforeRows ?? await service.executeCount(this.query, this._pageCountAlias, countOperation));
1118
- const queryRoot = new EntityRoot();
1119
- const data = new SmartList(rows.map((row: unknown) =>
1120
- row instanceof CustomerOrder
1121
- ? row
1122
- : CustomerOrder.fromRecord(row as Record<string, unknown>, queryRoot)));
1123
- data.totalCount = totalCount;
1124
- if (this._pageCountAlias !== undefined) data.aggregations[this._pageCountAlias] = totalCount;
1125
- if (this.query.facets.length > 0) {
1126
- data.facets = await executeRelationFacets(
1127
- service, (query: any) => context.prepareQuery(query), this.query, this.query.facets);
1128
- }
1129
- return { data, totalCount, offset, limit };
1130
- }
1131
-
1132
- private async *executeForStreamInternal(context: UserContext, chunkSize: number): AsyncIterable<CustomerOrder> {
1133
- this.ensureIntent();
1134
- if (this.filters.length > 0) this.query.filter({ "$and": this.filters });
1135
- const service = context.requireResource<TeaQLDataService>("dataService");
1136
- const queryRoot = new EntityRoot();
1137
- for await (const chunk of service.executeForStream(this.query, chunkSize)) {
1138
- for (const entity of chunk) {
1139
- yield entity instanceof CustomerOrder
1140
- ? entity
1141
- : CustomerOrder.fromRecord(entity as Record<string, unknown>, queryRoot);
1142
- }
1143
- }
1144
- }
1145
-
1146
- private ensureIntent(): void {
1147
- if (!this._comment?.trim()) {
1148
- throw new Error("Security audit failure: non-empty comment() is required before execution");
1149
- }
1150
- if (!this._purpose?.trim()) {
1151
- throw new Error("Security audit failure: non-empty purpose() is required before execution");
1152
- }
1153
- }
1154
-
1155
- }
1156
-
1157
- export class ExecutableCustomerOrderRequest {
1158
- constructor(
1159
- private readonly execute: (context: UserContext) => Promise<SmartList<CustomerOrder>>,
1160
- private readonly executeRows: (context: UserContext) => Promise<SmartList<Record<string, unknown>>>,
1161
- private readonly page: (
1162
- context: UserContext, offset: number, limit: number,
1163
- ) => Promise<TeaQLPage<CustomerOrder>>,
1164
- private readonly stream: (context: UserContext, chunkSize: number) => AsyncIterable<CustomerOrder>,
1165
- private readonly limitOne: () => void,
1166
- private readonly addComment: (comment: string) => void,
1167
- private readonly ensureIntent: () => void,
1168
- ) {}
1169
-
1170
- comment(c: string): this {
1171
- this.addComment(c);
1172
- return this;
1173
- }
1174
-
1175
- newEntity(context: UserContext): CustomerOrder {
1176
- this.ensureIntent();
1177
- return new CustomerOrder();
1178
- }
1179
-
1180
- executeForList(context: UserContext): Promise<SmartList<CustomerOrder>> {
1181
- this.ensureIntent();
1182
- return this.execute(context);
1183
- }
1184
-
1185
- executeForRows(context: UserContext): Promise<SmartList<Record<string, unknown>>> {
1186
- this.ensureIntent();
1187
- return this.executeRows(context);
1188
- }
1189
-
1190
- executeForPage(
1191
- context: UserContext, offset: number, limit: number,
1192
- ): Promise<TeaQLPage<CustomerOrder>> {
1193
- this.ensureIntent();
1194
- return this.page(context, offset, limit);
1195
- }
1196
-
1197
- executeForStream(context: UserContext, chunkSize = 1000): AsyncIterable<CustomerOrder> {
1198
- this.ensureIntent();
1199
- return this.stream(context, chunkSize);
1200
- }
1201
-
1202
- async executeForOne(context: UserContext): Promise<CustomerOrder | undefined> {
1203
- this.limitOne();
1204
- return (await this.executeForList(context))[0];
1205
- }
1206
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/src/generated/requests/CustomerRequest.ts DELETED
@@ -1,795 +0,0 @@
1
- import { EntityRoot, SelectQuery, SmartList, TeaQLDataService, TeaQLPage, UserContext, executeRelationFacets } from '../../teaql-ts';
2
- import { Customer } from '../models/Customer';
3
- import { mergeGeneratedScalarSearch, DynamicSearchWarning } from 'teaql-ts';
4
- import { GENERATED_SEARCH_MODELS } from '../../generated-search-models';
5
-
6
-
7
-
8
- export class CustomerRequest {
9
- private query: SelectQuery;
10
- private filters: any[] = [];
11
- private _purpose: string | undefined;
12
- private _comment: string | undefined;
13
- private _pageCountAlias: string | undefined;
14
- private _pageCountMethod: "count" | "countAs" | undefined;
15
- private _dynamicSearchWarnings: DynamicSearchWarning[] = [];
16
-
17
- constructor(minimal = false) {
18
- this.query = new SelectQuery("Customer");
19
- this.filters.push({ version: { "$gte": 1 } });
20
- if (minimal) {
21
- this.selectId();
22
- this.selectVersion();
23
- }
24
- else this.selectSelfFields();
25
- }
26
-
27
- comment(c: string): this {
28
- this.query.comment(c);
29
- this._comment = c;
30
- return this;
31
- }
32
-
33
- filterByJson(source: unknown, warn?: (warning: DynamicSearchWarning) => void): this {
34
- const base = this.query.clone();
35
- if (this.filters.length > 0) base.filter({ "$and": this.filters });
36
- const merged = mergeGeneratedScalarSearch(base, source, GENERATED_SEARCH_MODELS, warn);
37
- this.query = merged.query as SelectQuery;
38
- this.filters = this.query.filterCondition ? [this.query.filterCondition] : [];
39
- this._dynamicSearchWarnings.push(...merged.warnings);
40
- return this;
41
- }
42
-
43
- get dynamicSearchWarnings(): readonly DynamicSearchWarning[] {
44
- return this._dynamicSearchWarnings.map(warning => ({ ...warning }));
45
- }
46
-
47
- purpose(p: string): ExecutableCustomerRequest {
48
- this.query.purpose(p);
49
- this._purpose = p;
50
- return new ExecutableCustomerRequest(
51
- (context) => this.executeForListInternal(context),
52
- (context) => this.executeForRowsInternal(context),
53
- (context, offset, limit) => this.executeForPageInternal(context, offset, limit),
54
- (context, chunkSize) => this.executeForStreamInternal(context, chunkSize),
55
- () => this.limit(1),
56
- (c) => this.comment(c),
57
- () => this.ensureIntent());
58
- }
59
-
60
- optimizeForContinuousPageFetch(): this {
61
- this.query.optimizeForContinuousPageFetch();
62
- return this;
63
- }
64
-
65
- optimizeForContinuousPageFetchWith(namespace: string, ttlSeconds: number): this {
66
- this.query.optimizeForContinuousPageFetchWith(namespace, ttlSeconds);
67
- return this;
68
- }
69
-
70
- optimizePaginationWithIdSet(): this {
71
- this.query.optimizePaginationWithIdSet();
72
- return this;
73
- }
74
-
75
- optimizePaginationWithIdSetConfig(namespace: string, ttlSeconds: number, maxIds: number): this {
76
- this.query.optimizePaginationWithIdSetConfig(namespace, ttlSeconds, maxIds);
77
- return this;
78
- }
79
-
80
- topNProbeParentThreshold(threshold: number): this {
81
- this.query.topNProbeParentThreshold(threshold);
82
- return this;
83
- }
84
-
85
- limit(n: number): this {
86
- this.query.limit(n);
87
- return this;
88
- }
89
-
90
- offset(n: number): this {
91
- this.query.offset(n);
92
- return this;
93
- }
94
-
95
- toQuery(): SelectQuery {
96
- if (this.filters.length > 0) {
97
- this.query.filter({ "$and": this.filters });
98
- }
99
- return this.query;
100
- }
101
-
102
- withDeletedRows(): this {
103
- this.filters = this.filters.filter(filter => !("version" in filter));
104
- return this;
105
- }
106
-
107
- deletedRowsOnly(): this {
108
- this.withDeletedRows();
109
- this.filters.push({ version: { "$lte": -1 } });
110
- return this;
111
- }
112
-
113
- selectSelfFields(): this {
114
- this.query.select(["id", "platform", "name", "version"]);
115
- return this;
116
- }
117
-
118
- selectId(): this {
119
- this.query.select(["id"]);
120
- return this;
121
- }
122
-
123
-
124
- selectName(): this {
125
- this.query.select(["name"]);
126
- return this;
127
- }
128
-
129
- selectVersion(): this {
130
- this.query.select(["version"]);
131
- return this;
132
- }
133
-
134
-
135
- selectPlatformWith(request: { toQuery(): SelectQuery }): this {
136
- this.query.select(["platform"]);
137
- this.query.relationQuery(
138
- "platform", request.toQuery(), "platform", "id", false,
139
- { kind: "relation-select", method: "selectPlatformWith", relation: "platform" });
140
- return this;
141
- }
142
-
143
- withPlatformMatching(request: { toQuery(): SelectQuery }): this {
144
- this.filters.push({
145
- "platform": {
146
- "$inSubquery": { query: request.toQuery(), field: "id" },
147
- },
148
- });
149
- return this;
150
- }
151
-
152
- withoutPlatformMatching(request: { toQuery(): SelectQuery }): this {
153
- this.filters.push({
154
- "platform": {
155
- "$notInSubquery": { query: request.toQuery(), field: "id" },
156
- },
157
- });
158
- return this;
159
- }
160
-
161
- selectCustomerOrderListWith(request: { toQuery(): SelectQuery }): this {
162
- this.query.relationQuery(
163
- "customerOrderList", request.toQuery(), "id", "customer", true,
164
- { kind: "relation-select", method: "selectCustomerOrderListWith", relation: "customerOrderList" });
165
- return this;
166
- }
167
-
168
- haveCustomerOrders(): this {
169
- return this.withCustomerOrderListMatching({
170
- toQuery: () => new SelectQuery("CustomerOrder"),
171
- });
172
- }
173
-
174
- haveNoCustomerOrders(): this {
175
- return this.withoutCustomerOrderListMatching({
176
- toQuery: () => new SelectQuery("CustomerOrder"),
177
- });
178
- }
179
-
180
- withCustomerOrderListMatching(request: { toQuery(): SelectQuery }): this {
181
- this.filters.push({
182
- "id": {
183
- "$inSubquery": {
184
- query: request.toQuery(), field: "customer",
185
- },
186
- },
187
- });
188
- return this;
189
- }
190
-
191
- withoutCustomerOrderListMatching(request: { toQuery(): SelectQuery }): this {
192
- this.filters.push({
193
- "id": {
194
- "$notInSubquery": {
195
- query: request.toQuery(), field: "customer",
196
- },
197
- },
198
- });
199
- return this;
200
- }
201
-
202
- countCustomerOrders(): this {
203
- return this.countCustomerOrdersAs("countCustomerOrders");
204
- }
205
-
206
- countCustomerOrdersAs(alias: string): this {
207
- const query = new SelectQuery("CustomerOrder").filter({ version: { "$gte": 1 } });
208
- this.countCustomerOrdersWith(alias, { toQuery: () => query });
209
- this.query.relationAggregates[this.query.relationAggregates.length - 1].operation = {
210
- kind: "relation-count", method: "countCustomerOrdersAs", relation: "customerOrderList", alias };
211
- return this;
212
- }
213
-
214
- countCustomerOrdersWith(alias: string, child: { toQuery(): SelectQuery }): this {
215
- const query = child.toQuery().clone();
216
- query.aggregateItems = [];
217
- query.aggregate("Count", "id", alias);
218
- this.query.relationAggregate("customerOrderList", alias, query, true,
219
- { kind: "relation-count", method: "countCustomerOrdersWith", relation: "customerOrderList", alias });
220
- return this;
221
- }
222
-
223
- minTotalAmountOfCustomerOrders(): this {
224
- const query = new SelectQuery("CustomerOrder").filter({ version: { "$gte": 1 } });
225
- return this.minTotalAmountOfCustomerOrdersAs(
226
- "minOfTotalAmountOfCustomerOrders", { toQuery: () => query });
227
- }
228
-
229
- minTotalAmountOfCustomerOrdersAs(alias: string, child: { toQuery(): SelectQuery }): this {
230
- const query = child.toQuery().clone();
231
- query.aggregateItems = [];
232
- query.aggregate("min", "totalAmount", alias);
233
- this.query.relationAggregate("customerOrderList", alias, query, true,
234
- { kind: "aggregate", method: "minTotalAmountOfCustomerOrdersAs", relation: "customerOrderList", alias });
235
- return this;
236
- }
237
- maxTotalAmountOfCustomerOrders(): this {
238
- const query = new SelectQuery("CustomerOrder").filter({ version: { "$gte": 1 } });
239
- return this.maxTotalAmountOfCustomerOrdersAs(
240
- "maxOfTotalAmountOfCustomerOrders", { toQuery: () => query });
241
- }
242
-
243
- maxTotalAmountOfCustomerOrdersAs(alias: string, child: { toQuery(): SelectQuery }): this {
244
- const query = child.toQuery().clone();
245
- query.aggregateItems = [];
246
- query.aggregate("max", "totalAmount", alias);
247
- this.query.relationAggregate("customerOrderList", alias, query, true,
248
- { kind: "aggregate", method: "maxTotalAmountOfCustomerOrdersAs", relation: "customerOrderList", alias });
249
- return this;
250
- }
251
- sumTotalAmountOfCustomerOrders(): this {
252
- const query = new SelectQuery("CustomerOrder").filter({ version: { "$gte": 1 } });
253
- return this.sumTotalAmountOfCustomerOrdersAs(
254
- "sumOfTotalAmountOfCustomerOrders", { toQuery: () => query });
255
- }
256
-
257
- sumTotalAmountOfCustomerOrdersAs(alias: string, child: { toQuery(): SelectQuery }): this {
258
- const query = child.toQuery().clone();
259
- query.aggregateItems = [];
260
- query.aggregate("sum", "totalAmount", alias);
261
- this.query.relationAggregate("customerOrderList", alias, query, true,
262
- { kind: "aggregate", method: "sumTotalAmountOfCustomerOrdersAs", relation: "customerOrderList", alias });
263
- return this;
264
- }
265
- avgTotalAmountOfCustomerOrders(): this {
266
- const query = new SelectQuery("CustomerOrder").filter({ version: { "$gte": 1 } });
267
- return this.avgTotalAmountOfCustomerOrdersAs(
268
- "avgOfTotalAmountOfCustomerOrders", { toQuery: () => query });
269
- }
270
-
271
- avgTotalAmountOfCustomerOrdersAs(alias: string, child: { toQuery(): SelectQuery }): this {
272
- const query = child.toQuery().clone();
273
- query.aggregateItems = [];
274
- query.aggregate("avg", "totalAmount", alias);
275
- this.query.relationAggregate("customerOrderList", alias, query, true,
276
- { kind: "aggregate", method: "avgTotalAmountOfCustomerOrdersAs", relation: "customerOrderList", alias });
277
- return this;
278
- }
279
- standardDeviationTotalAmountOfCustomerOrders(): this {
280
- const query = new SelectQuery("CustomerOrder").filter({ version: { "$gte": 1 } });
281
- return this.standardDeviationTotalAmountOfCustomerOrdersAs(
282
- "standardDeviationOfTotalAmountOfCustomerOrders", { toQuery: () => query });
283
- }
284
-
285
- standardDeviationTotalAmountOfCustomerOrdersAs(alias: string, child: { toQuery(): SelectQuery }): this {
286
- const query = child.toQuery().clone();
287
- query.aggregateItems = [];
288
- query.aggregate("stddev", "totalAmount", alias);
289
- this.query.relationAggregate("customerOrderList", alias, query, true,
290
- { kind: "aggregate", method: "standardDeviationTotalAmountOfCustomerOrdersAs", relation: "customerOrderList", alias });
291
- return this;
292
- }
293
- squareRootOfPopulationStandardDeviationTotalAmountOfCustomerOrders(): this {
294
- const query = new SelectQuery("CustomerOrder").filter({ version: { "$gte": 1 } });
295
- return this.squareRootOfPopulationStandardDeviationTotalAmountOfCustomerOrdersAs(
296
- "squareRootOfPopulationStandardDeviationOfTotalAmountOfCustomerOrders", { toQuery: () => query });
297
- }
298
-
299
- squareRootOfPopulationStandardDeviationTotalAmountOfCustomerOrdersAs(alias: string, child: { toQuery(): SelectQuery }): this {
300
- const query = child.toQuery().clone();
301
- query.aggregateItems = [];
302
- query.aggregate("stddev_pop", "totalAmount", alias);
303
- this.query.relationAggregate("customerOrderList", alias, query, true,
304
- { kind: "aggregate", method: "squareRootOfPopulationStandardDeviationTotalAmountOfCustomerOrdersAs", relation: "customerOrderList", alias });
305
- return this;
306
- }
307
- sampleVarianceTotalAmountOfCustomerOrders(): this {
308
- const query = new SelectQuery("CustomerOrder").filter({ version: { "$gte": 1 } });
309
- return this.sampleVarianceTotalAmountOfCustomerOrdersAs(
310
- "sampleVarianceOfTotalAmountOfCustomerOrders", { toQuery: () => query });
311
- }
312
-
313
- sampleVarianceTotalAmountOfCustomerOrdersAs(alias: string, child: { toQuery(): SelectQuery }): this {
314
- const query = child.toQuery().clone();
315
- query.aggregateItems = [];
316
- query.aggregate("var_samp", "totalAmount", alias);
317
- this.query.relationAggregate("customerOrderList", alias, query, true,
318
- { kind: "aggregate", method: "sampleVarianceTotalAmountOfCustomerOrdersAs", relation: "customerOrderList", alias });
319
- return this;
320
- }
321
- samplePopulationVarianceTotalAmountOfCustomerOrders(): this {
322
- const query = new SelectQuery("CustomerOrder").filter({ version: { "$gte": 1 } });
323
- return this.samplePopulationVarianceTotalAmountOfCustomerOrdersAs(
324
- "samplePopulationVarianceOfTotalAmountOfCustomerOrders", { toQuery: () => query });
325
- }
326
-
327
- samplePopulationVarianceTotalAmountOfCustomerOrdersAs(alias: string, child: { toQuery(): SelectQuery }): this {
328
- const query = child.toQuery().clone();
329
- query.aggregateItems = [];
330
- query.aggregate("var_pop", "totalAmount", alias);
331
- this.query.relationAggregate("customerOrderList", alias, query, true,
332
- { kind: "aggregate", method: "samplePopulationVarianceTotalAmountOfCustomerOrdersAs", relation: "customerOrderList", alias });
333
- return this;
334
- }
335
-
336
- withIdIs(val: any): this {
337
- this.filters.push({ "id": { "$eq": val } });
338
- return this;
339
- }
340
-
341
- withIdIsNot(val: any): this {
342
- this.filters.push({ "id": { "$ne": val } });
343
- return this;
344
- }
345
-
346
- withIdIn(...vals: any[]): this {
347
- this.filters.push({ "id": { "$in": vals } });
348
- return this;
349
- }
350
-
351
- withIdNotIn(...vals: any[]): this {
352
- this.filters.push({ "id": { "$notIn": vals } });
353
- return this;
354
- }
355
-
356
- withIdGreaterThan(val: any): this {
357
- this.filters.push({ "id": { "$gt": val } });
358
- return this;
359
- }
360
-
361
- withIdGreaterThanOrEqualTo(val: any): this {
362
- this.filters.push({ "id": { "$gte": val } });
363
- return this;
364
- }
365
-
366
- withIdLessThan(val: any): this {
367
- this.filters.push({ "id": { "$lt": val } });
368
- return this;
369
- }
370
-
371
- withIdLessThanOrEqualTo(val: any): this {
372
- this.filters.push({ "id": { "$lte": val } });
373
- return this;
374
- }
375
-
376
- withIdBetween(lower: any, upper: any): this {
377
- this.filters.push({ "id": { "$between": [lower, upper] } });
378
- return this;
379
- }
380
-
381
- withIdIsKnown(): this {
382
- this.filters.push({ "id": { "$isNull": false } });
383
- return this;
384
- }
385
-
386
- withIdIsUnknown(): this {
387
- this.filters.push({ "id": { "$isNull": true } });
388
- return this;
389
- }
390
-
391
- filterByPlatform(val: any): this {
392
- this.filters.push({ "platform": { "$eq": val } });
393
- return this;
394
- }
395
-
396
- filterByPlatformIn(...vals: any[]): this {
397
- this.filters.push({ "platform": { "$in": vals } });
398
- return this;
399
- }
400
-
401
- withPlatformIsKnown(): this {
402
- this.filters.push({ "platform": { "$isNull": false } });
403
- return this;
404
- }
405
-
406
- withPlatformIsUnknown(): this {
407
- this.filters.push({ "platform": { "$isNull": true } });
408
- return this;
409
- }
410
-
411
- withNameContaining(val: string): this {
412
- this.filters.push({ "name": { "$contains": val } });
413
- return this;
414
- }
415
-
416
- withNameIs(val: string): this {
417
- this.filters.push({ "name": { "$eq": val } });
418
- return this;
419
- }
420
-
421
- withNameIsNot(val: any): this {
422
- this.filters.push({ "name": { "$ne": val } });
423
- return this;
424
- }
425
-
426
- withNameIn(...vals: any[]): this {
427
- this.filters.push({ "name": { "$in": vals } });
428
- return this;
429
- }
430
-
431
- withNameNotIn(...vals: any[]): this {
432
- this.filters.push({ "name": { "$notIn": vals } });
433
- return this;
434
- }
435
-
436
- withNameGreaterThan(val: any): this {
437
- this.filters.push({ "name": { "$gt": val } });
438
- return this;
439
- }
440
-
441
- withNameGreaterThanOrEqualTo(val: any): this {
442
- this.filters.push({ "name": { "$gte": val } });
443
- return this;
444
- }
445
-
446
- withNameLessThan(val: any): this {
447
- this.filters.push({ "name": { "$lt": val } });
448
- return this;
449
- }
450
-
451
- withNameLessThanOrEqualTo(val: any): this {
452
- this.filters.push({ "name": { "$lte": val } });
453
- return this;
454
- }
455
-
456
- withNameBetween(lower: any, upper: any): this {
457
- this.filters.push({ "name": { "$between": [lower, upper] } });
458
- return this;
459
- }
460
-
461
- withNameIsKnown(): this {
462
- this.filters.push({ "name": { "$isNull": false } });
463
- return this;
464
- }
465
-
466
- withNameIsUnknown(): this {
467
- this.filters.push({ "name": { "$isNull": true } });
468
- return this;
469
- }
470
- withNameNotContaining(val: string): this {
471
- this.filters.push({ "name": { "$notContains": val } });
472
- return this;
473
- }
474
-
475
- withNameStartingWith(val: string): this {
476
- this.filters.push({ "name": { "$startsWith": val } });
477
- return this;
478
- }
479
-
480
- withNameNotStartingWith(val: string): this {
481
- this.filters.push({ "name": { "$notStartsWith": val } });
482
- return this;
483
- }
484
-
485
- withNameEndingWith(val: string): this {
486
- this.filters.push({ "name": { "$endsWith": val } });
487
- return this;
488
- }
489
-
490
- withNameNotEndingWith(val: string): this {
491
- this.filters.push({ "name": { "$notEndsWith": val } });
492
- return this;
493
- }
494
-
495
- withNameSoundingLike(val: string): this {
496
- this.filters.push({ "name": { "$soundLike": val } });
497
- return this;
498
- }
499
-
500
- withVersionIs(val: any): this {
501
- this.filters.push({ "version": { "$eq": val } });
502
- return this;
503
- }
504
-
505
- withVersionIsNot(val: any): this {
506
- this.filters.push({ "version": { "$ne": val } });
507
- return this;
508
- }
509
-
510
- withVersionIn(...vals: any[]): this {
511
- this.filters.push({ "version": { "$in": vals } });
512
- return this;
513
- }
514
-
515
- withVersionNotIn(...vals: any[]): this {
516
- this.filters.push({ "version": { "$notIn": vals } });
517
- return this;
518
- }
519
-
520
- withVersionGreaterThan(val: any): this {
521
- this.filters.push({ "version": { "$gt": val } });
522
- return this;
523
- }
524
-
525
- withVersionGreaterThanOrEqualTo(val: any): this {
526
- this.filters.push({ "version": { "$gte": val } });
527
- return this;
528
- }
529
-
530
- withVersionLessThan(val: any): this {
531
- this.filters.push({ "version": { "$lt": val } });
532
- return this;
533
- }
534
-
535
- withVersionLessThanOrEqualTo(val: any): this {
536
- this.filters.push({ "version": { "$lte": val } });
537
- return this;
538
- }
539
-
540
- withVersionBetween(lower: any, upper: any): this {
541
- this.filters.push({ "version": { "$between": [lower, upper] } });
542
- return this;
543
- }
544
-
545
- withVersionIsKnown(): this {
546
- this.filters.push({ "version": { "$isNull": false } });
547
- return this;
548
- }
549
-
550
- withVersionIsUnknown(): this {
551
- this.filters.push({ "version": { "$isNull": true } });
552
- return this;
553
- }
554
-
555
- orderByIdAscending(): this {
556
- this.query.orderBy("id", "asc");
557
- return this;
558
- }
559
-
560
- orderByIdDescending(): this {
561
- this.query.orderBy("id", "desc");
562
- return this;
563
- }
564
-
565
-
566
- orderByNameAscending(): this {
567
- this.query.orderBy("name", "asc");
568
- return this;
569
- }
570
-
571
- orderByNameDescending(): this {
572
- this.query.orderBy("name", "desc");
573
- return this;
574
- }
575
-
576
- orderByVersionAscending(): this {
577
- this.query.orderBy("version", "asc");
578
- return this;
579
- }
580
-
581
- orderByVersionDescending(): this {
582
- this.query.orderBy("version", "desc");
583
- return this;
584
- }
585
-
586
-
587
- // --- Aggregations ---
588
- count(): this {
589
- this.query.aggregate("Count", "id", "count");
590
- this._pageCountAlias = "count";
591
- this._pageCountMethod = "count";
592
- return this;
593
- }
594
-
595
- countAs(retName: string): this {
596
- this.query.aggregate("Count", "id", retName);
597
- this._pageCountAlias = retName;
598
- this._pageCountMethod = "countAs";
599
- return this;
600
- }
601
-
602
-
603
- // --- Group By ---
604
- groupById(): this {
605
- this.query.groupBy("id");
606
- return this;
607
- }
608
-
609
- groupByIdAs(retName: string): this {
610
- this.query.groupBy("id"); // In TS we don't alias group by yet natively
611
- return this;
612
- }
613
- groupByPlatform(): this {
614
- this.query.groupBy("platform");
615
- return this;
616
- }
617
-
618
- groupByPlatformAs(retName: string): this {
619
- this.query.groupBy("platform"); // In TS we don't alias group by yet natively
620
- return this;
621
- }
622
- groupByName(): this {
623
- this.query.groupBy("name");
624
- return this;
625
- }
626
-
627
- groupByNameAs(retName: string): this {
628
- this.query.groupBy("name"); // In TS we don't alias group by yet natively
629
- return this;
630
- }
631
- groupByVersion(): this {
632
- this.query.groupBy("version");
633
- return this;
634
- }
635
-
636
- groupByVersionAs(retName: string): this {
637
- this.query.groupBy("version"); // In TS we don't alias group by yet natively
638
- return this;
639
- }
640
-
641
- // --- Facets ---
642
- facetByPlatformAs(
643
- facetName: string,
644
- request: { toQuery(): SelectQuery },
645
- includeAllFacets = true,
646
- ): this {
647
- this.query.facetBy(facetName, "platform", request, includeAllFacets,
648
- { kind: "facet", method: "facetByPlatformAs", relation: "platform", alias: facetName });
649
- return this;
650
- }
651
-
652
-
653
- private async executeForListInternal(context: UserContext): Promise<SmartList<Customer>> {
654
- this.ensureIntent();
655
- if (this.filters.length > 0) {
656
- this.query.filter({ "$and": this.filters });
657
- }
658
-
659
- const service = context.requireResource<TeaQLDataService>("dataService");
660
- const rows = await service.executeQuery(context.prepareQuery(this.query));
661
- const queryRoot = new EntityRoot();
662
- const aggregateOnly = this.query.aggregateItems.length > 0 && this.query.groupByItems.length === 0;
663
- const data = aggregateOnly ? [] : rows.map((row: unknown) =>
664
- row instanceof Customer
665
- ? row
666
- : Customer.fromRecord(row as Record<string, unknown>, queryRoot));
667
- const result = new SmartList<Customer>(data);
668
- if (aggregateOnly && rows[0]) Object.assign(result.aggregations, rows[0]);
669
-
670
- if (this.query.facets.length > 0) {
671
- result.facets = await executeRelationFacets(
672
- service, (query: any) => context.prepareQuery(query), this.query, this.query.facets);
673
- }
674
-
675
- return result;
676
- }
677
-
678
- private async executeForRowsInternal(context: UserContext): Promise<SmartList<Record<string, unknown>>> {
679
- this.ensureIntent();
680
- if (this.filters.length > 0) this.query.filter({ "$and": this.filters });
681
- const service = context.requireResource<TeaQLDataService>("dataService");
682
- return new SmartList<Record<string, unknown>>(
683
- await service.executeQuery(context.prepareQuery(this.query)) as Record<string, unknown>[]);
684
- }
685
-
686
- private async executeForPageInternal(
687
- context: UserContext, offset: number, limit: number,
688
- ): Promise<TeaQLPage<Customer>> {
689
- this.ensureIntent();
690
- this.query.offset(offset).limit(limit);
691
- if (this.filters.length > 0) this.query.filter({ "$and": this.filters });
692
- const service = context.requireResource<TeaQLDataService>("dataService");
693
- const useIdSet = this.query.localIdSetPaginationOptions() !== undefined;
694
- const countOperation = { kind: "named-count" as const,
695
- method: this._pageCountMethod ?? "count",
696
- ...(this._pageCountMethod === "countAs" ? { alias: this._pageCountAlias } : {}) };
697
- const totalCountBeforeRows = useIdSet ? undefined : await service.executeCount(
698
- this.query, this._pageCountAlias, countOperation);
699
- const pageQuery = this.query.clone();
700
- // A page count describes the full filtered set, not an aggregate-only page row.
701
- pageQuery.aggregateItems = pageQuery.aggregateItems.filter(item =>
702
- !(String(item.function).toLowerCase() === "count" && item.alias === this._pageCountAlias));
703
- const rows = await service.executeQuery(context.prepareQuery(pageQuery));
704
- const totalCount = useIdSet && context.idSetPaginationCountAccuracy === "EXACT"
705
- ? context.idSetPaginationCount!
706
- : (totalCountBeforeRows ?? await service.executeCount(this.query, this._pageCountAlias, countOperation));
707
- const queryRoot = new EntityRoot();
708
- const data = new SmartList(rows.map((row: unknown) =>
709
- row instanceof Customer
710
- ? row
711
- : Customer.fromRecord(row as Record<string, unknown>, queryRoot)));
712
- data.totalCount = totalCount;
713
- if (this._pageCountAlias !== undefined) data.aggregations[this._pageCountAlias] = totalCount;
714
- if (this.query.facets.length > 0) {
715
- data.facets = await executeRelationFacets(
716
- service, (query: any) => context.prepareQuery(query), this.query, this.query.facets);
717
- }
718
- return { data, totalCount, offset, limit };
719
- }
720
-
721
- private async *executeForStreamInternal(context: UserContext, chunkSize: number): AsyncIterable<Customer> {
722
- this.ensureIntent();
723
- if (this.filters.length > 0) this.query.filter({ "$and": this.filters });
724
- const service = context.requireResource<TeaQLDataService>("dataService");
725
- const queryRoot = new EntityRoot();
726
- for await (const chunk of service.executeForStream(this.query, chunkSize)) {
727
- for (const entity of chunk) {
728
- yield entity instanceof Customer
729
- ? entity
730
- : Customer.fromRecord(entity as Record<string, unknown>, queryRoot);
731
- }
732
- }
733
- }
734
-
735
- private ensureIntent(): void {
736
- if (!this._comment?.trim()) {
737
- throw new Error("Security audit failure: non-empty comment() is required before execution");
738
- }
739
- if (!this._purpose?.trim()) {
740
- throw new Error("Security audit failure: non-empty purpose() is required before execution");
741
- }
742
- }
743
-
744
- }
745
-
746
- export class ExecutableCustomerRequest {
747
- constructor(
748
- private readonly execute: (context: UserContext) => Promise<SmartList<Customer>>,
749
- private readonly executeRows: (context: UserContext) => Promise<SmartList<Record<string, unknown>>>,
750
- private readonly page: (
751
- context: UserContext, offset: number, limit: number,
752
- ) => Promise<TeaQLPage<Customer>>,
753
- private readonly stream: (context: UserContext, chunkSize: number) => AsyncIterable<Customer>,
754
- private readonly limitOne: () => void,
755
- private readonly addComment: (comment: string) => void,
756
- private readonly ensureIntent: () => void,
757
- ) {}
758
-
759
- comment(c: string): this {
760
- this.addComment(c);
761
- return this;
762
- }
763
-
764
- newEntity(context: UserContext): Customer {
765
- this.ensureIntent();
766
- return new Customer();
767
- }
768
-
769
- executeForList(context: UserContext): Promise<SmartList<Customer>> {
770
- this.ensureIntent();
771
- return this.execute(context);
772
- }
773
-
774
- executeForRows(context: UserContext): Promise<SmartList<Record<string, unknown>>> {
775
- this.ensureIntent();
776
- return this.executeRows(context);
777
- }
778
-
779
- executeForPage(
780
- context: UserContext, offset: number, limit: number,
781
- ): Promise<TeaQLPage<Customer>> {
782
- this.ensureIntent();
783
- return this.page(context, offset, limit);
784
- }
785
-
786
- executeForStream(context: UserContext, chunkSize = 1000): AsyncIterable<Customer> {
787
- this.ensureIntent();
788
- return this.stream(context, chunkSize);
789
- }
790
-
791
- async executeForOne(context: UserContext): Promise<Customer | undefined> {
792
- this.limitOne();
793
- return (await this.executeForList(context))[0];
794
- }
795
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/src/generated/requests/OrderItemRequest.ts DELETED
@@ -1,909 +0,0 @@
1
- import { EntityRoot, SelectQuery, SmartList, TeaQLDataService, TeaQLPage, UserContext, executeRelationFacets } from '../../teaql-ts';
2
- import { OrderItem } from '../models/OrderItem';
3
- import { mergeGeneratedScalarSearch, DynamicSearchWarning } from 'teaql-ts';
4
- import { GENERATED_SEARCH_MODELS } from '../../generated-search-models';
5
-
6
-
7
-
8
- export class OrderItemRequest {
9
- private query: SelectQuery;
10
- private filters: any[] = [];
11
- private _purpose: string | undefined;
12
- private _comment: string | undefined;
13
- private _pageCountAlias: string | undefined;
14
- private _pageCountMethod: "count" | "countAs" | undefined;
15
- private _dynamicSearchWarnings: DynamicSearchWarning[] = [];
16
-
17
- constructor(minimal = false) {
18
- this.query = new SelectQuery("OrderItem");
19
- this.filters.push({ version: { "$gte": 1 } });
20
- if (minimal) {
21
- this.selectId();
22
- this.selectVersion();
23
- }
24
- else this.selectSelfFields();
25
- }
26
-
27
- comment(c: string): this {
28
- this.query.comment(c);
29
- this._comment = c;
30
- return this;
31
- }
32
-
33
- filterByJson(source: unknown, warn?: (warning: DynamicSearchWarning) => void): this {
34
- const base = this.query.clone();
35
- if (this.filters.length > 0) base.filter({ "$and": this.filters });
36
- const merged = mergeGeneratedScalarSearch(base, source, GENERATED_SEARCH_MODELS, warn);
37
- this.query = merged.query as SelectQuery;
38
- this.filters = this.query.filterCondition ? [this.query.filterCondition] : [];
39
- this._dynamicSearchWarnings.push(...merged.warnings);
40
- return this;
41
- }
42
-
43
- get dynamicSearchWarnings(): readonly DynamicSearchWarning[] {
44
- return this._dynamicSearchWarnings.map(warning => ({ ...warning }));
45
- }
46
-
47
- purpose(p: string): ExecutableOrderItemRequest {
48
- this.query.purpose(p);
49
- this._purpose = p;
50
- return new ExecutableOrderItemRequest(
51
- (context) => this.executeForListInternal(context),
52
- (context) => this.executeForRowsInternal(context),
53
- (context, offset, limit) => this.executeForPageInternal(context, offset, limit),
54
- (context, chunkSize) => this.executeForStreamInternal(context, chunkSize),
55
- () => this.limit(1),
56
- (c) => this.comment(c),
57
- () => this.ensureIntent());
58
- }
59
-
60
- optimizeForContinuousPageFetch(): this {
61
- this.query.optimizeForContinuousPageFetch();
62
- return this;
63
- }
64
-
65
- optimizeForContinuousPageFetchWith(namespace: string, ttlSeconds: number): this {
66
- this.query.optimizeForContinuousPageFetchWith(namespace, ttlSeconds);
67
- return this;
68
- }
69
-
70
- optimizePaginationWithIdSet(): this {
71
- this.query.optimizePaginationWithIdSet();
72
- return this;
73
- }
74
-
75
- optimizePaginationWithIdSetConfig(namespace: string, ttlSeconds: number, maxIds: number): this {
76
- this.query.optimizePaginationWithIdSetConfig(namespace, ttlSeconds, maxIds);
77
- return this;
78
- }
79
-
80
- topNProbeParentThreshold(threshold: number): this {
81
- this.query.topNProbeParentThreshold(threshold);
82
- return this;
83
- }
84
-
85
- limit(n: number): this {
86
- this.query.limit(n);
87
- return this;
88
- }
89
-
90
- offset(n: number): this {
91
- this.query.offset(n);
92
- return this;
93
- }
94
-
95
- toQuery(): SelectQuery {
96
- if (this.filters.length > 0) {
97
- this.query.filter({ "$and": this.filters });
98
- }
99
- return this.query;
100
- }
101
-
102
- withDeletedRows(): this {
103
- this.filters = this.filters.filter(filter => !("version" in filter));
104
- return this;
105
- }
106
-
107
- deletedRowsOnly(): this {
108
- this.withDeletedRows();
109
- this.filters.push({ version: { "$lte": -1 } });
110
- return this;
111
- }
112
-
113
- selectSelfFields(): this {
114
- this.query.select(["id", "customerOrder", "productName", "quantity", "unitPrice", "version"]);
115
- return this;
116
- }
117
-
118
- selectId(): this {
119
- this.query.select(["id"]);
120
- return this;
121
- }
122
-
123
-
124
- selectProductName(): this {
125
- this.query.select(["productName"]);
126
- return this;
127
- }
128
-
129
- selectQuantity(): this {
130
- this.query.select(["quantity"]);
131
- return this;
132
- }
133
-
134
- selectUnitPrice(): this {
135
- this.query.select(["unitPrice"]);
136
- return this;
137
- }
138
-
139
- selectVersion(): this {
140
- this.query.select(["version"]);
141
- return this;
142
- }
143
-
144
-
145
- selectCustomerOrderWith(request: { toQuery(): SelectQuery }): this {
146
- this.query.select(["customerOrder"]);
147
- this.query.relationQuery(
148
- "customerOrder", request.toQuery(), "customerOrder", "id", false,
149
- { kind: "relation-select", method: "selectCustomerOrderWith", relation: "customerOrder" });
150
- return this;
151
- }
152
-
153
- withCustomerOrderMatching(request: { toQuery(): SelectQuery }): this {
154
- this.filters.push({
155
- "customerOrder": {
156
- "$inSubquery": { query: request.toQuery(), field: "id" },
157
- },
158
- });
159
- return this;
160
- }
161
-
162
- withoutCustomerOrderMatching(request: { toQuery(): SelectQuery }): this {
163
- this.filters.push({
164
- "customerOrder": {
165
- "$notInSubquery": { query: request.toQuery(), field: "id" },
166
- },
167
- });
168
- return this;
169
- }
170
-
171
-
172
-
173
-
174
- withIdIs(val: any): this {
175
- this.filters.push({ "id": { "$eq": val } });
176
- return this;
177
- }
178
-
179
- withIdIsNot(val: any): this {
180
- this.filters.push({ "id": { "$ne": val } });
181
- return this;
182
- }
183
-
184
- withIdIn(...vals: any[]): this {
185
- this.filters.push({ "id": { "$in": vals } });
186
- return this;
187
- }
188
-
189
- withIdNotIn(...vals: any[]): this {
190
- this.filters.push({ "id": { "$notIn": vals } });
191
- return this;
192
- }
193
-
194
- withIdGreaterThan(val: any): this {
195
- this.filters.push({ "id": { "$gt": val } });
196
- return this;
197
- }
198
-
199
- withIdGreaterThanOrEqualTo(val: any): this {
200
- this.filters.push({ "id": { "$gte": val } });
201
- return this;
202
- }
203
-
204
- withIdLessThan(val: any): this {
205
- this.filters.push({ "id": { "$lt": val } });
206
- return this;
207
- }
208
-
209
- withIdLessThanOrEqualTo(val: any): this {
210
- this.filters.push({ "id": { "$lte": val } });
211
- return this;
212
- }
213
-
214
- withIdBetween(lower: any, upper: any): this {
215
- this.filters.push({ "id": { "$between": [lower, upper] } });
216
- return this;
217
- }
218
-
219
- withIdIsKnown(): this {
220
- this.filters.push({ "id": { "$isNull": false } });
221
- return this;
222
- }
223
-
224
- withIdIsUnknown(): this {
225
- this.filters.push({ "id": { "$isNull": true } });
226
- return this;
227
- }
228
-
229
- filterByCustomerOrder(val: any): this {
230
- this.filters.push({ "customerOrder": { "$eq": val } });
231
- return this;
232
- }
233
-
234
- filterByCustomerOrderIn(...vals: any[]): this {
235
- this.filters.push({ "customerOrder": { "$in": vals } });
236
- return this;
237
- }
238
-
239
- withCustomerOrderIsKnown(): this {
240
- this.filters.push({ "customerOrder": { "$isNull": false } });
241
- return this;
242
- }
243
-
244
- withCustomerOrderIsUnknown(): this {
245
- this.filters.push({ "customerOrder": { "$isNull": true } });
246
- return this;
247
- }
248
-
249
- withProductNameContaining(val: string): this {
250
- this.filters.push({ "productName": { "$contains": val } });
251
- return this;
252
- }
253
-
254
- withProductNameIs(val: string): this {
255
- this.filters.push({ "productName": { "$eq": val } });
256
- return this;
257
- }
258
-
259
- withProductNameIsNot(val: any): this {
260
- this.filters.push({ "productName": { "$ne": val } });
261
- return this;
262
- }
263
-
264
- withProductNameIn(...vals: any[]): this {
265
- this.filters.push({ "productName": { "$in": vals } });
266
- return this;
267
- }
268
-
269
- withProductNameNotIn(...vals: any[]): this {
270
- this.filters.push({ "productName": { "$notIn": vals } });
271
- return this;
272
- }
273
-
274
- withProductNameGreaterThan(val: any): this {
275
- this.filters.push({ "productName": { "$gt": val } });
276
- return this;
277
- }
278
-
279
- withProductNameGreaterThanOrEqualTo(val: any): this {
280
- this.filters.push({ "productName": { "$gte": val } });
281
- return this;
282
- }
283
-
284
- withProductNameLessThan(val: any): this {
285
- this.filters.push({ "productName": { "$lt": val } });
286
- return this;
287
- }
288
-
289
- withProductNameLessThanOrEqualTo(val: any): this {
290
- this.filters.push({ "productName": { "$lte": val } });
291
- return this;
292
- }
293
-
294
- withProductNameBetween(lower: any, upper: any): this {
295
- this.filters.push({ "productName": { "$between": [lower, upper] } });
296
- return this;
297
- }
298
-
299
- withProductNameIsKnown(): this {
300
- this.filters.push({ "productName": { "$isNull": false } });
301
- return this;
302
- }
303
-
304
- withProductNameIsUnknown(): this {
305
- this.filters.push({ "productName": { "$isNull": true } });
306
- return this;
307
- }
308
- withProductNameNotContaining(val: string): this {
309
- this.filters.push({ "productName": { "$notContains": val } });
310
- return this;
311
- }
312
-
313
- withProductNameStartingWith(val: string): this {
314
- this.filters.push({ "productName": { "$startsWith": val } });
315
- return this;
316
- }
317
-
318
- withProductNameNotStartingWith(val: string): this {
319
- this.filters.push({ "productName": { "$notStartsWith": val } });
320
- return this;
321
- }
322
-
323
- withProductNameEndingWith(val: string): this {
324
- this.filters.push({ "productName": { "$endsWith": val } });
325
- return this;
326
- }
327
-
328
- withProductNameNotEndingWith(val: string): this {
329
- this.filters.push({ "productName": { "$notEndsWith": val } });
330
- return this;
331
- }
332
-
333
- withProductNameSoundingLike(val: string): this {
334
- this.filters.push({ "productName": { "$soundLike": val } });
335
- return this;
336
- }
337
-
338
- withQuantityIs(val: any): this {
339
- this.filters.push({ "quantity": { "$eq": val } });
340
- return this;
341
- }
342
-
343
- withQuantityIsNot(val: any): this {
344
- this.filters.push({ "quantity": { "$ne": val } });
345
- return this;
346
- }
347
-
348
- withQuantityIn(...vals: any[]): this {
349
- this.filters.push({ "quantity": { "$in": vals } });
350
- return this;
351
- }
352
-
353
- withQuantityNotIn(...vals: any[]): this {
354
- this.filters.push({ "quantity": { "$notIn": vals } });
355
- return this;
356
- }
357
-
358
- withQuantityGreaterThan(val: any): this {
359
- this.filters.push({ "quantity": { "$gt": val } });
360
- return this;
361
- }
362
-
363
- withQuantityGreaterThanOrEqualTo(val: any): this {
364
- this.filters.push({ "quantity": { "$gte": val } });
365
- return this;
366
- }
367
-
368
- withQuantityLessThan(val: any): this {
369
- this.filters.push({ "quantity": { "$lt": val } });
370
- return this;
371
- }
372
-
373
- withQuantityLessThanOrEqualTo(val: any): this {
374
- this.filters.push({ "quantity": { "$lte": val } });
375
- return this;
376
- }
377
-
378
- withQuantityBetween(lower: any, upper: any): this {
379
- this.filters.push({ "quantity": { "$between": [lower, upper] } });
380
- return this;
381
- }
382
-
383
- withQuantityIsKnown(): this {
384
- this.filters.push({ "quantity": { "$isNull": false } });
385
- return this;
386
- }
387
-
388
- withQuantityIsUnknown(): this {
389
- this.filters.push({ "quantity": { "$isNull": true } });
390
- return this;
391
- }
392
-
393
- withUnitPriceIs(val: any): this {
394
- this.filters.push({ "unitPrice": { "$eq": val } });
395
- return this;
396
- }
397
-
398
- withUnitPriceIsNot(val: any): this {
399
- this.filters.push({ "unitPrice": { "$ne": val } });
400
- return this;
401
- }
402
-
403
- withUnitPriceIn(...vals: any[]): this {
404
- this.filters.push({ "unitPrice": { "$in": vals } });
405
- return this;
406
- }
407
-
408
- withUnitPriceNotIn(...vals: any[]): this {
409
- this.filters.push({ "unitPrice": { "$notIn": vals } });
410
- return this;
411
- }
412
-
413
- withUnitPriceGreaterThan(val: any): this {
414
- this.filters.push({ "unitPrice": { "$gt": val } });
415
- return this;
416
- }
417
-
418
- withUnitPriceGreaterThanOrEqualTo(val: any): this {
419
- this.filters.push({ "unitPrice": { "$gte": val } });
420
- return this;
421
- }
422
-
423
- withUnitPriceLessThan(val: any): this {
424
- this.filters.push({ "unitPrice": { "$lt": val } });
425
- return this;
426
- }
427
-
428
- withUnitPriceLessThanOrEqualTo(val: any): this {
429
- this.filters.push({ "unitPrice": { "$lte": val } });
430
- return this;
431
- }
432
-
433
- withUnitPriceBetween(lower: any, upper: any): this {
434
- this.filters.push({ "unitPrice": { "$between": [lower, upper] } });
435
- return this;
436
- }
437
-
438
- withUnitPriceIsKnown(): this {
439
- this.filters.push({ "unitPrice": { "$isNull": false } });
440
- return this;
441
- }
442
-
443
- withUnitPriceIsUnknown(): this {
444
- this.filters.push({ "unitPrice": { "$isNull": true } });
445
- return this;
446
- }
447
-
448
- withVersionIs(val: any): this {
449
- this.filters.push({ "version": { "$eq": val } });
450
- return this;
451
- }
452
-
453
- withVersionIsNot(val: any): this {
454
- this.filters.push({ "version": { "$ne": val } });
455
- return this;
456
- }
457
-
458
- withVersionIn(...vals: any[]): this {
459
- this.filters.push({ "version": { "$in": vals } });
460
- return this;
461
- }
462
-
463
- withVersionNotIn(...vals: any[]): this {
464
- this.filters.push({ "version": { "$notIn": vals } });
465
- return this;
466
- }
467
-
468
- withVersionGreaterThan(val: any): this {
469
- this.filters.push({ "version": { "$gt": val } });
470
- return this;
471
- }
472
-
473
- withVersionGreaterThanOrEqualTo(val: any): this {
474
- this.filters.push({ "version": { "$gte": val } });
475
- return this;
476
- }
477
-
478
- withVersionLessThan(val: any): this {
479
- this.filters.push({ "version": { "$lt": val } });
480
- return this;
481
- }
482
-
483
- withVersionLessThanOrEqualTo(val: any): this {
484
- this.filters.push({ "version": { "$lte": val } });
485
- return this;
486
- }
487
-
488
- withVersionBetween(lower: any, upper: any): this {
489
- this.filters.push({ "version": { "$between": [lower, upper] } });
490
- return this;
491
- }
492
-
493
- withVersionIsKnown(): this {
494
- this.filters.push({ "version": { "$isNull": false } });
495
- return this;
496
- }
497
-
498
- withVersionIsUnknown(): this {
499
- this.filters.push({ "version": { "$isNull": true } });
500
- return this;
501
- }
502
-
503
- orderByIdAscending(): this {
504
- this.query.orderBy("id", "asc");
505
- return this;
506
- }
507
-
508
- orderByIdDescending(): this {
509
- this.query.orderBy("id", "desc");
510
- return this;
511
- }
512
-
513
-
514
- orderByProductNameAscending(): this {
515
- this.query.orderBy("productName", "asc");
516
- return this;
517
- }
518
-
519
- orderByProductNameDescending(): this {
520
- this.query.orderBy("productName", "desc");
521
- return this;
522
- }
523
-
524
- orderByQuantityAscending(): this {
525
- this.query.orderBy("quantity", "asc");
526
- return this;
527
- }
528
-
529
- orderByQuantityDescending(): this {
530
- this.query.orderBy("quantity", "desc");
531
- return this;
532
- }
533
-
534
- orderByUnitPriceAscending(): this {
535
- this.query.orderBy("unitPrice", "asc");
536
- return this;
537
- }
538
-
539
- orderByUnitPriceDescending(): this {
540
- this.query.orderBy("unitPrice", "desc");
541
- return this;
542
- }
543
-
544
- orderByVersionAscending(): this {
545
- this.query.orderBy("version", "asc");
546
- return this;
547
- }
548
-
549
- orderByVersionDescending(): this {
550
- this.query.orderBy("version", "desc");
551
- return this;
552
- }
553
-
554
-
555
- // --- Aggregations ---
556
- count(): this {
557
- this.query.aggregate("Count", "id", "count");
558
- this._pageCountAlias = "count";
559
- this._pageCountMethod = "count";
560
- return this;
561
- }
562
-
563
- countAs(retName: string): this {
564
- this.query.aggregate("Count", "id", retName);
565
- this._pageCountAlias = retName;
566
- this._pageCountMethod = "countAs";
567
- return this;
568
- }
569
-
570
- minQuantity(): this {
571
- return this.minQuantityAs("minOfQuantity");
572
- }
573
-
574
- minQuantityAs(retName: string): this {
575
- this.query.aggregate("min", "quantity", retName);
576
- return this;
577
- }
578
- maxQuantity(): this {
579
- return this.maxQuantityAs("maxOfQuantity");
580
- }
581
-
582
- maxQuantityAs(retName: string): this {
583
- this.query.aggregate("max", "quantity", retName);
584
- return this;
585
- }
586
- sumQuantity(): this {
587
- return this.sumQuantityAs("sumOfQuantity");
588
- }
589
-
590
- sumQuantityAs(retName: string): this {
591
- this.query.aggregate("sum", "quantity", retName);
592
- return this;
593
- }
594
- avgQuantity(): this {
595
- return this.avgQuantityAs("avgOfQuantity");
596
- }
597
-
598
- avgQuantityAs(retName: string): this {
599
- this.query.aggregate("avg", "quantity", retName);
600
- return this;
601
- }
602
- standardDeviationQuantity(): this {
603
- return this.standardDeviationQuantityAs("standardDeviationOfQuantity");
604
- }
605
-
606
- standardDeviationQuantityAs(retName: string): this {
607
- this.query.aggregate("stddev", "quantity", retName);
608
- return this;
609
- }
610
- squareRootOfPopulationStandardDeviationQuantity(): this {
611
- return this.squareRootOfPopulationStandardDeviationQuantityAs("squareRootOfPopulationStandardDeviationOfQuantity");
612
- }
613
-
614
- squareRootOfPopulationStandardDeviationQuantityAs(retName: string): this {
615
- this.query.aggregate("stddev_pop", "quantity", retName);
616
- return this;
617
- }
618
- sampleVarianceQuantity(): this {
619
- return this.sampleVarianceQuantityAs("sampleVarianceOfQuantity");
620
- }
621
-
622
- sampleVarianceQuantityAs(retName: string): this {
623
- this.query.aggregate("var_samp", "quantity", retName);
624
- return this;
625
- }
626
- samplePopulationVarianceQuantity(): this {
627
- return this.samplePopulationVarianceQuantityAs("samplePopulationVarianceOfQuantity");
628
- }
629
-
630
- samplePopulationVarianceQuantityAs(retName: string): this {
631
- this.query.aggregate("var_pop", "quantity", retName);
632
- return this;
633
- }
634
- minUnitPrice(): this {
635
- return this.minUnitPriceAs("minOfUnitPrice");
636
- }
637
-
638
- minUnitPriceAs(retName: string): this {
639
- this.query.aggregate("min", "unitPrice", retName);
640
- return this;
641
- }
642
- maxUnitPrice(): this {
643
- return this.maxUnitPriceAs("maxOfUnitPrice");
644
- }
645
-
646
- maxUnitPriceAs(retName: string): this {
647
- this.query.aggregate("max", "unitPrice", retName);
648
- return this;
649
- }
650
- sumUnitPrice(): this {
651
- return this.sumUnitPriceAs("sumOfUnitPrice");
652
- }
653
-
654
- sumUnitPriceAs(retName: string): this {
655
- this.query.aggregate("sum", "unitPrice", retName);
656
- return this;
657
- }
658
- avgUnitPrice(): this {
659
- return this.avgUnitPriceAs("avgOfUnitPrice");
660
- }
661
-
662
- avgUnitPriceAs(retName: string): this {
663
- this.query.aggregate("avg", "unitPrice", retName);
664
- return this;
665
- }
666
- standardDeviationUnitPrice(): this {
667
- return this.standardDeviationUnitPriceAs("standardDeviationOfUnitPrice");
668
- }
669
-
670
- standardDeviationUnitPriceAs(retName: string): this {
671
- this.query.aggregate("stddev", "unitPrice", retName);
672
- return this;
673
- }
674
- squareRootOfPopulationStandardDeviationUnitPrice(): this {
675
- return this.squareRootOfPopulationStandardDeviationUnitPriceAs("squareRootOfPopulationStandardDeviationOfUnitPrice");
676
- }
677
-
678
- squareRootOfPopulationStandardDeviationUnitPriceAs(retName: string): this {
679
- this.query.aggregate("stddev_pop", "unitPrice", retName);
680
- return this;
681
- }
682
- sampleVarianceUnitPrice(): this {
683
- return this.sampleVarianceUnitPriceAs("sampleVarianceOfUnitPrice");
684
- }
685
-
686
- sampleVarianceUnitPriceAs(retName: string): this {
687
- this.query.aggregate("var_samp", "unitPrice", retName);
688
- return this;
689
- }
690
- samplePopulationVarianceUnitPrice(): this {
691
- return this.samplePopulationVarianceUnitPriceAs("samplePopulationVarianceOfUnitPrice");
692
- }
693
-
694
- samplePopulationVarianceUnitPriceAs(retName: string): this {
695
- this.query.aggregate("var_pop", "unitPrice", retName);
696
- return this;
697
- }
698
-
699
- // --- Group By ---
700
- groupById(): this {
701
- this.query.groupBy("id");
702
- return this;
703
- }
704
-
705
- groupByIdAs(retName: string): this {
706
- this.query.groupBy("id"); // In TS we don't alias group by yet natively
707
- return this;
708
- }
709
- groupByCustomerOrder(): this {
710
- this.query.groupBy("customerOrder");
711
- return this;
712
- }
713
-
714
- groupByCustomerOrderAs(retName: string): this {
715
- this.query.groupBy("customerOrder"); // In TS we don't alias group by yet natively
716
- return this;
717
- }
718
- groupByProductName(): this {
719
- this.query.groupBy("productName");
720
- return this;
721
- }
722
-
723
- groupByProductNameAs(retName: string): this {
724
- this.query.groupBy("productName"); // In TS we don't alias group by yet natively
725
- return this;
726
- }
727
- groupByQuantity(): this {
728
- this.query.groupBy("quantity");
729
- return this;
730
- }
731
-
732
- groupByQuantityAs(retName: string): this {
733
- this.query.groupBy("quantity"); // In TS we don't alias group by yet natively
734
- return this;
735
- }
736
- groupByUnitPrice(): this {
737
- this.query.groupBy("unitPrice");
738
- return this;
739
- }
740
-
741
- groupByUnitPriceAs(retName: string): this {
742
- this.query.groupBy("unitPrice"); // In TS we don't alias group by yet natively
743
- return this;
744
- }
745
- groupByVersion(): this {
746
- this.query.groupBy("version");
747
- return this;
748
- }
749
-
750
- groupByVersionAs(retName: string): this {
751
- this.query.groupBy("version"); // In TS we don't alias group by yet natively
752
- return this;
753
- }
754
-
755
- // --- Facets ---
756
- facetByCustomerOrderAs(
757
- facetName: string,
758
- request: { toQuery(): SelectQuery },
759
- includeAllFacets = true,
760
- ): this {
761
- this.query.facetBy(facetName, "customerOrder", request, includeAllFacets,
762
- { kind: "facet", method: "facetByCustomerOrderAs", relation: "customerOrder", alias: facetName });
763
- return this;
764
- }
765
-
766
-
767
- private async executeForListInternal(context: UserContext): Promise<SmartList<OrderItem>> {
768
- this.ensureIntent();
769
- if (this.filters.length > 0) {
770
- this.query.filter({ "$and": this.filters });
771
- }
772
-
773
- const service = context.requireResource<TeaQLDataService>("dataService");
774
- const rows = await service.executeQuery(context.prepareQuery(this.query));
775
- const queryRoot = new EntityRoot();
776
- const aggregateOnly = this.query.aggregateItems.length > 0 && this.query.groupByItems.length === 0;
777
- const data = aggregateOnly ? [] : rows.map((row: unknown) =>
778
- row instanceof OrderItem
779
- ? row
780
- : OrderItem.fromRecord(row as Record<string, unknown>, queryRoot));
781
- const result = new SmartList<OrderItem>(data);
782
- if (aggregateOnly && rows[0]) Object.assign(result.aggregations, rows[0]);
783
-
784
- if (this.query.facets.length > 0) {
785
- result.facets = await executeRelationFacets(
786
- service, (query: any) => context.prepareQuery(query), this.query, this.query.facets);
787
- }
788
-
789
- return result;
790
- }
791
-
792
- private async executeForRowsInternal(context: UserContext): Promise<SmartList<Record<string, unknown>>> {
793
- this.ensureIntent();
794
- if (this.filters.length > 0) this.query.filter({ "$and": this.filters });
795
- const service = context.requireResource<TeaQLDataService>("dataService");
796
- return new SmartList<Record<string, unknown>>(
797
- await service.executeQuery(context.prepareQuery(this.query)) as Record<string, unknown>[]);
798
- }
799
-
800
- private async executeForPageInternal(
801
- context: UserContext, offset: number, limit: number,
802
- ): Promise<TeaQLPage<OrderItem>> {
803
- this.ensureIntent();
804
- this.query.offset(offset).limit(limit);
805
- if (this.filters.length > 0) this.query.filter({ "$and": this.filters });
806
- const service = context.requireResource<TeaQLDataService>("dataService");
807
- const useIdSet = this.query.localIdSetPaginationOptions() !== undefined;
808
- const countOperation = { kind: "named-count" as const,
809
- method: this._pageCountMethod ?? "count",
810
- ...(this._pageCountMethod === "countAs" ? { alias: this._pageCountAlias } : {}) };
811
- const totalCountBeforeRows = useIdSet ? undefined : await service.executeCount(
812
- this.query, this._pageCountAlias, countOperation);
813
- const pageQuery = this.query.clone();
814
- // A page count describes the full filtered set, not an aggregate-only page row.
815
- pageQuery.aggregateItems = pageQuery.aggregateItems.filter(item =>
816
- !(String(item.function).toLowerCase() === "count" && item.alias === this._pageCountAlias));
817
- const rows = await service.executeQuery(context.prepareQuery(pageQuery));
818
- const totalCount = useIdSet && context.idSetPaginationCountAccuracy === "EXACT"
819
- ? context.idSetPaginationCount!
820
- : (totalCountBeforeRows ?? await service.executeCount(this.query, this._pageCountAlias, countOperation));
821
- const queryRoot = new EntityRoot();
822
- const data = new SmartList(rows.map((row: unknown) =>
823
- row instanceof OrderItem
824
- ? row
825
- : OrderItem.fromRecord(row as Record<string, unknown>, queryRoot)));
826
- data.totalCount = totalCount;
827
- if (this._pageCountAlias !== undefined) data.aggregations[this._pageCountAlias] = totalCount;
828
- if (this.query.facets.length > 0) {
829
- data.facets = await executeRelationFacets(
830
- service, (query: any) => context.prepareQuery(query), this.query, this.query.facets);
831
- }
832
- return { data, totalCount, offset, limit };
833
- }
834
-
835
- private async *executeForStreamInternal(context: UserContext, chunkSize: number): AsyncIterable<OrderItem> {
836
- this.ensureIntent();
837
- if (this.filters.length > 0) this.query.filter({ "$and": this.filters });
838
- const service = context.requireResource<TeaQLDataService>("dataService");
839
- const queryRoot = new EntityRoot();
840
- for await (const chunk of service.executeForStream(this.query, chunkSize)) {
841
- for (const entity of chunk) {
842
- yield entity instanceof OrderItem
843
- ? entity
844
- : OrderItem.fromRecord(entity as Record<string, unknown>, queryRoot);
845
- }
846
- }
847
- }
848
-
849
- private ensureIntent(): void {
850
- if (!this._comment?.trim()) {
851
- throw new Error("Security audit failure: non-empty comment() is required before execution");
852
- }
853
- if (!this._purpose?.trim()) {
854
- throw new Error("Security audit failure: non-empty purpose() is required before execution");
855
- }
856
- }
857
-
858
- }
859
-
860
- export class ExecutableOrderItemRequest {
861
- constructor(
862
- private readonly execute: (context: UserContext) => Promise<SmartList<OrderItem>>,
863
- private readonly executeRows: (context: UserContext) => Promise<SmartList<Record<string, unknown>>>,
864
- private readonly page: (
865
- context: UserContext, offset: number, limit: number,
866
- ) => Promise<TeaQLPage<OrderItem>>,
867
- private readonly stream: (context: UserContext, chunkSize: number) => AsyncIterable<OrderItem>,
868
- private readonly limitOne: () => void,
869
- private readonly addComment: (comment: string) => void,
870
- private readonly ensureIntent: () => void,
871
- ) {}
872
-
873
- comment(c: string): this {
874
- this.addComment(c);
875
- return this;
876
- }
877
-
878
- newEntity(context: UserContext): OrderItem {
879
- this.ensureIntent();
880
- return new OrderItem();
881
- }
882
-
883
- executeForList(context: UserContext): Promise<SmartList<OrderItem>> {
884
- this.ensureIntent();
885
- return this.execute(context);
886
- }
887
-
888
- executeForRows(context: UserContext): Promise<SmartList<Record<string, unknown>>> {
889
- this.ensureIntent();
890
- return this.executeRows(context);
891
- }
892
-
893
- executeForPage(
894
- context: UserContext, offset: number, limit: number,
895
- ): Promise<TeaQLPage<OrderItem>> {
896
- this.ensureIntent();
897
- return this.page(context, offset, limit);
898
- }
899
-
900
- executeForStream(context: UserContext, chunkSize = 1000): AsyncIterable<OrderItem> {
901
- this.ensureIntent();
902
- return this.stream(context, chunkSize);
903
- }
904
-
905
- async executeForOne(context: UserContext): Promise<OrderItem | undefined> {
906
- this.limitOne();
907
- return (await this.executeForList(context))[0];
908
- }
909
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/src/generated/requests/OrderStatusRequest.ts DELETED
@@ -1,1162 +0,0 @@
1
- import { EntityRoot, SelectQuery, SmartList, TeaQLDataService, TeaQLPage, UserContext, executeRelationFacets } from '../../teaql-ts';
2
- import { OrderStatus } from '../models/OrderStatus';
3
- import { mergeGeneratedScalarSearch, DynamicSearchWarning } from 'teaql-ts';
4
- import { GENERATED_SEARCH_MODELS } from '../../generated-search-models';
5
-
6
-
7
-
8
- export class OrderStatusRequest {
9
- private query: SelectQuery;
10
- private filters: any[] = [];
11
- private _purpose: string | undefined;
12
- private _comment: string | undefined;
13
- private _pageCountAlias: string | undefined;
14
- private _pageCountMethod: "count" | "countAs" | undefined;
15
- private _dynamicSearchWarnings: DynamicSearchWarning[] = [];
16
-
17
- constructor(minimal = false) {
18
- this.query = new SelectQuery("OrderStatus");
19
- this.filters.push({ version: { "$gte": 1 } });
20
- if (minimal) {
21
- this.selectId();
22
- this.selectVersion();
23
- }
24
- else this.selectSelfFields();
25
- }
26
-
27
- comment(c: string): this {
28
- this.query.comment(c);
29
- this._comment = c;
30
- return this;
31
- }
32
-
33
- filterByJson(source: unknown, warn?: (warning: DynamicSearchWarning) => void): this {
34
- const base = this.query.clone();
35
- if (this.filters.length > 0) base.filter({ "$and": this.filters });
36
- const merged = mergeGeneratedScalarSearch(base, source, GENERATED_SEARCH_MODELS, warn);
37
- this.query = merged.query as SelectQuery;
38
- this.filters = this.query.filterCondition ? [this.query.filterCondition] : [];
39
- this._dynamicSearchWarnings.push(...merged.warnings);
40
- return this;
41
- }
42
-
43
- get dynamicSearchWarnings(): readonly DynamicSearchWarning[] {
44
- return this._dynamicSearchWarnings.map(warning => ({ ...warning }));
45
- }
46
-
47
- purpose(p: string): ExecutableOrderStatusRequest {
48
- this.query.purpose(p);
49
- this._purpose = p;
50
- return new ExecutableOrderStatusRequest(
51
- (context) => this.executeForListInternal(context),
52
- (context) => this.executeForRowsInternal(context),
53
- (context, offset, limit) => this.executeForPageInternal(context, offset, limit),
54
- (context, chunkSize) => this.executeForStreamInternal(context, chunkSize),
55
- () => this.limit(1),
56
- (c) => this.comment(c),
57
- () => this.ensureIntent());
58
- }
59
-
60
- optimizeForContinuousPageFetch(): this {
61
- this.query.optimizeForContinuousPageFetch();
62
- return this;
63
- }
64
-
65
- optimizeForContinuousPageFetchWith(namespace: string, ttlSeconds: number): this {
66
- this.query.optimizeForContinuousPageFetchWith(namespace, ttlSeconds);
67
- return this;
68
- }
69
-
70
- optimizePaginationWithIdSet(): this {
71
- this.query.optimizePaginationWithIdSet();
72
- return this;
73
- }
74
-
75
- optimizePaginationWithIdSetConfig(namespace: string, ttlSeconds: number, maxIds: number): this {
76
- this.query.optimizePaginationWithIdSetConfig(namespace, ttlSeconds, maxIds);
77
- return this;
78
- }
79
-
80
- topNProbeParentThreshold(threshold: number): this {
81
- this.query.topNProbeParentThreshold(threshold);
82
- return this;
83
- }
84
-
85
- limit(n: number): this {
86
- this.query.limit(n);
87
- return this;
88
- }
89
-
90
- offset(n: number): this {
91
- this.query.offset(n);
92
- return this;
93
- }
94
-
95
- toQuery(): SelectQuery {
96
- if (this.filters.length > 0) {
97
- this.query.filter({ "$and": this.filters });
98
- }
99
- return this.query;
100
- }
101
-
102
- withDeletedRows(): this {
103
- this.filters = this.filters.filter(filter => !("version" in filter));
104
- return this;
105
- }
106
-
107
- deletedRowsOnly(): this {
108
- this.withDeletedRows();
109
- this.filters.push({ version: { "$lte": -1 } });
110
- return this;
111
- }
112
-
113
- selectSelfFields(): this {
114
- this.query.select(["platform", "id", "name", "code", "color", "displayOrder", "version"]);
115
- return this;
116
- }
117
-
118
- selectId(): this {
119
- this.query.select(["id"]);
120
- return this;
121
- }
122
-
123
- selectName(): this {
124
- this.query.select(["name"]);
125
- return this;
126
- }
127
-
128
- selectCode(): this {
129
- this.query.select(["code"]);
130
- return this;
131
- }
132
-
133
- selectColor(): this {
134
- this.query.select(["color"]);
135
- return this;
136
- }
137
-
138
- selectDisplayOrder(): this {
139
- this.query.select(["displayOrder"]);
140
- return this;
141
- }
142
-
143
- selectVersion(): this {
144
- this.query.select(["version"]);
145
- return this;
146
- }
147
-
148
-
149
- selectPlatformWith(request: { toQuery(): SelectQuery }): this {
150
- this.query.select(["platform"]);
151
- this.query.relationQuery(
152
- "platform", request.toQuery(), "platform", "id", false,
153
- { kind: "relation-select", method: "selectPlatformWith", relation: "platform" });
154
- return this;
155
- }
156
-
157
- withPlatformMatching(request: { toQuery(): SelectQuery }): this {
158
- this.filters.push({
159
- "platform": {
160
- "$inSubquery": { query: request.toQuery(), field: "id" },
161
- },
162
- });
163
- return this;
164
- }
165
-
166
- withoutPlatformMatching(request: { toQuery(): SelectQuery }): this {
167
- this.filters.push({
168
- "platform": {
169
- "$notInSubquery": { query: request.toQuery(), field: "id" },
170
- },
171
- });
172
- return this;
173
- }
174
-
175
- selectCustomerOrderListWith(request: { toQuery(): SelectQuery }): this {
176
- this.query.relationQuery(
177
- "customerOrderList", request.toQuery(), "id", "status", true,
178
- { kind: "relation-select", method: "selectCustomerOrderListWith", relation: "customerOrderList" });
179
- return this;
180
- }
181
-
182
- haveCustomerOrders(): this {
183
- return this.withCustomerOrderListMatching({
184
- toQuery: () => new SelectQuery("CustomerOrder"),
185
- });
186
- }
187
-
188
- haveNoCustomerOrders(): this {
189
- return this.withoutCustomerOrderListMatching({
190
- toQuery: () => new SelectQuery("CustomerOrder"),
191
- });
192
- }
193
-
194
- withCustomerOrderListMatching(request: { toQuery(): SelectQuery }): this {
195
- this.filters.push({
196
- "id": {
197
- "$inSubquery": {
198
- query: request.toQuery(), field: "status",
199
- },
200
- },
201
- });
202
- return this;
203
- }
204
-
205
- withoutCustomerOrderListMatching(request: { toQuery(): SelectQuery }): this {
206
- this.filters.push({
207
- "id": {
208
- "$notInSubquery": {
209
- query: request.toQuery(), field: "status",
210
- },
211
- },
212
- });
213
- return this;
214
- }
215
-
216
- countCustomerOrders(): this {
217
- return this.countCustomerOrdersAs("countCustomerOrders");
218
- }
219
-
220
- countCustomerOrdersAs(alias: string): this {
221
- const query = new SelectQuery("CustomerOrder").filter({ version: { "$gte": 1 } });
222
- this.countCustomerOrdersWith(alias, { toQuery: () => query });
223
- this.query.relationAggregates[this.query.relationAggregates.length - 1].operation = {
224
- kind: "relation-count", method: "countCustomerOrdersAs", relation: "customerOrderList", alias };
225
- return this;
226
- }
227
-
228
- countCustomerOrdersWith(alias: string, child: { toQuery(): SelectQuery }): this {
229
- const query = child.toQuery().clone();
230
- query.aggregateItems = [];
231
- query.aggregate("Count", "id", alias);
232
- this.query.relationAggregate("customerOrderList", alias, query, true,
233
- { kind: "relation-count", method: "countCustomerOrdersWith", relation: "customerOrderList", alias });
234
- return this;
235
- }
236
-
237
- minTotalAmountOfCustomerOrders(): this {
238
- const query = new SelectQuery("CustomerOrder").filter({ version: { "$gte": 1 } });
239
- return this.minTotalAmountOfCustomerOrdersAs(
240
- "minOfTotalAmountOfCustomerOrders", { toQuery: () => query });
241
- }
242
-
243
- minTotalAmountOfCustomerOrdersAs(alias: string, child: { toQuery(): SelectQuery }): this {
244
- const query = child.toQuery().clone();
245
- query.aggregateItems = [];
246
- query.aggregate("min", "totalAmount", alias);
247
- this.query.relationAggregate("customerOrderList", alias, query, true,
248
- { kind: "aggregate", method: "minTotalAmountOfCustomerOrdersAs", relation: "customerOrderList", alias });
249
- return this;
250
- }
251
- maxTotalAmountOfCustomerOrders(): this {
252
- const query = new SelectQuery("CustomerOrder").filter({ version: { "$gte": 1 } });
253
- return this.maxTotalAmountOfCustomerOrdersAs(
254
- "maxOfTotalAmountOfCustomerOrders", { toQuery: () => query });
255
- }
256
-
257
- maxTotalAmountOfCustomerOrdersAs(alias: string, child: { toQuery(): SelectQuery }): this {
258
- const query = child.toQuery().clone();
259
- query.aggregateItems = [];
260
- query.aggregate("max", "totalAmount", alias);
261
- this.query.relationAggregate("customerOrderList", alias, query, true,
262
- { kind: "aggregate", method: "maxTotalAmountOfCustomerOrdersAs", relation: "customerOrderList", alias });
263
- return this;
264
- }
265
- sumTotalAmountOfCustomerOrders(): this {
266
- const query = new SelectQuery("CustomerOrder").filter({ version: { "$gte": 1 } });
267
- return this.sumTotalAmountOfCustomerOrdersAs(
268
- "sumOfTotalAmountOfCustomerOrders", { toQuery: () => query });
269
- }
270
-
271
- sumTotalAmountOfCustomerOrdersAs(alias: string, child: { toQuery(): SelectQuery }): this {
272
- const query = child.toQuery().clone();
273
- query.aggregateItems = [];
274
- query.aggregate("sum", "totalAmount", alias);
275
- this.query.relationAggregate("customerOrderList", alias, query, true,
276
- { kind: "aggregate", method: "sumTotalAmountOfCustomerOrdersAs", relation: "customerOrderList", alias });
277
- return this;
278
- }
279
- avgTotalAmountOfCustomerOrders(): this {
280
- const query = new SelectQuery("CustomerOrder").filter({ version: { "$gte": 1 } });
281
- return this.avgTotalAmountOfCustomerOrdersAs(
282
- "avgOfTotalAmountOfCustomerOrders", { toQuery: () => query });
283
- }
284
-
285
- avgTotalAmountOfCustomerOrdersAs(alias: string, child: { toQuery(): SelectQuery }): this {
286
- const query = child.toQuery().clone();
287
- query.aggregateItems = [];
288
- query.aggregate("avg", "totalAmount", alias);
289
- this.query.relationAggregate("customerOrderList", alias, query, true,
290
- { kind: "aggregate", method: "avgTotalAmountOfCustomerOrdersAs", relation: "customerOrderList", alias });
291
- return this;
292
- }
293
- standardDeviationTotalAmountOfCustomerOrders(): this {
294
- const query = new SelectQuery("CustomerOrder").filter({ version: { "$gte": 1 } });
295
- return this.standardDeviationTotalAmountOfCustomerOrdersAs(
296
- "standardDeviationOfTotalAmountOfCustomerOrders", { toQuery: () => query });
297
- }
298
-
299
- standardDeviationTotalAmountOfCustomerOrdersAs(alias: string, child: { toQuery(): SelectQuery }): this {
300
- const query = child.toQuery().clone();
301
- query.aggregateItems = [];
302
- query.aggregate("stddev", "totalAmount", alias);
303
- this.query.relationAggregate("customerOrderList", alias, query, true,
304
- { kind: "aggregate", method: "standardDeviationTotalAmountOfCustomerOrdersAs", relation: "customerOrderList", alias });
305
- return this;
306
- }
307
- squareRootOfPopulationStandardDeviationTotalAmountOfCustomerOrders(): this {
308
- const query = new SelectQuery("CustomerOrder").filter({ version: { "$gte": 1 } });
309
- return this.squareRootOfPopulationStandardDeviationTotalAmountOfCustomerOrdersAs(
310
- "squareRootOfPopulationStandardDeviationOfTotalAmountOfCustomerOrders", { toQuery: () => query });
311
- }
312
-
313
- squareRootOfPopulationStandardDeviationTotalAmountOfCustomerOrdersAs(alias: string, child: { toQuery(): SelectQuery }): this {
314
- const query = child.toQuery().clone();
315
- query.aggregateItems = [];
316
- query.aggregate("stddev_pop", "totalAmount", alias);
317
- this.query.relationAggregate("customerOrderList", alias, query, true,
318
- { kind: "aggregate", method: "squareRootOfPopulationStandardDeviationTotalAmountOfCustomerOrdersAs", relation: "customerOrderList", alias });
319
- return this;
320
- }
321
- sampleVarianceTotalAmountOfCustomerOrders(): this {
322
- const query = new SelectQuery("CustomerOrder").filter({ version: { "$gte": 1 } });
323
- return this.sampleVarianceTotalAmountOfCustomerOrdersAs(
324
- "sampleVarianceOfTotalAmountOfCustomerOrders", { toQuery: () => query });
325
- }
326
-
327
- sampleVarianceTotalAmountOfCustomerOrdersAs(alias: string, child: { toQuery(): SelectQuery }): this {
328
- const query = child.toQuery().clone();
329
- query.aggregateItems = [];
330
- query.aggregate("var_samp", "totalAmount", alias);
331
- this.query.relationAggregate("customerOrderList", alias, query, true,
332
- { kind: "aggregate", method: "sampleVarianceTotalAmountOfCustomerOrdersAs", relation: "customerOrderList", alias });
333
- return this;
334
- }
335
- samplePopulationVarianceTotalAmountOfCustomerOrders(): this {
336
- const query = new SelectQuery("CustomerOrder").filter({ version: { "$gte": 1 } });
337
- return this.samplePopulationVarianceTotalAmountOfCustomerOrdersAs(
338
- "samplePopulationVarianceOfTotalAmountOfCustomerOrders", { toQuery: () => query });
339
- }
340
-
341
- samplePopulationVarianceTotalAmountOfCustomerOrdersAs(alias: string, child: { toQuery(): SelectQuery }): this {
342
- const query = child.toQuery().clone();
343
- query.aggregateItems = [];
344
- query.aggregate("var_pop", "totalAmount", alias);
345
- this.query.relationAggregate("customerOrderList", alias, query, true,
346
- { kind: "aggregate", method: "samplePopulationVarianceTotalAmountOfCustomerOrdersAs", relation: "customerOrderList", alias });
347
- return this;
348
- }
349
-
350
- filterByPlatform(val: any): this {
351
- this.filters.push({ "platform": { "$eq": val } });
352
- return this;
353
- }
354
-
355
- filterByPlatformIn(...vals: any[]): this {
356
- this.filters.push({ "platform": { "$in": vals } });
357
- return this;
358
- }
359
-
360
- withPlatformIsKnown(): this {
361
- this.filters.push({ "platform": { "$isNull": false } });
362
- return this;
363
- }
364
-
365
- withPlatformIsUnknown(): this {
366
- this.filters.push({ "platform": { "$isNull": true } });
367
- return this;
368
- }
369
-
370
- withIdIs(val: any): this {
371
- this.filters.push({ "id": { "$eq": val } });
372
- return this;
373
- }
374
-
375
- withIdIsNot(val: any): this {
376
- this.filters.push({ "id": { "$ne": val } });
377
- return this;
378
- }
379
-
380
- withIdIn(...vals: any[]): this {
381
- this.filters.push({ "id": { "$in": vals } });
382
- return this;
383
- }
384
-
385
- withIdNotIn(...vals: any[]): this {
386
- this.filters.push({ "id": { "$notIn": vals } });
387
- return this;
388
- }
389
-
390
- withIdGreaterThan(val: any): this {
391
- this.filters.push({ "id": { "$gt": val } });
392
- return this;
393
- }
394
-
395
- withIdGreaterThanOrEqualTo(val: any): this {
396
- this.filters.push({ "id": { "$gte": val } });
397
- return this;
398
- }
399
-
400
- withIdLessThan(val: any): this {
401
- this.filters.push({ "id": { "$lt": val } });
402
- return this;
403
- }
404
-
405
- withIdLessThanOrEqualTo(val: any): this {
406
- this.filters.push({ "id": { "$lte": val } });
407
- return this;
408
- }
409
-
410
- withIdBetween(lower: any, upper: any): this {
411
- this.filters.push({ "id": { "$between": [lower, upper] } });
412
- return this;
413
- }
414
-
415
- withIdIsKnown(): this {
416
- this.filters.push({ "id": { "$isNull": false } });
417
- return this;
418
- }
419
-
420
- withIdIsUnknown(): this {
421
- this.filters.push({ "id": { "$isNull": true } });
422
- return this;
423
- }
424
-
425
- withNameContaining(val: string): this {
426
- this.filters.push({ "name": { "$contains": val } });
427
- return this;
428
- }
429
-
430
- withNameIs(val: string): this {
431
- this.filters.push({ "name": { "$eq": val } });
432
- return this;
433
- }
434
-
435
- withNameIsNot(val: any): this {
436
- this.filters.push({ "name": { "$ne": val } });
437
- return this;
438
- }
439
-
440
- withNameIn(...vals: any[]): this {
441
- this.filters.push({ "name": { "$in": vals } });
442
- return this;
443
- }
444
-
445
- withNameNotIn(...vals: any[]): this {
446
- this.filters.push({ "name": { "$notIn": vals } });
447
- return this;
448
- }
449
-
450
- withNameGreaterThan(val: any): this {
451
- this.filters.push({ "name": { "$gt": val } });
452
- return this;
453
- }
454
-
455
- withNameGreaterThanOrEqualTo(val: any): this {
456
- this.filters.push({ "name": { "$gte": val } });
457
- return this;
458
- }
459
-
460
- withNameLessThan(val: any): this {
461
- this.filters.push({ "name": { "$lt": val } });
462
- return this;
463
- }
464
-
465
- withNameLessThanOrEqualTo(val: any): this {
466
- this.filters.push({ "name": { "$lte": val } });
467
- return this;
468
- }
469
-
470
- withNameBetween(lower: any, upper: any): this {
471
- this.filters.push({ "name": { "$between": [lower, upper] } });
472
- return this;
473
- }
474
-
475
- withNameIsKnown(): this {
476
- this.filters.push({ "name": { "$isNull": false } });
477
- return this;
478
- }
479
-
480
- withNameIsUnknown(): this {
481
- this.filters.push({ "name": { "$isNull": true } });
482
- return this;
483
- }
484
- withNameNotContaining(val: string): this {
485
- this.filters.push({ "name": { "$notContains": val } });
486
- return this;
487
- }
488
-
489
- withNameStartingWith(val: string): this {
490
- this.filters.push({ "name": { "$startsWith": val } });
491
- return this;
492
- }
493
-
494
- withNameNotStartingWith(val: string): this {
495
- this.filters.push({ "name": { "$notStartsWith": val } });
496
- return this;
497
- }
498
-
499
- withNameEndingWith(val: string): this {
500
- this.filters.push({ "name": { "$endsWith": val } });
501
- return this;
502
- }
503
-
504
- withNameNotEndingWith(val: string): this {
505
- this.filters.push({ "name": { "$notEndsWith": val } });
506
- return this;
507
- }
508
-
509
- withNameSoundingLike(val: string): this {
510
- this.filters.push({ "name": { "$soundLike": val } });
511
- return this;
512
- }
513
-
514
- withCodeContaining(val: string): this {
515
- this.filters.push({ "code": { "$contains": val } });
516
- return this;
517
- }
518
-
519
- withCodeIs(val: string): this {
520
- this.filters.push({ "code": { "$eq": val } });
521
- return this;
522
- }
523
-
524
- withCodeIsNot(val: any): this {
525
- this.filters.push({ "code": { "$ne": val } });
526
- return this;
527
- }
528
-
529
- withCodeIn(...vals: any[]): this {
530
- this.filters.push({ "code": { "$in": vals } });
531
- return this;
532
- }
533
-
534
- withCodeNotIn(...vals: any[]): this {
535
- this.filters.push({ "code": { "$notIn": vals } });
536
- return this;
537
- }
538
-
539
- withCodeGreaterThan(val: any): this {
540
- this.filters.push({ "code": { "$gt": val } });
541
- return this;
542
- }
543
-
544
- withCodeGreaterThanOrEqualTo(val: any): this {
545
- this.filters.push({ "code": { "$gte": val } });
546
- return this;
547
- }
548
-
549
- withCodeLessThan(val: any): this {
550
- this.filters.push({ "code": { "$lt": val } });
551
- return this;
552
- }
553
-
554
- withCodeLessThanOrEqualTo(val: any): this {
555
- this.filters.push({ "code": { "$lte": val } });
556
- return this;
557
- }
558
-
559
- withCodeBetween(lower: any, upper: any): this {
560
- this.filters.push({ "code": { "$between": [lower, upper] } });
561
- return this;
562
- }
563
-
564
- withCodeIsKnown(): this {
565
- this.filters.push({ "code": { "$isNull": false } });
566
- return this;
567
- }
568
-
569
- withCodeIsUnknown(): this {
570
- this.filters.push({ "code": { "$isNull": true } });
571
- return this;
572
- }
573
- withCodeNotContaining(val: string): this {
574
- this.filters.push({ "code": { "$notContains": val } });
575
- return this;
576
- }
577
-
578
- withCodeStartingWith(val: string): this {
579
- this.filters.push({ "code": { "$startsWith": val } });
580
- return this;
581
- }
582
-
583
- withCodeNotStartingWith(val: string): this {
584
- this.filters.push({ "code": { "$notStartsWith": val } });
585
- return this;
586
- }
587
-
588
- withCodeEndingWith(val: string): this {
589
- this.filters.push({ "code": { "$endsWith": val } });
590
- return this;
591
- }
592
-
593
- withCodeNotEndingWith(val: string): this {
594
- this.filters.push({ "code": { "$notEndsWith": val } });
595
- return this;
596
- }
597
-
598
- withCodeSoundingLike(val: string): this {
599
- this.filters.push({ "code": { "$soundLike": val } });
600
- return this;
601
- }
602
-
603
- withColorContaining(val: string): this {
604
- this.filters.push({ "color": { "$contains": val } });
605
- return this;
606
- }
607
-
608
- withColorIs(val: string): this {
609
- this.filters.push({ "color": { "$eq": val } });
610
- return this;
611
- }
612
-
613
- withColorIsNot(val: any): this {
614
- this.filters.push({ "color": { "$ne": val } });
615
- return this;
616
- }
617
-
618
- withColorIn(...vals: any[]): this {
619
- this.filters.push({ "color": { "$in": vals } });
620
- return this;
621
- }
622
-
623
- withColorNotIn(...vals: any[]): this {
624
- this.filters.push({ "color": { "$notIn": vals } });
625
- return this;
626
- }
627
-
628
- withColorGreaterThan(val: any): this {
629
- this.filters.push({ "color": { "$gt": val } });
630
- return this;
631
- }
632
-
633
- withColorGreaterThanOrEqualTo(val: any): this {
634
- this.filters.push({ "color": { "$gte": val } });
635
- return this;
636
- }
637
-
638
- withColorLessThan(val: any): this {
639
- this.filters.push({ "color": { "$lt": val } });
640
- return this;
641
- }
642
-
643
- withColorLessThanOrEqualTo(val: any): this {
644
- this.filters.push({ "color": { "$lte": val } });
645
- return this;
646
- }
647
-
648
- withColorBetween(lower: any, upper: any): this {
649
- this.filters.push({ "color": { "$between": [lower, upper] } });
650
- return this;
651
- }
652
-
653
- withColorIsKnown(): this {
654
- this.filters.push({ "color": { "$isNull": false } });
655
- return this;
656
- }
657
-
658
- withColorIsUnknown(): this {
659
- this.filters.push({ "color": { "$isNull": true } });
660
- return this;
661
- }
662
- withColorNotContaining(val: string): this {
663
- this.filters.push({ "color": { "$notContains": val } });
664
- return this;
665
- }
666
-
667
- withColorStartingWith(val: string): this {
668
- this.filters.push({ "color": { "$startsWith": val } });
669
- return this;
670
- }
671
-
672
- withColorNotStartingWith(val: string): this {
673
- this.filters.push({ "color": { "$notStartsWith": val } });
674
- return this;
675
- }
676
-
677
- withColorEndingWith(val: string): this {
678
- this.filters.push({ "color": { "$endsWith": val } });
679
- return this;
680
- }
681
-
682
- withColorNotEndingWith(val: string): this {
683
- this.filters.push({ "color": { "$notEndsWith": val } });
684
- return this;
685
- }
686
-
687
- withColorSoundingLike(val: string): this {
688
- this.filters.push({ "color": { "$soundLike": val } });
689
- return this;
690
- }
691
-
692
- withDisplayOrderIs(val: any): this {
693
- this.filters.push({ "displayOrder": { "$eq": val } });
694
- return this;
695
- }
696
-
697
- withDisplayOrderIsNot(val: any): this {
698
- this.filters.push({ "displayOrder": { "$ne": val } });
699
- return this;
700
- }
701
-
702
- withDisplayOrderIn(...vals: any[]): this {
703
- this.filters.push({ "displayOrder": { "$in": vals } });
704
- return this;
705
- }
706
-
707
- withDisplayOrderNotIn(...vals: any[]): this {
708
- this.filters.push({ "displayOrder": { "$notIn": vals } });
709
- return this;
710
- }
711
-
712
- withDisplayOrderGreaterThan(val: any): this {
713
- this.filters.push({ "displayOrder": { "$gt": val } });
714
- return this;
715
- }
716
-
717
- withDisplayOrderGreaterThanOrEqualTo(val: any): this {
718
- this.filters.push({ "displayOrder": { "$gte": val } });
719
- return this;
720
- }
721
-
722
- withDisplayOrderLessThan(val: any): this {
723
- this.filters.push({ "displayOrder": { "$lt": val } });
724
- return this;
725
- }
726
-
727
- withDisplayOrderLessThanOrEqualTo(val: any): this {
728
- this.filters.push({ "displayOrder": { "$lte": val } });
729
- return this;
730
- }
731
-
732
- withDisplayOrderBetween(lower: any, upper: any): this {
733
- this.filters.push({ "displayOrder": { "$between": [lower, upper] } });
734
- return this;
735
- }
736
-
737
- withDisplayOrderIsKnown(): this {
738
- this.filters.push({ "displayOrder": { "$isNull": false } });
739
- return this;
740
- }
741
-
742
- withDisplayOrderIsUnknown(): this {
743
- this.filters.push({ "displayOrder": { "$isNull": true } });
744
- return this;
745
- }
746
-
747
- withVersionIs(val: any): this {
748
- this.filters.push({ "version": { "$eq": val } });
749
- return this;
750
- }
751
-
752
- withVersionIsNot(val: any): this {
753
- this.filters.push({ "version": { "$ne": val } });
754
- return this;
755
- }
756
-
757
- withVersionIn(...vals: any[]): this {
758
- this.filters.push({ "version": { "$in": vals } });
759
- return this;
760
- }
761
-
762
- withVersionNotIn(...vals: any[]): this {
763
- this.filters.push({ "version": { "$notIn": vals } });
764
- return this;
765
- }
766
-
767
- withVersionGreaterThan(val: any): this {
768
- this.filters.push({ "version": { "$gt": val } });
769
- return this;
770
- }
771
-
772
- withVersionGreaterThanOrEqualTo(val: any): this {
773
- this.filters.push({ "version": { "$gte": val } });
774
- return this;
775
- }
776
-
777
- withVersionLessThan(val: any): this {
778
- this.filters.push({ "version": { "$lt": val } });
779
- return this;
780
- }
781
-
782
- withVersionLessThanOrEqualTo(val: any): this {
783
- this.filters.push({ "version": { "$lte": val } });
784
- return this;
785
- }
786
-
787
- withVersionBetween(lower: any, upper: any): this {
788
- this.filters.push({ "version": { "$between": [lower, upper] } });
789
- return this;
790
- }
791
-
792
- withVersionIsKnown(): this {
793
- this.filters.push({ "version": { "$isNull": false } });
794
- return this;
795
- }
796
-
797
- withVersionIsUnknown(): this {
798
- this.filters.push({ "version": { "$isNull": true } });
799
- return this;
800
- }
801
-
802
- orderByIdAscending(): this {
803
- this.query.orderBy("id", "asc");
804
- return this;
805
- }
806
-
807
- orderByIdDescending(): this {
808
- this.query.orderBy("id", "desc");
809
- return this;
810
- }
811
-
812
- orderByNameAscending(): this {
813
- this.query.orderBy("name", "asc");
814
- return this;
815
- }
816
-
817
- orderByNameDescending(): this {
818
- this.query.orderBy("name", "desc");
819
- return this;
820
- }
821
-
822
- orderByCodeAscending(): this {
823
- this.query.orderBy("code", "asc");
824
- return this;
825
- }
826
-
827
- orderByCodeDescending(): this {
828
- this.query.orderBy("code", "desc");
829
- return this;
830
- }
831
-
832
- orderByColorAscending(): this {
833
- this.query.orderBy("color", "asc");
834
- return this;
835
- }
836
-
837
- orderByColorDescending(): this {
838
- this.query.orderBy("color", "desc");
839
- return this;
840
- }
841
-
842
- orderByDisplayOrderAscending(): this {
843
- this.query.orderBy("displayOrder", "asc");
844
- return this;
845
- }
846
-
847
- orderByDisplayOrderDescending(): this {
848
- this.query.orderBy("displayOrder", "desc");
849
- return this;
850
- }
851
-
852
- orderByVersionAscending(): this {
853
- this.query.orderBy("version", "asc");
854
- return this;
855
- }
856
-
857
- orderByVersionDescending(): this {
858
- this.query.orderBy("version", "desc");
859
- return this;
860
- }
861
-
862
-
863
- // --- Aggregations ---
864
- count(): this {
865
- this.query.aggregate("Count", "id", "count");
866
- this._pageCountAlias = "count";
867
- this._pageCountMethod = "count";
868
- return this;
869
- }
870
-
871
- countAs(retName: string): this {
872
- this.query.aggregate("Count", "id", retName);
873
- this._pageCountAlias = retName;
874
- this._pageCountMethod = "countAs";
875
- return this;
876
- }
877
-
878
- minDisplayOrder(): this {
879
- return this.minDisplayOrderAs("minOfDisplayOrder");
880
- }
881
-
882
- minDisplayOrderAs(retName: string): this {
883
- this.query.aggregate("min", "displayOrder", retName);
884
- return this;
885
- }
886
- maxDisplayOrder(): this {
887
- return this.maxDisplayOrderAs("maxOfDisplayOrder");
888
- }
889
-
890
- maxDisplayOrderAs(retName: string): this {
891
- this.query.aggregate("max", "displayOrder", retName);
892
- return this;
893
- }
894
- sumDisplayOrder(): this {
895
- return this.sumDisplayOrderAs("sumOfDisplayOrder");
896
- }
897
-
898
- sumDisplayOrderAs(retName: string): this {
899
- this.query.aggregate("sum", "displayOrder", retName);
900
- return this;
901
- }
902
- avgDisplayOrder(): this {
903
- return this.avgDisplayOrderAs("avgOfDisplayOrder");
904
- }
905
-
906
- avgDisplayOrderAs(retName: string): this {
907
- this.query.aggregate("avg", "displayOrder", retName);
908
- return this;
909
- }
910
- standardDeviationDisplayOrder(): this {
911
- return this.standardDeviationDisplayOrderAs("standardDeviationOfDisplayOrder");
912
- }
913
-
914
- standardDeviationDisplayOrderAs(retName: string): this {
915
- this.query.aggregate("stddev", "displayOrder", retName);
916
- return this;
917
- }
918
- squareRootOfPopulationStandardDeviationDisplayOrder(): this {
919
- return this.squareRootOfPopulationStandardDeviationDisplayOrderAs("squareRootOfPopulationStandardDeviationOfDisplayOrder");
920
- }
921
-
922
- squareRootOfPopulationStandardDeviationDisplayOrderAs(retName: string): this {
923
- this.query.aggregate("stddev_pop", "displayOrder", retName);
924
- return this;
925
- }
926
- sampleVarianceDisplayOrder(): this {
927
- return this.sampleVarianceDisplayOrderAs("sampleVarianceOfDisplayOrder");
928
- }
929
-
930
- sampleVarianceDisplayOrderAs(retName: string): this {
931
- this.query.aggregate("var_samp", "displayOrder", retName);
932
- return this;
933
- }
934
- samplePopulationVarianceDisplayOrder(): this {
935
- return this.samplePopulationVarianceDisplayOrderAs("samplePopulationVarianceOfDisplayOrder");
936
- }
937
-
938
- samplePopulationVarianceDisplayOrderAs(retName: string): this {
939
- this.query.aggregate("var_pop", "displayOrder", retName);
940
- return this;
941
- }
942
-
943
- // --- Group By ---
944
- groupByPlatform(): this {
945
- this.query.groupBy("platform");
946
- return this;
947
- }
948
-
949
- groupByPlatformAs(retName: string): this {
950
- this.query.groupBy("platform"); // In TS we don't alias group by yet natively
951
- return this;
952
- }
953
- groupById(): this {
954
- this.query.groupBy("id");
955
- return this;
956
- }
957
-
958
- groupByIdAs(retName: string): this {
959
- this.query.groupBy("id"); // In TS we don't alias group by yet natively
960
- return this;
961
- }
962
- groupByName(): this {
963
- this.query.groupBy("name");
964
- return this;
965
- }
966
-
967
- groupByNameAs(retName: string): this {
968
- this.query.groupBy("name"); // In TS we don't alias group by yet natively
969
- return this;
970
- }
971
- groupByCode(): this {
972
- this.query.groupBy("code");
973
- return this;
974
- }
975
-
976
- groupByCodeAs(retName: string): this {
977
- this.query.groupBy("code"); // In TS we don't alias group by yet natively
978
- return this;
979
- }
980
- groupByColor(): this {
981
- this.query.groupBy("color");
982
- return this;
983
- }
984
-
985
- groupByColorAs(retName: string): this {
986
- this.query.groupBy("color"); // In TS we don't alias group by yet natively
987
- return this;
988
- }
989
- groupByDisplayOrder(): this {
990
- this.query.groupBy("displayOrder");
991
- return this;
992
- }
993
-
994
- groupByDisplayOrderAs(retName: string): this {
995
- this.query.groupBy("displayOrder"); // In TS we don't alias group by yet natively
996
- return this;
997
- }
998
- groupByVersion(): this {
999
- this.query.groupBy("version");
1000
- return this;
1001
- }
1002
-
1003
- groupByVersionAs(retName: string): this {
1004
- this.query.groupBy("version"); // In TS we don't alias group by yet natively
1005
- return this;
1006
- }
1007
-
1008
- // --- Facets ---
1009
- facetByPlatformAs(
1010
- facetName: string,
1011
- request: { toQuery(): SelectQuery },
1012
- includeAllFacets = true,
1013
- ): this {
1014
- this.query.facetBy(facetName, "platform", request, includeAllFacets,
1015
- { kind: "facet", method: "facetByPlatformAs", relation: "platform", alias: facetName });
1016
- return this;
1017
- }
1018
-
1019
-
1020
- private async executeForListInternal(context: UserContext): Promise<SmartList<OrderStatus>> {
1021
- this.ensureIntent();
1022
- if (this.filters.length > 0) {
1023
- this.query.filter({ "$and": this.filters });
1024
- }
1025
-
1026
- const service = context.requireResource<TeaQLDataService>("dataService");
1027
- const rows = await service.executeQuery(context.prepareQuery(this.query));
1028
- const queryRoot = new EntityRoot();
1029
- const aggregateOnly = this.query.aggregateItems.length > 0 && this.query.groupByItems.length === 0;
1030
- const data = aggregateOnly ? [] : rows.map((row: unknown) =>
1031
- row instanceof OrderStatus
1032
- ? row
1033
- : OrderStatus.fromRecord(row as Record<string, unknown>, queryRoot));
1034
- const result = new SmartList<OrderStatus>(data);
1035
- if (aggregateOnly && rows[0]) Object.assign(result.aggregations, rows[0]);
1036
-
1037
- if (this.query.facets.length > 0) {
1038
- result.facets = await executeRelationFacets(
1039
- service, (query: any) => context.prepareQuery(query), this.query, this.query.facets);
1040
- }
1041
-
1042
- return result;
1043
- }
1044
-
1045
- private async executeForRowsInternal(context: UserContext): Promise<SmartList<Record<string, unknown>>> {
1046
- this.ensureIntent();
1047
- if (this.filters.length > 0) this.query.filter({ "$and": this.filters });
1048
- const service = context.requireResource<TeaQLDataService>("dataService");
1049
- return new SmartList<Record<string, unknown>>(
1050
- await service.executeQuery(context.prepareQuery(this.query)) as Record<string, unknown>[]);
1051
- }
1052
-
1053
- private async executeForPageInternal(
1054
- context: UserContext, offset: number, limit: number,
1055
- ): Promise<TeaQLPage<OrderStatus>> {
1056
- this.ensureIntent();
1057
- this.query.offset(offset).limit(limit);
1058
- if (this.filters.length > 0) this.query.filter({ "$and": this.filters });
1059
- const service = context.requireResource<TeaQLDataService>("dataService");
1060
- const useIdSet = this.query.localIdSetPaginationOptions() !== undefined;
1061
- const countOperation = { kind: "named-count" as const,
1062
- method: this._pageCountMethod ?? "count",
1063
- ...(this._pageCountMethod === "countAs" ? { alias: this._pageCountAlias } : {}) };
1064
- const totalCountBeforeRows = useIdSet ? undefined : await service.executeCount(
1065
- this.query, this._pageCountAlias, countOperation);
1066
- const pageQuery = this.query.clone();
1067
- // A page count describes the full filtered set, not an aggregate-only page row.
1068
- pageQuery.aggregateItems = pageQuery.aggregateItems.filter(item =>
1069
- !(String(item.function).toLowerCase() === "count" && item.alias === this._pageCountAlias));
1070
- const rows = await service.executeQuery(context.prepareQuery(pageQuery));
1071
- const totalCount = useIdSet && context.idSetPaginationCountAccuracy === "EXACT"
1072
- ? context.idSetPaginationCount!
1073
- : (totalCountBeforeRows ?? await service.executeCount(this.query, this._pageCountAlias, countOperation));
1074
- const queryRoot = new EntityRoot();
1075
- const data = new SmartList(rows.map((row: unknown) =>
1076
- row instanceof OrderStatus
1077
- ? row
1078
- : OrderStatus.fromRecord(row as Record<string, unknown>, queryRoot)));
1079
- data.totalCount = totalCount;
1080
- if (this._pageCountAlias !== undefined) data.aggregations[this._pageCountAlias] = totalCount;
1081
- if (this.query.facets.length > 0) {
1082
- data.facets = await executeRelationFacets(
1083
- service, (query: any) => context.prepareQuery(query), this.query, this.query.facets);
1084
- }
1085
- return { data, totalCount, offset, limit };
1086
- }
1087
-
1088
- private async *executeForStreamInternal(context: UserContext, chunkSize: number): AsyncIterable<OrderStatus> {
1089
- this.ensureIntent();
1090
- if (this.filters.length > 0) this.query.filter({ "$and": this.filters });
1091
- const service = context.requireResource<TeaQLDataService>("dataService");
1092
- const queryRoot = new EntityRoot();
1093
- for await (const chunk of service.executeForStream(this.query, chunkSize)) {
1094
- for (const entity of chunk) {
1095
- yield entity instanceof OrderStatus
1096
- ? entity
1097
- : OrderStatus.fromRecord(entity as Record<string, unknown>, queryRoot);
1098
- }
1099
- }
1100
- }
1101
-
1102
- private ensureIntent(): void {
1103
- if (!this._comment?.trim()) {
1104
- throw new Error("Security audit failure: non-empty comment() is required before execution");
1105
- }
1106
- if (!this._purpose?.trim()) {
1107
- throw new Error("Security audit failure: non-empty purpose() is required before execution");
1108
- }
1109
- }
1110
-
1111
- }
1112
-
1113
- export class ExecutableOrderStatusRequest {
1114
- constructor(
1115
- private readonly execute: (context: UserContext) => Promise<SmartList<OrderStatus>>,
1116
- private readonly executeRows: (context: UserContext) => Promise<SmartList<Record<string, unknown>>>,
1117
- private readonly page: (
1118
- context: UserContext, offset: number, limit: number,
1119
- ) => Promise<TeaQLPage<OrderStatus>>,
1120
- private readonly stream: (context: UserContext, chunkSize: number) => AsyncIterable<OrderStatus>,
1121
- private readonly limitOne: () => void,
1122
- private readonly addComment: (comment: string) => void,
1123
- private readonly ensureIntent: () => void,
1124
- ) {}
1125
-
1126
- comment(c: string): this {
1127
- this.addComment(c);
1128
- return this;
1129
- }
1130
-
1131
- newEntity(context: UserContext): OrderStatus {
1132
- this.ensureIntent();
1133
- return new OrderStatus();
1134
- }
1135
-
1136
- executeForList(context: UserContext): Promise<SmartList<OrderStatus>> {
1137
- this.ensureIntent();
1138
- return this.execute(context);
1139
- }
1140
-
1141
- executeForRows(context: UserContext): Promise<SmartList<Record<string, unknown>>> {
1142
- this.ensureIntent();
1143
- return this.executeRows(context);
1144
- }
1145
-
1146
- executeForPage(
1147
- context: UserContext, offset: number, limit: number,
1148
- ): Promise<TeaQLPage<OrderStatus>> {
1149
- this.ensureIntent();
1150
- return this.page(context, offset, limit);
1151
- }
1152
-
1153
- executeForStream(context: UserContext, chunkSize = 1000): AsyncIterable<OrderStatus> {
1154
- this.ensureIntent();
1155
- return this.stream(context, chunkSize);
1156
- }
1157
-
1158
- async executeForOne(context: UserContext): Promise<OrderStatus | undefined> {
1159
- this.limitOne();
1160
- return (await this.executeForList(context))[0];
1161
- }
1162
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/src/generated/requests/PlatformRequest.ts DELETED
@@ -1,791 +0,0 @@
1
- import { EntityRoot, SelectQuery, SmartList, TeaQLDataService, TeaQLPage, UserContext, executeRelationFacets } from '../../teaql-ts';
2
- import { Platform } from '../models/Platform';
3
- import { mergeGeneratedScalarSearch, DynamicSearchWarning } from 'teaql-ts';
4
- import { GENERATED_SEARCH_MODELS } from '../../generated-search-models';
5
-
6
-
7
-
8
- export class PlatformRequest {
9
- private query: SelectQuery;
10
- private filters: any[] = [];
11
- private _purpose: string | undefined;
12
- private _comment: string | undefined;
13
- private _pageCountAlias: string | undefined;
14
- private _pageCountMethod: "count" | "countAs" | undefined;
15
- private _dynamicSearchWarnings: DynamicSearchWarning[] = [];
16
-
17
- constructor(minimal = false) {
18
- this.query = new SelectQuery("Platform");
19
- this.filters.push({ version: { "$gte": 1 } });
20
- if (minimal) {
21
- this.selectId();
22
- this.selectVersion();
23
- }
24
- else this.selectSelfFields();
25
- }
26
-
27
- comment(c: string): this {
28
- this.query.comment(c);
29
- this._comment = c;
30
- return this;
31
- }
32
-
33
- filterByJson(source: unknown, warn?: (warning: DynamicSearchWarning) => void): this {
34
- const base = this.query.clone();
35
- if (this.filters.length > 0) base.filter({ "$and": this.filters });
36
- const merged = mergeGeneratedScalarSearch(base, source, GENERATED_SEARCH_MODELS, warn);
37
- this.query = merged.query as SelectQuery;
38
- this.filters = this.query.filterCondition ? [this.query.filterCondition] : [];
39
- this._dynamicSearchWarnings.push(...merged.warnings);
40
- return this;
41
- }
42
-
43
- get dynamicSearchWarnings(): readonly DynamicSearchWarning[] {
44
- return this._dynamicSearchWarnings.map(warning => ({ ...warning }));
45
- }
46
-
47
- purpose(p: string): ExecutablePlatformRequest {
48
- this.query.purpose(p);
49
- this._purpose = p;
50
- return new ExecutablePlatformRequest(
51
- (context) => this.executeForListInternal(context),
52
- (context) => this.executeForRowsInternal(context),
53
- (context, offset, limit) => this.executeForPageInternal(context, offset, limit),
54
- (context, chunkSize) => this.executeForStreamInternal(context, chunkSize),
55
- () => this.limit(1),
56
- (c) => this.comment(c),
57
- () => this.ensureIntent());
58
- }
59
-
60
- optimizeForContinuousPageFetch(): this {
61
- this.query.optimizeForContinuousPageFetch();
62
- return this;
63
- }
64
-
65
- optimizeForContinuousPageFetchWith(namespace: string, ttlSeconds: number): this {
66
- this.query.optimizeForContinuousPageFetchWith(namespace, ttlSeconds);
67
- return this;
68
- }
69
-
70
- optimizePaginationWithIdSet(): this {
71
- this.query.optimizePaginationWithIdSet();
72
- return this;
73
- }
74
-
75
- optimizePaginationWithIdSetConfig(namespace: string, ttlSeconds: number, maxIds: number): this {
76
- this.query.optimizePaginationWithIdSetConfig(namespace, ttlSeconds, maxIds);
77
- return this;
78
- }
79
-
80
- topNProbeParentThreshold(threshold: number): this {
81
- this.query.topNProbeParentThreshold(threshold);
82
- return this;
83
- }
84
-
85
- limit(n: number): this {
86
- this.query.limit(n);
87
- return this;
88
- }
89
-
90
- offset(n: number): this {
91
- this.query.offset(n);
92
- return this;
93
- }
94
-
95
- toQuery(): SelectQuery {
96
- if (this.filters.length > 0) {
97
- this.query.filter({ "$and": this.filters });
98
- }
99
- return this.query;
100
- }
101
-
102
- withDeletedRows(): this {
103
- this.filters = this.filters.filter(filter => !("version" in filter));
104
- return this;
105
- }
106
-
107
- deletedRowsOnly(): this {
108
- this.withDeletedRows();
109
- this.filters.push({ version: { "$lte": -1 } });
110
- return this;
111
- }
112
-
113
- selectSelfFields(): this {
114
- this.query.select(["id", "name", "version"]);
115
- return this;
116
- }
117
-
118
- selectId(): this {
119
- this.query.select(["id"]);
120
- return this;
121
- }
122
-
123
- selectName(): this {
124
- this.query.select(["name"]);
125
- return this;
126
- }
127
-
128
- selectVersion(): this {
129
- this.query.select(["version"]);
130
- return this;
131
- }
132
-
133
-
134
-
135
-
136
- selectOrderStatusListWith(request: { toQuery(): SelectQuery }): this {
137
- this.query.relationQuery(
138
- "orderStatusList", request.toQuery(), "id", "platform", true,
139
- { kind: "relation-select", method: "selectOrderStatusListWith", relation: "orderStatusList" });
140
- return this;
141
- }
142
- selectCustomerListWith(request: { toQuery(): SelectQuery }): this {
143
- this.query.relationQuery(
144
- "customerList", request.toQuery(), "id", "platform", true,
145
- { kind: "relation-select", method: "selectCustomerListWith", relation: "customerList" });
146
- return this;
147
- }
148
-
149
- haveOrderStatuses(): this {
150
- return this.withOrderStatusListMatching({
151
- toQuery: () => new SelectQuery("OrderStatus"),
152
- });
153
- }
154
-
155
- haveNoOrderStatuses(): this {
156
- return this.withoutOrderStatusListMatching({
157
- toQuery: () => new SelectQuery("OrderStatus"),
158
- });
159
- }
160
-
161
- withOrderStatusListMatching(request: { toQuery(): SelectQuery }): this {
162
- this.filters.push({
163
- "id": {
164
- "$inSubquery": {
165
- query: request.toQuery(), field: "platform",
166
- },
167
- },
168
- });
169
- return this;
170
- }
171
-
172
- withoutOrderStatusListMatching(request: { toQuery(): SelectQuery }): this {
173
- this.filters.push({
174
- "id": {
175
- "$notInSubquery": {
176
- query: request.toQuery(), field: "platform",
177
- },
178
- },
179
- });
180
- return this;
181
- }
182
- haveCustomers(): this {
183
- return this.withCustomerListMatching({
184
- toQuery: () => new SelectQuery("Customer"),
185
- });
186
- }
187
-
188
- haveNoCustomers(): this {
189
- return this.withoutCustomerListMatching({
190
- toQuery: () => new SelectQuery("Customer"),
191
- });
192
- }
193
-
194
- withCustomerListMatching(request: { toQuery(): SelectQuery }): this {
195
- this.filters.push({
196
- "id": {
197
- "$inSubquery": {
198
- query: request.toQuery(), field: "platform",
199
- },
200
- },
201
- });
202
- return this;
203
- }
204
-
205
- withoutCustomerListMatching(request: { toQuery(): SelectQuery }): this {
206
- this.filters.push({
207
- "id": {
208
- "$notInSubquery": {
209
- query: request.toQuery(), field: "platform",
210
- },
211
- },
212
- });
213
- return this;
214
- }
215
-
216
- countOrderStatuses(): this {
217
- return this.countOrderStatusesAs("countOrderStatuses");
218
- }
219
-
220
- countOrderStatusesAs(alias: string): this {
221
- const query = new SelectQuery("OrderStatus").filter({ version: { "$gte": 1 } });
222
- this.countOrderStatusesWith(alias, { toQuery: () => query });
223
- this.query.relationAggregates[this.query.relationAggregates.length - 1].operation = {
224
- kind: "relation-count", method: "countOrderStatusesAs", relation: "orderStatusList", alias };
225
- return this;
226
- }
227
-
228
- countOrderStatusesWith(alias: string, child: { toQuery(): SelectQuery }): this {
229
- const query = child.toQuery().clone();
230
- query.aggregateItems = [];
231
- query.aggregate("Count", "id", alias);
232
- this.query.relationAggregate("orderStatusList", alias, query, true,
233
- { kind: "relation-count", method: "countOrderStatusesWith", relation: "orderStatusList", alias });
234
- return this;
235
- }
236
-
237
- minDisplayOrderOfOrderStatuses(): this {
238
- const query = new SelectQuery("OrderStatus").filter({ version: { "$gte": 1 } });
239
- return this.minDisplayOrderOfOrderStatusesAs(
240
- "minOfDisplayOrderOfOrderStatuses", { toQuery: () => query });
241
- }
242
-
243
- minDisplayOrderOfOrderStatusesAs(alias: string, child: { toQuery(): SelectQuery }): this {
244
- const query = child.toQuery().clone();
245
- query.aggregateItems = [];
246
- query.aggregate("min", "displayOrder", alias);
247
- this.query.relationAggregate("orderStatusList", alias, query, true,
248
- { kind: "aggregate", method: "minDisplayOrderOfOrderStatusesAs", relation: "orderStatusList", alias });
249
- return this;
250
- }
251
- maxDisplayOrderOfOrderStatuses(): this {
252
- const query = new SelectQuery("OrderStatus").filter({ version: { "$gte": 1 } });
253
- return this.maxDisplayOrderOfOrderStatusesAs(
254
- "maxOfDisplayOrderOfOrderStatuses", { toQuery: () => query });
255
- }
256
-
257
- maxDisplayOrderOfOrderStatusesAs(alias: string, child: { toQuery(): SelectQuery }): this {
258
- const query = child.toQuery().clone();
259
- query.aggregateItems = [];
260
- query.aggregate("max", "displayOrder", alias);
261
- this.query.relationAggregate("orderStatusList", alias, query, true,
262
- { kind: "aggregate", method: "maxDisplayOrderOfOrderStatusesAs", relation: "orderStatusList", alias });
263
- return this;
264
- }
265
- sumDisplayOrderOfOrderStatuses(): this {
266
- const query = new SelectQuery("OrderStatus").filter({ version: { "$gte": 1 } });
267
- return this.sumDisplayOrderOfOrderStatusesAs(
268
- "sumOfDisplayOrderOfOrderStatuses", { toQuery: () => query });
269
- }
270
-
271
- sumDisplayOrderOfOrderStatusesAs(alias: string, child: { toQuery(): SelectQuery }): this {
272
- const query = child.toQuery().clone();
273
- query.aggregateItems = [];
274
- query.aggregate("sum", "displayOrder", alias);
275
- this.query.relationAggregate("orderStatusList", alias, query, true,
276
- { kind: "aggregate", method: "sumDisplayOrderOfOrderStatusesAs", relation: "orderStatusList", alias });
277
- return this;
278
- }
279
- avgDisplayOrderOfOrderStatuses(): this {
280
- const query = new SelectQuery("OrderStatus").filter({ version: { "$gte": 1 } });
281
- return this.avgDisplayOrderOfOrderStatusesAs(
282
- "avgOfDisplayOrderOfOrderStatuses", { toQuery: () => query });
283
- }
284
-
285
- avgDisplayOrderOfOrderStatusesAs(alias: string, child: { toQuery(): SelectQuery }): this {
286
- const query = child.toQuery().clone();
287
- query.aggregateItems = [];
288
- query.aggregate("avg", "displayOrder", alias);
289
- this.query.relationAggregate("orderStatusList", alias, query, true,
290
- { kind: "aggregate", method: "avgDisplayOrderOfOrderStatusesAs", relation: "orderStatusList", alias });
291
- return this;
292
- }
293
- standardDeviationDisplayOrderOfOrderStatuses(): this {
294
- const query = new SelectQuery("OrderStatus").filter({ version: { "$gte": 1 } });
295
- return this.standardDeviationDisplayOrderOfOrderStatusesAs(
296
- "standardDeviationOfDisplayOrderOfOrderStatuses", { toQuery: () => query });
297
- }
298
-
299
- standardDeviationDisplayOrderOfOrderStatusesAs(alias: string, child: { toQuery(): SelectQuery }): this {
300
- const query = child.toQuery().clone();
301
- query.aggregateItems = [];
302
- query.aggregate("stddev", "displayOrder", alias);
303
- this.query.relationAggregate("orderStatusList", alias, query, true,
304
- { kind: "aggregate", method: "standardDeviationDisplayOrderOfOrderStatusesAs", relation: "orderStatusList", alias });
305
- return this;
306
- }
307
- squareRootOfPopulationStandardDeviationDisplayOrderOfOrderStatuses(): this {
308
- const query = new SelectQuery("OrderStatus").filter({ version: { "$gte": 1 } });
309
- return this.squareRootOfPopulationStandardDeviationDisplayOrderOfOrderStatusesAs(
310
- "squareRootOfPopulationStandardDeviationOfDisplayOrderOfOrderStatuses", { toQuery: () => query });
311
- }
312
-
313
- squareRootOfPopulationStandardDeviationDisplayOrderOfOrderStatusesAs(alias: string, child: { toQuery(): SelectQuery }): this {
314
- const query = child.toQuery().clone();
315
- query.aggregateItems = [];
316
- query.aggregate("stddev_pop", "displayOrder", alias);
317
- this.query.relationAggregate("orderStatusList", alias, query, true,
318
- { kind: "aggregate", method: "squareRootOfPopulationStandardDeviationDisplayOrderOfOrderStatusesAs", relation: "orderStatusList", alias });
319
- return this;
320
- }
321
- sampleVarianceDisplayOrderOfOrderStatuses(): this {
322
- const query = new SelectQuery("OrderStatus").filter({ version: { "$gte": 1 } });
323
- return this.sampleVarianceDisplayOrderOfOrderStatusesAs(
324
- "sampleVarianceOfDisplayOrderOfOrderStatuses", { toQuery: () => query });
325
- }
326
-
327
- sampleVarianceDisplayOrderOfOrderStatusesAs(alias: string, child: { toQuery(): SelectQuery }): this {
328
- const query = child.toQuery().clone();
329
- query.aggregateItems = [];
330
- query.aggregate("var_samp", "displayOrder", alias);
331
- this.query.relationAggregate("orderStatusList", alias, query, true,
332
- { kind: "aggregate", method: "sampleVarianceDisplayOrderOfOrderStatusesAs", relation: "orderStatusList", alias });
333
- return this;
334
- }
335
- samplePopulationVarianceDisplayOrderOfOrderStatuses(): this {
336
- const query = new SelectQuery("OrderStatus").filter({ version: { "$gte": 1 } });
337
- return this.samplePopulationVarianceDisplayOrderOfOrderStatusesAs(
338
- "samplePopulationVarianceOfDisplayOrderOfOrderStatuses", { toQuery: () => query });
339
- }
340
-
341
- samplePopulationVarianceDisplayOrderOfOrderStatusesAs(alias: string, child: { toQuery(): SelectQuery }): this {
342
- const query = child.toQuery().clone();
343
- query.aggregateItems = [];
344
- query.aggregate("var_pop", "displayOrder", alias);
345
- this.query.relationAggregate("orderStatusList", alias, query, true,
346
- { kind: "aggregate", method: "samplePopulationVarianceDisplayOrderOfOrderStatusesAs", relation: "orderStatusList", alias });
347
- return this;
348
- }
349
- countCustomers(): this {
350
- return this.countCustomersAs("countCustomers");
351
- }
352
-
353
- countCustomersAs(alias: string): this {
354
- const query = new SelectQuery("Customer").filter({ version: { "$gte": 1 } });
355
- this.countCustomersWith(alias, { toQuery: () => query });
356
- this.query.relationAggregates[this.query.relationAggregates.length - 1].operation = {
357
- kind: "relation-count", method: "countCustomersAs", relation: "customerList", alias };
358
- return this;
359
- }
360
-
361
- countCustomersWith(alias: string, child: { toQuery(): SelectQuery }): this {
362
- const query = child.toQuery().clone();
363
- query.aggregateItems = [];
364
- query.aggregate("Count", "id", alias);
365
- this.query.relationAggregate("customerList", alias, query, true,
366
- { kind: "relation-count", method: "countCustomersWith", relation: "customerList", alias });
367
- return this;
368
- }
369
-
370
-
371
-
372
- withIdIs(val: any): this {
373
- this.filters.push({ "id": { "$eq": val } });
374
- return this;
375
- }
376
-
377
- withIdIsNot(val: any): this {
378
- this.filters.push({ "id": { "$ne": val } });
379
- return this;
380
- }
381
-
382
- withIdIn(...vals: any[]): this {
383
- this.filters.push({ "id": { "$in": vals } });
384
- return this;
385
- }
386
-
387
- withIdNotIn(...vals: any[]): this {
388
- this.filters.push({ "id": { "$notIn": vals } });
389
- return this;
390
- }
391
-
392
- withIdGreaterThan(val: any): this {
393
- this.filters.push({ "id": { "$gt": val } });
394
- return this;
395
- }
396
-
397
- withIdGreaterThanOrEqualTo(val: any): this {
398
- this.filters.push({ "id": { "$gte": val } });
399
- return this;
400
- }
401
-
402
- withIdLessThan(val: any): this {
403
- this.filters.push({ "id": { "$lt": val } });
404
- return this;
405
- }
406
-
407
- withIdLessThanOrEqualTo(val: any): this {
408
- this.filters.push({ "id": { "$lte": val } });
409
- return this;
410
- }
411
-
412
- withIdBetween(lower: any, upper: any): this {
413
- this.filters.push({ "id": { "$between": [lower, upper] } });
414
- return this;
415
- }
416
-
417
- withIdIsKnown(): this {
418
- this.filters.push({ "id": { "$isNull": false } });
419
- return this;
420
- }
421
-
422
- withIdIsUnknown(): this {
423
- this.filters.push({ "id": { "$isNull": true } });
424
- return this;
425
- }
426
-
427
- withNameContaining(val: string): this {
428
- this.filters.push({ "name": { "$contains": val } });
429
- return this;
430
- }
431
-
432
- withNameIs(val: string): this {
433
- this.filters.push({ "name": { "$eq": val } });
434
- return this;
435
- }
436
-
437
- withNameIsNot(val: any): this {
438
- this.filters.push({ "name": { "$ne": val } });
439
- return this;
440
- }
441
-
442
- withNameIn(...vals: any[]): this {
443
- this.filters.push({ "name": { "$in": vals } });
444
- return this;
445
- }
446
-
447
- withNameNotIn(...vals: any[]): this {
448
- this.filters.push({ "name": { "$notIn": vals } });
449
- return this;
450
- }
451
-
452
- withNameGreaterThan(val: any): this {
453
- this.filters.push({ "name": { "$gt": val } });
454
- return this;
455
- }
456
-
457
- withNameGreaterThanOrEqualTo(val: any): this {
458
- this.filters.push({ "name": { "$gte": val } });
459
- return this;
460
- }
461
-
462
- withNameLessThan(val: any): this {
463
- this.filters.push({ "name": { "$lt": val } });
464
- return this;
465
- }
466
-
467
- withNameLessThanOrEqualTo(val: any): this {
468
- this.filters.push({ "name": { "$lte": val } });
469
- return this;
470
- }
471
-
472
- withNameBetween(lower: any, upper: any): this {
473
- this.filters.push({ "name": { "$between": [lower, upper] } });
474
- return this;
475
- }
476
-
477
- withNameIsKnown(): this {
478
- this.filters.push({ "name": { "$isNull": false } });
479
- return this;
480
- }
481
-
482
- withNameIsUnknown(): this {
483
- this.filters.push({ "name": { "$isNull": true } });
484
- return this;
485
- }
486
- withNameNotContaining(val: string): this {
487
- this.filters.push({ "name": { "$notContains": val } });
488
- return this;
489
- }
490
-
491
- withNameStartingWith(val: string): this {
492
- this.filters.push({ "name": { "$startsWith": val } });
493
- return this;
494
- }
495
-
496
- withNameNotStartingWith(val: string): this {
497
- this.filters.push({ "name": { "$notStartsWith": val } });
498
- return this;
499
- }
500
-
501
- withNameEndingWith(val: string): this {
502
- this.filters.push({ "name": { "$endsWith": val } });
503
- return this;
504
- }
505
-
506
- withNameNotEndingWith(val: string): this {
507
- this.filters.push({ "name": { "$notEndsWith": val } });
508
- return this;
509
- }
510
-
511
- withNameSoundingLike(val: string): this {
512
- this.filters.push({ "name": { "$soundLike": val } });
513
- return this;
514
- }
515
-
516
- withVersionIs(val: any): this {
517
- this.filters.push({ "version": { "$eq": val } });
518
- return this;
519
- }
520
-
521
- withVersionIsNot(val: any): this {
522
- this.filters.push({ "version": { "$ne": val } });
523
- return this;
524
- }
525
-
526
- withVersionIn(...vals: any[]): this {
527
- this.filters.push({ "version": { "$in": vals } });
528
- return this;
529
- }
530
-
531
- withVersionNotIn(...vals: any[]): this {
532
- this.filters.push({ "version": { "$notIn": vals } });
533
- return this;
534
- }
535
-
536
- withVersionGreaterThan(val: any): this {
537
- this.filters.push({ "version": { "$gt": val } });
538
- return this;
539
- }
540
-
541
- withVersionGreaterThanOrEqualTo(val: any): this {
542
- this.filters.push({ "version": { "$gte": val } });
543
- return this;
544
- }
545
-
546
- withVersionLessThan(val: any): this {
547
- this.filters.push({ "version": { "$lt": val } });
548
- return this;
549
- }
550
-
551
- withVersionLessThanOrEqualTo(val: any): this {
552
- this.filters.push({ "version": { "$lte": val } });
553
- return this;
554
- }
555
-
556
- withVersionBetween(lower: any, upper: any): this {
557
- this.filters.push({ "version": { "$between": [lower, upper] } });
558
- return this;
559
- }
560
-
561
- withVersionIsKnown(): this {
562
- this.filters.push({ "version": { "$isNull": false } });
563
- return this;
564
- }
565
-
566
- withVersionIsUnknown(): this {
567
- this.filters.push({ "version": { "$isNull": true } });
568
- return this;
569
- }
570
-
571
- orderByIdAscending(): this {
572
- this.query.orderBy("id", "asc");
573
- return this;
574
- }
575
-
576
- orderByIdDescending(): this {
577
- this.query.orderBy("id", "desc");
578
- return this;
579
- }
580
-
581
- orderByNameAscending(): this {
582
- this.query.orderBy("name", "asc");
583
- return this;
584
- }
585
-
586
- orderByNameDescending(): this {
587
- this.query.orderBy("name", "desc");
588
- return this;
589
- }
590
-
591
- orderByVersionAscending(): this {
592
- this.query.orderBy("version", "asc");
593
- return this;
594
- }
595
-
596
- orderByVersionDescending(): this {
597
- this.query.orderBy("version", "desc");
598
- return this;
599
- }
600
-
601
-
602
- // --- Aggregations ---
603
- count(): this {
604
- this.query.aggregate("Count", "id", "count");
605
- this._pageCountAlias = "count";
606
- this._pageCountMethod = "count";
607
- return this;
608
- }
609
-
610
- countAs(retName: string): this {
611
- this.query.aggregate("Count", "id", retName);
612
- this._pageCountAlias = retName;
613
- this._pageCountMethod = "countAs";
614
- return this;
615
- }
616
-
617
-
618
- // --- Group By ---
619
- groupById(): this {
620
- this.query.groupBy("id");
621
- return this;
622
- }
623
-
624
- groupByIdAs(retName: string): this {
625
- this.query.groupBy("id"); // In TS we don't alias group by yet natively
626
- return this;
627
- }
628
- groupByName(): this {
629
- this.query.groupBy("name");
630
- return this;
631
- }
632
-
633
- groupByNameAs(retName: string): this {
634
- this.query.groupBy("name"); // In TS we don't alias group by yet natively
635
- return this;
636
- }
637
- groupByVersion(): this {
638
- this.query.groupBy("version");
639
- return this;
640
- }
641
-
642
- groupByVersionAs(retName: string): this {
643
- this.query.groupBy("version"); // In TS we don't alias group by yet natively
644
- return this;
645
- }
646
-
647
- // --- Facets ---
648
-
649
- private async executeForListInternal(context: UserContext): Promise<SmartList<Platform>> {
650
- this.ensureIntent();
651
- if (this.filters.length > 0) {
652
- this.query.filter({ "$and": this.filters });
653
- }
654
-
655
- const service = context.requireResource<TeaQLDataService>("dataService");
656
- const rows = await service.executeQuery(context.prepareQuery(this.query));
657
- const queryRoot = new EntityRoot();
658
- const aggregateOnly = this.query.aggregateItems.length > 0 && this.query.groupByItems.length === 0;
659
- const data = aggregateOnly ? [] : rows.map((row: unknown) =>
660
- row instanceof Platform
661
- ? row
662
- : Platform.fromRecord(row as Record<string, unknown>, queryRoot));
663
- const result = new SmartList<Platform>(data);
664
- if (aggregateOnly && rows[0]) Object.assign(result.aggregations, rows[0]);
665
-
666
- if (this.query.facets.length > 0) {
667
- result.facets = await executeRelationFacets(
668
- service, (query: any) => context.prepareQuery(query), this.query, this.query.facets);
669
- }
670
-
671
- return result;
672
- }
673
-
674
- private async executeForRowsInternal(context: UserContext): Promise<SmartList<Record<string, unknown>>> {
675
- this.ensureIntent();
676
- if (this.filters.length > 0) this.query.filter({ "$and": this.filters });
677
- const service = context.requireResource<TeaQLDataService>("dataService");
678
- return new SmartList<Record<string, unknown>>(
679
- await service.executeQuery(context.prepareQuery(this.query)) as Record<string, unknown>[]);
680
- }
681
-
682
- private async executeForPageInternal(
683
- context: UserContext, offset: number, limit: number,
684
- ): Promise<TeaQLPage<Platform>> {
685
- this.ensureIntent();
686
- this.query.offset(offset).limit(limit);
687
- if (this.filters.length > 0) this.query.filter({ "$and": this.filters });
688
- const service = context.requireResource<TeaQLDataService>("dataService");
689
- const useIdSet = this.query.localIdSetPaginationOptions() !== undefined;
690
- const countOperation = { kind: "named-count" as const,
691
- method: this._pageCountMethod ?? "count",
692
- ...(this._pageCountMethod === "countAs" ? { alias: this._pageCountAlias } : {}) };
693
- const totalCountBeforeRows = useIdSet ? undefined : await service.executeCount(
694
- this.query, this._pageCountAlias, countOperation);
695
- const pageQuery = this.query.clone();
696
- // A page count describes the full filtered set, not an aggregate-only page row.
697
- pageQuery.aggregateItems = pageQuery.aggregateItems.filter(item =>
698
- !(String(item.function).toLowerCase() === "count" && item.alias === this._pageCountAlias));
699
- const rows = await service.executeQuery(context.prepareQuery(pageQuery));
700
- const totalCount = useIdSet && context.idSetPaginationCountAccuracy === "EXACT"
701
- ? context.idSetPaginationCount!
702
- : (totalCountBeforeRows ?? await service.executeCount(this.query, this._pageCountAlias, countOperation));
703
- const queryRoot = new EntityRoot();
704
- const data = new SmartList(rows.map((row: unknown) =>
705
- row instanceof Platform
706
- ? row
707
- : Platform.fromRecord(row as Record<string, unknown>, queryRoot)));
708
- data.totalCount = totalCount;
709
- if (this._pageCountAlias !== undefined) data.aggregations[this._pageCountAlias] = totalCount;
710
- if (this.query.facets.length > 0) {
711
- data.facets = await executeRelationFacets(
712
- service, (query: any) => context.prepareQuery(query), this.query, this.query.facets);
713
- }
714
- return { data, totalCount, offset, limit };
715
- }
716
-
717
- private async *executeForStreamInternal(context: UserContext, chunkSize: number): AsyncIterable<Platform> {
718
- this.ensureIntent();
719
- if (this.filters.length > 0) this.query.filter({ "$and": this.filters });
720
- const service = context.requireResource<TeaQLDataService>("dataService");
721
- const queryRoot = new EntityRoot();
722
- for await (const chunk of service.executeForStream(this.query, chunkSize)) {
723
- for (const entity of chunk) {
724
- yield entity instanceof Platform
725
- ? entity
726
- : Platform.fromRecord(entity as Record<string, unknown>, queryRoot);
727
- }
728
- }
729
- }
730
-
731
- private ensureIntent(): void {
732
- if (!this._comment?.trim()) {
733
- throw new Error("Security audit failure: non-empty comment() is required before execution");
734
- }
735
- if (!this._purpose?.trim()) {
736
- throw new Error("Security audit failure: non-empty purpose() is required before execution");
737
- }
738
- }
739
-
740
- }
741
-
742
- export class ExecutablePlatformRequest {
743
- constructor(
744
- private readonly execute: (context: UserContext) => Promise<SmartList<Platform>>,
745
- private readonly executeRows: (context: UserContext) => Promise<SmartList<Record<string, unknown>>>,
746
- private readonly page: (
747
- context: UserContext, offset: number, limit: number,
748
- ) => Promise<TeaQLPage<Platform>>,
749
- private readonly stream: (context: UserContext, chunkSize: number) => AsyncIterable<Platform>,
750
- private readonly limitOne: () => void,
751
- private readonly addComment: (comment: string) => void,
752
- private readonly ensureIntent: () => void,
753
- ) {}
754
-
755
- comment(c: string): this {
756
- this.addComment(c);
757
- return this;
758
- }
759
-
760
- newEntity(context: UserContext): Platform {
761
- this.ensureIntent();
762
- return new Platform();
763
- }
764
-
765
- executeForList(context: UserContext): Promise<SmartList<Platform>> {
766
- this.ensureIntent();
767
- return this.execute(context);
768
- }
769
-
770
- executeForRows(context: UserContext): Promise<SmartList<Record<string, unknown>>> {
771
- this.ensureIntent();
772
- return this.executeRows(context);
773
- }
774
-
775
- executeForPage(
776
- context: UserContext, offset: number, limit: number,
777
- ): Promise<TeaQLPage<Platform>> {
778
- this.ensureIntent();
779
- return this.page(context, offset, limit);
780
- }
781
-
782
- executeForStream(context: UserContext, chunkSize = 1000): AsyncIterable<Platform> {
783
- this.ensureIntent();
784
- return this.stream(context, chunkSize);
785
- }
786
-
787
- async executeForOne(context: UserContext): Promise<Platform | undefined> {
788
- this.limitOne();
789
- return (await this.executeForList(context))[0];
790
- }
791
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/src/runtime-module.ts DELETED
@@ -1,150 +0,0 @@
1
- import { ObjectLocation, RuntimeModule } from "teaql-ts";
2
- import { ENTITY_SCHEMAS } from "./teaql-schemas";
3
- import { ensureGeneratedBootstrap } from "./generated-bootstrap";
4
-
5
- /** Generated canonical KSML to selected-wire mapping. Never infer this from TS members. */
6
- export const GENERATED_WIRE_MODEL_METADATA = Object.freeze({
7
- profile: "camelCase" as const,
8
- entities: Object.freeze({
9
- "Platform": Object.freeze({
10
- entityType: "Platform",
11
- profile: "camelCase" as const,
12
- fields: Object.freeze({
13
- "id": Object.freeze({ canonicalName: "id", wireName: "id", aliases: Object.freeze([] as string[]) }),
14
- "name": Object.freeze({ canonicalName: "name", wireName: "name", aliases: Object.freeze([] as string[]) }),
15
- "version": Object.freeze({ canonicalName: "version", wireName: "version", aliases: Object.freeze([] as string[]) })
16
- }),
17
- }),
18
- "OrderStatus": Object.freeze({
19
- entityType: "OrderStatus",
20
- profile: "camelCase" as const,
21
- fields: Object.freeze({
22
- "platform": Object.freeze({ canonicalName: "platform", wireName: "platform", aliases: Object.freeze([] as string[]) }),
23
- "id": Object.freeze({ canonicalName: "id", wireName: "id", aliases: Object.freeze([] as string[]) }),
24
- "name": Object.freeze({ canonicalName: "name", wireName: "name", aliases: Object.freeze([] as string[]) }),
25
- "code": Object.freeze({ canonicalName: "code", wireName: "code", aliases: Object.freeze([] as string[]) }),
26
- "color": Object.freeze({ canonicalName: "color", wireName: "color", aliases: Object.freeze([] as string[]) }),
27
- "display_order": Object.freeze({ canonicalName: "display_order", wireName: "displayOrder", aliases: Object.freeze([] as string[]) }),
28
- "version": Object.freeze({ canonicalName: "version", wireName: "version", aliases: Object.freeze([] as string[]) })
29
- }),
30
- }),
31
- "Customer": Object.freeze({
32
- entityType: "Customer",
33
- profile: "camelCase" as const,
34
- fields: Object.freeze({
35
- "id": Object.freeze({ canonicalName: "id", wireName: "id", aliases: Object.freeze([] as string[]) }),
36
- "platform": Object.freeze({ canonicalName: "platform", wireName: "platform", aliases: Object.freeze([] as string[]) }),
37
- "name": Object.freeze({ canonicalName: "name", wireName: "name", aliases: Object.freeze([] as string[]) }),
38
- "version": Object.freeze({ canonicalName: "version", wireName: "version", aliases: Object.freeze([] as string[]) })
39
- }),
40
- }),
41
- "CustomerOrder": Object.freeze({
42
- entityType: "CustomerOrder",
43
- profile: "camelCase" as const,
44
- fields: Object.freeze({
45
- "id": Object.freeze({ canonicalName: "id", wireName: "id", aliases: Object.freeze([] as string[]) }),
46
- "customer": Object.freeze({ canonicalName: "customer", wireName: "customer", aliases: Object.freeze([] as string[]) }),
47
- "status": Object.freeze({ canonicalName: "status", wireName: "status", aliases: Object.freeze([] as string[]) }),
48
- "order_number": Object.freeze({ canonicalName: "order_number", wireName: "orderNumber", aliases: Object.freeze([] as string[]) }),
49
- "order_date": Object.freeze({ canonicalName: "order_date", wireName: "orderDate", aliases: Object.freeze([] as string[]) }),
50
- "total_amount": Object.freeze({ canonicalName: "total_amount", wireName: "totalAmount", aliases: Object.freeze([] as string[]) }),
51
- "version": Object.freeze({ canonicalName: "version", wireName: "version", aliases: Object.freeze([] as string[]) })
52
- }),
53
- }),
54
- "OrderItem": Object.freeze({
55
- entityType: "OrderItem",
56
- profile: "camelCase" as const,
57
- fields: Object.freeze({
58
- "id": Object.freeze({ canonicalName: "id", wireName: "id", aliases: Object.freeze([] as string[]) }),
59
- "customer_order": Object.freeze({ canonicalName: "customer_order", wireName: "customerOrder", aliases: Object.freeze([] as string[]) }),
60
- "product_name": Object.freeze({ canonicalName: "product_name", wireName: "productName", aliases: Object.freeze([] as string[]) }),
61
- "quantity": Object.freeze({ canonicalName: "quantity", wireName: "quantity", aliases: Object.freeze([] as string[]) }),
62
- "unit_price": Object.freeze({ canonicalName: "unit_price", wireName: "unitPrice", aliases: Object.freeze([] as string[]) }),
63
- "version": Object.freeze({ canonicalName: "version", wireName: "version", aliases: Object.freeze([] as string[]) })
64
- }),
65
- })
66
- }),
67
- });
68
-
69
- /** Passive generated metadata manifest. It never modifies the database schema. */
70
- export const GENERATED_RUNTIME_MODULE = new RuntimeModule(ENTITY_SCHEMAS, {
71
- "Platform": {
72
- checkAndFix(context, mutation, results) {
73
- const now = context.getResource("fixTime");
74
- if ((mutation.action === "Create" && mutation.payload["name"] === undefined) || mutation.payload["name"] === null) results.push({ ruleId: "required", location: ObjectLocation.property("name") });
75
- if (mutation.payload["name"] != null && [...String(mutation.payload["name"])].length > 100) results.push({ ruleId: "max_length", location: ObjectLocation.property("name"), inputValue: mutation.payload["name"], systemValue: 100 });
76
-
77
-
78
- },
79
- },
80
- "OrderStatus": {
81
- checkAndFix(context, mutation, results) {
82
- const now = context.getResource("fixTime");
83
- if ((mutation.action === "Create" && mutation.payload["platform"] === undefined) || mutation.payload["platform"] === null) results.push({ ruleId: "required", location: ObjectLocation.property("platform") });
84
-
85
-
86
- if ((mutation.action === "Create" && mutation.payload["name"] === undefined) || mutation.payload["name"] === null) results.push({ ruleId: "required", location: ObjectLocation.property("name") });
87
- if (mutation.payload["name"] != null && [...String(mutation.payload["name"])].length > 100) results.push({ ruleId: "max_length", location: ObjectLocation.property("name"), inputValue: mutation.payload["name"], systemValue: 100 });
88
-
89
- if ((mutation.action === "Create" && mutation.payload["code"] === undefined) || mutation.payload["code"] === null) results.push({ ruleId: "required", location: ObjectLocation.property("code") });
90
- if (mutation.payload["code"] != null && [...String(mutation.payload["code"])].length > 100) results.push({ ruleId: "max_length", location: ObjectLocation.property("code"), inputValue: mutation.payload["code"], systemValue: 100 });
91
-
92
- if ((mutation.action === "Create" && mutation.payload["color"] === undefined) || mutation.payload["color"] === null) results.push({ ruleId: "required", location: ObjectLocation.property("color") });
93
- if (mutation.payload["color"] != null && [...String(mutation.payload["color"])].length > 100) results.push({ ruleId: "max_length", location: ObjectLocation.property("color"), inputValue: mutation.payload["color"], systemValue: 100 });
94
-
95
- if ((mutation.action === "Create" && mutation.payload["display_order"] === undefined) || mutation.payload["display_order"] === null) results.push({ ruleId: "required", location: ObjectLocation.property("display_order") });
96
-
97
-
98
- },
99
- },
100
- "Customer": {
101
- checkAndFix(context, mutation, results) {
102
- const now = context.getResource("fixTime");
103
- if ((mutation.action === "Create" && mutation.payload["platform"] === undefined) || mutation.payload["platform"] === null) results.push({ ruleId: "required", location: ObjectLocation.property("platform") });
104
-
105
- if ((mutation.action === "Create" && mutation.payload["name"] === undefined) || mutation.payload["name"] === null) results.push({ ruleId: "required", location: ObjectLocation.property("name") });
106
- if (mutation.payload["name"] != null && [...String(mutation.payload["name"])].length > 100) results.push({ ruleId: "max_length", location: ObjectLocation.property("name"), inputValue: mutation.payload["name"], systemValue: 100 });
107
-
108
-
109
- },
110
- },
111
- "CustomerOrder": {
112
- checkAndFix(context, mutation, results) {
113
- const now = context.getResource("fixTime");
114
- if ((mutation.action === "Create" && mutation.payload["customer"] === undefined) || mutation.payload["customer"] === null) results.push({ ruleId: "required", location: ObjectLocation.property("customer") });
115
-
116
- if ((mutation.action === "Create" && mutation.payload["status"] === undefined) || mutation.payload["status"] === null) results.push({ ruleId: "required", location: ObjectLocation.property("status") });
117
-
118
- if ((mutation.action === "Create" && mutation.payload["order_number"] === undefined) || mutation.payload["order_number"] === null) results.push({ ruleId: "required", location: ObjectLocation.property("order_number") });
119
- if (mutation.payload["order_number"] != null && [...String(mutation.payload["order_number"])].length > 100) results.push({ ruleId: "max_length", location: ObjectLocation.property("order_number"), inputValue: mutation.payload["order_number"], systemValue: 100 });
120
-
121
- if ((mutation.action === "Create" && mutation.payload["order_date"] === undefined) || mutation.payload["order_date"] === null) results.push({ ruleId: "required", location: ObjectLocation.property("order_date") });
122
-
123
- if ((mutation.action === "Create" && mutation.payload["total_amount"] === undefined) || mutation.payload["total_amount"] === null) results.push({ ruleId: "required", location: ObjectLocation.property("total_amount") });
124
-
125
-
126
- },
127
- },
128
- "OrderItem": {
129
- checkAndFix(context, mutation, results) {
130
- const now = context.getResource("fixTime");
131
- if ((mutation.action === "Create" && mutation.payload["customer_order"] === undefined) || mutation.payload["customer_order"] === null) results.push({ ruleId: "required", location: ObjectLocation.property("customer_order") });
132
-
133
- if ((mutation.action === "Create" && mutation.payload["product_name"] === undefined) || mutation.payload["product_name"] === null) results.push({ ruleId: "required", location: ObjectLocation.property("product_name") });
134
- if (mutation.payload["product_name"] != null && [...String(mutation.payload["product_name"])].length > 100) results.push({ ruleId: "max_length", location: ObjectLocation.property("product_name"), inputValue: mutation.payload["product_name"], systemValue: 100 });
135
-
136
- if ((mutation.action === "Create" && mutation.payload["quantity"] === undefined) || mutation.payload["quantity"] === null) results.push({ ruleId: "required", location: ObjectLocation.property("quantity") });
137
-
138
- if ((mutation.action === "Create" && mutation.payload["unit_price"] === undefined) || mutation.payload["unit_price"] === null) results.push({ ruleId: "required", location: ObjectLocation.property("unit_price") });
139
-
140
-
141
- },
142
- }
143
- }, { ...{
144
- defaultDomainRoot: { entity: "Platform", id: "1", values: { "name": "Commerce Test Platform" } },
145
- constants: [
146
- { entity: "OrderStatus", id: "1001", values: { "platform": "1", "name": "New", "code": "NEW", "color": "#94A3B8", "displayOrder": 1 } },
147
- { entity: "OrderStatus", id: "1002", values: { "platform": "1", "name": "Paid", "code": "PAID", "color": "#22C55E", "displayOrder": 2 } },
148
- { entity: "OrderStatus", id: "1003", values: { "platform": "1", "name": "Cancelled", "code": "CANCELLED", "color": "#EF4444", "displayOrder": 3 } }
149
- ]
150
- }, ensure: ensureGeneratedBootstrap });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/src/teaql-schemas.ts DELETED
@@ -1,34 +0,0 @@
1
- import { EntitySchema } from "teaql-ts/sql/core";
2
-
3
- export const ENTITY_SCHEMAS: Record<string, EntitySchema> = {
4
- "Platform": {
5
- table: "platform_data",
6
- auditMaskFields: [],
7
- columns: {"id": { columnName: "id", modelName: "id", logPolicy: "plain", logicalType: "integer", decode: "string", nullable: false }, "name": { columnName: "name", modelName: "name", logPolicy: "plain", logicalType: "text", decode: "native", nullable: false }, "version": { columnName: "version", modelName: "version", logPolicy: "plain", logicalType: "integer", decode: "number", nullable: false }},
8
- relations: {"orderStatusList": { targetEntity: "OrderStatus", localKey: "id", foreignKey: "platform", many: true }, "customerList": { targetEntity: "Customer", localKey: "id", foreignKey: "platform", many: true }}
9
- },
10
- "OrderStatus": {
11
- table: "order_status_data",
12
- auditMaskFields: [],
13
- columns: {"platform": { columnName: "platform", modelName: "platform", logPolicy: "plain", logicalType: "integer", decode: "string", nullable: false }, "id": { columnName: "id", modelName: "id", logPolicy: "plain", logicalType: "integer", decode: "string", nullable: false }, "name": { columnName: "name", modelName: "name", logPolicy: "plain", logicalType: "text", decode: "native", nullable: false }, "code": { columnName: "code", modelName: "code", logPolicy: "plain", logicalType: "text", decode: "native", nullable: false }, "color": { columnName: "color", modelName: "color", logPolicy: "plain", logicalType: "text", decode: "native", nullable: false }, "displayOrder": { columnName: "display_order", modelName: "display_order", logPolicy: "plain", logicalType: "integer", decode: "number", nullable: false }, "version": { columnName: "version", modelName: "version", logPolicy: "plain", logicalType: "integer", decode: "number", nullable: false }},
14
- relations: {"platform": { targetEntity: "Platform", localKey: "platform", foreignKey: "id", many: false }, "customerOrderList": { targetEntity: "CustomerOrder", localKey: "id", foreignKey: "status", many: true }}
15
- },
16
- "Customer": {
17
- table: "customer_data",
18
- auditMaskFields: [],
19
- columns: {"id": { columnName: "id", modelName: "id", logPolicy: "plain", logicalType: "integer", decode: "string", nullable: false }, "platform": { columnName: "platform", modelName: "platform", logPolicy: "plain", logicalType: "integer", decode: "string", nullable: false }, "name": { columnName: "name", modelName: "name", logPolicy: "plain", logicalType: "text", decode: "native", nullable: false }, "version": { columnName: "version", modelName: "version", logPolicy: "plain", logicalType: "integer", decode: "number", nullable: false }},
20
- relations: {"platform": { targetEntity: "Platform", localKey: "platform", foreignKey: "id", many: false }, "customerOrderList": { targetEntity: "CustomerOrder", localKey: "id", foreignKey: "customer", many: true }}
21
- },
22
- "CustomerOrder": {
23
- table: "customer_order_data",
24
- auditMaskFields: [],
25
- columns: {"id": { columnName: "id", modelName: "id", logPolicy: "plain", logicalType: "integer", decode: "string", nullable: false }, "customer": { columnName: "customer", modelName: "customer", logPolicy: "plain", logicalType: "integer", decode: "string", nullable: false }, "status": { columnName: "status", modelName: "status", logPolicy: "plain", logicalType: "integer", decode: "string", nullable: false }, "orderNumber": { columnName: "order_number", modelName: "order_number", logPolicy: "plain", logicalType: "text", decode: "native", nullable: false }, "orderDate": { columnName: "order_date", modelName: "order_date", logPolicy: "plain", logicalType: "date", decode: "date", nullable: false }, "totalAmount": { columnName: "total_amount", modelName: "total_amount", logPolicy: "plain", logicalType: "decimal", decode: "number", nullable: false }, "version": { columnName: "version", modelName: "version", logPolicy: "plain", logicalType: "integer", decode: "number", nullable: false }},
26
- relations: {"customer": { targetEntity: "Customer", localKey: "customer", foreignKey: "id", many: false }, "status": { targetEntity: "OrderStatus", localKey: "status", foreignKey: "id", many: false }, "orderItemList": { targetEntity: "OrderItem", localKey: "id", foreignKey: "customerOrder", many: true }}
27
- },
28
- "OrderItem": {
29
- table: "order_item_data",
30
- auditMaskFields: [],
31
- columns: {"id": { columnName: "id", modelName: "id", logPolicy: "plain", logicalType: "integer", decode: "string", nullable: false }, "customerOrder": { columnName: "customer_order", modelName: "customer_order", logPolicy: "plain", logicalType: "integer", decode: "string", nullable: false }, "productName": { columnName: "product_name", modelName: "product_name", logPolicy: "plain", logicalType: "text", decode: "native", nullable: false }, "quantity": { columnName: "quantity", modelName: "quantity", logPolicy: "plain", logicalType: "integer", decode: "number", nullable: false }, "unitPrice": { columnName: "unit_price", modelName: "unit_price", logPolicy: "plain", logicalType: "decimal", decode: "number", nullable: false }, "version": { columnName: "version", modelName: "version", logPolicy: "plain", logicalType: "integer", decode: "number", nullable: false }},
32
- relations: {"customerOrder": { targetEntity: "CustomerOrder", localKey: "customerOrder", foreignKey: "id", many: false }}
33
- }
34
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/src/teaql-ts.ts DELETED
@@ -1,308 +0,0 @@
1
- import {
2
- CheckException, EntityChecker, RuntimeModule,
3
- SelectQuery as RuntimeSelectQuery, UserContext,
4
- executeRelationFacets, QueryRequest, MutationIntent, MutationRequest, GraphMutationSession,
5
- } from "teaql-ts";
6
-
7
- export { CheckException, EntityRoot, ObjectLocation, SmartList, UserContext, executeRelationFacets, MutationIntent } from "teaql-ts";
8
- export { GraphMutationSession, LoadedScalarSnapshot, MutationTraceScope } from "teaql-ts";
9
- export type { EntityKey } from "teaql-ts";
10
- export type { TeaQLPage } from "teaql-ts";
11
- import type { QueryOperation } from "teaql-ts";
12
-
13
- function soundex(input: unknown): string {
14
- const text = String(input ?? "").toUpperCase().replace(/[^A-Z]/g, "");
15
- if (!text) return "";
16
- const code = (char: string): string => "BFPV".includes(char) ? "1"
17
- : "CGJKQSXZ".includes(char) ? "2" : "DT".includes(char) ? "3"
18
- : char === "L" ? "4" : "MN".includes(char) ? "5" : char === "R" ? "6" : "";
19
- let result = text[0], previous = code(text[0]);
20
- for (const char of text.slice(1)) {
21
- const current = code(char);
22
- if (current && current !== previous) result += current;
23
- previous = current;
24
- if (result.length === 4) break;
25
- }
26
- return (result + "000").slice(0, 4);
27
- }
28
-
29
- /** Generated naming adapter; query policy and execution remain in the formal runtime. */
30
- export class SelectQuery extends RuntimeSelectQuery {
31
- orderBy(field: string, direction: string): this {
32
- return this.order({ field, expr: null, direction: direction === "desc" ? "Desc" : "Asc" } as any);
33
- }
34
-
35
- relationQuery(
36
- name: string, query: RuntimeSelectQuery, localKey = "id", foreignKey = "id", many = true,
37
- operation?: QueryOperation,
38
- ): this {
39
- return super.relationQuery(name, query, localKey, foreignKey, many, operation);
40
- }
41
- }
42
-
43
- export interface TeaQLDataService {
44
- executeGraphSave<T>(intent: MutationIntent, work: (graph: GraphMutationSession) => Promise<T>): Promise<T>;
45
- preflightMutation(mutation: any): any;
46
- afterGraphCommit(work: () => void): void;
47
- afterGraphRollback(work: () => void): void;
48
- executeMutation(mutation: any): Promise<any>;
49
- executeQuery(query: any): Promise<any[]>;
50
- executeCount(query: any, alias?: string, operation?: QueryOperation): Promise<number>;
51
- executeForStream(query: any, chunkSize?: number): AsyncIterable<any[]>;
52
- close?(): Promise<void>;
53
- }
54
-
55
- export class TeaQLClient implements TeaQLDataService {
56
- private data: Record<string, Record<string, any>> = {};
57
- private nextIds: Record<string, number> = {};
58
- private readonly checkers: Record<string, EntityChecker> = {};
59
- private userContext = new UserContext();
60
- private graphSaveActive = false;
61
- private graphCommitActions: Array<() => void> = [];
62
- private graphRollbackActions: Array<() => void> = [];
63
- private graphSaveTail: Promise<void> = Promise.resolve();
64
- private readonly mutationGovernanceEvents: any[] = [];
65
-
66
- constructor(private storagePath?: string) {
67
- if (storagePath) {
68
- const fs = require("fs");
69
- if (fs.existsSync(storagePath)) {
70
- const state = JSON.parse(fs.readFileSync(storagePath, "utf8"));
71
- this.data = state.data || {};
72
- this.nextIds = state.nextIds || {};
73
- }
74
- }
75
- }
76
-
77
- /** Installs passive generated metadata. It never mutates storage. */
78
- install(module: RuntimeModule): this {
79
- Object.assign(this.checkers, module.checkers);
80
- return this;
81
- }
82
-
83
- setUserContext(context: UserContext): this {
84
- this.userContext = context;
85
- return this;
86
- }
87
-
88
- get mutationGovernanceTrace(): readonly any[] {
89
- return [...this.mutationGovernanceEvents];
90
- }
91
-
92
- private persist() {
93
- if (!this.storagePath) return;
94
- const fs = require("fs");
95
- const path = require("path");
96
- fs.mkdirSync(path.dirname(path.resolve(this.storagePath)), { recursive: true });
97
- const temporaryPath = `${this.storagePath}.tmp`;
98
- fs.writeFileSync(temporaryPath, JSON.stringify({ data: this.data, nextIds: this.nextIds }));
99
- fs.renameSync(temporaryPath, this.storagePath);
100
- }
101
-
102
- async executeGraphSave<T>(intent: MutationIntent, work: (graph: GraphMutationSession) => Promise<T>): Promise<T> {
103
- const graph = new GraphMutationSession(intent);
104
- const predecessor = this.graphSaveTail;
105
- let release!: () => void;
106
- this.graphSaveTail = new Promise<void>(resolve => { release = resolve; });
107
- await predecessor;
108
- const dataSnapshot = JSON.parse(JSON.stringify(this.data));
109
- const nextIdsSnapshot = { ...this.nextIds };
110
- let fixEvidenceStarted = false;
111
- let mutationPolicyGraphStarted = false;
112
- try {
113
- this.graphSaveActive = true;
114
- this.graphCommitActions = [];
115
- this.graphRollbackActions = [];
116
- this.userContext.insertResource("fixTime", new Date());
117
- this.userContext.beginFixEvidence();
118
- fixEvidenceStarted = true;
119
- this.userContext.beginMutationPolicyGraph();
120
- mutationPolicyGraphStarted = true;
121
- const result = await work(graph);
122
- this.userContext.ensureMutationPolicyGraphComplete();
123
- this.persist();
124
- for (const action of this.graphCommitActions) action();
125
- return result;
126
- } catch (error) {
127
- this.data = dataSnapshot;
128
- this.nextIds = nextIdsSnapshot;
129
- for (const action of [...this.graphRollbackActions].reverse()) action();
130
- throw error;
131
- } finally {
132
- this.graphSaveActive = false;
133
- this.graphCommitActions = [];
134
- this.graphRollbackActions = [];
135
- if (mutationPolicyGraphStarted) this.userContext.endMutationPolicyGraph();
136
- this.userContext.removeResource("fixTime");
137
- if (fixEvidenceStarted) this.userContext.finishFixEvidence();
138
- release();
139
- }
140
- }
141
-
142
- afterGraphCommit(work: () => void): void {
143
- if (!this.graphSaveActive) throw new Error("No graph save is active");
144
- this.graphCommitActions.push(work);
145
- }
146
-
147
- afterGraphRollback(work: () => void): void {
148
- if (!this.graphSaveActive) throw new Error("No graph save is active");
149
- this.graphRollbackActions.push(work);
150
- }
151
-
152
- preflightMutation(mutation: any): any {
153
- mutation = this.checkAndFixMutation(mutation);
154
- this.userContext.recordMutationPolicyPreflight(mutation);
155
- return mutation;
156
- }
157
-
158
- private checkAndFixMutation(mutation: any): any {
159
- if (mutation instanceof MutationRequest) mutation = mutation.mutation;
160
- if (!String(mutation?.comment || "").trim()) throw new Error("Security audit failure: audit reason is required before mutation");
161
- mutation = { ...mutation, payload: { ...(mutation?.payload || {}) } };
162
- const checker = this.checkers[String(mutation.entity)];
163
- if (!checker) return mutation;
164
- const results: any[] = [];
165
- const ownsFixTime = this.userContext.getResource("fixTime") === undefined;
166
- if (ownsFixTime) this.userContext.insertResource("fixTime", new Date()).beginFixEvidence();
167
- try {
168
- checker.checkAndFix(this.userContext, mutation, results);
169
- if (mutation.ledgerKey && mutation.ledgerRoot) for (const [field, value] of Object.entries(mutation.payload)) mutation.ledgerRoot.set(mutation.ledgerKey, field, value);
170
- this.userContext.translateCheckResults(results);
171
- if (results.length) throw new CheckException(results);
172
- return mutation;
173
- } finally { if (ownsFixTime) this.userContext.removeResource("fixTime").finishFixEvidence(); }
174
- }
175
-
176
- async executeMutation(mutation: any): Promise<any> {
177
- mutation = this.checkAndFixMutation(mutation);
178
- const mutationGovernance = this.userContext.enterMutationPolicy(mutation);
179
- this.mutationGovernanceEvents.push(mutationGovernance);
180
- const table = this.data[mutation.entity] ||= {};
181
- if (mutation.action === "Create") {
182
- const id = mutation.id ?? String(this.nextIds[mutation.entity] || 1);
183
- this.nextIds[mutation.entity] = Number(id) + 1;
184
- const record = { ...mutation.payload, id: String(id), version: Number(mutation.version || 0) + 1 };
185
- table[String(id)] = record;
186
- if (!this.graphSaveActive) this.persist();
187
- return { success: true, id: String(id), version: record.version, persistedRecord: { ...record } };
188
- }
189
- if (mutation.action === "Update") {
190
- const id = String(mutation.id);
191
- if (!table[id]) throw new Error(`${mutation.entity}(${id}) does not exist`);
192
- const expectedVersion = Number(mutation.version);
193
- const currentVersion = Number(table[id].version || 0);
194
- if (!Number.isFinite(expectedVersion) || expectedVersion !== currentVersion) {
195
- throw new Error(
196
- `Optimistic lock conflict for ${mutation.entity}(${id}): expected ${expectedVersion}, current ${currentVersion}`);
197
- }
198
- table[id] = { ...table[id], ...mutation.payload, id, version: Number(table[id].version || 0) + 1 };
199
- if (!this.graphSaveActive) this.persist();
200
- return { success: true, id, version: table[id].version, persistedRecord: { ...table[id] } };
201
- }
202
- if (mutation.action === "Delete") {
203
- const id = String(mutation.id);
204
- if (!table[id]) throw new Error(`${mutation.entity}(${id}) does not exist`);
205
- const expectedVersion = Number(mutation.version);
206
- const currentVersion = Number(table[id].version || 0);
207
- if (!Number.isFinite(expectedVersion) || expectedVersion !== currentVersion) {
208
- throw new Error(
209
- `Optimistic lock conflict for ${mutation.entity}(${id}): expected ${expectedVersion}, current ${currentVersion}`);
210
- }
211
- table[id] = { ...table[id], id, version: -(currentVersion + 1) };
212
- if (!this.graphSaveActive) this.persist();
213
- return { success: true, id, version: table[id].version, deleted: true, persistedRecord: { ...table[id] } };
214
- }
215
- throw new Error(`Unsupported mutation action: ${mutation.action}`);
216
- }
217
- async query(context: any, req: any): Promise<any> {
218
- return { rows: [] };
219
- }
220
- async executeQuery(query: any): Promise<any> {
221
- if (!(query instanceof RuntimeSelectQuery)) {
222
- throw new Error("TeaQL list execution requires the formal runtime SelectQuery");
223
- }
224
- query.prepareForList();
225
- let rows = Object.values(this.data[query.entity] || {}).map((row: any) => ({ ...row }));
226
- const matches = (row: any, expression: any): boolean => {
227
- if (expression?.$and) return expression.$and.every((item: any) => matches(row, item));
228
- return Object.entries(expression || {}).every(([field, predicate]: [string, any]) => {
229
- if (predicate?.$eq !== undefined) return row[field] === (predicate.$eq?.id ?? predicate.$eq);
230
- if (predicate?.$ne !== undefined) return row[field] !== (predicate.$ne?.id ?? predicate.$ne);
231
- if (predicate?.$contains !== undefined) return String(row[field] ?? "").includes(String(predicate.$contains));
232
- if (predicate?.$notContains !== undefined) return !String(row[field] ?? "").includes(String(predicate.$notContains));
233
- if (predicate?.$startsWith !== undefined) return String(row[field] ?? "").startsWith(String(predicate.$startsWith));
234
- if (predicate?.$notStartsWith !== undefined) return !String(row[field] ?? "").startsWith(String(predicate.$notStartsWith));
235
- if (predicate?.$endsWith !== undefined) return String(row[field] ?? "").endsWith(String(predicate.$endsWith));
236
- if (predicate?.$notEndsWith !== undefined) return !String(row[field] ?? "").endsWith(String(predicate.$notEndsWith));
237
- if (predicate?.$soundLike !== undefined) return soundex(row[field]) === soundex(predicate.$soundLike);
238
- if (predicate?.$in !== undefined) return predicate.$in.some((value: any) => row[field] === (value?.id ?? value));
239
- if (predicate?.$notIn !== undefined) return !predicate.$notIn.some((value: any) => row[field] === (value?.id ?? value));
240
- if (predicate?.$between !== undefined) return row[field] >= predicate.$between[0] && row[field] <= predicate.$between[1];
241
- if (predicate?.$isNull === true) return row[field] === null || row[field] === undefined;
242
- if (predicate?.$isNull === false) return row[field] !== null && row[field] !== undefined;
243
- if (predicate?.$gt !== undefined) return row[field] > predicate.$gt;
244
- if (predicate?.$gte !== undefined) return row[field] >= predicate.$gte;
245
- if (predicate?.$lt !== undefined) return row[field] < predicate.$lt;
246
- if (predicate?.$lte !== undefined) return row[field] <= predicate.$lte;
247
- return true;
248
- });
249
- };
250
- if (query.filterCondition) rows = rows.filter(row => matches(row, query.filterCondition));
251
- if (query.aggregateItems?.length) {
252
- return [Object.fromEntries(query.aggregateItems.map((aggregate: any) => {
253
- if (String(aggregate.function).toLowerCase() !== "count") {
254
- throw new Error(`Unsupported local aggregate: ${aggregate.function}`);
255
- }
256
- return [aggregate.alias, rows.length];
257
- }))];
258
- }
259
- for (const order of [...query.orderItems].reverse()) {
260
- rows.sort((a, b) => (a[order.field] === b[order.field] ? 0 : a[order.field] > b[order.field] ? 1 : -1) * (String(order.direction).toLowerCase() === "desc" ? -1 : 1));
261
- }
262
- const start = query.offsetValue || 0;
263
- rows = rows.slice(start, start + query.limitValue);
264
- for (const relation of (query.relations || []) as any[]) {
265
- const localValues = new Set(rows.map((row: any) => row[relation.localKey || "id"]));
266
- const relatedRows = (await this.executeQuery(relation.query)).filter(
267
- (row: any) => localValues.has(row[relation.foreignKey || "id"]));
268
- for (const row of rows) {
269
- const matches = relatedRows.filter(
270
- (related: any) => related[relation.foreignKey || "id"] === row[relation.localKey || "id"]);
271
- row[relation.name] = relation.many === false ? matches[0] : matches;
272
- }
273
- }
274
- if (query.selectItems.length > 0) {
275
- const selections = new Set(query.selectItems);
276
- for (const relation of (query.relations || []) as any[]) selections.add(relation.name);
277
- rows = rows.map((row: any) => Object.fromEntries(
278
- Object.entries(row).filter(([field]) => selections.has(field))));
279
- }
280
- return rows;
281
- }
282
- async executeCount(query: any, countAlias?: string, operation?: QueryOperation): Promise<number> {
283
- if (typeof query?.forExactCount !== "function") {
284
- throw new Error("TeaQL exact count requires the formal runtime SelectQuery");
285
- }
286
- const alias = countAlias ?? "__teaql_total";
287
- const request = new QueryRequest(query).deriveOperation(query.forExactCount(alias), operation ?? {
288
- kind: "named-count", ...(countAlias === undefined ? {} : { alias: countAlias }) });
289
- const rows = await this.executeQuery(request.query);
290
- const value = rows[0]?.[alias];
291
- if (typeof value !== "number" || !Number.isFinite(value)) {
292
- throw new Error(`TeaQL provider did not return exact count alias ${alias}`);
293
- }
294
- return value;
295
- }
296
- async *executeForStream(query: any, chunkSize = 1000): AsyncIterable<any[]> {
297
- if (!Number.isInteger(chunkSize) || chunkSize <= 0) throw new Error("stream chunk size must be a positive integer");
298
- const rows = await this.executeQuery(query);
299
- for (let offset = 0; offset < rows.length; offset += chunkSize) {
300
- yield rows.slice(offset, offset + chunkSize);
301
- }
302
- }
303
- }
304
-
305
- declare const require: any;
306
-
307
- export function eq(a: any, b: any) { return {type: 'eq', field: a, value: b}; }
308
- export function contain(a: any, b: any) { return {type: 'contain', field: a, value: b}; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/teaql-i18n.json DELETED
@@ -1,128 +0,0 @@
1
- {
2
- "schema": "teaql.i18n/v1",
3
- "defaultLocale": "en",
4
- "locales": {
5
- "de": {
6
- "vocabulary": {
7
- },
8
- "messages": {
9
- }
10
- },
11
- "ko": {
12
- "vocabulary": {
13
- },
14
- "messages": {
15
- }
16
- },
17
- "pt": {
18
- "vocabulary": {
19
- },
20
- "messages": {
21
- }
22
- },
23
- "zh-TW": {
24
- "vocabulary": {
25
- },
26
- "messages": {
27
- }
28
- },
29
- "fil": {
30
- "vocabulary": {
31
- },
32
- "messages": {
33
- }
34
- },
35
- "en": {
36
- "vocabulary": {
37
- "property.platform.name": "Name",
38
- "property.customerOrder.orderNumber": "Order Number",
39
- "property.orderItem.id": "Id",
40
- "entity.orderItem": "Order Item",
41
- "property.orderItem.customerOrder": "Customer Order",
42
- "property.orderStatus.version": "Version",
43
- "property.orderItem.unitPrice": "Unit Price",
44
- "property.orderItem.productName": "Product Name",
45
- "property.orderStatus.code": "Code",
46
- "property.customerOrder.orderDate": "Order Date",
47
- "entity.customerOrder": "Customer Order",
48
- "property.orderStatus.displayOrder": "Display Order",
49
- "entity.customer": "Customer",
50
- "property.customerOrder.id": "Id",
51
- "property.orderStatus.color": "Color",
52
- "property.customerOrder.totalAmount": "Total Amount",
53
- "property.customerOrder.version": "Version",
54
- "entity.platform": "Platform",
55
- "property.platform.id": "Id",
56
- "property.customer.version": "Version",
57
- "property.orderStatus.id": "Id",
58
- "property.customer.id": "Id",
59
- "property.customer.platform": "Platform",
60
- "entity.orderStatus": "Order Status",
61
- "property.customerOrder.customer": "Customer",
62
- "property.customer.name": "Name",
63
- "property.orderItem.version": "Version",
64
- "property.orderStatus.platform": "Platform",
65
- "property.orderStatus.name": "Name",
66
- "property.platform.version": "Version",
67
- "property.customerOrder.status": "Status",
68
- "property.orderItem.quantity": "Quantity"
69
- },
70
- "messages": {
71
- }
72
- },
73
- "fr": {
74
- "vocabulary": {
75
- },
76
- "messages": {
77
- }
78
- },
79
- "zh-CN": {
80
- "vocabulary": {
81
- },
82
- "messages": {
83
- }
84
- },
85
- "es": {
86
- "vocabulary": {
87
- },
88
- "messages": {
89
- }
90
- },
91
- "ar": {
92
- "vocabulary": {
93
- },
94
- "messages": {
95
- }
96
- },
97
- "vi": {
98
- "vocabulary": {
99
- },
100
- "messages": {
101
- }
102
- },
103
- "th": {
104
- "vocabulary": {
105
- },
106
- "messages": {
107
- }
108
- },
109
- "uk": {
110
- "vocabulary": {
111
- },
112
- "messages": {
113
- }
114
- },
115
- "ja": {
116
- "vocabulary": {
117
- },
118
- "messages": {
119
- }
120
- },
121
- "id": {
122
- "vocabulary": {
123
- },
124
- "messages": {
125
- }
126
- }
127
- }
128
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/orders-lib/tsconfig.json DELETED
@@ -1,12 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "es2022",
4
- "module": "commonjs",
5
- "strict": true,
6
- "esModuleInterop": true,
7
- "skipLibCheck": true,
8
- "forceConsistentCasingInFileNames": true,
9
- "declaration": true
10
- },
11
- "include": ["src/**/*", "*.d.ts"]
12
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/package-lock.json DELETED
@@ -1,1624 +0,0 @@
1
- {
2
- "name": "teaql-browser-sqlite-example",
3
- "version": "1.0.0",
4
- "lockfileVersion": 3,
5
- "requires": true,
6
- "packages": {
7
- "": {
8
- "name": "teaql-browser-sqlite-example",
9
- "version": "1.0.0",
10
- "dependencies": {
11
- "@sqlite.org/sqlite-wasm": "3.53.0-build1",
12
- "teaql-ts": "file:vendor/teaql-teaql-0.3.0.tgz"
13
- },
14
- "devDependencies": {
15
- "puppeteer-core": "25.10.0",
16
- "typescript": "5.9.2",
17
- "vite": "^7.3.6"
18
- }
19
- },
20
- "node_modules/@esbuild/aix-ppc64": {
21
- "version": "0.28.2",
22
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz",
23
- "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==",
24
- "cpu": [
25
- "ppc64"
26
- ],
27
- "dev": true,
28
- "license": "MIT",
29
- "optional": true,
30
- "os": [
31
- "aix"
32
- ],
33
- "engines": {
34
- "node": ">=18"
35
- }
36
- },
37
- "node_modules/@esbuild/android-arm": {
38
- "version": "0.28.2",
39
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz",
40
- "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==",
41
- "cpu": [
42
- "arm"
43
- ],
44
- "dev": true,
45
- "license": "MIT",
46
- "optional": true,
47
- "os": [
48
- "android"
49
- ],
50
- "engines": {
51
- "node": ">=18"
52
- }
53
- },
54
- "node_modules/@esbuild/android-arm64": {
55
- "version": "0.28.2",
56
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz",
57
- "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==",
58
- "cpu": [
59
- "arm64"
60
- ],
61
- "dev": true,
62
- "license": "MIT",
63
- "optional": true,
64
- "os": [
65
- "android"
66
- ],
67
- "engines": {
68
- "node": ">=18"
69
- }
70
- },
71
- "node_modules/@esbuild/android-x64": {
72
- "version": "0.28.2",
73
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz",
74
- "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==",
75
- "cpu": [
76
- "x64"
77
- ],
78
- "dev": true,
79
- "license": "MIT",
80
- "optional": true,
81
- "os": [
82
- "android"
83
- ],
84
- "engines": {
85
- "node": ">=18"
86
- }
87
- },
88
- "node_modules/@esbuild/darwin-arm64": {
89
- "version": "0.28.2",
90
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz",
91
- "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==",
92
- "cpu": [
93
- "arm64"
94
- ],
95
- "dev": true,
96
- "license": "MIT",
97
- "optional": true,
98
- "os": [
99
- "darwin"
100
- ],
101
- "engines": {
102
- "node": ">=18"
103
- }
104
- },
105
- "node_modules/@esbuild/darwin-x64": {
106
- "version": "0.28.2",
107
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz",
108
- "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==",
109
- "cpu": [
110
- "x64"
111
- ],
112
- "dev": true,
113
- "license": "MIT",
114
- "optional": true,
115
- "os": [
116
- "darwin"
117
- ],
118
- "engines": {
119
- "node": ">=18"
120
- }
121
- },
122
- "node_modules/@esbuild/freebsd-arm64": {
123
- "version": "0.28.2",
124
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz",
125
- "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==",
126
- "cpu": [
127
- "arm64"
128
- ],
129
- "dev": true,
130
- "license": "MIT",
131
- "optional": true,
132
- "os": [
133
- "freebsd"
134
- ],
135
- "engines": {
136
- "node": ">=18"
137
- }
138
- },
139
- "node_modules/@esbuild/freebsd-x64": {
140
- "version": "0.28.2",
141
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz",
142
- "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==",
143
- "cpu": [
144
- "x64"
145
- ],
146
- "dev": true,
147
- "license": "MIT",
148
- "optional": true,
149
- "os": [
150
- "freebsd"
151
- ],
152
- "engines": {
153
- "node": ">=18"
154
- }
155
- },
156
- "node_modules/@esbuild/linux-arm": {
157
- "version": "0.28.2",
158
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz",
159
- "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==",
160
- "cpu": [
161
- "arm"
162
- ],
163
- "dev": true,
164
- "license": "MIT",
165
- "optional": true,
166
- "os": [
167
- "linux"
168
- ],
169
- "engines": {
170
- "node": ">=18"
171
- }
172
- },
173
- "node_modules/@esbuild/linux-arm64": {
174
- "version": "0.28.2",
175
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz",
176
- "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==",
177
- "cpu": [
178
- "arm64"
179
- ],
180
- "dev": true,
181
- "license": "MIT",
182
- "optional": true,
183
- "os": [
184
- "linux"
185
- ],
186
- "engines": {
187
- "node": ">=18"
188
- }
189
- },
190
- "node_modules/@esbuild/linux-ia32": {
191
- "version": "0.28.2",
192
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz",
193
- "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==",
194
- "cpu": [
195
- "ia32"
196
- ],
197
- "dev": true,
198
- "license": "MIT",
199
- "optional": true,
200
- "os": [
201
- "linux"
202
- ],
203
- "engines": {
204
- "node": ">=18"
205
- }
206
- },
207
- "node_modules/@esbuild/linux-loong64": {
208
- "version": "0.28.2",
209
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz",
210
- "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==",
211
- "cpu": [
212
- "loong64"
213
- ],
214
- "dev": true,
215
- "license": "MIT",
216
- "optional": true,
217
- "os": [
218
- "linux"
219
- ],
220
- "engines": {
221
- "node": ">=18"
222
- }
223
- },
224
- "node_modules/@esbuild/linux-mips64el": {
225
- "version": "0.28.2",
226
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz",
227
- "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==",
228
- "cpu": [
229
- "mips64el"
230
- ],
231
- "dev": true,
232
- "license": "MIT",
233
- "optional": true,
234
- "os": [
235
- "linux"
236
- ],
237
- "engines": {
238
- "node": ">=18"
239
- }
240
- },
241
- "node_modules/@esbuild/linux-ppc64": {
242
- "version": "0.28.2",
243
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz",
244
- "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==",
245
- "cpu": [
246
- "ppc64"
247
- ],
248
- "dev": true,
249
- "license": "MIT",
250
- "optional": true,
251
- "os": [
252
- "linux"
253
- ],
254
- "engines": {
255
- "node": ">=18"
256
- }
257
- },
258
- "node_modules/@esbuild/linux-riscv64": {
259
- "version": "0.28.2",
260
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz",
261
- "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==",
262
- "cpu": [
263
- "riscv64"
264
- ],
265
- "dev": true,
266
- "license": "MIT",
267
- "optional": true,
268
- "os": [
269
- "linux"
270
- ],
271
- "engines": {
272
- "node": ">=18"
273
- }
274
- },
275
- "node_modules/@esbuild/linux-s390x": {
276
- "version": "0.28.2",
277
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz",
278
- "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==",
279
- "cpu": [
280
- "s390x"
281
- ],
282
- "dev": true,
283
- "license": "MIT",
284
- "optional": true,
285
- "os": [
286
- "linux"
287
- ],
288
- "engines": {
289
- "node": ">=18"
290
- }
291
- },
292
- "node_modules/@esbuild/linux-x64": {
293
- "version": "0.28.2",
294
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz",
295
- "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==",
296
- "cpu": [
297
- "x64"
298
- ],
299
- "dev": true,
300
- "license": "MIT",
301
- "optional": true,
302
- "os": [
303
- "linux"
304
- ],
305
- "engines": {
306
- "node": ">=18"
307
- }
308
- },
309
- "node_modules/@esbuild/netbsd-arm64": {
310
- "version": "0.28.2",
311
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz",
312
- "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==",
313
- "cpu": [
314
- "arm64"
315
- ],
316
- "dev": true,
317
- "license": "MIT",
318
- "optional": true,
319
- "os": [
320
- "netbsd"
321
- ],
322
- "engines": {
323
- "node": ">=18"
324
- }
325
- },
326
- "node_modules/@esbuild/netbsd-x64": {
327
- "version": "0.28.2",
328
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz",
329
- "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==",
330
- "cpu": [
331
- "x64"
332
- ],
333
- "dev": true,
334
- "license": "MIT",
335
- "optional": true,
336
- "os": [
337
- "netbsd"
338
- ],
339
- "engines": {
340
- "node": ">=18"
341
- }
342
- },
343
- "node_modules/@esbuild/openbsd-arm64": {
344
- "version": "0.28.2",
345
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz",
346
- "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==",
347
- "cpu": [
348
- "arm64"
349
- ],
350
- "dev": true,
351
- "license": "MIT",
352
- "optional": true,
353
- "os": [
354
- "openbsd"
355
- ],
356
- "engines": {
357
- "node": ">=18"
358
- }
359
- },
360
- "node_modules/@esbuild/openbsd-x64": {
361
- "version": "0.28.2",
362
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz",
363
- "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==",
364
- "cpu": [
365
- "x64"
366
- ],
367
- "dev": true,
368
- "license": "MIT",
369
- "optional": true,
370
- "os": [
371
- "openbsd"
372
- ],
373
- "engines": {
374
- "node": ">=18"
375
- }
376
- },
377
- "node_modules/@esbuild/openharmony-arm64": {
378
- "version": "0.28.2",
379
- "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz",
380
- "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==",
381
- "cpu": [
382
- "arm64"
383
- ],
384
- "dev": true,
385
- "license": "MIT",
386
- "optional": true,
387
- "os": [
388
- "openharmony"
389
- ],
390
- "engines": {
391
- "node": ">=18"
392
- }
393
- },
394
- "node_modules/@esbuild/sunos-x64": {
395
- "version": "0.28.2",
396
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz",
397
- "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==",
398
- "cpu": [
399
- "x64"
400
- ],
401
- "dev": true,
402
- "license": "MIT",
403
- "optional": true,
404
- "os": [
405
- "sunos"
406
- ],
407
- "engines": {
408
- "node": ">=18"
409
- }
410
- },
411
- "node_modules/@esbuild/win32-arm64": {
412
- "version": "0.28.2",
413
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz",
414
- "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==",
415
- "cpu": [
416
- "arm64"
417
- ],
418
- "dev": true,
419
- "license": "MIT",
420
- "optional": true,
421
- "os": [
422
- "win32"
423
- ],
424
- "engines": {
425
- "node": ">=18"
426
- }
427
- },
428
- "node_modules/@esbuild/win32-ia32": {
429
- "version": "0.28.2",
430
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz",
431
- "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==",
432
- "cpu": [
433
- "ia32"
434
- ],
435
- "dev": true,
436
- "license": "MIT",
437
- "optional": true,
438
- "os": [
439
- "win32"
440
- ],
441
- "engines": {
442
- "node": ">=18"
443
- }
444
- },
445
- "node_modules/@esbuild/win32-x64": {
446
- "version": "0.28.2",
447
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz",
448
- "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==",
449
- "cpu": [
450
- "x64"
451
- ],
452
- "dev": true,
453
- "license": "MIT",
454
- "optional": true,
455
- "os": [
456
- "win32"
457
- ],
458
- "engines": {
459
- "node": ">=18"
460
- }
461
- },
462
- "node_modules/@napi-rs/lzma-linux-x64-gnu": {
463
- "version": "1.5.1",
464
- "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz",
465
- "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==",
466
- "cpu": [
467
- "x64"
468
- ],
469
- "dev": true,
470
- "libc": [
471
- "glibc"
472
- ],
473
- "license": "MIT",
474
- "optional": true,
475
- "os": [
476
- "linux"
477
- ],
478
- "engines": {
479
- "node": "^22.20 || ^24.12 || >=25"
480
- }
481
- },
482
- "node_modules/@puppeteer/browsers": {
483
- "version": "3.2.2",
484
- "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-3.2.2.tgz",
485
- "integrity": "sha512-q2BU4YfO9h/Wt7IcWPcggpOOqLk2Tbs1hDwolvKZrweRjy751OJBKMN9zO5bfD0pzU7X/tvKw/exQds4pM/LOg==",
486
- "dev": true,
487
- "license": "Apache-2.0",
488
- "dependencies": {
489
- "modern-tar": "^0.8.4",
490
- "yargs": "^18.0.0"
491
- },
492
- "bin": {
493
- "browsers": "lib/main-cli.js"
494
- },
495
- "engines": {
496
- "node": ">=22.12.0"
497
- },
498
- "peerDependencies": {
499
- "proxy-agent": ">=8.0.1",
500
- "yauzl": "^2.10.0 || ^3.4.0"
501
- },
502
- "peerDependenciesMeta": {
503
- "proxy-agent": {
504
- "optional": true
505
- },
506
- "yauzl": {
507
- "optional": true
508
- }
509
- }
510
- },
511
- "node_modules/@rollup/rollup-android-arm-eabi": {
512
- "version": "4.63.1",
513
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.1.tgz",
514
- "integrity": "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==",
515
- "cpu": [
516
- "arm"
517
- ],
518
- "dev": true,
519
- "license": "MIT",
520
- "optional": true,
521
- "os": [
522
- "android"
523
- ]
524
- },
525
- "node_modules/@rollup/rollup-android-arm64": {
526
- "version": "4.63.1",
527
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.1.tgz",
528
- "integrity": "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==",
529
- "cpu": [
530
- "arm64"
531
- ],
532
- "dev": true,
533
- "license": "MIT",
534
- "optional": true,
535
- "os": [
536
- "android"
537
- ]
538
- },
539
- "node_modules/@rollup/rollup-darwin-arm64": {
540
- "version": "4.63.1",
541
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.1.tgz",
542
- "integrity": "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==",
543
- "cpu": [
544
- "arm64"
545
- ],
546
- "dev": true,
547
- "license": "MIT",
548
- "optional": true,
549
- "os": [
550
- "darwin"
551
- ]
552
- },
553
- "node_modules/@rollup/rollup-darwin-x64": {
554
- "version": "4.63.1",
555
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.1.tgz",
556
- "integrity": "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==",
557
- "cpu": [
558
- "x64"
559
- ],
560
- "dev": true,
561
- "license": "MIT",
562
- "optional": true,
563
- "os": [
564
- "darwin"
565
- ]
566
- },
567
- "node_modules/@rollup/rollup-freebsd-arm64": {
568
- "version": "4.63.1",
569
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.1.tgz",
570
- "integrity": "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==",
571
- "cpu": [
572
- "arm64"
573
- ],
574
- "dev": true,
575
- "license": "MIT",
576
- "optional": true,
577
- "os": [
578
- "freebsd"
579
- ]
580
- },
581
- "node_modules/@rollup/rollup-freebsd-x64": {
582
- "version": "4.63.1",
583
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.1.tgz",
584
- "integrity": "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==",
585
- "cpu": [
586
- "x64"
587
- ],
588
- "dev": true,
589
- "license": "MIT",
590
- "optional": true,
591
- "os": [
592
- "freebsd"
593
- ]
594
- },
595
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
596
- "version": "4.63.1",
597
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.1.tgz",
598
- "integrity": "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==",
599
- "cpu": [
600
- "arm"
601
- ],
602
- "dev": true,
603
- "libc": [
604
- "glibc"
605
- ],
606
- "license": "MIT",
607
- "optional": true,
608
- "os": [
609
- "linux"
610
- ]
611
- },
612
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
613
- "version": "4.63.1",
614
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.1.tgz",
615
- "integrity": "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==",
616
- "cpu": [
617
- "arm"
618
- ],
619
- "dev": true,
620
- "libc": [
621
- "musl"
622
- ],
623
- "license": "MIT",
624
- "optional": true,
625
- "os": [
626
- "linux"
627
- ]
628
- },
629
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
630
- "version": "4.63.1",
631
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.1.tgz",
632
- "integrity": "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==",
633
- "cpu": [
634
- "arm64"
635
- ],
636
- "dev": true,
637
- "libc": [
638
- "glibc"
639
- ],
640
- "license": "MIT",
641
- "optional": true,
642
- "os": [
643
- "linux"
644
- ]
645
- },
646
- "node_modules/@rollup/rollup-linux-arm64-musl": {
647
- "version": "4.63.1",
648
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.1.tgz",
649
- "integrity": "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==",
650
- "cpu": [
651
- "arm64"
652
- ],
653
- "dev": true,
654
- "libc": [
655
- "musl"
656
- ],
657
- "license": "MIT",
658
- "optional": true,
659
- "os": [
660
- "linux"
661
- ]
662
- },
663
- "node_modules/@rollup/rollup-linux-loong64-gnu": {
664
- "version": "4.63.1",
665
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.1.tgz",
666
- "integrity": "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==",
667
- "cpu": [
668
- "loong64"
669
- ],
670
- "dev": true,
671
- "libc": [
672
- "glibc"
673
- ],
674
- "license": "MIT",
675
- "optional": true,
676
- "os": [
677
- "linux"
678
- ]
679
- },
680
- "node_modules/@rollup/rollup-linux-loong64-musl": {
681
- "version": "4.63.1",
682
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.1.tgz",
683
- "integrity": "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==",
684
- "cpu": [
685
- "loong64"
686
- ],
687
- "dev": true,
688
- "libc": [
689
- "musl"
690
- ],
691
- "license": "MIT",
692
- "optional": true,
693
- "os": [
694
- "linux"
695
- ]
696
- },
697
- "node_modules/@rollup/rollup-linux-ppc64-gnu": {
698
- "version": "4.63.1",
699
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.1.tgz",
700
- "integrity": "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==",
701
- "cpu": [
702
- "ppc64"
703
- ],
704
- "dev": true,
705
- "libc": [
706
- "glibc"
707
- ],
708
- "license": "MIT",
709
- "optional": true,
710
- "os": [
711
- "linux"
712
- ]
713
- },
714
- "node_modules/@rollup/rollup-linux-ppc64-musl": {
715
- "version": "4.63.1",
716
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.1.tgz",
717
- "integrity": "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==",
718
- "cpu": [
719
- "ppc64"
720
- ],
721
- "dev": true,
722
- "libc": [
723
- "musl"
724
- ],
725
- "license": "MIT",
726
- "optional": true,
727
- "os": [
728
- "linux"
729
- ]
730
- },
731
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
732
- "version": "4.63.1",
733
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.1.tgz",
734
- "integrity": "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==",
735
- "cpu": [
736
- "riscv64"
737
- ],
738
- "dev": true,
739
- "libc": [
740
- "glibc"
741
- ],
742
- "license": "MIT",
743
- "optional": true,
744
- "os": [
745
- "linux"
746
- ]
747
- },
748
- "node_modules/@rollup/rollup-linux-riscv64-musl": {
749
- "version": "4.63.1",
750
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.1.tgz",
751
- "integrity": "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==",
752
- "cpu": [
753
- "riscv64"
754
- ],
755
- "dev": true,
756
- "libc": [
757
- "musl"
758
- ],
759
- "license": "MIT",
760
- "optional": true,
761
- "os": [
762
- "linux"
763
- ]
764
- },
765
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
766
- "version": "4.63.1",
767
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.1.tgz",
768
- "integrity": "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==",
769
- "cpu": [
770
- "s390x"
771
- ],
772
- "dev": true,
773
- "libc": [
774
- "glibc"
775
- ],
776
- "license": "MIT",
777
- "optional": true,
778
- "os": [
779
- "linux"
780
- ]
781
- },
782
- "node_modules/@rollup/rollup-linux-x64-gnu": {
783
- "version": "4.63.1",
784
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz",
785
- "integrity": "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==",
786
- "cpu": [
787
- "x64"
788
- ],
789
- "dev": true,
790
- "libc": [
791
- "glibc"
792
- ],
793
- "license": "MIT",
794
- "optional": true,
795
- "os": [
796
- "linux"
797
- ]
798
- },
799
- "node_modules/@rollup/rollup-linux-x64-musl": {
800
- "version": "4.63.1",
801
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.1.tgz",
802
- "integrity": "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==",
803
- "cpu": [
804
- "x64"
805
- ],
806
- "dev": true,
807
- "libc": [
808
- "musl"
809
- ],
810
- "license": "MIT",
811
- "optional": true,
812
- "os": [
813
- "linux"
814
- ]
815
- },
816
- "node_modules/@rollup/rollup-openbsd-x64": {
817
- "version": "4.63.1",
818
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.1.tgz",
819
- "integrity": "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==",
820
- "cpu": [
821
- "x64"
822
- ],
823
- "dev": true,
824
- "license": "MIT",
825
- "optional": true,
826
- "os": [
827
- "openbsd"
828
- ]
829
- },
830
- "node_modules/@rollup/rollup-openharmony-arm64": {
831
- "version": "4.63.1",
832
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.1.tgz",
833
- "integrity": "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==",
834
- "cpu": [
835
- "arm64"
836
- ],
837
- "dev": true,
838
- "license": "MIT",
839
- "optional": true,
840
- "os": [
841
- "openharmony"
842
- ]
843
- },
844
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
845
- "version": "4.63.1",
846
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.1.tgz",
847
- "integrity": "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==",
848
- "cpu": [
849
- "arm64"
850
- ],
851
- "dev": true,
852
- "license": "MIT",
853
- "optional": true,
854
- "os": [
855
- "win32"
856
- ]
857
- },
858
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
859
- "version": "4.63.1",
860
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.1.tgz",
861
- "integrity": "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==",
862
- "cpu": [
863
- "ia32"
864
- ],
865
- "dev": true,
866
- "license": "MIT",
867
- "optional": true,
868
- "os": [
869
- "win32"
870
- ]
871
- },
872
- "node_modules/@rollup/rollup-win32-x64-gnu": {
873
- "version": "4.63.1",
874
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.1.tgz",
875
- "integrity": "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==",
876
- "cpu": [
877
- "x64"
878
- ],
879
- "dev": true,
880
- "license": "MIT",
881
- "optional": true,
882
- "os": [
883
- "win32"
884
- ]
885
- },
886
- "node_modules/@rollup/rollup-win32-x64-msvc": {
887
- "version": "4.63.1",
888
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.1.tgz",
889
- "integrity": "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==",
890
- "cpu": [
891
- "x64"
892
- ],
893
- "dev": true,
894
- "license": "MIT",
895
- "optional": true,
896
- "os": [
897
- "win32"
898
- ]
899
- },
900
- "node_modules/@sqlite.org/sqlite-wasm": {
901
- "version": "3.53.0-build1",
902
- "resolved": "https://registry.npmjs.org/@sqlite.org/sqlite-wasm/-/sqlite-wasm-3.53.0-build1.tgz",
903
- "integrity": "sha512-PfWPWN2n+/37doa8oh2/oUXk4OOsRYZsxc1W1sDXIGb/Pu5Yrb+f2eyYpgQMGITVX7HVgxhs9P18Rc6I97ym/g==",
904
- "license": "Apache-2.0",
905
- "workspaces": [
906
- "demos/*"
907
- ],
908
- "engines": {
909
- "node": ">=22"
910
- }
911
- },
912
- "node_modules/@types/estree": {
913
- "version": "1.0.9",
914
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
915
- "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
916
- "dev": true,
917
- "license": "MIT"
918
- },
919
- "node_modules/ansi-regex": {
920
- "version": "6.3.0",
921
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz",
922
- "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==",
923
- "dev": true,
924
- "license": "MIT",
925
- "engines": {
926
- "node": ">=12"
927
- },
928
- "funding": {
929
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
930
- }
931
- },
932
- "node_modules/ansi-styles": {
933
- "version": "6.2.3",
934
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
935
- "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
936
- "dev": true,
937
- "license": "MIT",
938
- "engines": {
939
- "node": ">=12"
940
- },
941
- "funding": {
942
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
943
- }
944
- },
945
- "node_modules/chromium-bidi": {
946
- "version": "17.0.2",
947
- "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-17.0.2.tgz",
948
- "integrity": "sha512-5v9GQFhTktFvotn/OFNJBmKLKRAb6n9r0bVCwf7sHgWc3/JryK0bj1nn93L3pHFrfgcsu6Be6EWsDi+1XHTGDg==",
949
- "dev": true,
950
- "license": "Apache-2.0",
951
- "dependencies": {
952
- "mitt": "^3.0.1",
953
- "zod": "^3.24.1"
954
- },
955
- "engines": {
956
- "node": ">=20.19.0 <22.0.0 || >=22.12.0"
957
- },
958
- "peerDependencies": {
959
- "devtools-protocol": "*"
960
- }
961
- },
962
- "node_modules/cliui": {
963
- "version": "9.0.1",
964
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz",
965
- "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==",
966
- "dev": true,
967
- "license": "ISC",
968
- "dependencies": {
969
- "string-width": "^7.2.0",
970
- "strip-ansi": "^7.1.0",
971
- "wrap-ansi": "^9.0.0"
972
- },
973
- "engines": {
974
- "node": ">=20"
975
- }
976
- },
977
- "node_modules/cliui/node_modules/string-width": {
978
- "version": "7.2.0",
979
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
980
- "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
981
- "dev": true,
982
- "license": "MIT",
983
- "dependencies": {
984
- "emoji-regex": "^10.3.0",
985
- "get-east-asian-width": "^1.0.0",
986
- "strip-ansi": "^7.1.0"
987
- },
988
- "engines": {
989
- "node": ">=18"
990
- },
991
- "funding": {
992
- "url": "https://github.com/sponsors/sindresorhus"
993
- }
994
- },
995
- "node_modules/devtools-protocol": {
996
- "version": "0.0.1666840",
997
- "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1666840.tgz",
998
- "integrity": "sha512-gCcO42XCHKEs7Ag0S7aGYsnJ7hlgrO3qderYqeiY0Eqk+0GFfuvT13IA0hHreJTa2KCdDVyGMeOhdMNmrrTjVg==",
999
- "dev": true,
1000
- "license": "BSD-3-Clause"
1001
- },
1002
- "node_modules/emoji-regex": {
1003
- "version": "10.6.0",
1004
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
1005
- "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
1006
- "dev": true,
1007
- "license": "MIT"
1008
- },
1009
- "node_modules/esbuild": {
1010
- "version": "0.28.2",
1011
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz",
1012
- "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==",
1013
- "dev": true,
1014
- "hasInstallScript": true,
1015
- "license": "MIT",
1016
- "bin": {
1017
- "esbuild": "bin/esbuild"
1018
- },
1019
- "engines": {
1020
- "node": ">=18"
1021
- },
1022
- "optionalDependencies": {
1023
- "@esbuild/aix-ppc64": "0.28.2",
1024
- "@esbuild/android-arm": "0.28.2",
1025
- "@esbuild/android-arm64": "0.28.2",
1026
- "@esbuild/android-x64": "0.28.2",
1027
- "@esbuild/darwin-arm64": "0.28.2",
1028
- "@esbuild/darwin-x64": "0.28.2",
1029
- "@esbuild/freebsd-arm64": "0.28.2",
1030
- "@esbuild/freebsd-x64": "0.28.2",
1031
- "@esbuild/linux-arm": "0.28.2",
1032
- "@esbuild/linux-arm64": "0.28.2",
1033
- "@esbuild/linux-ia32": "0.28.2",
1034
- "@esbuild/linux-loong64": "0.28.2",
1035
- "@esbuild/linux-mips64el": "0.28.2",
1036
- "@esbuild/linux-ppc64": "0.28.2",
1037
- "@esbuild/linux-riscv64": "0.28.2",
1038
- "@esbuild/linux-s390x": "0.28.2",
1039
- "@esbuild/linux-x64": "0.28.2",
1040
- "@esbuild/netbsd-arm64": "0.28.2",
1041
- "@esbuild/netbsd-x64": "0.28.2",
1042
- "@esbuild/openbsd-arm64": "0.28.2",
1043
- "@esbuild/openbsd-x64": "0.28.2",
1044
- "@esbuild/openharmony-arm64": "0.28.2",
1045
- "@esbuild/sunos-x64": "0.28.2",
1046
- "@esbuild/win32-arm64": "0.28.2",
1047
- "@esbuild/win32-ia32": "0.28.2",
1048
- "@esbuild/win32-x64": "0.28.2"
1049
- }
1050
- },
1051
- "node_modules/escalade": {
1052
- "version": "3.2.0",
1053
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
1054
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
1055
- "dev": true,
1056
- "license": "MIT",
1057
- "engines": {
1058
- "node": ">=6"
1059
- }
1060
- },
1061
- "node_modules/fdir": {
1062
- "version": "6.5.0",
1063
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
1064
- "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
1065
- "dev": true,
1066
- "license": "MIT",
1067
- "engines": {
1068
- "node": ">=12.0.0"
1069
- },
1070
- "peerDependencies": {
1071
- "picomatch": "^3 || ^4"
1072
- },
1073
- "peerDependenciesMeta": {
1074
- "picomatch": {
1075
- "optional": true
1076
- }
1077
- }
1078
- },
1079
- "node_modules/fsevents": {
1080
- "version": "2.3.3",
1081
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1082
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1083
- "dev": true,
1084
- "hasInstallScript": true,
1085
- "license": "MIT",
1086
- "optional": true,
1087
- "os": [
1088
- "darwin"
1089
- ],
1090
- "engines": {
1091
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1092
- }
1093
- },
1094
- "node_modules/get-caller-file": {
1095
- "version": "2.0.5",
1096
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
1097
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
1098
- "dev": true,
1099
- "license": "ISC",
1100
- "engines": {
1101
- "node": "6.* || 8.* || >= 10.*"
1102
- }
1103
- },
1104
- "node_modules/get-east-asian-width": {
1105
- "version": "1.6.0",
1106
- "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz",
1107
- "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==",
1108
- "dev": true,
1109
- "license": "MIT",
1110
- "engines": {
1111
- "node": ">=18"
1112
- },
1113
- "funding": {
1114
- "url": "https://github.com/sponsors/sindresorhus"
1115
- }
1116
- },
1117
- "node_modules/mitt": {
1118
- "version": "3.0.1",
1119
- "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
1120
- "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
1121
- "dev": true,
1122
- "license": "MIT"
1123
- },
1124
- "node_modules/modern-tar": {
1125
- "version": "0.8.4",
1126
- "resolved": "https://registry.npmjs.org/modern-tar/-/modern-tar-0.8.4.tgz",
1127
- "integrity": "sha512-gN54ddmyzEg10orwZ2u4OOv+bjpMWdIl5jIkodK97bMq8QBSL5c0D7YX0lT1Ooz+99S7+PvFbnxzdjgHo1r41g==",
1128
- "dev": true,
1129
- "license": "MIT",
1130
- "engines": {
1131
- "node": ">=18.0.0"
1132
- }
1133
- },
1134
- "node_modules/nanoid": {
1135
- "version": "3.3.18",
1136
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz",
1137
- "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
1138
- "dev": true,
1139
- "funding": [
1140
- {
1141
- "type": "github",
1142
- "url": "https://github.com/sponsors/ai"
1143
- }
1144
- ],
1145
- "license": "MIT",
1146
- "bin": {
1147
- "nanoid": "bin/nanoid.cjs"
1148
- },
1149
- "engines": {
1150
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1151
- }
1152
- },
1153
- "node_modules/node-fetch": {
1154
- "version": "2.7.0",
1155
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
1156
- "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
1157
- "license": "MIT",
1158
- "dependencies": {
1159
- "whatwg-url": "^5.0.0"
1160
- },
1161
- "engines": {
1162
- "node": "4.x || >=6.0.0"
1163
- },
1164
- "peerDependencies": {
1165
- "encoding": "^0.1.0"
1166
- },
1167
- "peerDependenciesMeta": {
1168
- "encoding": {
1169
- "optional": true
1170
- }
1171
- }
1172
- },
1173
- "node_modules/picocolors": {
1174
- "version": "1.1.1",
1175
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
1176
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
1177
- "dev": true,
1178
- "license": "ISC"
1179
- },
1180
- "node_modules/picomatch": {
1181
- "version": "4.0.7",
1182
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz",
1183
- "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
1184
- "dev": true,
1185
- "license": "MIT",
1186
- "engines": {
1187
- "node": ">=12"
1188
- },
1189
- "funding": {
1190
- "url": "https://github.com/sponsors/jonschlinkert"
1191
- }
1192
- },
1193
- "node_modules/postcss": {
1194
- "version": "8.5.28",
1195
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz",
1196
- "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==",
1197
- "dev": true,
1198
- "funding": [
1199
- {
1200
- "type": "opencollective",
1201
- "url": "https://opencollective.com/postcss/"
1202
- },
1203
- {
1204
- "type": "tidelift",
1205
- "url": "https://tidelift.com/funding/github/npm/postcss"
1206
- },
1207
- {
1208
- "type": "github",
1209
- "url": "https://github.com/sponsors/ai"
1210
- }
1211
- ],
1212
- "license": "MIT",
1213
- "dependencies": {
1214
- "nanoid": "^3.3.18",
1215
- "picocolors": "^1.1.1",
1216
- "source-map-js": "^1.2.1"
1217
- },
1218
- "engines": {
1219
- "node": "^10 || ^12 || >=14"
1220
- }
1221
- },
1222
- "node_modules/puppeteer-core": {
1223
- "version": "25.10.0",
1224
- "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-25.10.0.tgz",
1225
- "integrity": "sha512-Hy5eMQshOEMil4JUUx03h5pw1HYkYCso1RG/gcpPlFSd4cYPOcopxcXEAxpLPOkOPJb9LIJtwxuj66bSdvknFg==",
1226
- "dev": true,
1227
- "license": "Apache-2.0",
1228
- "dependencies": {
1229
- "@puppeteer/browsers": "3.2.2",
1230
- "chromium-bidi": "17.0.2",
1231
- "devtools-protocol": "0.0.1666840",
1232
- "typed-query-selector": "^2.12.2",
1233
- "webdriver-bidi-protocol": "0.4.3",
1234
- "ws": "^8.21.3"
1235
- },
1236
- "engines": {
1237
- "node": ">=22.12.0"
1238
- }
1239
- },
1240
- "node_modules/rollup": {
1241
- "version": "4.63.1",
1242
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.1.tgz",
1243
- "integrity": "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==",
1244
- "dev": true,
1245
- "license": "MIT",
1246
- "dependencies": {
1247
- "@types/estree": "1.0.9"
1248
- },
1249
- "bin": {
1250
- "rollup": "dist/bin/rollup"
1251
- },
1252
- "engines": {
1253
- "node": ">=18.0.0",
1254
- "npm": ">=8.0.0"
1255
- },
1256
- "optionalDependencies": {
1257
- "@napi-rs/lzma-linux-x64-gnu": "1.5.1",
1258
- "@rollup/rollup-android-arm-eabi": "4.63.1",
1259
- "@rollup/rollup-android-arm64": "4.63.1",
1260
- "@rollup/rollup-darwin-arm64": "4.63.1",
1261
- "@rollup/rollup-darwin-x64": "4.63.1",
1262
- "@rollup/rollup-freebsd-arm64": "4.63.1",
1263
- "@rollup/rollup-freebsd-x64": "4.63.1",
1264
- "@rollup/rollup-linux-arm-gnueabihf": "4.63.1",
1265
- "@rollup/rollup-linux-arm-musleabihf": "4.63.1",
1266
- "@rollup/rollup-linux-arm64-gnu": "4.63.1",
1267
- "@rollup/rollup-linux-arm64-musl": "4.63.1",
1268
- "@rollup/rollup-linux-loong64-gnu": "4.63.1",
1269
- "@rollup/rollup-linux-loong64-musl": "4.63.1",
1270
- "@rollup/rollup-linux-ppc64-gnu": "4.63.1",
1271
- "@rollup/rollup-linux-ppc64-musl": "4.63.1",
1272
- "@rollup/rollup-linux-riscv64-gnu": "4.63.1",
1273
- "@rollup/rollup-linux-riscv64-musl": "4.63.1",
1274
- "@rollup/rollup-linux-s390x-gnu": "4.63.1",
1275
- "@rollup/rollup-linux-x64-gnu": "4.63.1",
1276
- "@rollup/rollup-linux-x64-musl": "4.63.1",
1277
- "@rollup/rollup-openbsd-x64": "4.63.1",
1278
- "@rollup/rollup-openharmony-arm64": "4.63.1",
1279
- "@rollup/rollup-win32-arm64-msvc": "4.63.1",
1280
- "@rollup/rollup-win32-ia32-msvc": "4.63.1",
1281
- "@rollup/rollup-win32-x64-gnu": "4.63.1",
1282
- "@rollup/rollup-win32-x64-msvc": "4.63.1",
1283
- "fsevents": "~2.3.2"
1284
- }
1285
- },
1286
- "node_modules/source-map-js": {
1287
- "version": "1.2.1",
1288
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
1289
- "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
1290
- "dev": true,
1291
- "license": "BSD-3-Clause",
1292
- "engines": {
1293
- "node": ">=0.10.0"
1294
- }
1295
- },
1296
- "node_modules/string-width": {
1297
- "version": "8.2.2",
1298
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz",
1299
- "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==",
1300
- "dev": true,
1301
- "license": "MIT",
1302
- "dependencies": {
1303
- "get-east-asian-width": "^1.5.0",
1304
- "strip-ansi": "^7.1.2"
1305
- },
1306
- "engines": {
1307
- "node": ">=20"
1308
- },
1309
- "funding": {
1310
- "url": "https://github.com/sponsors/sindresorhus"
1311
- }
1312
- },
1313
- "node_modules/strip-ansi": {
1314
- "version": "7.2.0",
1315
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
1316
- "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
1317
- "dev": true,
1318
- "license": "MIT",
1319
- "dependencies": {
1320
- "ansi-regex": "^6.2.2"
1321
- },
1322
- "engines": {
1323
- "node": ">=12"
1324
- },
1325
- "funding": {
1326
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
1327
- }
1328
- },
1329
- "node_modules/teaql-ts": {
1330
- "name": "@teaql/teaql",
1331
- "version": "0.3.0",
1332
- "resolved": "file:vendor/teaql-teaql-0.3.0.tgz",
1333
- "integrity": "sha512-au422aLCU34kwRxBu4rjqbiMCxpStQzTBek73/dUKw+SbJVMDNoo/VqkcgI8C4leKEF5p4ozH+QosGuSp+PIWw==",
1334
- "license": "Apache-2.0",
1335
- "dependencies": {
1336
- "node-fetch": "^2.7.0"
1337
- },
1338
- "peerDependencies": {
1339
- "@opentelemetry/api": "^1.9.1",
1340
- "@opentelemetry/api-logs": "^0.221.0",
1341
- "@sqlite.org/sqlite-wasm": "3.53.0-build1",
1342
- "better-sqlite3": "^12.10.0",
1343
- "expo-sqlite": "*",
1344
- "mysql2": "^3.11.0",
1345
- "pg": "^8.12.0",
1346
- "pg-query-stream": "^4.7.0"
1347
- },
1348
- "peerDependenciesMeta": {
1349
- "@opentelemetry/api": {
1350
- "optional": true
1351
- },
1352
- "@opentelemetry/api-logs": {
1353
- "optional": true
1354
- },
1355
- "@sqlite.org/sqlite-wasm": {
1356
- "optional": true
1357
- },
1358
- "better-sqlite3": {
1359
- "optional": true
1360
- },
1361
- "expo-sqlite": {
1362
- "optional": true
1363
- },
1364
- "mysql2": {
1365
- "optional": true
1366
- },
1367
- "pg": {
1368
- "optional": true
1369
- },
1370
- "pg-query-stream": {
1371
- "optional": true
1372
- }
1373
- }
1374
- },
1375
- "node_modules/tinyglobby": {
1376
- "version": "0.2.17",
1377
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
1378
- "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
1379
- "dev": true,
1380
- "license": "MIT",
1381
- "dependencies": {
1382
- "fdir": "^6.5.0",
1383
- "picomatch": "^4.0.4"
1384
- },
1385
- "engines": {
1386
- "node": ">=12.0.0"
1387
- },
1388
- "funding": {
1389
- "url": "https://github.com/sponsors/SuperchupuDev"
1390
- }
1391
- },
1392
- "node_modules/tr46": {
1393
- "version": "0.0.3",
1394
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
1395
- "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
1396
- "license": "MIT"
1397
- },
1398
- "node_modules/typed-query-selector": {
1399
- "version": "2.12.2",
1400
- "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.2.tgz",
1401
- "integrity": "sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ==",
1402
- "dev": true,
1403
- "license": "MIT"
1404
- },
1405
- "node_modules/typescript": {
1406
- "version": "5.9.2",
1407
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz",
1408
- "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==",
1409
- "dev": true,
1410
- "license": "Apache-2.0",
1411
- "bin": {
1412
- "tsc": "bin/tsc",
1413
- "tsserver": "bin/tsserver"
1414
- },
1415
- "engines": {
1416
- "node": ">=14.17"
1417
- }
1418
- },
1419
- "node_modules/vite": {
1420
- "version": "7.3.6",
1421
- "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz",
1422
- "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==",
1423
- "dev": true,
1424
- "license": "MIT",
1425
- "dependencies": {
1426
- "esbuild": "^0.27.0 || ^0.28.0",
1427
- "fdir": "^6.5.0",
1428
- "picomatch": "^4.0.3",
1429
- "postcss": "^8.5.6",
1430
- "rollup": "^4.43.0",
1431
- "tinyglobby": "^0.2.15"
1432
- },
1433
- "bin": {
1434
- "vite": "bin/vite.js"
1435
- },
1436
- "engines": {
1437
- "node": "^20.19.0 || >=22.12.0"
1438
- },
1439
- "funding": {
1440
- "url": "https://github.com/vitejs/vite?sponsor=1"
1441
- },
1442
- "optionalDependencies": {
1443
- "fsevents": "~2.3.3"
1444
- },
1445
- "peerDependencies": {
1446
- "@types/node": "^20.19.0 || >=22.12.0",
1447
- "jiti": ">=1.21.0",
1448
- "less": "^4.0.0",
1449
- "lightningcss": "^1.21.0",
1450
- "sass": "^1.70.0",
1451
- "sass-embedded": "^1.70.0",
1452
- "stylus": ">=0.54.8",
1453
- "sugarss": "^5.0.0",
1454
- "terser": "^5.16.0",
1455
- "tsx": "^4.8.1",
1456
- "yaml": "^2.4.2"
1457
- },
1458
- "peerDependenciesMeta": {
1459
- "@types/node": {
1460
- "optional": true
1461
- },
1462
- "jiti": {
1463
- "optional": true
1464
- },
1465
- "less": {
1466
- "optional": true
1467
- },
1468
- "lightningcss": {
1469
- "optional": true
1470
- },
1471
- "sass": {
1472
- "optional": true
1473
- },
1474
- "sass-embedded": {
1475
- "optional": true
1476
- },
1477
- "stylus": {
1478
- "optional": true
1479
- },
1480
- "sugarss": {
1481
- "optional": true
1482
- },
1483
- "terser": {
1484
- "optional": true
1485
- },
1486
- "tsx": {
1487
- "optional": true
1488
- },
1489
- "yaml": {
1490
- "optional": true
1491
- }
1492
- }
1493
- },
1494
- "node_modules/webdriver-bidi-protocol": {
1495
- "version": "0.4.3",
1496
- "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.3.tgz",
1497
- "integrity": "sha512-uuN0goWfxP22B7J/uAgBpOYNPttC+XVseYE+rSY5+rQ+YBeVz/VORw8WbmLVcqW78zNg5A4qnjNXYUWR3il2ig==",
1498
- "dev": true,
1499
- "license": "Apache-2.0"
1500
- },
1501
- "node_modules/webidl-conversions": {
1502
- "version": "3.0.1",
1503
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
1504
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
1505
- "license": "BSD-2-Clause"
1506
- },
1507
- "node_modules/whatwg-url": {
1508
- "version": "5.0.0",
1509
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
1510
- "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
1511
- "license": "MIT",
1512
- "dependencies": {
1513
- "tr46": "~0.0.3",
1514
- "webidl-conversions": "^3.0.0"
1515
- }
1516
- },
1517
- "node_modules/wrap-ansi": {
1518
- "version": "9.0.2",
1519
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz",
1520
- "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==",
1521
- "dev": true,
1522
- "license": "MIT",
1523
- "dependencies": {
1524
- "ansi-styles": "^6.2.1",
1525
- "string-width": "^7.0.0",
1526
- "strip-ansi": "^7.1.0"
1527
- },
1528
- "engines": {
1529
- "node": ">=18"
1530
- },
1531
- "funding": {
1532
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1533
- }
1534
- },
1535
- "node_modules/wrap-ansi/node_modules/string-width": {
1536
- "version": "7.2.0",
1537
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
1538
- "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
1539
- "dev": true,
1540
- "license": "MIT",
1541
- "dependencies": {
1542
- "emoji-regex": "^10.3.0",
1543
- "get-east-asian-width": "^1.0.0",
1544
- "strip-ansi": "^7.1.0"
1545
- },
1546
- "engines": {
1547
- "node": ">=18"
1548
- },
1549
- "funding": {
1550
- "url": "https://github.com/sponsors/sindresorhus"
1551
- }
1552
- },
1553
- "node_modules/ws": {
1554
- "version": "8.21.3",
1555
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz",
1556
- "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==",
1557
- "dev": true,
1558
- "license": "MIT",
1559
- "engines": {
1560
- "node": ">=10.0.0"
1561
- },
1562
- "peerDependencies": {
1563
- "bufferutil": "^4.0.1",
1564
- "utf-8-validate": ">=5.0.2"
1565
- },
1566
- "peerDependenciesMeta": {
1567
- "bufferutil": {
1568
- "optional": true
1569
- },
1570
- "utf-8-validate": {
1571
- "optional": true
1572
- }
1573
- }
1574
- },
1575
- "node_modules/y18n": {
1576
- "version": "5.0.8",
1577
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
1578
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
1579
- "dev": true,
1580
- "license": "ISC",
1581
- "engines": {
1582
- "node": ">=10"
1583
- }
1584
- },
1585
- "node_modules/yargs": {
1586
- "version": "18.1.0",
1587
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz",
1588
- "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==",
1589
- "dev": true,
1590
- "license": "MIT",
1591
- "dependencies": {
1592
- "cliui": "^9.0.1",
1593
- "escalade": "^3.1.1",
1594
- "get-caller-file": "^2.0.5",
1595
- "string-width": "^8.2.1",
1596
- "y18n": "^5.0.5",
1597
- "yargs-parser": "^22.0.0"
1598
- },
1599
- "engines": {
1600
- "node": "^20.19.0 || ^22.12.0 || >=23"
1601
- }
1602
- },
1603
- "node_modules/yargs-parser": {
1604
- "version": "22.0.0",
1605
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
1606
- "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==",
1607
- "dev": true,
1608
- "license": "ISC",
1609
- "engines": {
1610
- "node": "^20.19.0 || ^22.12.0 || >=23"
1611
- }
1612
- },
1613
- "node_modules/zod": {
1614
- "version": "3.25.76",
1615
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
1616
- "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
1617
- "dev": true,
1618
- "license": "MIT",
1619
- "funding": {
1620
- "url": "https://github.com/sponsors/colinhacks"
1621
- }
1622
- }
1623
- }
1624
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/package.json DELETED
@@ -1,20 +0,0 @@
1
- {
2
- "name": "teaql-browser-sqlite-example",
3
- "version": "1.0.0",
4
- "private": true,
5
- "type": "module",
6
- "scripts": {
7
- "dev": "vite",
8
- "build": "tsc --noEmit && vite build",
9
- "smoke": "node scripts/smoke.mjs"
10
- },
11
- "dependencies": {
12
- "@sqlite.org/sqlite-wasm": "3.53.0-build1",
13
- "teaql-ts": "file:vendor/teaql-teaql-0.3.0.tgz"
14
- },
15
- "devDependencies": {
16
- "puppeteer-core": "25.10.0",
17
- "typescript": "5.9.2",
18
- "vite": "^7.3.6"
19
- }
20
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/scripts/smoke.mjs DELETED
@@ -1,130 +0,0 @@
1
- import {spawn} from 'node:child_process';
2
- import {readFileSync, writeFileSync} from 'node:fs';
3
- import {createHash} from 'node:crypto';
4
- import {join} from 'node:path';
5
- import assert from 'node:assert/strict';
6
- import puppeteer from 'puppeteer-core';
7
-
8
- const generated = JSON.parse(readFileSync('generated-order-hashes.json', 'utf8'));
9
- function checkLibrary() {
10
- for (const [file, expected] of Object.entries(generated))
11
- assert.equal(createHash('sha256').update(readFileSync(join('orders-lib', file))).digest('hex'), expected, `generated file changed: ${file}`);
12
- }
13
- checkLibrary();
14
- const server = spawn(process.execPath, ['node_modules/vite/bin/vite.js', 'preview', '--host', '127.0.0.1', '--port', '4175', '--strictPort'],
15
- {stdio: ['ignore', 'pipe', 'pipe']});
16
- let serverOutput = '';
17
- server.stdout.on('data', value => { serverOutput += value; }); server.stderr.on('data', value => { serverOutput += value; });
18
- let browser;
19
- const receipts = [];
20
- try {
21
- let ready = false;
22
- for (let attempt = 0; attempt < 100; attempt++) {
23
- try { ready = (await fetch('http://127.0.0.1:4175/')).ok; } catch { /* starting */ }
24
- if (ready) break;
25
- await new Promise(resolve => setTimeout(resolve, 100));
26
- }
27
- assert.ok(ready, serverOutput);
28
- browser = await puppeteer.launch({executablePath: process.env.CHROME_BIN || '/usr/bin/google-chrome',
29
- args: ['--no-sandbox', '--disable-dev-shm-usage'], headless: true});
30
- const page = await browser.newPage(), errors = [];
31
- page.on('pageerror', error => errors.push(error.message));
32
- page.on('console', event => { if (event.type() === 'error') errors.push(event.text()); });
33
- page.on('response', response => { if (response.status() >= 400) errors.push(`${response.status()} ${response.url()}`); });
34
- page.on('requestfailed', request => errors.push(`${request.failure()?.errorText} ${request.url()}`));
35
- async function waitReady(storage) {
36
- try {
37
- await page.waitForFunction(value => {
38
- const text = document.querySelector('#status')?.textContent || '';
39
- return text.startsWith(value) && text.includes('ready');
40
- }, {timeout: 20_000}, storage);
41
- } catch (error) {
42
- throw new Error(`${error.message}; status=${await page.$eval('#status', element => element.textContent)}; browserErrors=${errors.join('\n')}`);
43
- }
44
- }
45
- async function inspect(label, diagnostics) {
46
- const response = JSON.parse(await page.$eval('#result', element => element.textContent));
47
- assert.equal(response.metadata.totalCount, 3); assert.equal(response.metadata.aggregations.totalOrders, 3);
48
- assert.equal(response.metadata.pageOffset, 1); assert.equal(response.metadata.pageSize, 1);
49
- assert.equal(response.resultCode, 0); assert.equal(response.status, 'YES');
50
- assert.equal(response.version, '1.001'); assert.equal(response.recordCount, 3);
51
- assert.deepEqual(response.metadata.searchWarnings, []);
52
- assert.equal(response.data.length, 1); const order = response.data[0];
53
- assert.equal(order.orderNumber, 'KEEP-002'); assert.equal(order.orderDate.slice(0, 10), '2026-10-02');
54
- assert.equal(order.version, 1); assert.equal(order.status.name, 'Paid'); assert.equal(order.status.color, '#22C55E');
55
- assert.deepEqual(order.items.map(item => [item.productName, item.quantity]), [['Box 1', 1], ['Box 2', 2], ['Box 3', 3]]);
56
- assert.equal(order.itemCount, 5);
57
- assert.deepEqual(response.facets.statusCounts.map(row => [String(row.id), row.orderCount, row.orderTotalAmount]),
58
- [['1001', 1, 100], ['1002', 2, 500], ['1003', 0, null]]);
59
- const evidence = JSON.parse(await page.$eval('#sql', element => element.textContent));
60
- assert.equal(evidence.length, 8);
61
- const comments = evidence.map(entry => entry.traceChain.filter(node => node.kind === 'comment').map(node => node.detail));
62
- const expected = [
63
- ['load order list', "countAs('totalOrders')"], ['load order list'],
64
- ['load order list', 'selectStatusWith(...)', 'load status'],
65
- ['load order list', 'selectOrderItemListWith(...)', 'load item previews'],
66
- ['load order list', "countOrderItemsAs('itemCount')"],
67
- ['load order list', "facetByStatusAs('statusCounts')", 'aggregate status'],
68
- ['load order list', "facetByStatusAs('statusCounts')", 'load status facets'],
69
- ['load order list', "facetByStatusAs('statusCounts')", 'aggregate status'],
70
- ];
71
- assert.deepEqual(comments.map(JSON.stringify).sort(), expected.map(JSON.stringify).sort());
72
- for (const entry of evidence) {
73
- assert.equal(entry.purpose, 'render order list page');
74
- assert.ok(entry.tracePath.some(node => node.kind === 'provider'));
75
- assert.equal(entry.traceChain.filter(node => node.kind === 'purpose').length, 1);
76
- }
77
- const text = await page.$eval('#status', element => element.textContent);
78
- assert.ok(text.includes(`${diagnostics} diagnostics`), text);
79
- assert.equal(await page.$eval('#trace', element => element.textContent), evidence.map(entry => `${entry.purpose}: ${entry.traceChain
80
- .filter(node => node.kind === 'comment').map(node => node.detail).join(' → ')}`).join('\n'));
81
- assert.deepEqual(await page.$$eval('.evidence-table th', cells => cells.map(cell => cell.textContent)),
82
- ['Time', 'Identity', 'Trace chain', 'SQL']);
83
- const renderedEvidence = await page.$$eval('#evidence-rows tr', rows => rows.map(row =>
84
- [...row.querySelectorAll('td')].map(cell => cell.textContent)));
85
- assert.deepEqual(renderedEvidence, evidence.map(entry => [
86
- `${entry.elapsedMicros} µs`, entry.tracePath.find(node => node.kind === 'request')?.name ?? '—',
87
- `${entry.traceChain.find(node => node.kind === 'purpose').detail}: ${entry.traceChain
88
- .filter(node => node.kind === 'comment').map(node => node.detail).join(' → ')}`, entry.debugSQL,
89
- ]));
90
- receipts.push({label, response, evidence, diagnostics, renderedEvidence});
91
- return response;
92
- }
93
- await page.goto('http://127.0.0.1:4175/', {waitUntil: 'networkidle0'});
94
- await waitReady('MEMORY'); const baseline = await inspect('memory-first', 8);
95
- await page.select('#example', 'all');
96
- await page.waitForFunction(() => {
97
- const text = document.querySelector('#result')?.textContent;
98
- return text && JSON.parse(text).metadata.totalCount === 4;
99
- });
100
- const all = JSON.parse(await page.$eval('#result', element => element.textContent));
101
- assert.equal(all.data[0].orderNumber, 'KEEP-003');
102
- assert.deepEqual(all.facets.statusCounts.map(row => [row.orderCount, row.orderTotalAmount]), [[1, 100], [3, 1400], [0, null]]);
103
- await page.$eval('#search', element => { element.value = 'Q.constructor("return globalThis")'; });
104
- await page.click('#query');
105
- await page.waitForFunction(() => document.querySelector('#status')?.textContent?.includes('not allowed'));
106
- assert.equal(await page.$$eval('#evidence-rows tr', rows => rows.length), 0);
107
- assert.equal(await page.$eval('#sql', element => element.textContent), '[]');
108
- await page.click('#preset'); await waitReady('MEMORY');
109
- assert.deepEqual(await inspect('restored-preset', 8), baseline);
110
- await page.reload({waitUntil: 'networkidle0'}); await waitReady('MEMORY');
111
- assert.deepEqual(await inspect('memory-refresh', 8), baseline);
112
- await page.click('#logging');
113
- await page.waitForFunction(() => document.querySelector('#status')?.textContent?.includes('0 diagnostics'));
114
- assert.deepEqual(await inspect('memory-logging-off', 0), baseline);
115
- await page.click('#reset');
116
- await page.waitForFunction(() => !document.querySelector('#reset')?.hasAttribute('disabled'));
117
- assert.deepEqual(await inspect('memory-reset', 0), baseline);
118
- await page.click('#persist'); await waitReady('OPFS');
119
- assert.deepEqual(await inspect('opfs-first', 0), baseline);
120
- await page.reload({waitUntil: 'networkidle0'}); await waitReady('OPFS');
121
- assert.deepEqual(await inspect('opfs-refresh', 8), baseline);
122
- await page.click('#reset');
123
- await page.waitForFunction(() => !document.querySelector('#reset')?.hasAttribute('disabled'));
124
- assert.deepEqual(await inspect('opfs-reset', 8), baseline);
125
- assert.deepEqual(errors, []); checkLibrary();
126
- if (process.env.TEAQL_BROWSER_ORDER_EVIDENCE) writeFileSync(process.env.TEAQL_BROWSER_ORDER_EVIDENCE,
127
- JSON.stringify({receipts, queryPresetSwitch: true, forbiddenConstructorRejected: true,
128
- generatedLibraryUnchanged: true, browserErrors: errors}, null, 2) + '\n', {flag: 'wx'});
129
- console.log('PASS browser generated order TraceChain: memory/OPFS, refresh/reset, logging on/off, exact facets/counts/previews, actual SQL=8, unchanged generated library');
130
- } finally { await browser?.close(); server.kill('SIGTERM'); }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/src/main.ts DELETED
@@ -1,185 +0,0 @@
1
- import { BrowserSQLiteTeaQLClient, type BrowserSQLiteStorage } from 'teaql-ts/sql/browser-sqlite';
2
- import { DelegatingMutationPolicyApprovalProvider, DelegatingMutationPolicyRegistry, QueryParser, UserContext } from 'teaql-ts';
3
- import type { TeaQLPage } from 'teaql-ts';
4
- import { SQLExecutionEvidenceStore, type SQLExecutionMetadata } from 'teaql-ts/sql/core';
5
- import { Q } from '../orders-lib/src/generated/Q';
6
- import { E } from '../orders-lib/src/generated/E';
7
- import { OrderStatus } from '../orders-lib/src/generated/models/OrderStatus';
8
- import { GENERATED_RUNTIME_MODULE } from '../orders-lib/src/runtime-module';
9
- import { ENTITY_SCHEMAS } from '../orders-lib/src/teaql-schemas';
10
- import { webResponse } from './web-response';
11
- import './style.css';
12
-
13
- const status = document.querySelector<HTMLParagraphElement>('#status')!;
14
- const output = document.querySelector<HTMLPreElement>('#result')!;
15
- const trace = document.querySelector<HTMLPreElement>('#trace')!;
16
- const sql = document.querySelector<HTMLPreElement>('#sql')!;
17
- const evidenceRows = document.querySelector<HTMLTableSectionElement>('#evidence-rows')!;
18
- const persist = document.querySelector<HTMLInputElement>('#persist')!;
19
- const logging = document.querySelector<HTMLInputElement>('#logging')!;
20
- const reset = document.querySelector<HTMLButtonElement>('#reset')!;
21
- const run = document.querySelector<HTMLButtonElement>('#query')!;
22
- const search = document.querySelector<HTMLTextAreaElement>('#search')!;
23
- const example = document.querySelector<HTMLSelectElement>('#example')!;
24
- const filteredSearch = JSON.stringify(JSON.stringify({filter: {orderNumber: {$contains: 'KEEP'}}}));
25
- const preset = `Q.customerOrdersWithMinimalFields()
26
- .filterByJson(${filteredSearch})
27
- .countAs("totalOrders")
28
- .facetByStatusAs("statusCounts", Q.orderStatusesWithMinimalFields()
29
- .selectName().selectColor().countAs("orderCount")
30
- .sumTotalAmountOfCustomerOrdersAs("orderTotalAmount", Q.customerOrdersWithMinimalFields())
31
- .orderByDisplayOrderAscending().comment("load status facets"))
32
- .selectOrderNumber().selectOrderDate()
33
- .selectStatusWith(Q.orderStatusesWithMinimalFields()
34
- .selectName().selectColor().comment("load status"))
35
- .selectOrderItemListWith(Q.orderItemsWithMinimalFields()
36
- .selectProductName().selectQuantity().orderByIdAscending().limit(3).comment("load item previews"))
37
- .countOrderItemsAs("itemCount")
38
- .orderByOrderDateDescending().orderByIdDescending()
39
- .comment("load order list").purpose("render order list page")`;
40
- search.value = preset;
41
- type Runtime = {client: BrowserSQLiteTeaQLClient; context: UserContext; evidence: SQLExecutionEvidenceStore; diagnostics: SQLExecutionMetadata[]};
42
- let active: Runtime | undefined;
43
- const opfsAvailable = globalThis.crossOriginIsolated && typeof navigator.storage?.getDirectory === 'function';
44
- persist.checked = opfsAvailable && localStorage.getItem('teaql-browser-order-storage') === 'opfs';
45
- persist.disabled = !opfsAvailable;
46
- if (!opfsAvailable) document.querySelector('#opfs-note')!.textContent = '(not available on this host; memory remains fully browser-local)';
47
-
48
- async function open(storage: BrowserSQLiteStorage): Promise<Runtime> {
49
- const worker = new Worker(new URL('./sqlite.worker.ts', import.meta.url), {type: 'module'});
50
- const client = await BrowserSQLiteTeaQLClient.open(worker, {...ENTITY_SCHEMAS}, {
51
- storage, databaseName: 'teaql-browser-orders.sqlite3',
52
- });
53
- client.install(GENERATED_RUNTIME_MODULE);
54
- client.setDiagnosticSQLLogSink(undefined).setMutationLoggingEnabled(false);
55
- const identity = Object.freeze({policyId: 'browser-order-seed', version: '1', fingerprint: 'sha256:browser-order-seed-v1'});
56
- const context = new UserContext().insertResource('dataService', client)
57
- .withMutationPolicyRegistry(new DelegatingMutationPolicyRegistry(() => ({identity,
58
- review: (_context, plan) => plan.operations.length > 0 ? {verdict: 'allow'}
59
- : {verdict: 'deny', code: 'EMPTY_GRAPH', message: 'empty mutation graph'},
60
- })))
61
- .withMutationPolicyApprovalProvider(new DelegatingMutationPolicyApprovalProvider(
62
- policy => ({policy, approvedBy: 'browser-demo-owner', approvedAt: new Date()}),
63
- ));
64
- client.setUserContext(context);
65
- await context.ensureSchema();
66
- await context.ensureSchema();
67
- return {client, context, evidence: new SQLExecutionEvidenceStore(), diagnostics: []};
68
- }
69
-
70
- async function seed({context}: Runtime): Promise<void> {
71
- const existing = await Q.customerOrdersWithMinimalFields().limit(1)
72
- .comment('detect existing order demo').purpose('keep mutation seeding idempotent').executeForList(context);
73
- if (existing.length) return;
74
- const platform = (await Q.platforms().limit(2).comment('load bootstrap platform').purpose('prepare order demo').executeForList(context))[0];
75
- const customer = Q.customers().comment('initialize demo customer').purpose('prepare order demo').newEntity(context);
76
- customer.updateName('North Star Retail').updatePlatform(platform.id);
77
- await customer.auditAs('seed browser order customer').save(context);
78
- for (let index = 1; index <= 4; index++) {
79
- const order = Q.customerOrders().comment('initialize demo order').purpose('prepare order demo').newEntity(context);
80
- order.updateCustomer(customer.id).updateOrderNumber(index < 4 ? `KEEP-00${index}` : 'DROP-004')
81
- .updateOrderDate(`2026-10-0${index}`).updateTotalAmount(index < 4 ? index * 100 : 900);
82
- if (index === 1) order.updateStatusToNew(); else order.updateStatusToPaid();
83
- await order.auditAs('seed browser order').save(context);
84
- for (let item = 1; item <= 5; item++) {
85
- const line = Q.orderItems().comment('initialize demo item').purpose('prepare item previews').newEntity(context);
86
- line.updateCustomerOrder(order.id).updateProductName(`Box ${item}`).updateQuantity(item).updateUnitPrice(20);
87
- await line.auditAs('seed browser order item').save(context);
88
- }
89
- }
90
- }
91
-
92
- async function show(runtime: Runtime): Promise<void> {
93
- output.textContent = '';
94
- trace.textContent = '';
95
- sql.textContent = '[]';
96
- evidenceRows.replaceChildren();
97
- runtime.evidence.enableAll(); runtime.diagnostics.length = 0;
98
- type Order = NonNullable<Parameters<typeof E.customerOrder>[0]>;
99
- type Executable = {executeForPage(context: UserContext, offset: number, size: number): Promise<TeaQLPage<Order>>};
100
- const request = QueryParser.parse(search.value, Q) as Executable & {dynamicSearchWarnings?: readonly unknown[]};
101
- if (typeof request?.executeForPage !== 'function') throw new Error('The query must contain a generated executable Q request');
102
- runtime.client.setRuntimeTelemetrySink(runtime.evidence).setQueryLoggingEnabled(logging.checked)
103
- .setDiagnosticSQLLogSink({write: entry => runtime.diagnostics.push(entry)});
104
- const page = await request.executeForPage(runtime.context, 1, 1);
105
- const responseBase = webResponse(page.data);
106
- const response = {
107
- resultCode: responseBase.resultCode, status: responseBase.status, version: responseBase.version,
108
- recordCount: page.totalCount,
109
- data: page.data.map(row => {
110
- const expression = E.customerOrder(row);
111
- const previewSize = expression.orderItemList().size().eval();
112
- if (previewSize == null) throw new Error('Selected item list unexpectedly has a null size');
113
- return {id: row.id, version: row.version, orderNumber: expression.orderNumber().eval(), orderDate: expression.orderDate().eval(),
114
- status: {name: expression.status().name().eval(), color: expression.status().color().eval()},
115
- items: Array.from({length: previewSize}, (_, index) => ({
116
- productName: expression.orderItemList().get(index).productName().eval(), quantity: expression.orderItemList().get(index).quantity().eval(),
117
- })), itemCount: (row as unknown as Record<string, unknown>).itemCount};
118
- }),
119
- metadata: {totalCount: page.totalCount, pageOffset: 1, pageSize: 1, aggregations: page.data.aggregations, searchWarnings: request.dynamicSearchWarnings ?? []},
120
- facets: {statusCounts: page.data.facets.statusCounts.map(value => ({
121
- id: value.id, name: E.orderStatus(OrderStatus.fromRecord(value)).name().eval(),
122
- color: E.orderStatus(OrderStatus.fromRecord(value)).color().eval(), orderCount: value.orderCount, orderTotalAmount: value.orderTotalAmount,
123
- }))},
124
- };
125
- output.textContent = JSON.stringify(response, null, 2);
126
- const statements = runtime.evidence.snapshot();
127
- // Rendering only: ownership and comments come from the actual runtime metadata.
128
- const rows = statements.map(entry => {
129
- const chain = entry.traceChain ?? [];
130
- const purposes = chain.filter(node => node.kind === 'purpose');
131
- const businessTrace = purposes.length === 1
132
- ? `${purposes[0].detail}: ${chain.filter(node => node.kind === 'comment').map(node => node.detail).join(' → ')}`
133
- : 'TraceChain unavailable';
134
- const row = document.createElement('tr');
135
- for (const value of [`${entry.elapsedMicros} µs`,
136
- entry.tracePath.find(node => node.kind === 'request')?.name ?? '—', businessTrace, entry.debugSQL]) {
137
- const cell = document.createElement('td');
138
- cell.textContent = value;
139
- row.append(cell);
140
- }
141
- return {row, businessTrace};
142
- });
143
- evidenceRows.replaceChildren(...rows.map(value => value.row));
144
- trace.textContent = rows.map(value => value.businessTrace).join('\n');
145
- sql.textContent = JSON.stringify(statements, null, 2);
146
- status.textContent = `${runtime.client.storage!.toUpperCase()} · ${page.totalCount} matches · ${statements.length} SQL statements · ${runtime.diagnostics.length} diagnostics · policy installed · ready`;
147
- }
148
-
149
- async function replace(storage: BrowserSQLiteStorage): Promise<void> {
150
- status.textContent = `Opening ${storage.toUpperCase()} SQLite/WASM…`;
151
- const previous = active; active = undefined;
152
- await previous?.client.close();
153
- const next = await open(storage); active = next;
154
- await seed(next); await show(next);
155
- }
156
- function fail(value: unknown): void {
157
- status.textContent = value instanceof Error ? `${value.name}: ${value.message}` : String(value);
158
- }
159
- run.addEventListener('click', async () => {
160
- if (!active) return;
161
- run.disabled = true;
162
- try { await show(active); } catch (error) { fail(error); } finally { run.disabled = false; }
163
- });
164
- document.querySelector('#preset')!.addEventListener('click', () => {
165
- search.value = preset; example.value = 'filtered'; run.click();
166
- });
167
- example.addEventListener('change', () => {
168
- search.value = example.value === 'all' ? preset.replace(filteredSearch, JSON.stringify('{}')) : preset;
169
- run.click();
170
- });
171
- search.addEventListener('keydown', event => {
172
- if ((event.ctrlKey || event.metaKey) && event.key === 'Enter') run.click();
173
- });
174
- logging.addEventListener('change', () => { if (active) show(active).catch(fail); });
175
- persist.addEventListener('change', () => {
176
- const storage = persist.checked ? 'opfs' : 'memory';
177
- localStorage.setItem('teaql-browser-order-storage', storage); replace(storage).catch(fail);
178
- });
179
- reset.addEventListener('click', async () => {
180
- if (!active) return;
181
- reset.disabled = true;
182
- try { await active.client.reset(active.context); await seed(active); await show(active); }
183
- catch (error) { fail(error); } finally { reset.disabled = false; }
184
- });
185
- replace(persist.checked ? 'opfs' : 'memory').catch(fail);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/browser-sqlite/src/sqlite.worker.ts DELETED
@@ -1,4 +0,0 @@
1
- import { startBrowserSQLiteWorker } from 'teaql-ts/sql/browser-sqlite-worker';
2
- import sqliteWasmUrl from '@sqlite.org/sqlite-wasm/sqlite3.wasm?url';
3
-
4
- startBrowserSQLiteWorker({ wasmUrl: sqliteWasmUrl });
 
 
 
 
 
source/browser-sqlite/src/style.css DELETED
@@ -1,14 +0,0 @@
1
- :root { font: 16px/1.5 Inter, system-ui, sans-serif; color: #e8edf5; background: #090b10; }
2
- body { margin: 0; }
3
- main { width: min(760px, calc(100% - 40px)); margin: 10vh auto; }
4
- .eyebrow { color: #d9ff52; font-size: 12px; font-weight: 800; letter-spacing: .16em; }
5
- h1 { margin: 8px 0; font-size: clamp(36px, 7vw, 68px); letter-spacing: -.05em; }
6
- .controls { display: flex; gap: 18px; align-items: center; margin: 32px 0; }
7
- button { border: 0; border-radius: 5px; padding: 10px 14px; background: #d9ff52; font-weight: 800; }
8
- #status { color: #aab4c4; }
9
- pre { min-height: 260px; padding: 22px; overflow: auto; border: 1px solid #2b323e; border-radius: 8px; background: #11151c; color: #c6d1df; }
10
- .evidence-scroll { overflow-x: auto; margin: 24px 0; }
11
- .evidence-table { border-collapse: collapse; width: 100%; text-align: left; }
12
- .evidence-table th, .evidence-table td { padding: 12px; border: 1px solid #2b323e; vertical-align: top; }
13
- .evidence-table td { white-space: pre-wrap; overflow-wrap: anywhere; min-width: 110px; }
14
- .evidence-table td:last-child { min-width: 320px; font-family: monospace; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/runtime/LICENSE DELETED
@@ -1,202 +0,0 @@
1
- Apache License
2
- Version 2.0, January 2004
3
- http://www.apache.org/licenses/
4
-
5
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
-
7
- 1. Definitions.
8
-
9
- "License" shall mean the terms and conditions for use, reproduction,
10
- and distribution as defined by Sections 1 through 9 of this document.
11
-
12
- "Licensor" shall mean the copyright owner or entity authorized by
13
- the copyright owner that is granting the License.
14
-
15
- "Legal Entity" shall mean the union of the acting entity and all
16
- other entities that control, are controlled by, or are under common
17
- control with that entity. For the purposes of this definition,
18
- "control" means (i) the power, direct or indirect, to cause the
19
- direction or management of such entity, whether by contract or
20
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
- outstanding shares, or (iii) beneficial ownership of such entity.
22
-
23
- "You" (or "Your") shall mean an individual or Legal Entity
24
- exercising permissions granted by this License.
25
-
26
- "Source" form shall mean the preferred form for making modifications,
27
- including but not limited to software source code, documentation
28
- source, and configuration files.
29
-
30
- "Object" form shall mean any form resulting from mechanical
31
- transformation or translation of a Source form, including but
32
- not limited to compiled object code, generated documentation,
33
- and conversions to other media types.
34
-
35
- "Work" shall mean the work of authorship, whether in Source or
36
- Object form, made available under the License, as indicated by a
37
- copyright notice that is included in or attached to the work
38
- (an example is provided in the Appendix below).
39
-
40
- "Derivative Works" shall mean any work, whether in Source or Object
41
- form, that is based on (or derived from) the Work and for which the
42
- editorial revisions, annotations, elaborations, or other modifications
43
- represent, as a whole, an original work of authorship. For the purposes
44
- of this License, Derivative Works shall not include works that remain
45
- separable from, or merely link (or bind by name) to the interfaces of,
46
- the Work and Derivative Works thereof.
47
-
48
- "Contribution" shall mean any work of authorship, including
49
- the original version of the Work and any modifications or additions
50
- to that Work or Derivative Works thereof, that is intentionally
51
- submitted to Licensor for inclusion in the Work by the copyright owner
52
- or by an individual or Legal Entity authorized to submit on behalf of
53
- the copyright owner. For the purposes of this definition, "submitted"
54
- means any form of electronic, verbal, or written communication sent
55
- to the Licensor or its representatives, including but not limited to
56
- communication on electronic mailing lists, source code control systems,
57
- and issue tracking systems that are managed by, or on behalf of, the
58
- Licensor for the purpose of discussing and improving the Work, but
59
- excluding communication that is conspicuously marked or otherwise
60
- designated in writing by the copyright owner as "Not a Contribution."
61
-
62
- "Contributor" shall mean Licensor and any individual or Legal Entity
63
- on behalf of whom a Contribution has been received by Licensor and
64
- subsequently incorporated within the Work.
65
-
66
- 2. Grant of Copyright License. Subject to the terms and conditions of
67
- this License, each Contributor hereby grants to You a perpetual,
68
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
- copyright license to reproduce, prepare Derivative Works of,
70
- publicly display, publicly perform, sublicense, and distribute the
71
- Work and such Derivative Works in Source or Object form.
72
-
73
- 3. Grant of Patent License. Subject to the terms and conditions of
74
- this License, each Contributor hereby grants to You a perpetual,
75
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
- (except as stated in this section) patent license to make, have made,
77
- use, offer to sell, sell, import, and otherwise transfer the Work,
78
- where such license applies only to those patent claims licensable
79
- by such Contributor that are necessarily infringed by their
80
- Contribution(s) alone or by combination of their Contribution(s)
81
- with the Work to which such Contribution(s) was submitted. If You
82
- institute patent litigation against any entity (including a
83
- cross-claim or counterclaim in a lawsuit) alleging that the Work
84
- or a Contribution incorporated within the Work constitutes direct
85
- or contributory patent infringement, then any patent licenses
86
- granted to You under this License for that Work shall terminate
87
- as of the date such litigation is filed.
88
-
89
- 4. Redistribution. You may reproduce and distribute copies of the
90
- Work or Derivative Works thereof in any medium, with or without
91
- modifications, and in Source or Object form, provided that You
92
- meet the following conditions:
93
-
94
- (a) You must give any other recipients of the Work or
95
- Derivative Works a copy of this License; and
96
-
97
- (b) You must cause any modified files to carry prominent notices
98
- stating that You changed the files; and
99
-
100
- (c) You must retain, in the Source form of any Derivative Works
101
- that You distribute, all copyright, patent, trademark, and
102
- attribution notices from the Source form of the Work,
103
- excluding those notices that do not pertain to any part of
104
- the Derivative Works; and
105
-
106
- (d) If the Work includes a "NOTICE" text file as part of its
107
- distribution, then any Derivative Works that You distribute must
108
- include a readable copy of the attribution notices contained
109
- within such NOTICE file, excluding those notices that do not
110
- pertain to any part of the Derivative Works, in at least one
111
- of the following places: within a NOTICE text file distributed
112
- as part of the Derivative Works; within the Source form or
113
- documentation, if provided along with the Derivative Works; or,
114
- within a display generated by the Derivative Works, if and
115
- wherever such third-party notices normally appear. The contents
116
- of the NOTICE file are for informational purposes only and
117
- do not modify the License. You may add Your own attribution
118
- notices within Derivative Works that You distribute, alongside
119
- or as an addendum to the NOTICE text from the Work, provided
120
- that such additional attribution notices cannot be construed
121
- as modifying the License.
122
-
123
- You may add Your own copyright statement to Your modifications and
124
- may provide additional or different license terms and conditions
125
- for use, reproduction, or distribution of Your modifications, or
126
- for any such Derivative Works as a whole, provided Your use,
127
- reproduction, and distribution of the Work otherwise complies with
128
- the conditions stated in this License.
129
-
130
- 5. Submission of Contributions. Unless You explicitly state otherwise,
131
- any Contribution intentionally submitted for inclusion in the Work
132
- by You to the Licensor shall be under the terms and conditions of
133
- this License, without any additional terms or conditions.
134
- Notwithstanding the above, nothing herein shall supersede or modify
135
- the terms of any separate license agreement you may have executed
136
- with Licensor regarding such Contributions.
137
-
138
- 6. Trademarks. This License does not grant permission to use the trade
139
- names, trademarks, service marks, or product names of the Licensor,
140
- except as required for reasonable and customary use in describing the
141
- origin of the Work and reproducing the content of the NOTICE file.
142
-
143
- 7. Disclaimer of Warranty. Unless required by applicable law or
144
- agreed to in writing, Licensor provides the Work (and each
145
- Contributor provides its Contributions) on an "AS IS" BASIS,
146
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
- implied, including, without limitation, any warranties or conditions
148
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
- PARTICULAR PURPOSE. You are solely responsible for determining the
150
- appropriateness of using or redistributing the Work and assume any
151
- risks associated with Your exercise of permissions under this License.
152
-
153
- 8. Limitation of Liability. In no event and under no legal theory,
154
- whether in tort (including negligence), contract, or otherwise,
155
- unless required by applicable law (such as deliberate and grossly
156
- negligent acts) or agreed to in writing, shall any Contributor be
157
- liable to You for damages, including any direct, indirect, special,
158
- incidental, or consequential damages of any character arising as a
159
- result of this License or out of the use or inability to use the
160
- Work (including but not limited to damages for loss of goodwill,
161
- work stoppage, computer failure or malfunction, or any and all
162
- other commercial damages or losses), even if such Contributor
163
- has been advised of the possibility of such damages.
164
-
165
- 9. Accepting Warranty or Additional Liability. While redistributing
166
- the Work or Derivative Works thereof, You may choose to offer,
167
- and charge a fee for, acceptance of support, warranty, indemnity,
168
- or other liability obligations and/or rights consistent with this
169
- License. However, in accepting such obligations, You may act only
170
- on Your own behalf and on Your sole responsibility, not on behalf
171
- of any other Contributor, and only if You agree to indemnify,
172
- defend, and hold each Contributor harmless for any liability
173
- incurred by, or claims asserted against, such Contributor by reason
174
- of your accepting any such warranty or additional liability.
175
-
176
- END OF TERMS AND CONDITIONS
177
-
178
- APPENDIX: How to apply the Apache License to your work.
179
-
180
- To apply the Apache License to your work, attach the following
181
- boilerplate notice, with the fields enclosed by brackets "[]"
182
- replaced with your own identifying information. (Don't include
183
- the brackets!) The text should be enclosed in the appropriate
184
- comment syntax for the file format. We also recommend that a
185
- file or class name and description of purpose be included on the
186
- same "printed page" as the copyright notice for easier
187
- identification within third-party archives.
188
-
189
- Copyright [yyyy] [name of copyright owner]
190
-
191
- Licensed under the Apache License, Version 2.0 (the "License");
192
- you may not use this file except in compliance with the License.
193
- You may obtain a copy of the License at
194
-
195
- http://www.apache.org/licenses/LICENSE-2.0
196
-
197
- Unless required by applicable law or agreed to in writing, software
198
- distributed under the License is distributed on an "AS IS" BASIS,
199
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
- See the License for the specific language governing permissions and
201
- limitations under the License.
202
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/runtime/package-lock.json DELETED
The diff for this file is too large to render. See raw diff
 
source/runtime/package.json DELETED
@@ -1,188 +0,0 @@
1
- {
2
- "name": "@teaql/teaql",
3
- "version": "0.3.0",
4
- "description": "TeaQL runtime and SQL data services for TypeScript",
5
- "files": [
6
- "dist",
7
- "!dist/.sql-root-owned-backup-*"
8
- ],
9
- "main": "dist/index.js",
10
- "types": "dist/index.d.ts",
11
- "exports": {
12
- ".": {
13
- "types": "./dist/index.d.ts",
14
- "import": "./dist/esm/index.js",
15
- "require": "./dist/index.js",
16
- "default": "./dist/index.js"
17
- },
18
- "./sql/core": {
19
- "types": "./dist/sql/core.d.ts",
20
- "import": "./dist/esm/sql/core.js",
21
- "require": "./dist/sql/core.js",
22
- "default": "./dist/sql/core.js"
23
- },
24
- "./sql/postgres": {
25
- "types": "./dist/sql/postgres.d.ts",
26
- "import": "./dist/esm/sql/postgres.js",
27
- "require": "./dist/sql/postgres.js",
28
- "default": "./dist/sql/postgres.js"
29
- },
30
- "./sql/mysql": {
31
- "types": "./dist/sql/mysql.d.ts",
32
- "import": "./dist/esm/sql/mysql.js",
33
- "require": "./dist/sql/mysql.js",
34
- "default": "./dist/sql/mysql.js"
35
- },
36
- "./sql/sqlite": {
37
- "types": "./dist/sql/sqlite.d.ts",
38
- "import": "./dist/esm/sql/sqlite.js",
39
- "require": "./dist/sql/sqlite.js",
40
- "default": "./dist/sql/sqlite.js"
41
- },
42
- "./sql/expo-sqlite": {
43
- "types": "./dist/sql/expo-sqlite.d.ts",
44
- "import": "./dist/esm/sql/expo-sqlite.js",
45
- "require": "./dist/sql/expo-sqlite.js",
46
- "default": "./dist/sql/expo-sqlite.js"
47
- },
48
- "./sql/browser-sqlite": {
49
- "types": "./dist/sql/browser-sqlite.d.ts",
50
- "import": "./dist/esm/sql/browser-sqlite.js",
51
- "require": "./dist/sql/browser-sqlite.js",
52
- "default": "./dist/sql/browser-sqlite.js"
53
- },
54
- "./sql/browser-sqlite-worker": {
55
- "types": "./dist/sql/browser-sqlite-worker.d.ts",
56
- "import": "./dist/esm/sql/browser-sqlite-worker.js",
57
- "require": "./dist/sql/browser-sqlite-worker.js",
58
- "default": "./dist/sql/browser-sqlite-worker.js"
59
- },
60
- "./telemetry/opentelemetry": {
61
- "types": "./dist/telemetry/opentelemetry.d.ts",
62
- "import": "./dist/esm/telemetry/opentelemetry.js",
63
- "require": "./dist/telemetry/opentelemetry.js",
64
- "default": "./dist/telemetry/opentelemetry.js"
65
- }
66
- },
67
- "typesVersions": {
68
- "*": {
69
- "sql/core": [
70
- "dist/sql/core.d.ts"
71
- ],
72
- "sql/postgres": [
73
- "dist/sql/postgres.d.ts"
74
- ],
75
- "sql/mysql": [
76
- "dist/sql/mysql.d.ts"
77
- ],
78
- "sql/sqlite": [
79
- "dist/sql/sqlite.d.ts"
80
- ],
81
- "sql/expo-sqlite": [
82
- "dist/sql/expo-sqlite.d.ts"
83
- ],
84
- "sql/browser-sqlite": [
85
- "dist/sql/browser-sqlite.d.ts"
86
- ],
87
- "sql/browser-sqlite-worker": [
88
- "dist/sql/browser-sqlite-worker.d.ts"
89
- ]
90
- }
91
- },
92
- "scripts": {
93
- "generate:query-parser": "node scripts/generate-query-parser.mjs",
94
- "build": "npm run generate:query-parser && tsc && node scripts/build-esm.mjs",
95
- "test": "jest",
96
- "prepack": "npm run build"
97
- },
98
- "keywords": [
99
- "teaql",
100
- "query",
101
- "database"
102
- ],
103
- "author": "TeaQL",
104
- "license": "Apache-2.0",
105
- "repository": {
106
- "type": "git",
107
- "url": "git+https://github.com/teaql/teaql-ts.git"
108
- },
109
- "bugs": {
110
- "url": "https://github.com/teaql/teaql-ts/issues"
111
- },
112
- "homepage": "https://teaql.io",
113
- "sideEffects": false,
114
- "publishConfig": {
115
- "access": "public"
116
- },
117
- "devDependencies": {
118
- "@opentelemetry/api-logs": "^0.221.0",
119
- "@opentelemetry/context-async-hooks": "^2.10.0",
120
- "@opentelemetry/core": "^2.10.0",
121
- "@opentelemetry/exporter-logs-otlp-http": "^0.221.0",
122
- "@opentelemetry/exporter-metrics-otlp-http": "^0.221.0",
123
- "@opentelemetry/exporter-trace-otlp-http": "^0.221.0",
124
- "@opentelemetry/resources": "^2.10.0",
125
- "@opentelemetry/sdk-logs": "^0.221.0",
126
- "@opentelemetry/sdk-metrics": "^2.10.0",
127
- "@opentelemetry/sdk-trace-base": "^2.10.0",
128
- "@sqlite.org/sqlite-wasm": "3.53.0-build1",
129
- "@types/better-sqlite3": "^7.6.12",
130
- "@types/jest": "^29.5.0",
131
- "@types/node-fetch": "^2.6.13",
132
- "@types/pg": "^8.11.0",
133
- "better-sqlite3": "^12.10.0",
134
- "esbuild": "^0.28.2",
135
- "jest": "^29.5.0",
136
- "jest-util": "^29.7.0",
137
- "mysql2": "^3.11.0",
138
- "peggy": "^5.1.0",
139
- "pg": "^8.12.0",
140
- "pg-query-stream": "^4.7.0",
141
- "ts-jest": "^29.1.0",
142
- "typescript": "5.4.5"
143
- },
144
- "dependencies": {
145
- "node-fetch": "^2.7.0"
146
- },
147
- "peerDependencies": {
148
- "@opentelemetry/api": "^1.9.1",
149
- "@opentelemetry/api-logs": "^0.221.0",
150
- "@sqlite.org/sqlite-wasm": "3.53.0-build1",
151
- "better-sqlite3": "^12.10.0",
152
- "expo-sqlite": "*",
153
- "mysql2": "^3.11.0",
154
- "pg": "^8.12.0",
155
- "pg-query-stream": "^4.7.0"
156
- },
157
- "peerDependenciesMeta": {
158
- "@opentelemetry/api": {
159
- "optional": true
160
- },
161
- "@opentelemetry/api-logs": {
162
- "optional": true
163
- },
164
- "@sqlite.org/sqlite-wasm": {
165
- "optional": true
166
- },
167
- "better-sqlite3": {
168
- "optional": true
169
- },
170
- "mysql2": {
171
- "optional": true
172
- },
173
- "pg": {
174
- "optional": true
175
- },
176
- "pg-query-stream": {
177
- "optional": true
178
- },
179
- "expo-sqlite": {
180
- "optional": true
181
- }
182
- },
183
- "directories": {
184
- "example": "examples",
185
- "test": "tests"
186
- },
187
- "type": "commonjs"
188
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/runtime/scripts/build-esm.mjs DELETED
@@ -1,28 +0,0 @@
1
- import {rm, writeFile} from 'node:fs/promises';
2
- import {build} from 'esbuild';
3
-
4
- const output = new URL('../dist/esm/', import.meta.url);
5
- await rm(output, {recursive: true, force: true});
6
- await build({
7
- entryPoints: {
8
- index: 'src/index.ts',
9
- 'sql/core': 'src/sql/core.ts',
10
- 'sql/postgres': 'src/sql/postgres.ts',
11
- 'sql/mysql': 'src/sql/mysql.ts',
12
- 'sql/sqlite': 'src/sql/sqlite.ts',
13
- 'sql/expo-sqlite': 'src/sql/expo-sqlite.ts',
14
- 'sql/browser-sqlite': 'src/sql/browser-sqlite.ts',
15
- 'sql/browser-sqlite-worker': 'src/sql/browser-sqlite-worker.ts',
16
- 'telemetry/opentelemetry': 'src/telemetry/opentelemetry.ts',
17
- },
18
- outdir: 'dist/esm',
19
- bundle: true,
20
- splitting: true,
21
- chunkNames: 'chunks/[name]-[hash]',
22
- packages: 'external',
23
- platform: 'neutral',
24
- format: 'esm',
25
- target: 'es2020',
26
- sourcemap: true,
27
- });
28
- await writeFile(new URL('package.json', output), '{"type":"module"}\n');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/runtime/scripts/fixtures/checker-overlap-command.sh DELETED
@@ -1,13 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- # Test-only npm stand-in; never invoked by a real consumer verification.
5
- marker='PASS TypeScript generated Checker overlap: 4 scenarios; real Required rejection, no rejected commands/business SQL/audit; transactions serialized'
6
- case "${TEAQL_CHECKER_GUARD_CONTROL:?test mode required}" in
7
- timeout) printf '%s\n' "$marker"; exec sleep 30 ;;
8
- nonzero) printf '%s\n' "$marker"; exit 7 ;;
9
- missing) echo 'process exited successfully without completing Checker assertions' ;;
10
- partial) printf 'prefix %s suffix\n' "$marker" ;;
11
- success) printf '%s\n' "$marker" ;;
12
- *) exit 2 ;;
13
- esac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/runtime/scripts/generate-query-parser.mjs DELETED
@@ -1,9 +0,0 @@
1
- import {readFile, writeFile} from 'node:fs/promises';
2
- import peggy from 'peggy';
3
-
4
- const grammar = await readFile(new URL('../src/parser/query.pegjs', import.meta.url), 'utf8');
5
- const source = peggy.generate(grammar, {format: 'es', output: 'source'});
6
- await writeFile(
7
- new URL('../src/parser/query-parser.generated.ts', import.meta.url),
8
- `// @ts-nocheck -- generated by scripts/generate-query-parser.mjs\n${source}\n`,
9
- );
 
 
 
 
 
 
 
 
 
 
source/runtime/scripts/run-checker-overlap.sh DELETED
@@ -1,32 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- # Requires GNU coreutils timeout (including --kill-after). Guard only this
5
- # Checker consumer; compilation and unrelated examples retain their own flows.
6
- repo="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
7
- log="${1:?usage: run-checker-overlap.sh LOG_FILE}"
8
- seconds="${TEAQL_TRACE_CHAIN_CHECKER_TIMEOUT_SECONDS:-60}"
9
- if [[ ! "$seconds" =~ ^[1-9][0-9]*$ ]]; then
10
- echo 'FAIL: Checker timeout must be a positive integer number of seconds' >&2
11
- exit 2
12
- fi
13
- marker='PASS TypeScript generated Checker overlap: 4 scenarios; real Required rejection, no rejected commands/business SQL/audit; transactions serialized'
14
-
15
- if (
16
- cd "$repo/examples/trace-chain"
17
- timeout --kill-after=5s "${seconds}s" env -u TEAQL_ALLOW_SENSITIVE_PLAINTEXT_LOGS \
18
- npm run test:checker-overlap
19
- ) > "$log" 2>&1; then
20
- :
21
- else
22
- status=$?
23
- tail -n 20 "$log" >&2
24
- printf 'FAIL: Checker consumer exit %s; evidence %s\n' "$status" "$log" >&2
25
- exit "$status"
26
- fi
27
- if ! grep -Fxq -- "$marker" "$log"; then
28
- tail -n 20 "$log" >&2
29
- printf 'FAIL: Checker consumer omitted its exact PASS marker; evidence %s\n' "$log" >&2
30
- exit 1
31
- fi
32
- tail -n 2 "$log"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/runtime/scripts/test-checker-overlap-guard.sh DELETED
@@ -1,32 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- repo="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
5
- evidence="${1:-$(mktemp -d /tmp/teaql-ts-checker-guard-controls.XXXXXX)}"
6
- mkdir -p "$evidence/bin"
7
- evidence="$(cd "$evidence" && pwd)"
8
- ln -s "$repo/scripts/fixtures/checker-overlap-command.sh" "$evidence/bin/npm"
9
-
10
- for control in timeout nonzero missing partial success; do
11
- case "$control" in
12
- timeout) expected=124 ;;
13
- nonzero) expected=7 ;;
14
- missing|partial) expected=1 ;;
15
- success) expected=0 ;;
16
- esac
17
- if PATH="$evidence/bin:$PATH" TEAQL_CHECKER_GUARD_CONTROL="$control" \
18
- TEAQL_TRACE_CHAIN_CHECKER_TIMEOUT_SECONDS=1 \
19
- bash "$repo/scripts/run-checker-overlap.sh" "$evidence/$control-consumer.log" \
20
- > "$evidence/$control-guard.log" 2>&1; then
21
- actual=0
22
- else
23
- actual=$?
24
- fi
25
- if [[ "$actual" != "$expected" ]]; then
26
- printf 'FAIL: guard control %s expected %s got %s; evidence %s\n' \
27
- "$control" "$expected" "$actual" "$evidence" >&2
28
- exit 1
29
- fi
30
- printf 'GUARD_CONTROL %s exit=%s expected=%s\n' "$control" "$actual" "$expected"
31
- done
32
- printf 'PASS: Checker verifier guard controls; evidence %s\n' "$evidence"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/runtime/scripts/verify-checker-overlap.sh DELETED
@@ -1,20 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- repo="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
5
- evidence="${TEAQL_TRACE_CHAIN_CHECKER_EVIDENCE:-$(mktemp -d /tmp/teaql-ts-checker-overlap.XXXXXX)}"
6
- mkdir -p "$evidence"
7
- evidence="$(cd "$evidence" && pwd)"
8
- database="${TEAQL_TRACE_CHAIN_CHECKER_DB:-$evidence/checker.sqlite}"
9
- export TEAQL_TRACE_CHAIN_CHECKER_EVIDENCE="$evidence"
10
- export TEAQL_TRACE_CHAIN_CHECKER_DB="$database"
11
-
12
- # file: dependencies execute dist. Rebuild without installing packages or
13
- # resetting data, then replay both modes/orderings against one retained DB.
14
- (cd "$repo" && npm run build) > "$evidence/runtime-build.log" 2>&1
15
- (cd "$repo/examples/trace-chain" && npm run build) > "$evidence/app-build.log" 2>&1
16
- for attempt in 1 2; do
17
- TEAQL_TRACE_CHAIN_CHECKER_RUN="attempt-$attempt" \
18
- bash "$repo/scripts/run-checker-overlap.sh" "$evidence/attempt-$attempt.log"
19
- done
20
- printf 'PASS: retained Checker overlap evidence %s\n' "$evidence"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/runtime/scripts/verify-current-aggregate.sh DELETED
@@ -1,21 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- repo="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
4
- evidence="${TEAQL_TS_AGGREGATE_EVIDENCE:-$(mktemp -d -t teaql-ts-aggregate-gate.XXXXXXXX)}"
5
- mkdir -p "$evidence"
6
- database="${TEAQL_TRACE_CHAIN_MEMBERSHIP_DB:-$evidence/membership.sqlite}"
7
- unset TEAQL_ALLOW_SENSITIVE_PLAINTEXT_LOGS
8
- (cd "$repo" && npm run build) > "$evidence/runtime-build.log" 2>&1
9
- (cd "$repo/examples/trace-chain" && npm run build) > "$evidence/app-build.log" 2>&1
10
- (cd "$repo/examples/trace-chain/lib" && rg --files --hidden --no-ignore -0 | sort -z | xargs -0 sha256sum) > "$evidence/library-before.sha256"
11
- for round in 1 2; do
12
- (cd "$repo" && timeout --kill-after=5s 120s npm test -- --runInBand \
13
- tests/numeric-partition-trace.test.ts tests/sql-relation-membership.test.ts) > "$evidence/native-$round.log" 2>&1
14
- (cd "$repo/examples/trace-chain" && TEAQL_TRACE_CHAIN_MEMBERSHIP_DB="$database" \
15
- timeout --kill-after=5s 90s node node_modules/ts-node/dist/bin.js aggregate-membership.ts) > "$evidence/run-$round.log" 2>&1
16
- rg -Fxq 'PASS TypeScript generated aggregate membership: 24 scenarios; actual SQL, complete safe ancestry, FK and independent filtered views' "$evidence/run-$round.log"
17
- [[ "$(rg -c '^TS_AGGREGATE_MEMBERSHIP ' "$evidence/run-$round.log")" == 24 ]]
18
- done
19
- (cd "$repo/examples/trace-chain/lib" && rg --files --hidden --no-ignore -0 | sort -z | xargs -0 sha256sum) > "$evidence/library-after.sha256"
20
- cmp "$evidence/library-before.sha256" "$evidence/library-after.sha256"
21
- echo "PASS TypeScript current aggregate gate: native and generated twice; retained database=$database; evidence=$evidence"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
source/runtime/scripts/verify-examples.sh DELETED
@@ -1,80 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- repo="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
5
- # file: dependencies resolve the package's dist entry points, not TypeScript source.
6
- # Rebuild here so examples can never silently validate stale checked-in output.
7
- (cd "$repo" && npm run build)
8
- (cd "$repo" && npm test -- --runInBand tests/sql-relation-membership.test.ts)
9
- mkdir -p "$repo/.local"
10
- expected=(browser-sqlite conformance ensure-schema-bootstrap facet-trace order-management school-management task-board trace-chain)
11
- mapfile -t actual < <(find "$repo/examples" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort)
12
- if [[ "${actual[*]}" != "${expected[*]}" ]]; then
13
- echo "example inventory changed; update scripts/verify-examples.sh: ${actual[*]}" >&2
14
- exit 1
15
- fi
16
-
17
- for example in conformance ensure-schema-bootstrap school-management; do
18
- (
19
- cd "$repo/examples/$example"
20
- npm install
21
- npm run build
22
- if [[ "$example" == school-management ]]; then
23
- npx ts-node app.ts
24
- else
25
- npm start
26
- fi
27
- )
28
- done
29
- (cd "$repo/examples/order-management" && npm install && npm run build && npm start)
30
- (cd "$repo/examples/task-board" && npm install && npm run build)
31
- (cd "$repo/examples/browser-sqlite" && npm install && npm run build && npm run smoke && npm run smoke:orders)
32
- (
33
- cd "$repo/examples/trace-chain"
34
- npm install
35
- npm run build
36
- for attempt in 1 2; do
37
- graph_log="$(mktemp -t teaql-ts-graph.XXXXXX.log)"
38
- npm start | tee "$graph_log"
39
- rg -Fxq 'PASS TypeScript graph identity controls: duplicate, missing and equal-ID type collapse rejected' "$graph_log"
40
- rg -Fq 'GRAPH IDENTITY EVIDENCE ' "$graph_log"
41
- rg -Fxq 'PASS TypeScript generated trace-chain example: 7 checks' "$graph_log"
42
- [[ "$(rg -c '^PRIVATE_LINEAGE_OBSERVED ' "$graph_log")" == 8 ]]
43
- [[ "$(rg -c '^PASS TypeScript complete private lineage:' "$graph_log")" == 8 ]]
44
- done
45
- env -u TEAQL_TRACE_CHAIN_SCENARIO npm run test:shared-reference
46
- env -u TEAQL_TRACE_CHAIN_SCENARIO npm run test:shared-reference
47
- npm run test:page
48
- npm run test:page
49
- npm run test:stream-capture
50
- npm run test:stream-capture
51
- )
52
- for attempt in 1 2; do
53
- aggregate_log="$(mktemp -t teaql-ts-aggregate.XXXXXX.log)"
54
- (cd "$repo/examples/trace-chain" && npm run test:relation-aggregate) | tee "$aggregate_log"
55
- rg -Fq 'FORWARD_NOTLOADED_OBSERVED {"logging":true' "$aggregate_log"
56
- rg -Fq 'FORWARD_NOTLOADED_OBSERVED {"logging":false' "$aggregate_log"
57
- done
58
- bash "$repo/scripts/verify-current-aggregate.sh"
59
- for attempt in 1 2; do
60
- checker_log="$(mktemp -t teaql-ts-checker.XXXXXX.log)"
61
- TEAQL_TRACE_CHAIN_CHECKER_RUN="verify-examples-$attempt" \
62
- bash "$repo/scripts/run-checker-overlap.sh" "$checker_log"
63
- done
64
- for attempt in 1 2; do
65
- plan_log="$(mktemp -t teaql-ts-plan-items.XXXXXX.log)"
66
- (cd "$repo/examples/trace-chain" && timeout --kill-after=5s 90s npm run test:plan-item-lineage) | tee "$plan_log"
67
- rg -Fxq 'PASS TypeScript generated plan item lineage: 4 scenarios; one plan, ordered same-type items, sibling privacy, independent next request' "$plan_log"
68
- done
69
- bash "$repo/examples/facet-trace/verify.sh"
70
- bootstrap_directory="$(mktemp -d -t teaql-ts-bootstrap.XXXXXXXX)"
71
- for attempt in 1 2; do
72
- bootstrap_log="$bootstrap_directory/round-$attempt.log"
73
- (cd "$repo/examples/trace-chain" && TEAQL_TRACE_CHAIN_BOOTSTRAP_DB="$bootstrap_directory/bootstrap.sqlite" \
74
- timeout --kill-after=5s 90s npm run test:bootstrap-intent) | tee "$bootstrap_log"
75
- rg -Fxq 'PASS TypeScript generated bootstrap intent: logging off/on, committed audit, repeat no writes, unchanged generated library' "$bootstrap_log"
76
- for logging in false true; do
77
- rg -Fq "\"path\":\"generated default bootstrap\",\"logging\":$logging,\"firstWrites\":$((2-attempt)),\"repeatWrites\":0" "$bootstrap_log"
78
- done
79
- done
80
- echo "PASS: all TypeScript examples"