@celigo/api-specs 0.2.216 → 0.2.218

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/export.yml CHANGED
@@ -1461,6 +1461,18 @@ components:
1461
1461
  IMPORTANT: Ensure the field is not being updated by other processes, as this could
1462
1462
  cause records to be skipped unexpectedly. If multiple processes need to track exports,
1463
1463
  use separate boolean fields for each process.
1464
+ - |-
1465
+ On a NetSuite saved-search export the run pins the set of records to flag when it
1466
+ starts and reads them from the front of the still-unflagged set, so records that
1467
+ become eligible during the run wait for the next run — the pattern to recommend over
1468
+ a type-`all` export whose flow sets the flag in a later NetSuite step. Correctness
1469
+ then rests on Group rows, not on the Batch size limit: with `netsuite.skipGrouping:
1470
+ false` (Group rows on, search sorted by Internal ID) every record of the pinned set
1471
+ exported exactly once at a batch size of 5, with no duplicates when two records
1472
+ became eligible mid-run (they waited for the next run); with Group rows
1473
+ off on a search that returns several rows per record, the rows of a record that fall
1474
+ after the page in which it was flagged are not exported and are not retried (83 of
1475
+ 134 transaction lines at a batch size of 1, 117 of 134 at 5).
1464
1476
  examples:
1465
1477
  - isExported
1466
1478
  - hasBeenSynced
@@ -4763,9 +4775,10 @@ components:
4763
4775
  json:
4764
4776
  type: object
4765
4777
  description: |-
4766
- Parsing settings for JSON files. Configure when type is "json". resourcePath locates the
4767
- array of records when they are nested inside a container object; malformed JSON fails
4768
- the entire file's processing.
4778
+ Parsing settings for JSON files. Configure when type is "json". resourcePath selects the
4779
+ record elements inside the document — the wildcard form (`*`, `rows[*]`) iterates an
4780
+ array, while a path that stops at the array (or an empty path on a root array) yields
4781
+ the whole array as one record; malformed JSON fails the entire file's processing.
4769
4782
 
4770
4783
  Required when type is json.
4771
4784
  x-celigo-ai-guidance:
@@ -4807,8 +4820,12 @@ components:
4807
4820
  ]
4808
4821
  ```
4809
4822
  - Records are directly at the root as an array
4810
- - No resourcePath needed (leave blank)
4811
- - Most straightforward structure for processing
4823
+ - Set resourcePath to `*` (or `[*]`) so each element becomes a record
4824
+ - An empty resourcePath returns the entire array as ONE record — a large file then
4825
+ fails with `record_size_exceeded` instead of being split. The export form appends
4826
+ the wildcard itself when the attached sample file is 10 MB or smaller (why a blank
4827
+ path often works in the UI — a larger sample gets no wildcard and the blank path
4828
+ stands); a document sent through the API carries exactly the path it names
4812
4829
 
4813
4830
  ### Container Object Pattern
4814
4831
  ```json
@@ -4824,7 +4841,8 @@ components:
4824
4841
  }
4825
4842
  ```
4826
4843
  - Records are in an array inside a container object
4827
- - Requires resourcePath (e.g., "data")
4844
+ - Requires resourcePath with the element wildcard (e.g., "data[*]" or "data.*");
4845
+ "data" alone selects the array itself and yields it as one record
4828
4846
  - Common in API responses with metadata
4829
4847
 
4830
4848
  ### Nested Container Pattern
@@ -4843,13 +4861,20 @@ components:
4843
4861
  }
4844
4862
  ```
4845
4863
  - Records are deeply nested in the hierarchy
4846
- - Requires dot notation in resourcePath (e.g., "response.results")
4864
+ - Requires dot notation ending in the element wildcard (e.g., "response.results[*]")
4847
4865
  - Common in complex API responses
4848
4866
  - |-
4849
4867
  ## ERROR PREVENTION
4850
4868
 
4851
4869
  - **Invalid Path**: Incorrectly specified resourcePath results in zero records found
4852
- - **Type Mismatch**: resourcePath must point to an array of objects for proper record processing
4870
+ - **Array as one record**: a path that stops at the array (or an empty path on a root
4871
+ array) yields the whole array as a single record; it fails `record_size_exceeded`
4872
+ ("The size of a single record should not exceed 26214400 bytes. This may happen
4873
+ because the Resource path is not set correctly") once the file passes 25 MiB — the
4874
+ fix is the element wildcard (`*` / `path[*]`). A preSavePage hook cannot split the
4875
+ record instead: the rejection happens while the file is parsed, before any page of
4876
+ records exists for a hook to receive (an export with such a hook fails identically,
4877
+ with zero pages generated)
4853
4878
  - **Empty Results**: If path resolves to null or non-existent field, no error is thrown but no records are processed
4854
4879
  - **Parsing Failures**: Malformed JSON will cause the entire file processing to fail
4855
4880
  - |-
@@ -4863,11 +4888,19 @@ components:
4863
4888
  resourcePath:
4864
4889
  type: string
4865
4890
  description: |-
4866
- Dot-notation path to the array of records within the JSON structure (e.g.
4867
- "response.data.customers"); leave empty when the file's root is already the record
4868
- array. The path must resolve to an array of objects — array indexing and wildcards
4869
- are not supported. A path that resolves to nothing produces zero records without
4870
- raising an error.
4891
+ Dot-notation path that selects the record elements within the JSON document, ending
4892
+ in the element wildcard — `*` when the file's root is the record array,
4893
+ `response.data.customers[*]` (or `.customers.*`) when the array sits under a key. A
4894
+ path that stops at the array — `response.data.customers`, or an empty path on a root
4895
+ array — yields the whole array as a single record, which fails `record_size_exceeded`
4896
+ once it exceeds 26,214,400 bytes. The export form appends the wildcard when the
4897
+ attached sample file is 10 MB or smaller, so a path left blank in the UI often works
4898
+ where the same document sent through the API — or a form with a larger sample — does
4899
+ not. Array indexing and `$`-rooted JSONPath (`$[*]`,
4900
+ `$.rows`) are not supported; a path that resolves to nothing produces zero records
4901
+ without raising an error. This is the file parser's path only — the path to records
4902
+ in an HTTP API response is the separate `http.response.resourcePath`, with its own
4903
+ rules (a bare dot path such as `results.customers` selects the record array there).
4871
4904
  x-celigo-ai-guidance:
4872
4905
  - |-
4873
4906
  Specifies the path to the array of records within the JSON structure.
@@ -4876,18 +4909,18 @@ components:
4876
4909
  - |-
4877
4910
  ## BEHAVIOR
4878
4911
 
4879
- - **Purpose**: Identifies where the array of records is located in the JSON structure
4880
- - **Format**: Dot notation path to navigate nested objects (e.g., "data.records")
4881
- - **When Empty**: System expects records to be at the root level as an array
4882
- - **Result**: Array found at this path is processed as individual records
4912
+ - **Purpose**: Selects the elements that become records within the JSON structure
4913
+ - **Format**: Dot notation to navigate nested objects, ending in the element wildcard (e.g., "data.records[*]")
4914
+ - **When Empty**: The whole document is one record — a root object is that one record; a root array is NOT split (use `*` to split it)
4915
+ - **Result**: Each element the wildcard selects is processed as one record; a path that stops at the array yields the array as one record
4883
4916
  - |-
4884
4917
  ## PATH NOTATION GUIDELINES
4885
4918
 
4886
4919
  ### Basic Path Patterns
4887
4920
 
4888
- - **Root Level Array**: Leave empty or null when records are a direct array at root
4889
- - **Single Level Nesting**: Use the property name (e.g., "data", "results", "items")
4890
- - **Multi-Level Nesting**: Use dot notation (e.g., "response.data.items")
4921
+ - **Root Level Array**: `*` (or `[*]`) when records are a direct array at root
4922
+ - **Single Level Nesting**: The property name plus the wildcard (e.g., "data[*]", "results[*]", "items.*")
4923
+ - **Multi-Level Nesting**: Dot notation plus the wildcard (e.g., "response.data.items[*]")
4891
4924
 
4892
4925
  ### Path Construction Rules
4893
4926
 
@@ -4896,13 +4929,14 @@ components:
4896
4929
  - Each segment must be a valid property name in the JSON
4897
4930
 
4898
4931
  2. **Target Requirements**:
4899
- - The path MUST resolve to an array of objects
4900
- - Each object in the array will be processed as one record
4901
- - The array must be the final element in the path
4932
+ - The parser yields whatever the path selects as the record(s): to get one record per array element, the path MUST end in the element wildcard (`[*]` or `.*`)
4933
+ - A path that stops at the array ("data") selects the array itself and yields ONE record holding every element
4934
+ - A path that selects a single object ("response", "response.data") yields that object as one record — the shape for a file that IS one record
4935
+ - The wildcard iterates whatever it is applied to: on an OBJECT (`*` on a root object, "response.*") it yields one record per member value, not the object — apply it to arrays
4902
4936
 
4903
4937
  3. **Limitations**:
4904
4938
  - Array indexing is not supported in the path (e.g., "data[0]")
4905
- - Wildcard selectors are not supported
4939
+ - `$`-rooted JSONPath is not supported ("$[*]", "$.data[*]" match nothing and yield zero records)
4906
4940
  - Regular expressions are not supported
4907
4941
  - |-
4908
4942
  ## DETERMINATION STRATEGY FOR AI AGENTS
@@ -4918,20 +4952,21 @@ components:
4918
4952
 
4919
4953
  | Source Type | Common Paths | Example |
4920
4954
  |-------------|--------------|---------|
4921
- | REST APIs | "data", "results", "items" | "data" |
4922
- | Complex APIs | "response.data", "data.items" | "response.data" |
4923
- | Database Exports | "rows", "records", "exports" | "rows" |
4924
- | CRM Systems | "contacts", "accounts", "opportunities" | "contacts" |
4925
- | Analytics APIs | "data.rows", "response.data.rows" | "data.rows" |
4955
+ | Root array file | "*" | "*" |
4956
+ | REST APIs | "data[*]", "results[*]", "items[*]" | "data[*]" |
4957
+ | Complex APIs | "response.data[*]", "data.items[*]" | "response.data[*]" |
4958
+ | Database Exports | "rows[*]", "records[*]", "exports[*]" | "rows[*]" |
4959
+ | CRM Systems | "contacts[*]", "accounts[*]", "opportunities[*]" | "contacts[*]" |
4960
+ | Analytics APIs | "data.rows[*]", "response.data.rows[*]" | "data.rows[*]" |
4926
4961
 
4927
4962
  3. **Verification Approach**:
4928
- - The path should resolve to an array (typically with square brackets in the JSON)
4929
- - Each element in this array should represent one complete record
4963
+ - Preview the export: the parse stage must show one record per array element — a single record that is itself an array means the path stopped at the array
4964
+ - Each element should represent one complete record
4930
4965
  - The array should not be a property array (like tags or categories)
4931
4966
  - |-
4932
4967
  ## IMPLEMENTATION EXAMPLES
4933
4968
 
4934
- ### Root Array (No Path Needed)
4969
+ ### Root Array
4935
4970
 
4936
4971
  JSON Structure:
4937
4972
  ```json
@@ -4943,9 +4978,11 @@ components:
4943
4978
 
4944
4979
  Configuration:
4945
4980
  ```json
4946
- "resourcePath": "" // or omit entirely
4981
+ "resourcePath": "*"
4947
4982
  ```
4948
4983
 
4984
+ An empty path (or omitting it) returns this array as ONE record rather than two.
4985
+
4949
4986
  ### Single-Level Nesting
4950
4987
 
4951
4988
  JSON Structure:
@@ -4961,7 +4998,7 @@ components:
4961
4998
 
4962
4999
  Configuration:
4963
5000
  ```json
4964
- "resourcePath": "orders"
5001
+ "resourcePath": "orders[*]"
4965
5002
  ```
4966
5003
 
4967
5004
  ### Multi-Level Nesting
@@ -4983,7 +5020,7 @@ components:
4983
5020
 
4984
5021
  Configuration:
4985
5022
  ```json
4986
- "resourcePath": "response.data.customers"
5023
+ "resourcePath": "response.data.customers[*]"
4987
5024
  ```
4988
5025
  - |-
4989
5026
  ## TROUBLESHOOTING INDICATORS
@@ -4991,6 +5028,8 @@ components:
4991
5028
  If you encounter these issues, review the resourcePath setting:
4992
5029
 
4993
5030
  - Export completes successfully but processes 0 records
5031
+ - `record_size_exceeded` — "The size of a single record should not exceed 26214400 bytes. This may happen because the Resource path is not set correctly": the path stopped at the array, so the whole file is one record; append the element wildcard (`*` for a root array, `path[*]` for a nested one) — a preSavePage hook cannot help: the record is rejected while the file is parsed, before any page exists for a hook to receive
5032
+ - A preview whose single record is itself an array of the expected objects (same cause, small file)
4994
5033
  - "Cannot read property 'forEach' of undefined" errors
4995
5034
  - "Expected array but got object/string/number" errors
4996
5035
  - Records appear flattened or with unexpected structure
@@ -5002,10 +5041,11 @@ components:
5002
5041
  - Document the expected JSON structure alongside the configuration
5003
5042
  - For APIs with changing response structures, implement validation checks
5004
5043
  examples:
5005
- - data.orders
5006
- - response.results
5007
- - items
5008
- - data.customers.records
5044
+ - '*'
5045
+ - data.orders[*]
5046
+ - response.results[*]
5047
+ - items[*]
5048
+ - data.customers.records.*
5009
5049
  xlsx:
5010
5050
  type: object
5011
5051
  description: |-
@@ -9413,7 +9453,7 @@ components:
9413
9453
  PathToRecords:
9414
9454
  type: string
9415
9455
  maxLength: 250
9416
- description: Path to the array of records inside each document or item fetched from the source; each array element is emitted as an individual record, which keeps records within the 5 MB page-size limit even when the source document exceeds it. Accepts dot notation (e.g. `data.orders`) or JSONPath for values starting with `$`, including unions (`$['orders','invoices'][*]`) and filter expressions (`$.items[?(@.qty>3)]`); a path that resolves to nothing emits zero records for that document or item. When omitted, each document or item is emitted as one record, exactly as before — HTTP and file-based exports configure this same capability through their existing `http.response.resourcePath` and `file.json`/`file.xml` `resourcePath` fields.
9456
+ description: Path to the array of records inside each document or item fetched from the source; each array element is emitted as an individual record, which keeps records within the 5 MB page-size limit even when the source document exceeds it. Accepts dot notation (e.g. `data.orders`) or JSONPath for values starting with `$`, including unions (`$['orders','invoices'][*]`) and filter expressions (`$.items[?(@.qty>3)]`); a path that resolves to nothing emits zero records for that document or item. When omitted, each document or item is emitted as one record, exactly as before. HTTP exports configure the same capability through `http.response.resourcePath` with these same path rules; file-based exports configure it through `file.json`/`file.xml` `resourcePath`, where the JSON file parser follows its own rule — the path yields whatever it selects as the record, so it must end in the element wildcard (`*` for a root array, `data.orders[*]` under a key) to emit one record per element, and `$`-rooted JSONPath is not supported there.
9417
9457
  examples:
9418
9458
  - lineItems
9419
9459
  - order.lineItems
@@ -10691,6 +10731,12 @@ components:
10691
10731
  Set `true` for an ad-hoc RESTlet search (criteria and columns without a saved
10692
10732
  search): grouping needs the search sorted by internal id, and an unsorted ad-hoc
10693
10733
  search fails with `[search_not_sorted]`.
10734
+ - |-
10735
+ With export type `once`, keep this `false` on a search that returns several rows per
10736
+ record: `once` flags the record when the page holding its first row completes, and
10737
+ with `true` the record's remaining rows drop out of the later requests — at a batch
10738
+ size of 5, 17 of 134 transaction lines never exported. Grouped, the record is the
10739
+ whole transaction and every row is exported exactly once.
10694
10740
  - 'For `exportSelect` / `refreshableSelect` dropdowns backed by a NetSuite RESTlet, set `skipGrouping: true`: the UI''s option mapper expects flat per-row results, and the platform otherwise wraps each row in its own grouping list (every option''s `label` then renders as `undefined`).'
10695
10741
  statsOnly:
10696
10742
  type: boolean
@@ -10912,6 +10958,22 @@ components:
10912
10958
  and memory use per call; tune to the record's size. The RESTlet caps a call at 1000,
10913
10959
  so a larger value acts as 1000. In a test run or preview the request is capped at the
10914
10960
  export's `pageSize` (default 20) instead.
10961
+ x-celigo-ai-guidance:
10962
+ - |-
10963
+ Each request re-runs the saved search and returns the next slice by position, on
10964
+ the SuiteBundle and SuiteApp 2.0 RESTlets alike. Rows that enter the result set
10965
+ ahead of the position between two requests come back again — a contiguous block
10966
+ of duplicates equal to the rows that entered; rows that leave it are skipped with
10967
+ no error. A run whose rows fit in one request has no gap. The shift acts on
10968
+ positions, not on order: in the probes every row came back in one fixed per-row
10969
+ order (Internal ID, then line) on every run, and the inserted rows displaced them
10970
+ all the same. Export type `once` with `netsuite.skipGrouping: false` prevents it,
10971
+ because it pins the record set when the run starts.
10972
+ - |-
10973
+ Leave this blank unless a NetSuite time limit forced a smaller value: a smaller
10974
+ batch multiplies the request boundaries per run, and each one is exposed when
10975
+ the search's membership changes mid-run (an older record approved, a flag the
10976
+ search filters on reset).
10915
10977
  examples:
10916
10978
  - 100
10917
10979
  - 200
package/dist/tool.yml CHANGED
@@ -27851,6 +27851,18 @@ components:
27851
27851
  IMPORTANT: Ensure the field is not being updated by other processes, as this could
27852
27852
  cause records to be skipped unexpectedly. If multiple processes need to track exports,
27853
27853
  use separate boolean fields for each process.
27854
+ - |-
27855
+ On a NetSuite saved-search export the run pins the set of records to flag when it
27856
+ starts and reads them from the front of the still-unflagged set, so records that
27857
+ become eligible during the run wait for the next run — the pattern to recommend over
27858
+ a type-`all` export whose flow sets the flag in a later NetSuite step. Correctness
27859
+ then rests on Group rows, not on the Batch size limit: with `netsuite.skipGrouping:
27860
+ false` (Group rows on, search sorted by Internal ID) every record of the pinned set
27861
+ exported exactly once at a batch size of 5, with no duplicates when two records
27862
+ became eligible mid-run (they waited for the next run); with Group rows
27863
+ off on a search that returns several rows per record, the rows of a record that fall
27864
+ after the page in which it was flagged are not exported and are not retried (83 of
27865
+ 134 transaction lines at a batch size of 1, 117 of 134 at 5).
27854
27866
  examples:
27855
27867
  - isExported
27856
27868
  - hasBeenSynced
@@ -30658,9 +30670,10 @@ components:
30658
30670
  json:
30659
30671
  type: object
30660
30672
  description: |-
30661
- Parsing settings for JSON files. Configure when type is "json". resourcePath locates the
30662
- array of records when they are nested inside a container object; malformed JSON fails
30663
- the entire file's processing.
30673
+ Parsing settings for JSON files. Configure when type is "json". resourcePath selects the
30674
+ record elements inside the document — the wildcard form (`*`, `rows[*]`) iterates an
30675
+ array, while a path that stops at the array (or an empty path on a root array) yields
30676
+ the whole array as one record; malformed JSON fails the entire file's processing.
30664
30677
 
30665
30678
  Required when type is json.
30666
30679
  x-celigo-ai-guidance:
@@ -30702,8 +30715,12 @@ components:
30702
30715
  ]
30703
30716
  ```
30704
30717
  - Records are directly at the root as an array
30705
- - No resourcePath needed (leave blank)
30706
- - Most straightforward structure for processing
30718
+ - Set resourcePath to `*` (or `[*]`) so each element becomes a record
30719
+ - An empty resourcePath returns the entire array as ONE record — a large file then
30720
+ fails with `record_size_exceeded` instead of being split. The export form appends
30721
+ the wildcard itself when the attached sample file is 10 MB or smaller (why a blank
30722
+ path often works in the UI — a larger sample gets no wildcard and the blank path
30723
+ stands); a document sent through the API carries exactly the path it names
30707
30724
 
30708
30725
  ### Container Object Pattern
30709
30726
  ```json
@@ -30719,7 +30736,8 @@ components:
30719
30736
  }
30720
30737
  ```
30721
30738
  - Records are in an array inside a container object
30722
- - Requires resourcePath (e.g., "data")
30739
+ - Requires resourcePath with the element wildcard (e.g., "data[*]" or "data.*");
30740
+ "data" alone selects the array itself and yields it as one record
30723
30741
  - Common in API responses with metadata
30724
30742
 
30725
30743
  ### Nested Container Pattern
@@ -30738,13 +30756,20 @@ components:
30738
30756
  }
30739
30757
  ```
30740
30758
  - Records are deeply nested in the hierarchy
30741
- - Requires dot notation in resourcePath (e.g., "response.results")
30759
+ - Requires dot notation ending in the element wildcard (e.g., "response.results[*]")
30742
30760
  - Common in complex API responses
30743
30761
  - |-
30744
30762
  ## ERROR PREVENTION
30745
30763
 
30746
30764
  - **Invalid Path**: Incorrectly specified resourcePath results in zero records found
30747
- - **Type Mismatch**: resourcePath must point to an array of objects for proper record processing
30765
+ - **Array as one record**: a path that stops at the array (or an empty path on a root
30766
+ array) yields the whole array as a single record; it fails `record_size_exceeded`
30767
+ ("The size of a single record should not exceed 26214400 bytes. This may happen
30768
+ because the Resource path is not set correctly") once the file passes 25 MiB — the
30769
+ fix is the element wildcard (`*` / `path[*]`). A preSavePage hook cannot split the
30770
+ record instead: the rejection happens while the file is parsed, before any page of
30771
+ records exists for a hook to receive (an export with such a hook fails identically,
30772
+ with zero pages generated)
30748
30773
  - **Empty Results**: If path resolves to null or non-existent field, no error is thrown but no records are processed
30749
30774
  - **Parsing Failures**: Malformed JSON will cause the entire file processing to fail
30750
30775
  - |-
@@ -30758,11 +30783,19 @@ components:
30758
30783
  resourcePath:
30759
30784
  type: string
30760
30785
  description: |-
30761
- Dot-notation path to the array of records within the JSON structure (e.g.
30762
- "response.data.customers"); leave empty when the file's root is already the record
30763
- array. The path must resolve to an array of objects — array indexing and wildcards
30764
- are not supported. A path that resolves to nothing produces zero records without
30765
- raising an error.
30786
+ Dot-notation path that selects the record elements within the JSON document, ending
30787
+ in the element wildcard — `*` when the file's root is the record array,
30788
+ `response.data.customers[*]` (or `.customers.*`) when the array sits under a key. A
30789
+ path that stops at the array — `response.data.customers`, or an empty path on a root
30790
+ array — yields the whole array as a single record, which fails `record_size_exceeded`
30791
+ once it exceeds 26,214,400 bytes. The export form appends the wildcard when the
30792
+ attached sample file is 10 MB or smaller, so a path left blank in the UI often works
30793
+ where the same document sent through the API — or a form with a larger sample — does
30794
+ not. Array indexing and `$`-rooted JSONPath (`$[*]`,
30795
+ `$.rows`) are not supported; a path that resolves to nothing produces zero records
30796
+ without raising an error. This is the file parser's path only — the path to records
30797
+ in an HTTP API response is the separate `http.response.resourcePath`, with its own
30798
+ rules (a bare dot path such as `results.customers` selects the record array there).
30766
30799
  x-celigo-ai-guidance:
30767
30800
  - |-
30768
30801
  Specifies the path to the array of records within the JSON structure.
@@ -30771,18 +30804,18 @@ components:
30771
30804
  - |-
30772
30805
  ## BEHAVIOR
30773
30806
 
30774
- - **Purpose**: Identifies where the array of records is located in the JSON structure
30775
- - **Format**: Dot notation path to navigate nested objects (e.g., "data.records")
30776
- - **When Empty**: System expects records to be at the root level as an array
30777
- - **Result**: Array found at this path is processed as individual records
30807
+ - **Purpose**: Selects the elements that become records within the JSON structure
30808
+ - **Format**: Dot notation to navigate nested objects, ending in the element wildcard (e.g., "data.records[*]")
30809
+ - **When Empty**: The whole document is one record — a root object is that one record; a root array is NOT split (use `*` to split it)
30810
+ - **Result**: Each element the wildcard selects is processed as one record; a path that stops at the array yields the array as one record
30778
30811
  - |-
30779
30812
  ## PATH NOTATION GUIDELINES
30780
30813
 
30781
30814
  ### Basic Path Patterns
30782
30815
 
30783
- - **Root Level Array**: Leave empty or null when records are a direct array at root
30784
- - **Single Level Nesting**: Use the property name (e.g., "data", "results", "items")
30785
- - **Multi-Level Nesting**: Use dot notation (e.g., "response.data.items")
30816
+ - **Root Level Array**: `*` (or `[*]`) when records are a direct array at root
30817
+ - **Single Level Nesting**: The property name plus the wildcard (e.g., "data[*]", "results[*]", "items.*")
30818
+ - **Multi-Level Nesting**: Dot notation plus the wildcard (e.g., "response.data.items[*]")
30786
30819
 
30787
30820
  ### Path Construction Rules
30788
30821
 
@@ -30791,13 +30824,14 @@ components:
30791
30824
  - Each segment must be a valid property name in the JSON
30792
30825
 
30793
30826
  2. **Target Requirements**:
30794
- - The path MUST resolve to an array of objects
30795
- - Each object in the array will be processed as one record
30796
- - The array must be the final element in the path
30827
+ - The parser yields whatever the path selects as the record(s): to get one record per array element, the path MUST end in the element wildcard (`[*]` or `.*`)
30828
+ - A path that stops at the array ("data") selects the array itself and yields ONE record holding every element
30829
+ - A path that selects a single object ("response", "response.data") yields that object as one record — the shape for a file that IS one record
30830
+ - The wildcard iterates whatever it is applied to: on an OBJECT (`*` on a root object, "response.*") it yields one record per member value, not the object — apply it to arrays
30797
30831
 
30798
30832
  3. **Limitations**:
30799
30833
  - Array indexing is not supported in the path (e.g., "data[0]")
30800
- - Wildcard selectors are not supported
30834
+ - `$`-rooted JSONPath is not supported ("$[*]", "$.data[*]" match nothing and yield zero records)
30801
30835
  - Regular expressions are not supported
30802
30836
  - |-
30803
30837
  ## DETERMINATION STRATEGY FOR AI AGENTS
@@ -30813,20 +30847,21 @@ components:
30813
30847
 
30814
30848
  | Source Type | Common Paths | Example |
30815
30849
  |-------------|--------------|---------|
30816
- | REST APIs | "data", "results", "items" | "data" |
30817
- | Complex APIs | "response.data", "data.items" | "response.data" |
30818
- | Database Exports | "rows", "records", "exports" | "rows" |
30819
- | CRM Systems | "contacts", "accounts", "opportunities" | "contacts" |
30820
- | Analytics APIs | "data.rows", "response.data.rows" | "data.rows" |
30850
+ | Root array file | "*" | "*" |
30851
+ | REST APIs | "data[*]", "results[*]", "items[*]" | "data[*]" |
30852
+ | Complex APIs | "response.data[*]", "data.items[*]" | "response.data[*]" |
30853
+ | Database Exports | "rows[*]", "records[*]", "exports[*]" | "rows[*]" |
30854
+ | CRM Systems | "contacts[*]", "accounts[*]", "opportunities[*]" | "contacts[*]" |
30855
+ | Analytics APIs | "data.rows[*]", "response.data.rows[*]" | "data.rows[*]" |
30821
30856
 
30822
30857
  3. **Verification Approach**:
30823
- - The path should resolve to an array (typically with square brackets in the JSON)
30824
- - Each element in this array should represent one complete record
30858
+ - Preview the export: the parse stage must show one record per array element — a single record that is itself an array means the path stopped at the array
30859
+ - Each element should represent one complete record
30825
30860
  - The array should not be a property array (like tags or categories)
30826
30861
  - |-
30827
30862
  ## IMPLEMENTATION EXAMPLES
30828
30863
 
30829
- ### Root Array (No Path Needed)
30864
+ ### Root Array
30830
30865
 
30831
30866
  JSON Structure:
30832
30867
  ```json
@@ -30838,9 +30873,11 @@ components:
30838
30873
 
30839
30874
  Configuration:
30840
30875
  ```json
30841
- "resourcePath": "" // or omit entirely
30876
+ "resourcePath": "*"
30842
30877
  ```
30843
30878
 
30879
+ An empty path (or omitting it) returns this array as ONE record rather than two.
30880
+
30844
30881
  ### Single-Level Nesting
30845
30882
 
30846
30883
  JSON Structure:
@@ -30856,7 +30893,7 @@ components:
30856
30893
 
30857
30894
  Configuration:
30858
30895
  ```json
30859
- "resourcePath": "orders"
30896
+ "resourcePath": "orders[*]"
30860
30897
  ```
30861
30898
 
30862
30899
  ### Multi-Level Nesting
@@ -30878,7 +30915,7 @@ components:
30878
30915
 
30879
30916
  Configuration:
30880
30917
  ```json
30881
- "resourcePath": "response.data.customers"
30918
+ "resourcePath": "response.data.customers[*]"
30882
30919
  ```
30883
30920
  - |-
30884
30921
  ## TROUBLESHOOTING INDICATORS
@@ -30886,6 +30923,8 @@ components:
30886
30923
  If you encounter these issues, review the resourcePath setting:
30887
30924
 
30888
30925
  - Export completes successfully but processes 0 records
30926
+ - `record_size_exceeded` — "The size of a single record should not exceed 26214400 bytes. This may happen because the Resource path is not set correctly": the path stopped at the array, so the whole file is one record; append the element wildcard (`*` for a root array, `path[*]` for a nested one) — a preSavePage hook cannot help: the record is rejected while the file is parsed, before any page exists for a hook to receive
30927
+ - A preview whose single record is itself an array of the expected objects (same cause, small file)
30889
30928
  - "Cannot read property 'forEach' of undefined" errors
30890
30929
  - "Expected array but got object/string/number" errors
30891
30930
  - Records appear flattened or with unexpected structure
@@ -30897,10 +30936,11 @@ components:
30897
30936
  - Document the expected JSON structure alongside the configuration
30898
30937
  - For APIs with changing response structures, implement validation checks
30899
30938
  examples:
30900
- - data.orders
30901
- - response.results
30902
- - items
30903
- - data.customers.records
30939
+ - '*'
30940
+ - data.orders[*]
30941
+ - response.results[*]
30942
+ - items[*]
30943
+ - data.customers.records.*
30904
30944
  xlsx:
30905
30945
  type: object
30906
30946
  description: |-
@@ -35308,7 +35348,7 @@ components:
35308
35348
  PathToRecords:
35309
35349
  type: string
35310
35350
  maxLength: 250
35311
- description: Path to the array of records inside each document or item fetched from the source; each array element is emitted as an individual record, which keeps records within the 5 MB page-size limit even when the source document exceeds it. Accepts dot notation (e.g. `data.orders`) or JSONPath for values starting with `$`, including unions (`$['orders','invoices'][*]`) and filter expressions (`$.items[?(@.qty>3)]`); a path that resolves to nothing emits zero records for that document or item. When omitted, each document or item is emitted as one record, exactly as before — HTTP and file-based exports configure this same capability through their existing `http.response.resourcePath` and `file.json`/`file.xml` `resourcePath` fields.
35351
+ description: Path to the array of records inside each document or item fetched from the source; each array element is emitted as an individual record, which keeps records within the 5 MB page-size limit even when the source document exceeds it. Accepts dot notation (e.g. `data.orders`) or JSONPath for values starting with `$`, including unions (`$['orders','invoices'][*]`) and filter expressions (`$.items[?(@.qty>3)]`); a path that resolves to nothing emits zero records for that document or item. When omitted, each document or item is emitted as one record, exactly as before. HTTP exports configure the same capability through `http.response.resourcePath` with these same path rules; file-based exports configure it through `file.json`/`file.xml` `resourcePath`, where the JSON file parser follows its own rule — the path yields whatever it selects as the record, so it must end in the element wildcard (`*` for a root array, `data.orders[*]` under a key) to emit one record per element, and `$`-rooted JSONPath is not supported there.
35312
35352
  examples:
35313
35353
  - lineItems
35314
35354
  - order.lineItems
@@ -36586,6 +36626,12 @@ components:
36586
36626
  Set `true` for an ad-hoc RESTlet search (criteria and columns without a saved
36587
36627
  search): grouping needs the search sorted by internal id, and an unsorted ad-hoc
36588
36628
  search fails with `[search_not_sorted]`.
36629
+ - |-
36630
+ With export type `once`, keep this `false` on a search that returns several rows per
36631
+ record: `once` flags the record when the page holding its first row completes, and
36632
+ with `true` the record's remaining rows drop out of the later requests — at a batch
36633
+ size of 5, 17 of 134 transaction lines never exported. Grouped, the record is the
36634
+ whole transaction and every row is exported exactly once.
36589
36635
  - 'For `exportSelect` / `refreshableSelect` dropdowns backed by a NetSuite RESTlet, set `skipGrouping: true`: the UI''s option mapper expects flat per-row results, and the platform otherwise wraps each row in its own grouping list (every option''s `label` then renders as `undefined`).'
36590
36636
  statsOnly:
36591
36637
  type: boolean
@@ -36807,6 +36853,22 @@ components:
36807
36853
  and memory use per call; tune to the record's size. The RESTlet caps a call at 1000,
36808
36854
  so a larger value acts as 1000. In a test run or preview the request is capped at the
36809
36855
  export's `pageSize` (default 20) instead.
36856
+ x-celigo-ai-guidance:
36857
+ - |-
36858
+ Each request re-runs the saved search and returns the next slice by position, on
36859
+ the SuiteBundle and SuiteApp 2.0 RESTlets alike. Rows that enter the result set
36860
+ ahead of the position between two requests come back again — a contiguous block
36861
+ of duplicates equal to the rows that entered; rows that leave it are skipped with
36862
+ no error. A run whose rows fit in one request has no gap. The shift acts on
36863
+ positions, not on order: in the probes every row came back in one fixed per-row
36864
+ order (Internal ID, then line) on every run, and the inserted rows displaced them
36865
+ all the same. Export type `once` with `netsuite.skipGrouping: false` prevents it,
36866
+ because it pins the record set when the run starts.
36867
+ - |-
36868
+ Leave this blank unless a NetSuite time limit forced a smaller value: a smaller
36869
+ batch multiplies the request boundaries per run, and each one is exposed when
36870
+ the search's membership changes mid-run (an older record approved, a flag the
36871
+ search filters on reset).
36810
36872
  examples:
36811
36873
  - 100
36812
36874
  - 200
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@celigo/api-specs",
3
- "version": "0.2.216",
3
+ "version": "0.2.218",
4
4
  "private": false,
5
5
  "description": "Public OpenAPI bundles (dist/) and the celigo-cli lint schema pack (schemas.json).",
6
6
  "keywords": [
package/schemas.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "provenance": {
3
3
  "repo": "celigo/integrator-api-specs",
4
- "iasCommit": "0b379620",
5
- "generatedAt": "2026-11-01"
4
+ "iasCommit": "a159c7c3",
5
+ "generatedAt": "2026-11-02"
6
6
  },
7
7
  "roots": {
8
8
  "aiagent": 128,