From 3cc078f742e0c10c485497d99dce01d9e5574f80 Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Tue, 21 Oct 2025 22:56:41 -0700 Subject: [PATCH 1/7] Document OpenAPI workflow and add CI linting --- .github/workflows/openapi-validation.yml | 48 ++ docs/openapi.json | 120 +-- docs/openapi/README.md | 69 ++ docs/openapi/components/schemas/account.yaml | 22 + .../container-pod-terminal-changed-event.yaml | 57 ++ .../schemas/container-updated-event.yaml | 73 ++ .../openapi/components/schemas/container.yaml | 372 +++++++++ docs/openapi/components/schemas/error.yaml | 35 + .../components/schemas/estimated-event.yaml | 102 +++ .../openapi/components/schemas/link-self.yaml | 6 + docs/openapi/components/schemas/links.yaml | 18 + docs/openapi/components/schemas/meta.yaml | 7 + .../components/schemas/metro-area.yaml | 49 ++ docs/openapi/components/schemas/party.yaml | 20 + docs/openapi/components/schemas/port.yaml | 47 ++ .../components/schemas/rail-terminal.yaml | 54 ++ .../openapi/components/schemas/raw-event.yaml | 136 ++++ .../components/schemas/route-location.yaml | 153 ++++ docs/openapi/components/schemas/route.yaml | 84 ++ docs/openapi/components/schemas/shipment.yaml | 275 +++++++ .../components/schemas/shipping-line.yaml | 50 ++ .../components/schemas/terminal-fee.yaml | 21 + .../components/schemas/terminal-hold.yaml | 17 + docs/openapi/components/schemas/terminal.yaml | 67 ++ .../components/schemas/tracking-request.yaml | 112 +++ .../components/schemas/transport-event.yaml | 143 ++++ .../schemas/vessel-with-positions.yaml | 72 ++ docs/openapi/components/schemas/vessel.yaml | 76 ++ .../schemas/webhook-notification.yaml | 97 +++ docs/openapi/components/schemas/webhook.yaml | 85 ++ .../securitySchemes/authorization.yaml | 4 + docs/openapi/index.yaml | 173 ++++ .../paths/containers-id-raw-events.yaml | 359 +++++++++ docs/openapi/paths/containers-id-refresh.yaml | 76 ++ docs/openapi/paths/containers-id-route.yaml | 57 ++ .../paths/containers-id-transport-events.yaml | 233 ++++++ docs/openapi/paths/containers-id.yaml | 136 ++++ docs/openapi/paths/containers.yaml | 747 ++++++++++++++++++ docs/openapi/paths/metro-areas-id.yaml | 23 + docs/openapi/paths/parties-id.yaml | 86 ++ docs/openapi/paths/parties.yaml | 108 +++ docs/openapi/paths/ports-id.yaml | 23 + .../paths/shipments-id-resume-tracking.yaml | 23 + .../paths/shipments-id-stop-tracking.yaml | 23 + docs/openapi/paths/shipments-id.yaml | 397 ++++++++++ docs/openapi/paths/shipments.yaml | 450 +++++++++++ docs/openapi/paths/shipping-lines-id.yaml | 23 + docs/openapi/paths/shipping-lines.yaml | 20 + docs/openapi/paths/terminals-id.yaml | 23 + docs/openapi/paths/tracking-requests-id.yaml | 252 ++++++ docs/openapi/paths/tracking-requests.yaml | 332 ++++++++ ...-id-future-positions-with-coordinates.yaml | 82 ++ .../paths/vessels-id-future-positions.yaml | 68 ++ docs/openapi/paths/vessels-id.yaml | 65 ++ docs/openapi/paths/vessels-imo.yaml | 66 ++ .../paths/webhook-notifications-examples.yaml | 77 ++ .../paths/webhook-notifications-id.yaml | 504 ++++++++++++ docs/openapi/paths/webhook-notifications.yaml | 51 ++ docs/openapi/paths/webhooks-id.yaml | 130 +++ docs/openapi/paths/webhooks-ips.yaml | 31 + docs/openapi/paths/webhooks.yaml | 220 ++++++ scripts/split_openapi.py | 114 +++ tests/test_openapi_bundle.py | 19 + tools/__init__.py | 0 tools/openapi_bundle.py | 74 ++ tools/openapi_yaml.py | 200 +++++ 66 files changed, 7696 insertions(+), 60 deletions(-) create mode 100644 .github/workflows/openapi-validation.yml create mode 100644 docs/openapi/README.md create mode 100644 docs/openapi/components/schemas/account.yaml create mode 100644 docs/openapi/components/schemas/container-pod-terminal-changed-event.yaml create mode 100644 docs/openapi/components/schemas/container-updated-event.yaml create mode 100644 docs/openapi/components/schemas/container.yaml create mode 100644 docs/openapi/components/schemas/error.yaml create mode 100644 docs/openapi/components/schemas/estimated-event.yaml create mode 100644 docs/openapi/components/schemas/link-self.yaml create mode 100644 docs/openapi/components/schemas/links.yaml create mode 100644 docs/openapi/components/schemas/meta.yaml create mode 100644 docs/openapi/components/schemas/metro-area.yaml create mode 100644 docs/openapi/components/schemas/party.yaml create mode 100644 docs/openapi/components/schemas/port.yaml create mode 100644 docs/openapi/components/schemas/rail-terminal.yaml create mode 100644 docs/openapi/components/schemas/raw-event.yaml create mode 100644 docs/openapi/components/schemas/route-location.yaml create mode 100644 docs/openapi/components/schemas/route.yaml create mode 100644 docs/openapi/components/schemas/shipment.yaml create mode 100644 docs/openapi/components/schemas/shipping-line.yaml create mode 100644 docs/openapi/components/schemas/terminal-fee.yaml create mode 100644 docs/openapi/components/schemas/terminal-hold.yaml create mode 100644 docs/openapi/components/schemas/terminal.yaml create mode 100644 docs/openapi/components/schemas/tracking-request.yaml create mode 100644 docs/openapi/components/schemas/transport-event.yaml create mode 100644 docs/openapi/components/schemas/vessel-with-positions.yaml create mode 100644 docs/openapi/components/schemas/vessel.yaml create mode 100644 docs/openapi/components/schemas/webhook-notification.yaml create mode 100644 docs/openapi/components/schemas/webhook.yaml create mode 100644 docs/openapi/components/securitySchemes/authorization.yaml create mode 100644 docs/openapi/index.yaml create mode 100644 docs/openapi/paths/containers-id-raw-events.yaml create mode 100644 docs/openapi/paths/containers-id-refresh.yaml create mode 100644 docs/openapi/paths/containers-id-route.yaml create mode 100644 docs/openapi/paths/containers-id-transport-events.yaml create mode 100644 docs/openapi/paths/containers-id.yaml create mode 100644 docs/openapi/paths/containers.yaml create mode 100644 docs/openapi/paths/metro-areas-id.yaml create mode 100644 docs/openapi/paths/parties-id.yaml create mode 100644 docs/openapi/paths/parties.yaml create mode 100644 docs/openapi/paths/ports-id.yaml create mode 100644 docs/openapi/paths/shipments-id-resume-tracking.yaml create mode 100644 docs/openapi/paths/shipments-id-stop-tracking.yaml create mode 100644 docs/openapi/paths/shipments-id.yaml create mode 100644 docs/openapi/paths/shipments.yaml create mode 100644 docs/openapi/paths/shipping-lines-id.yaml create mode 100644 docs/openapi/paths/shipping-lines.yaml create mode 100644 docs/openapi/paths/terminals-id.yaml create mode 100644 docs/openapi/paths/tracking-requests-id.yaml create mode 100644 docs/openapi/paths/tracking-requests.yaml create mode 100644 docs/openapi/paths/vessels-id-future-positions-with-coordinates.yaml create mode 100644 docs/openapi/paths/vessels-id-future-positions.yaml create mode 100644 docs/openapi/paths/vessels-id.yaml create mode 100644 docs/openapi/paths/vessels-imo.yaml create mode 100644 docs/openapi/paths/webhook-notifications-examples.yaml create mode 100644 docs/openapi/paths/webhook-notifications-id.yaml create mode 100644 docs/openapi/paths/webhook-notifications.yaml create mode 100644 docs/openapi/paths/webhooks-id.yaml create mode 100644 docs/openapi/paths/webhooks-ips.yaml create mode 100644 docs/openapi/paths/webhooks.yaml create mode 100644 scripts/split_openapi.py create mode 100644 tests/test_openapi_bundle.py create mode 100644 tools/__init__.py create mode 100644 tools/openapi_bundle.py create mode 100644 tools/openapi_yaml.py diff --git a/.github/workflows/openapi-validation.yml b/.github/workflows/openapi-validation.yml new file mode 100644 index 00000000..f32a9948 --- /dev/null +++ b/.github/workflows/openapi-validation.yml @@ -0,0 +1,48 @@ +name: OpenAPI validation + +on: + pull_request: + paths: + - 'docs/openapi/**' + - 'docs/openapi.json' + - 'tools/openapi_*.py' + - 'tests/test_openapi_bundle.py' + - '.spectral.mjs' + - '.github/workflows/openapi-validation.yml' + push: + branches: + - main + paths: + - 'docs/openapi/**' + - 'docs/openapi.json' + - 'tools/openapi_*.py' + - 'tests/test_openapi_bundle.py' + - '.spectral.mjs' + - '.github/workflows/openapi-validation.yml' + +jobs: + check: + runs-on: ubuntu-latest + + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + + - name: Install Spectral CLI + run: npm install --global @stoplight/spectral-cli + + - name: Lint OpenAPI specification + run: spectral lint docs/openapi/index.yaml + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Run OpenAPI regression test + run: python -m unittest tests.test_openapi_bundle diff --git a/docs/openapi.json b/docs/openapi.json index f3f3dc96..5675abca 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -18,6 +18,65 @@ "description": "Production" } ], + "tags": [ + { + "name": "Containers" + }, + { + "name": "Shipments" + }, + { + "name": "Locations" + }, + { + "name": "Events" + }, + { + "name": "Tracking Requests" + }, + { + "name": "Webhooks" + }, + { + "name": "Webhook Notifications" + }, + { + "name": "Ports" + }, + { + "name": "Metro Areas" + }, + { + "name": "Terminals" + }, + { + "name": "Routing (Paid)" + } + ], + "security": [ + { + "authorization": [] + } + ], + "x-tagGroups": [ + { + "name": "End Points", + "tags": [ + "Shipments", + "Containers", + "Tracking Requests", + "Webhooks", + "Webhook Notifications", + "Metro Areas" + ] + }, + { + "name": "Routing (Paid)", + "tags": [ + "Routing (Paid)" + ] + } + ], "paths": { "/shipments": { "get": { @@ -6526,25 +6585,6 @@ } } }, - "x-tagGroups": [ - { - "name": "End Points", - "tags": [ - "Shipments", - "Containers", - "Tracking Requests", - "Webhooks", - "Webhook Notifications", - "Metro Areas" - ] - }, - { - "name": "Routing (Paid)", - "tags": [ - "Routing (Paid)" - ] - } - ], "components": { "schemas": { "shipment": { @@ -9683,45 +9723,5 @@ "description": "`Token YOUR_API_TOKEN`\n\nThe APIs require authentication to be done using header-based API Key and Secret Authentication. \n\nAPI key and secret are sent va the `Authorization` request header.\n\nYou send your API key and secret in the following way:\n\n`Authorization: Token YOUR_API_KEY`" } } - }, - "tags": [ - { - "name": "Containers" - }, - { - "name": "Shipments" - }, - { - "name": "Locations" - }, - { - "name": "Events" - }, - { - "name": "Tracking Requests" - }, - { - "name": "Webhooks" - }, - { - "name": "Webhook Notifications" - }, - { - "name": "Ports" - }, - { - "name": "Metro Areas" - }, - { - "name": "Terminals" - }, - { - "name": "Routing (Paid)" - } - ], - "security": [ - { - "authorization": [] - } - ] + } } diff --git a/docs/openapi/README.md b/docs/openapi/README.md new file mode 100644 index 00000000..2606cd27 --- /dev/null +++ b/docs/openapi/README.md @@ -0,0 +1,69 @@ +# OpenAPI authoring workflow + +This repository maintains the API reference as a modular OpenAPI 3.0 specification. The +single `docs/openapi.json` file that Mintlify consumes is generated from the YAML sources in +this folder. + +## Directory layout + +``` +docs/openapi/ +├── index.yaml # Root document with info, servers, tags, shared components +├── paths/ # One file per REST endpoint (you can create sub-folders) +├── components/ +│ ├── schemas/ # Reusable schema definitions referenced from the paths +│ └── securitySchemes/ # Authentication descriptions +└── README.md # You are here +``` + +All references between files use relative `$ref` pointers (for example, +`$ref: ../components/schemas/shipment.yaml`). Feel free to group related paths inside +subdirectories – the bundler resolves file references relative to where they are declared. + +## Editing workflow + +1. Update the relevant YAML file(s) under `docs/openapi/`. +2. Regenerate the bundled JSON and check the diff: + ```bash + python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json + ``` +3. Run the regression test to ensure the bundle matches the checked-in artifact: + ```bash + python -m unittest tests.test_openapi_bundle + ``` +4. Commit both the YAML sources and the regenerated `docs/openapi.json`. + +If you need to re-split a monolithic OpenAPI document, the helper script below reproduces the +current tree from `docs/openapi.json`: + +```bash +python scripts/split_openapi.py +``` + +## Linting and validation + +We use [Spectral](https://github.com/stoplightio/spectral) with the shared ruleset defined in +`.spectral.mjs` to lint the spec. You can lint locally with: + +```bash +npx -y @stoplight/spectral-cli lint docs/openapi/index.yaml +``` + +> Tip: install `@stoplight/spectral-cli` globally if you run the lint frequently. + +## Continuous integration + +A GitHub Actions workflow (`.github/workflows/openapi-validation.yml`) runs on every pull +request that touches the OpenAPI sources. It lints the modular spec with Spectral and executes +`python -m unittest tests.test_openapi_bundle` to confirm the bundled JSON stays in sync. If +you push commits that break the lint or forget to regenerate `docs/openapi.json`, the workflow +will fail and point at the offending step. + +## Related files + +- `tools/openapi_bundle.py` – Bundler CLI used by both local developers and CI. +- `tools/openapi_yaml.py` – Minimal YAML reader/writer used by the bundler and split script. +- `tests/test_openapi_bundle.py` – Regression test that compares the bundled JSON to the + committed artifact. +- `.spectral.mjs` – Spectral configuration shared by local runs and CI. + diff --git a/docs/openapi/components/schemas/account.yaml b/docs/openapi/components/schemas/account.yaml new file mode 100644 index 00000000..d299f598 --- /dev/null +++ b/docs/openapi/components/schemas/account.yaml @@ -0,0 +1,22 @@ +title: "Account model" +type: "object" +properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "container" + attributes: + type: "object" + required: + - "company_name" + properties: + company_name: + type: "string" +required: + - "id" + - "type" + - "attributes" +x-examples: {} diff --git a/docs/openapi/components/schemas/container-pod-terminal-changed-event.yaml b/docs/openapi/components/schemas/container-pod-terminal-changed-event.yaml new file mode 100644 index 00000000..7361b083 --- /dev/null +++ b/docs/openapi/components/schemas/container-pod-terminal-changed-event.yaml @@ -0,0 +1,57 @@ +title: "Container Pod Terminal Changed Event" +type: "object" +properties: + id: + type: "string" + type: + type: "string" + attributes: + type: "object" + properties: + data_source: + type: "string" + enum: + - "shipping_line" + - "terminal" + - "pierpass" + example: "shipping_line" + description: "Where the information about the terminal change came from" + timestamp: + type: "string" + format: "date-time" + description: "When the terminal change was recorded" + relationships: + type: "object" + properties: + container: + type: "object" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "container" + shipment: + type: "object" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "shipment" + terminal: + type: "object" + description: "The terminal the container has changed to. If this container is still on the vessel this represents an advisory. If it was previously at the terminal this represents an off-dock move." + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "terminal" +description: "" diff --git a/docs/openapi/components/schemas/container-updated-event.yaml b/docs/openapi/components/schemas/container-updated-event.yaml new file mode 100644 index 00000000..309e9e9b --- /dev/null +++ b/docs/openapi/components/schemas/container-updated-event.yaml @@ -0,0 +1,73 @@ +title: "container_updated_event" +type: "object" +properties: + id: + type: "string" + type: + type: "string" + attributes: + type: "object" + properties: + changeset: + type: "object" + description: "A hash of all the changed attributes with the values being an array of the before and after. E.g. \n`{\"pickup_lfd\": [null, \"2020-05-20\"]}`\n\nThe current attributes that can be alerted on are:\n- `available_for_pickup`\n- `pickup_lfd`\n- `fees_at_pod_terminal`\n- `holds_at_pod_terminal`\n- `pickup_appointment_at`\n- `pod_terminal`" + timestamp: + type: "string" + format: "date-time" + description: "" + timezone: + type: "string" + description: "IANA tz " + data_source: + type: "string" + enum: + - "terminal" + example: "terminal" + required: + - "changeset" + - "timestamp" + relationships: + type: "object" + required: + - "container" + - "terminal" + properties: + container: + type: "object" + required: + - "data" + properties: + data: + type: "object" + required: + - "id" + - "type" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "container" + terminal: + type: "object" + description: "" + required: + - "data" + properties: + data: + type: "object" + required: + - "id" + - "type" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "terminal" +required: + - "relationships" diff --git a/docs/openapi/components/schemas/container.yaml b/docs/openapi/components/schemas/container.yaml new file mode 100644 index 00000000..7772f98c --- /dev/null +++ b/docs/openapi/components/schemas/container.yaml @@ -0,0 +1,372 @@ +title: "Container model" +type: "object" +x-examples: + Example Container: + id: "ff77a822-23a7-4ccd-95ca-g534c071baaf3" + type: "container" + attributes: + number: "KOCU4959010" + ref_numbers: + - "REF-1" + - "REF-2" + seal_number: "210084213" + created_at: "2021-10-18T09:52:33Z" + equipment_type: "dry" + equipment_length: 40 + equipment_height: "high_cube" + weight_in_lbs: 20210 + fees_at_pod_terminal: [] + holds_at_pod_terminal: [] + pickup_lfd: "2022-01-21T08:00:00Z" + pickup_appointment_at: null + pod_full_out_chassis_number: "APMZ418805" + location_at_pod_terminal: "Delivered 02/11/2022 14:18" + availability_known: true + available_for_pickup: false + pod_arrived_at: "2022-01-03T10:30:00Z" + pod_discharged_at: "2022-01-08T09:15:00Z" + final_destination_full_out_at: null + pod_full_out_at: "2022-02-11T22:18:00Z" + empty_terminated_at: null + terminal_checked_at: "2022-02-11T22:45:32Z" + pod_rail_carrier_scac: "UPRR" + ind_rail_carrier_scac: "CSXT" + pod_timezone: "America/Los_Angeles" + final_destination_timezone: null + empty_terminated_timezone: null + pod_last_tracking_request_at: "2022-02-11T22:40:00Z" + shipment_last_tracking_request_at: "2022-02-11T22:40:00Z" + pod_rail_loaded_at: "2022-02-11T22:18:00Z" + pod_rail_departed_at: "2022-02-11T23:30:00Z" + ind_eta_at: null + ind_ata_at: "2022-02-15T01:12:00Z" + ind_rail_unloaded_at: "2022-02-15T07:54:00Z" + ind_facility_lfd_on: null + import_deadlines: + pickup_lfd_terminal: null + pickup_lfd_rail: "2022-02-20T08:00:00Z" + pickup_lfd_line: "2022-02-25T08:00:00Z" + relationships: + shipment: + data: + id: "x92acf88-c263-43ddf-b005-aca2a32d47f1" + type: "shipment" + pod_terminal: + data: + id: "x551cac7-aff5-40a6-9c63-49facf19cc3df" + type: "terminal" + pickup_facility: + data: + id: "d7d8d314-b02b-4caa-b04f-d3d4726f4107" + type: "terminal" + transport_events: + data: + - + id: "xecfe2d1-c498-4022-a9f8-ec56722e1215" + type: "transport_event" + - + id: "2900a9b8-d9e2-4696-abd86-4a767b885d23" + type: "transport_event" + - + id: "5ad0dce1-x78e4-464d-af5f-a36190428a2c" + type: "transport_event" + - + id: "876575d5-5ede-40d6-a093-c3a4cfcxaa1c7" + type: "transport_event" + - + id: "dc2a9d8f-75e6-43xa5-a04e-58458495f08c" + type: "transport_event" + - + id: "50xd2ea1-01ac-473d-8a08-3b5d77d2b793" + type: "transport_event" + - + id: "9d1f55xe3-6758-4be7-872a-30451ddd957e" + type: "transport_event" + raw_events: + data: + - + id: "38084a1d-a2eb-434e-81ac3-606c89a61c4b" + type: "raw_event" + - + id: "53680df3-93d5-4385-86c5-a33ee41b4c1f" + type: "raw_event" + - + id: "7d9cdf70-51e8-4b75-a8229-f5d691495ab6" + type: "raw_event" + - + id: "e62d41ac-8738-42e8-b582-35ef28ae88e2" + type: "raw_event" + - + id: "1209172b-acd8-4ce0-8821-dbc4934208b3" + type: "raw_event" + - + id: "4265ea5f-2b9a-436f-98fa-803d8ed49acb2" + type: "raw_event" + - + id: "c3cb2eb7-6c0a-4db8-8742-517b97b175d5" + type: "raw_event" + - + id: "b1959f36-a218-4b6e-863a9-2e0b4ad5159c" + type: "raw_event" +description: "Represents the equipment during a specific journey." +properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "container" + attributes: + type: "object" + properties: + number: + type: "string" + ref_numbers: + type: "array" + items: + type: "string" + equipment_type: + type: "string" + enum: + - "dry" + - "reefer" + - "open top" + - "flat rack" + - "bulk" + - "tank" + - null + nullable: true + equipment_length: + type: "integer" + enum: + - null + - 10 + - 20 + - 40 + - 45 + nullable: true + equipment_height: + type: "string" + enum: + - "standard" + - "high_cube" + - null + nullable: true + weight_in_lbs: + type: "number" + nullable: true + created_at: + type: "string" + format: "date-time" + seal_number: + type: "string" + nullable: true + pickup_lfd: + type: "string" + format: "date-time" + description: "Coalesces `import_deadlines` values giving preference to `pickup_lfd_line`" + nullable: true + pickup_appointment_at: + type: "string" + format: "date-time" + description: "When available the pickup appointment time at the terminal is returned." + nullable: true + availability_known: + type: "boolean" + description: "Whether Terminal 49 is receiving availability status from the terminal." + available_for_pickup: + type: "boolean" + description: "If availability_known is true, then whether container is available to be picked up at terminal." + nullable: true + pod_arrived_at: + type: "string" + format: "date-time" + description: "Time the vessel arrived at the POD" + nullable: true + pod_discharged_at: + type: "string" + format: "date-time" + description: "Discharge time at the port of discharge" + nullable: true + pod_full_out_at: + type: "string" + format: "date-time" + description: "Full Out time at port of discharge. Null for inland moves." + nullable: true + terminal_checked_at: + type: "string" + format: "date-time" + description: "When the terminal was last checked." + nullable: true + pod_full_out_chassis_number: + type: "string" + description: "The chassis number used when container was picked up at POD (if available)" + nullable: true + location_at_pod_terminal: + type: "string" + description: "Location at port of discharge terminal" + nullable: true + final_destination_full_out_at: + type: "string" + format: "date-time" + description: "Pickup time at final destination for inland moves." + nullable: true + empty_terminated_at: + type: "string" + format: "date-time" + description: "Time empty container was returned." + nullable: true + holds_at_pod_terminal: + type: "array" + items: + $ref: "#/components/schemas/terminal_hold" + fees_at_pod_terminal: + type: "array" + items: + $ref: "#/components/schemas/terminal_fee" + pod_timezone: + type: "string" + description: "IANA tz. Applies to attributes pod_arrived_at, pod_discharged_at, pickup_appointment_at, pod_full_out_at." + nullable: true + final_destination_timezone: + type: "string" + description: "IANA tz. Applies to attribute final_destination_full_out_at." + nullable: true + empty_terminated_timezone: + type: "string" + description: "IANA tz. Applies to attribute empty_terminated_at." + nullable: true + pod_rail_carrier_scac: + type: "string" + description: "The SCAC of the rail carrier for the pickup leg of the container's journey.(BETA)" + nullable: true + ind_rail_carrier_scac: + type: "string" + description: "The SCAC of the rail carrier for the delivery leg of the container's journey.(BETA)" + nullable: true + pod_last_tracking_request_at: + type: "string" + format: "date-time" + nullable: true + shipment_last_tracking_request_at: + type: "string" + format: "date-time" + nullable: true + pod_rail_loaded_at: + type: "string" + format: "date-time" + nullable: true + pod_rail_departed_at: + type: "string" + format: "date-time" + nullable: true + ind_eta_at: + type: "string" + format: "date-time" + nullable: true + ind_ata_at: + type: "string" + format: "date-time" + nullable: true + ind_rail_unloaded_at: + type: "string" + format: "date-time" + nullable: true + ind_facility_lfd_on: + type: "string" + format: "date-time" + description: "Please use `import_deadlines.pickup_lfd_rail`" + nullable: true + deprecated: true + import_deadlines: + type: "object" + description: "Import pickup deadlines for the container" + properties: + pickup_lfd_terminal: + type: "string" + format: "date-time" + description: "The last free day for pickup before demmurage accrues. Corresponding timezone is pod_timezone." + nullable: true + pickup_lfd_rail: + type: "string" + format: "date-time" + description: "The last free day for pickup before demmurage accrues. Corresponding timezone is final_destination_timezone." + nullable: true + pickup_lfd_line: + type: "string" + format: "date-time" + description: "The last free day as reported by the line. Corresponding timezone is final_destination_timezone or pod_timezone." + nullable: true + nullable: true + relationships: + type: "object" + properties: + shipment: + type: "object" + properties: + data: + type: "object" + properties: + id: + type: "string" + type: + type: "string" + enum: + - "shipment" + pickup_facility: + type: "object" + properties: + data: + type: "object" + properties: + id: + type: "string" + type: + type: "string" + enum: + - "terminal" + pod_terminal: + type: "object" + properties: + data: + type: "object" + properties: + id: + type: "string" + type: + type: "string" + enum: + - "terminal" + transport_events: + type: "object" + properties: + data: + type: "array" + items: + type: "object" + properties: + id: + type: "string" + type: + type: "string" + enum: + - "transport_event" + raw_events: + type: "object" + properties: + data: + type: "array" + items: + type: "object" + properties: + id: + type: "string" + type: + type: "string" + enum: + - "raw_event" +required: + - "id" + - "type" + - "attributes" diff --git a/docs/openapi/components/schemas/error.yaml b/docs/openapi/components/schemas/error.yaml new file mode 100644 index 00000000..9a8fbb86 --- /dev/null +++ b/docs/openapi/components/schemas/error.yaml @@ -0,0 +1,35 @@ +title: "Error model" +type: "object" +properties: + detail: + type: "string" + nullable: true + title: + type: "string" + nullable: true + source: + type: "object" + nullable: true + properties: + pointer: + type: "string" + nullable: true + parameter: + type: "string" + nullable: true + code: + type: "string" + nullable: true + status: + type: "string" + nullable: true + meta: + type: "object" + nullable: true + properties: + tracking_request_id: + type: "string" + format: "uuid" + nullable: true +required: + - "title" diff --git a/docs/openapi/components/schemas/estimated-event.yaml b/docs/openapi/components/schemas/estimated-event.yaml new file mode 100644 index 00000000..4061865d --- /dev/null +++ b/docs/openapi/components/schemas/estimated-event.yaml @@ -0,0 +1,102 @@ +title: "Estimated Event Model" +type: "object" +properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "estimated_event" + attributes: + type: "object" + required: + - "created_at" + - "estimated_timestamp" + - "event" + properties: + created_at: + type: "string" + description: "When the estimated event was created" + format: "date-time" + estimated_timestamp: + type: "string" + format: "date-time" + event: + type: "string" + enum: + - "shipment.estimated.arrival" + location_locode: + type: "string" + description: "UNLOCODE of the event location" + nullable: true + timezone: + type: "string" + description: "IANA tz" + nullable: true + voyage_number: + type: "string" + nullable: true + data_source: + type: "string" + enum: + - "shipping_line" + - "terminal" + description: "The original source of the event data" + relationships: + type: "object" + required: + - "shipment" + properties: + shipment: + type: "object" + required: + - "data" + properties: + data: + type: "object" + required: + - "id" + - "type" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "shipment" + port: + type: "object" + properties: + data: + type: "object" + nullable: true + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "port" + vessel: + type: "object" + description: "\n" + properties: + data: + type: "object" + nullable: true + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "vessel" +required: + - "id" + - "type" + - "attributes" + - "relationships" diff --git a/docs/openapi/components/schemas/link-self.yaml b/docs/openapi/components/schemas/link-self.yaml new file mode 100644 index 00000000..ab858670 --- /dev/null +++ b/docs/openapi/components/schemas/link-self.yaml @@ -0,0 +1,6 @@ +title: "link" +type: "object" +properties: + self: + type: "string" + format: "uri" diff --git a/docs/openapi/components/schemas/links.yaml b/docs/openapi/components/schemas/links.yaml new file mode 100644 index 00000000..771e00e6 --- /dev/null +++ b/docs/openapi/components/schemas/links.yaml @@ -0,0 +1,18 @@ +title: "links" +type: "object" +properties: + last: + type: "string" + format: "uri" + next: + type: "string" + format: "uri" + prev: + type: "string" + format: "uri" + first: + type: "string" + format: "uri" + self: + type: "string" + format: "uri" diff --git a/docs/openapi/components/schemas/meta.yaml b/docs/openapi/components/schemas/meta.yaml new file mode 100644 index 00000000..317da9a2 --- /dev/null +++ b/docs/openapi/components/schemas/meta.yaml @@ -0,0 +1,7 @@ +title: "meta" +type: "object" +properties: + size: + type: "integer" + total: + type: "integer" diff --git a/docs/openapi/components/schemas/metro-area.yaml b/docs/openapi/components/schemas/metro-area.yaml new file mode 100644 index 00000000..ef7b9d75 --- /dev/null +++ b/docs/openapi/components/schemas/metro-area.yaml @@ -0,0 +1,49 @@ +title: "Metro area model" +type: "object" +properties: + id: + type: "string" + format: "uuid" + attributes: + type: "object" + properties: + name: + type: "string" + code: + type: "string" + description: "UN/LOCODE" + state_abbr: + type: "string" + x-stoplight: + id: "j9yuwej2ym7yq" + nullable: true + country_code: + type: "string" + x-stoplight: + id: "hfupdk750wcrj" + time_zone: + type: "string" + description: "IANA tz" + x-stoplight: + id: "izvtty345nfsz" + latitude: + type: "number" + x-stoplight: + id: "9l62t4cwsp53w" + nullable: true + longitude: + type: "number" + x-stoplight: + id: "3tzibc0li8xvg" + nullable: true + type: + type: "string" + enum: + - "metro_area" + "": + type: "string" + x-stoplight: + id: "kwcjunrtu3r5o" +required: + - "id" + - "type" diff --git a/docs/openapi/components/schemas/party.yaml b/docs/openapi/components/schemas/party.yaml new file mode 100644 index 00000000..fbc762f4 --- /dev/null +++ b/docs/openapi/components/schemas/party.yaml @@ -0,0 +1,20 @@ +title: "Party model" +type: "object" +properties: + id: + type: "string" + format: "uuid" + attributes: + type: "object" + required: + - "company_name" + properties: + company_name: + type: "string" + description: "Company name" + type: + type: "string" + enum: + - "party" +required: + - "attributes" diff --git a/docs/openapi/components/schemas/port.yaml b/docs/openapi/components/schemas/port.yaml new file mode 100644 index 00000000..64b4fa42 --- /dev/null +++ b/docs/openapi/components/schemas/port.yaml @@ -0,0 +1,47 @@ +title: "Port model" +type: "object" +properties: + id: + type: "string" + format: "uuid" + attributes: + type: "object" + properties: + name: + type: "string" + code: + type: "string" + description: "UN/LOCODE" + state_abbr: + type: "string" + x-stoplight: + id: "jixah1a0q3exs" + nullable: true + city: + type: "string" + x-stoplight: + id: "657ij4boc7kyv" + nullable: true + country_code: + type: "string" + description: "2 digit country code" + time_zone: + type: "string" + description: "IANA tz" + latitude: + type: "number" + x-stoplight: + id: "480os7a90z6kk" + nullable: true + longitude: + type: "number" + x-stoplight: + id: "nfdetqgx5p1yv" + nullable: true + type: + type: "string" + enum: + - "port" +required: + - "id" + - "type" diff --git a/docs/openapi/components/schemas/rail-terminal.yaml b/docs/openapi/components/schemas/rail-terminal.yaml new file mode 100644 index 00000000..ff502a90 --- /dev/null +++ b/docs/openapi/components/schemas/rail-terminal.yaml @@ -0,0 +1,54 @@ +title: "Rail Terminal model" +type: "object" +properties: + id: + type: "string" + format: "uuid" + relationships: + type: "object" + properties: + port: + type: "object" + properties: + data: + type: "object" + nullable: true + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "port" + metro_area: + type: "object" + properties: + data: + type: "object" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "metro_area" + attributes: + type: "object" + required: + - "name" + properties: + name: + type: "string" + nickname: + type: "string" + firms_code: + type: "string" + description: "CBP FIRMS Code or CBS Sublocation Code" + type: + type: "string" + enum: + - "rail_terminal" +required: + - "attributes" diff --git a/docs/openapi/components/schemas/raw-event.yaml b/docs/openapi/components/schemas/raw-event.yaml new file mode 100644 index 00000000..b37a2273 --- /dev/null +++ b/docs/openapi/components/schemas/raw-event.yaml @@ -0,0 +1,136 @@ +title: "Raw Event Model" +type: "object" +description: "Raw Events represent the milestones from the shipping line for a given container.\n\n### About raw_event datetimes\n\nThe events may include estimated future events. The event is a future event if an `estimated_` timestamp is not null. \n\nThe datetime properties `timestamp` and `estimated`. \n\nWhen the `time_zone` property is present the datetimes are UTC timestamps, which can be converted to the local time by parsing the provided `time_zone`.\n\nWhen the `time_zone` property is absent, the datetimes represent local times which serialized as UTC timestamps for consistency. " +properties: + id: + type: "string" + type: + type: "string" + description: "" + enum: + - "raw_event" + attributes: + type: "object" + properties: + event: + type: "string" + enum: + - "empty_out" + - "full_in" + - "positioned_in" + - "positioned_out" + - "vessel_loaded" + - "vessel_departed" + - "transshipment_arrived" + - "transshipment_discharged" + - "transshipment_loaded" + - "transshipment_departed" + - "feeder_arrived" + - "feeder_discharged" + - "feeder_loaded" + - "feeder_departed" + - "rail_loaded" + - "rail_departed" + - "rail_arrived" + - "rail_unloaded" + - "vessel_arrived" + - "vessel_discharged" + - "arrived_at_destination" + - "delivered" + - "full_out" + - "empty_in" + - "vgm_received" + - "carrier_release" + - "customs_release" + - "available" + description: "Normalized string representing the event" + nullable: true + original_event: + type: "string" + description: "The event name as returned by the carrier" + timestamp: + type: "string" + format: "date-time" + description: "The datetime the event either transpired or will occur in UTC" + estimated: + type: "boolean" + description: "True if the timestamp is estimated, false otherwise" + actual_on: + type: "string" + format: "date" + description: "Deprecated: The date of the event at the event location when no time information is available. " + nullable: true + estimated_on: + type: "string" + format: "date" + description: "Deprecated: The estimated date of the event at the event location when no time information is available. " + nullable: true + actual_at: + type: "string" + format: "date-time" + description: "Deprecated: The datetime the event transpired in UTC" + nullable: true + estimated_at: + type: "string" + format: "date-time" + description: "Deprecated: The estimated datetime the event will occur in UTC" + nullable: true + timezone: + type: "string" + description: "IANA tz where the event occured" + nullable: true + created_at: + type: "string" + format: "date-time" + description: "When the raw_event was created in UTC" + location_name: + type: "string" + description: "The city or facility name of the event location" + location_locode: + type: "string" + description: "UNLOCODE of the event location" + nullable: true + vessel_name: + type: "string" + description: "The name of the vessel where applicable" + nullable: true + vessel_imo: + type: "string" + description: "The IMO of the vessel where applicable" + nullable: true + index: + type: "integer" + description: "The order of the event. This may be helpful when only dates (i.e. actual_on) are available." + voyage_number: + type: "string" + nullable: true + relationships: + type: "object" + properties: + location: + type: "object" + properties: + data: + type: "object" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "port" + - "metro_area" + vessel: + type: "object" + properties: + data: + type: "object" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "vessel" diff --git a/docs/openapi/components/schemas/route-location.yaml b/docs/openapi/components/schemas/route-location.yaml new file mode 100644 index 00000000..11456779 --- /dev/null +++ b/docs/openapi/components/schemas/route-location.yaml @@ -0,0 +1,153 @@ +title: "Route Location model" +type: "object" +properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "route_location" + attributes: + type: "object" + properties: + id: + type: "string" + format: "uuid" + inbound_scac: + type: "string" + nullable: true + minLength: 4 + maxLength: 4 + inbound_mode: + type: "string" + nullable: true + enum: + - "vessel" + - "rail" + - null + inbound_eta_at: + type: "string" + format: "date-time" + nullable: true + inbound_ata_at: + type: "string" + format: "date-time" + nullable: true + inbound_voyage_number: + type: "string" + nullable: true + outbound_scac: + type: "string" + nullable: true + minLength: 4 + maxLength: 4 + outbound_mode: + type: "string" + nullable: true + enum: + - "vessel" + - "rail" + - null + outbound_etd_at: + type: "string" + format: "date-time" + nullable: true + outbound_atd_at: + type: "string" + format: "date-time" + nullable: true + outbound_voyage_number: + type: "string" + nullable: true + created_at: + type: "string" + format: "date-time" + updated_at: + type: "string" + format: "date-time" + required: + - "id" + - "created_at" + - "updated_at" + relationships: + type: "object" + properties: + route: + type: "object" + properties: + data: + type: "object" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "route" + required: + - "id" + - "type" + inbound_vessel: + type: "object" + properties: + data: + type: "object" + nullable: true + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "vessel" + outbound_vessel: + type: "object" + properties: + data: + type: "object" + nullable: true + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "vessel" + location: + type: "object" + properties: + data: + type: "object" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "port" + - "terminal" + facility: + type: "object" + properties: + data: + type: "object" + nullable: true + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "terminal" + - "port" +required: + - "id" + - "type" + - "attributes" + - "relationships" diff --git a/docs/openapi/components/schemas/route.yaml b/docs/openapi/components/schemas/route.yaml new file mode 100644 index 00000000..c856f5ea --- /dev/null +++ b/docs/openapi/components/schemas/route.yaml @@ -0,0 +1,84 @@ +title: "Route model" +type: "object" +properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "route" + attributes: + type: "object" + properties: + id: + type: "string" + format: "uuid" + created_at: + type: "string" + format: "date-time" + updated_at: + type: "string" + format: "date-time" + required: + - "id" + - "created_at" + - "updated_at" + relationships: + type: "object" + properties: + cargo: + type: "object" + properties: + data: + type: "object" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "container" + required: + - "id" + - "type" + shipment: + type: "object" + properties: + data: + type: "object" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "shipment" + required: + - "id" + - "type" + route_locations: + type: "object" + properties: + data: + type: "array" + items: + type: "object" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "route_location" + required: + - "id" + - "type" +required: + - "id" + - "type" + - "attributes" + - "relationships" diff --git a/docs/openapi/components/schemas/shipment.yaml b/docs/openapi/components/schemas/shipment.yaml new file mode 100644 index 00000000..aade0e59 --- /dev/null +++ b/docs/openapi/components/schemas/shipment.yaml @@ -0,0 +1,275 @@ +title: "Shipment model" +type: "object" +x-examples: {} +description: "" +properties: + id: + type: "string" + format: "uuid" + relationships: + type: "object" + properties: + destination: + type: "object" + properties: + data: + type: "object" + nullable: true + properties: + type: + type: "string" + enum: + - "port" + - "metro_area" + id: + type: "string" + format: "uuid" + required: + - "type" + - "id" + port_of_lading: + type: "object" + properties: + data: + type: "object" + nullable: true + properties: + type: + type: "string" + enum: + - "port" + id: + type: "string" + format: "uuid" + required: + - "type" + - "id" + containers: + type: "object" + properties: + data: + type: "array" + items: + type: "object" + properties: + type: + type: "string" + enum: + - "container" + id: + type: "string" + format: "uuid" + required: + - "type" + - "id" + port_of_discharge: + type: "object" + properties: + data: + type: "object" + nullable: true + properties: + type: + type: "string" + enum: + - "port" + id: + type: "string" + format: "uuid" + required: + - "type" + - "id" + pod_terminal: + type: "object" + properties: + data: + type: "object" + properties: + type: + type: "string" + enum: + - "terminal" + id: + type: "string" + format: "uuid" + required: + - "type" + - "id" + destination_terminal: + type: "object" + properties: + data: + type: "object" + properties: + type: + type: "string" + enum: + - "terminal" + - "rail_terminal" + id: + type: "string" + format: "uuid" + required: + - "type" + - "id" + line_tracking_stopped_by_user: + type: "object" + properties: + data: + type: "object" + properties: + type: + type: "string" + enum: + - "user" + id: + type: "string" + format: "uuid" + required: + - "type" + - "id" + attributes: + type: "object" + properties: + bill_of_lading_number: + type: "string" + normalized_number: + type: "string" + description: "The normalized version of the shipment number used for querying the carrier" + ref_numbers: + type: "array" + items: + type: "string" + nullable: true + created_at: + type: "string" + format: "date-time" + tags: + type: "array" + items: + type: "string" + port_of_lading_locode: + type: "string" + description: "UN/LOCODE" + nullable: true + port_of_lading_name: + type: "string" + nullable: true + port_of_discharge_locode: + type: "string" + description: "UN/LOCODE" + nullable: true + port_of_discharge_name: + type: "string" + nullable: true + destination_locode: + type: "string" + description: "UN/LOCODE" + nullable: true + destination_name: + type: "string" + nullable: true + shipping_line_scac: + type: "string" + shipping_line_name: + type: "string" + shipping_line_short_name: + type: "string" + customer_name: + type: "string" + nullable: true + pod_vessel_name: + type: "string" + nullable: true + pod_vessel_imo: + type: "string" + nullable: true + pod_voyage_number: + type: "string" + nullable: true + pol_etd_at: + type: "string" + format: "date-time" + nullable: true + pol_atd_at: + type: "string" + format: "date-time" + nullable: true + pod_eta_at: + type: "string" + format: "date-time" + nullable: true + pod_original_eta_at: + type: "string" + format: "date-time" + nullable: true + pod_ata_at: + type: "string" + format: "date-time" + nullable: true + destination_eta_at: + type: "string" + format: "date-time" + nullable: true + destination_ata_at: + type: "string" + format: "date-time" + nullable: true + pol_timezone: + type: "string" + description: "IANA tz" + nullable: true + pod_timezone: + type: "string" + description: "IANA tz" + nullable: true + destination_timezone: + type: "string" + description: "IANA tz" + nullable: true + line_tracking_last_attempted_at: + type: "string" + format: "date-time" + description: "When Terminal49 last tried to update the shipment status from the shipping line" + nullable: true + line_tracking_last_succeeded_at: + type: "string" + format: "date-time" + description: "When Terminal49 last successfully updated the shipment status from the shipping line" + nullable: true + line_tracking_stopped_at: + type: "string" + format: "date-time" + description: "When Terminal49 stopped checking at the shipping line" + nullable: true + line_tracking_stopped_reason: + type: "string" + enum: + - "all_containers_terminated" + - "past_arrival_window" + - "no_updates_at_line" + - "cancelled_by_user" + - "booking_cancelled" + - null + description: "The reason Terminal49 stopped checking" + nullable: true + required: + - "bill_of_lading_number" + type: + type: "string" + enum: + - "shipment" + links: + type: "object" + properties: + self: + type: "string" + format: "uri" + required: + - "self" +required: + - "id" + - "type" + - "attributes" + - "relationships" + - "links" diff --git a/docs/openapi/components/schemas/shipping-line.yaml b/docs/openapi/components/schemas/shipping-line.yaml new file mode 100644 index 00000000..8c7e2e8b --- /dev/null +++ b/docs/openapi/components/schemas/shipping-line.yaml @@ -0,0 +1,50 @@ +title: "Shipping line model" +type: "object" +properties: + id: + type: "string" + format: "uuid" + attributes: + type: "object" + required: + - "scac" + - "name" + - "alternative_scacs" + - "short_name" + - "bill_of_lading_tracking_support" + - "booking_number_tracking_support" + - "container_number_tracking_support" + properties: + scac: + type: "string" + minLength: 4 + maxLength: 4 + name: + type: "string" + alternative_scacs: + type: "array" + x-stoplight: + id: "jwf70hnip0xwb" + description: "Additional SCACs which will be accepted in tracking requests" + items: + x-stoplight: + id: "nrqnwg5y2u0ni" + type: "string" + minLength: 4 + maxLength: 4 + short_name: + type: "string" + bill_of_lading_tracking_support: + type: "boolean" + booking_number_tracking_support: + type: "boolean" + container_number_tracking_support: + type: "boolean" + type: + type: "string" + enum: + - "shipping_line" +required: + - "id" + - "attributes" + - "type" diff --git a/docs/openapi/components/schemas/terminal-fee.yaml b/docs/openapi/components/schemas/terminal-fee.yaml new file mode 100644 index 00000000..ffa85062 --- /dev/null +++ b/docs/openapi/components/schemas/terminal-fee.yaml @@ -0,0 +1,21 @@ +title: "terminal_fee" +type: "object" +properties: + type: + type: "string" + enum: + - "demurrage" + - "exam" + - "extended_dwell_time" + - "other" + - "total" + amount: + type: "number" + description: "The fee amount in local currency" + currency_code: + type: "string" + description: "The ISO 4217 currency code of the fee is charged in. E.g. USD" + example: "USD" +required: + - "type" + - "amount" diff --git a/docs/openapi/components/schemas/terminal-hold.yaml b/docs/openapi/components/schemas/terminal-hold.yaml new file mode 100644 index 00000000..f6454d87 --- /dev/null +++ b/docs/openapi/components/schemas/terminal-hold.yaml @@ -0,0 +1,17 @@ +title: "terminal_hold" +type: "object" +properties: + name: + type: "string" + status: + type: "string" + enum: + - "pending" + - "hold" + description: + type: "string" + description: "Text description from the terminal (if any)" + nullable: true +required: + - "name" + - "status" diff --git a/docs/openapi/components/schemas/terminal.yaml b/docs/openapi/components/schemas/terminal.yaml new file mode 100644 index 00000000..697687bf --- /dev/null +++ b/docs/openapi/components/schemas/terminal.yaml @@ -0,0 +1,67 @@ +title: "Terminal model" +type: "object" +properties: + id: + type: "string" + format: "uuid" + relationships: + type: "object" + required: + - "port" + properties: + port: + type: "object" + properties: + data: + type: "object" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "port" + attributes: + type: "object" + required: + - "name" + properties: + name: + type: "string" + nickname: + type: "string" + firms_code: + type: "string" + description: "CBP FIRMS Code or CBS Sublocation Code" + smdg_code: + type: "string" + description: "SMDG Code" + bic_facility_code: + type: "string" + description: "BIC Facility Code" + street: + type: "string" + description: "Street part of the address" + city: + type: "string" + description: "City part of the address" + state: + type: "string" + description: "State part of the address" + state_abbr: + type: "string" + description: "State abbreviation for the state" + zip: + type: "string" + description: "ZIP code part of the address" + country: + type: "string" + description: "Country part of the address" + type: + type: "string" + enum: + - "terminal" +required: + - "attributes" + - "relationships" diff --git a/docs/openapi/components/schemas/tracking-request.yaml b/docs/openapi/components/schemas/tracking-request.yaml new file mode 100644 index 00000000..21cc195c --- /dev/null +++ b/docs/openapi/components/schemas/tracking-request.yaml @@ -0,0 +1,112 @@ +title: "Tracking Request" +type: "object" +properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "tracking_request" + attributes: + type: "object" + properties: + request_number: + type: "string" + example: "ONEYSH9AME650500" + ref_numbers: + type: "array" + nullable: true + items: + type: "string" + tags: + type: "array" + items: + type: "string" + status: + type: "string" + enum: + - "pending" + - "awaiting_manifest" + - "created" + - "failed" + - "tracking_stopped" + failed_reason: + type: "string" + enum: + - "booking_cancelled" + - "duplicate" + - "expired" + - "internal_processing_error" + - "invalid_number" + - "not_found" + - "retries_exhausted" + - "shipping_line_unreachable" + - "unrecognized_response" + - "data_unavailable" + - null + description: "If the tracking request has failed, or is currently failing, the last reason we were unable to complete the request" + nullable: true + request_type: + type: "string" + enum: + - "bill_of_lading" + - "booking_number" + - "container" + example: "bill_of_lading" + scac: + type: "string" + example: "ONEY" + minLength: 4 + maxLength: 4 + created_at: + type: "string" + format: "date-time" + updated_at: + type: "string" + format: "date-time" + is_retrying: + type: "boolean" + retry_count: + type: "integer" + description: "How many times T49 has attempted to get the shipment from the shipping line" + nullable: true + required: + - "request_number" + - "status" + - "request_type" + - "scac" + - "created_at" + relationships: + type: "object" + properties: + tracked_object: + type: "object" + properties: + data: + type: "object" + nullable: true + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "shipment" + customer: + type: "object" + properties: + data: + type: "object" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "party" +required: + - "id" + - "type" diff --git a/docs/openapi/components/schemas/transport-event.yaml b/docs/openapi/components/schemas/transport-event.yaml new file mode 100644 index 00000000..4e67d779 --- /dev/null +++ b/docs/openapi/components/schemas/transport-event.yaml @@ -0,0 +1,143 @@ +title: "Transport Event Model" +type: "object" +properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "transport_event" + attributes: + type: "object" + properties: + event: + type: "string" + enum: + - "container.transport.vessel_arrived" + - "container.transport.vessel_discharged" + - "container.transport.vessel_loaded" + - "container.transport.vessel_departed" + - "container.transport.rail_departed" + - "container.transport.rail_arrived" + - "container.transport.rail_loaded" + - "container.transport.rail_unloaded" + - "container.transport.transshipment_arrived" + - "container.transport.transshipment_discharged" + - "container.transport.transshipment_loaded" + - "container.transport.transshipment_departed" + - "container.transport.feeder_arrived" + - "container.transport.feeder_discharged" + - "container.transport.feeder_loaded" + - "container.transport.feeder_departed" + - "container.transport.empty_out" + - "container.transport.full_in" + - "container.transport.full_out" + - "container.transport.empty_in" + - "container.transport.vessel_berthed" + - "container.transport.arrived_at_inland_destination" + - "container.transport.estimated.arrived_at_inland_destination" + - "container.pickup_lfd.changed" + - "container.transport.available" + voyage_number: + type: "string" + nullable: true + timestamp: + type: "string" + format: "date-time" + nullable: true + timezone: + type: "string" + description: "IANA tz" + nullable: true + location_locode: + type: "string" + description: "UNLOCODE of the event location" + nullable: true + created_at: + type: "string" + format: "date-time" + data_source: + type: "string" + enum: + - "shipping_line" + - "terminal" + - "ais" + example: "shipping_line" + description: "The original source of the event data" + relationships: + type: "object" + properties: + shipment: + type: "object" + properties: + data: + type: "object" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "shipment" + location: + type: "object" + properties: + data: + type: "object" + nullable: true + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "port" + - "metro_area" + vessel: + type: "object" + properties: + data: + type: "object" + nullable: true + properties: + id: + type: "string" + format: "uuid" + name: + type: "string" + enum: + - "vessel" + terminal: + type: "object" + properties: + data: + type: "object" + nullable: true + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "terminal" + - "rail_terminal" + container: + type: "object" + properties: + data: + type: "object" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "container" +required: + - "id" + - "type" diff --git a/docs/openapi/components/schemas/vessel-with-positions.yaml b/docs/openapi/components/schemas/vessel-with-positions.yaml new file mode 100644 index 00000000..16b599e2 --- /dev/null +++ b/docs/openapi/components/schemas/vessel-with-positions.yaml @@ -0,0 +1,72 @@ +title: "Vessel with positions model" +type: "object" +properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "vessel" + attributes: + type: "object" + properties: + name: + type: "string" + description: "The name of the ship or vessel" + imo: + type: "string" + description: "International Maritime Organization (IMO) number" + nullable: true + mmsi: + type: "string" + description: "Maritime Mobile Service Identity (MMSI)" + nullable: true + latitude: + type: "number" + description: "The current latitude position of the vessel" + nullable: true + longitude: + type: "number" + description: "The current longitude position of the vessel" + nullable: true + nautical_speed_knots: + type: "number" + description: "The current speed of the ship in knots (nautical miles per hour)" + nullable: true + navigational_heading_degrees: + type: "number" + description: "The current heading of the ship in degrees, where 0 is North, 90 is East, 180 is South, and 270 is West" + nullable: true + position_timestamp: + type: "string" + format: "date-time" + description: "The timestamp of when the ship's position was last recorded, in ISO 8601 date and time format" + nullable: true + positions: + type: "array" + description: "Array of estimated future positions" + items: + type: "object" + properties: + latitude: + type: "number" + longitude: + type: "number" + heading: + type: "number" + nullable: true + timestamp: + type: "string" + format: "date-time" + estimated: + type: "boolean" + required: + - "latitude" + - "longitude" + - "timestamp" + - "estimated" +required: + - "id" + - "type" + - "attributes" diff --git a/docs/openapi/components/schemas/vessel.yaml b/docs/openapi/components/schemas/vessel.yaml new file mode 100644 index 00000000..cc54987d --- /dev/null +++ b/docs/openapi/components/schemas/vessel.yaml @@ -0,0 +1,76 @@ +title: "vessel" +type: "object" +properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "vessel" + attributes: + type: "object" + properties: + name: + type: "string" + description: "The name of the ship or vessel" + example: "Ever Given" + imo: + type: "string" + description: "International Maritime Organization (IMO) number" + nullable: true + example: "9811000" + mmsi: + type: "string" + description: "Maritime Mobile Service Identity (MMSI)" + nullable: true + example: "353136000" + latitude: + type: "number" + description: "The current latitude position of the vessel" + nullable: true + example: 25.29845 + longitude: + type: "number" + description: "The current longitude position of the vessel" + nullable: true + example: 121.217 + nautical_speed_knots: + type: "number" + description: "The current speed of the ship in knots (nautical miles per hour)" + nullable: true + example: 90 + navigational_heading_degrees: + type: "number" + description: "The current heading of the ship in degrees, where 0 is North, 90 is East, 180 is South, and 270 is West" + nullable: true + example: 194 + position_timestamp: + type: "string" + description: "The timestamp of when the ship's position was last recorded, in ISO 8601 date and time format" + nullable: true + example: "2023-07-28T14:01:37Z" + positions: + type: "array" + description: "An array of historical position data for the vessel. Only included if `show_positions` is true." + nullable: true + items: + type: "object" + properties: + latitude: + type: "number" + example: 1.477285 + longitude: + type: "number" + example: 104.535533333 + heading: + type: "number" + nullable: true + example: 51 + timestamp: + type: "string" + format: "date-time" + example: "2025-05-23T19:14:22Z" + estimated: + type: "boolean" + example: false diff --git a/docs/openapi/components/schemas/webhook-notification.yaml b/docs/openapi/components/schemas/webhook-notification.yaml new file mode 100644 index 00000000..1fc38f7c --- /dev/null +++ b/docs/openapi/components/schemas/webhook-notification.yaml @@ -0,0 +1,97 @@ +title: "webhook_notification" +type: "object" +properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "webhook_notification" + attributes: + type: "object" + properties: + event: + type: "string" + enum: + - "container.transport.vessel_arrived" + - "container.transport.vessel_discharged" + - "container.transport.vessel_loaded" + - "container.transport.vessel_departed" + - "container.transport.rail_departed" + - "container.transport.rail_arrived" + - "container.transport.rail_loaded" + - "container.transport.rail_unloaded" + - "container.transport.transshipment_arrived" + - "container.transport.transshipment_discharged" + - "container.transport.transshipment_loaded" + - "container.transport.transshipment_departed" + - "container.transport.feeder_arrived" + - "container.transport.feeder_discharged" + - "container.transport.feeder_loaded" + - "container.transport.feeder_departed" + - "container.transport.empty_out" + - "container.transport.full_in" + - "container.transport.full_out" + - "container.transport.empty_in" + - "container.transport.vessel_berthed" + - "shipment.estimated.arrival" + - "tracking_request.succeeded" + - "tracking_request.failed" + - "tracking_request.awaiting_manifest" + - "tracking_request.tracking_stopped" + - "container.created" + - "container.updated" + - "container.pod_terminal_changed" + - "container.transport.arrived_at_inland_destination" + - "container.transport.estimated.arrived_at_inland_destination" + - "container.pickup_lfd.changed" + - "container.transport.available" + delivery_status: + type: "string" + default: "pending" + enum: + - "pending" + - "succeeded" + - "failed" + description: "Whether the notification has been delivered to the webhook endpoint" + created_at: + type: "string" + required: + - "event" + - "delivery_status" + - "created_at" + relationships: + type: "object" + properties: + webhook: + type: "object" + properties: + data: + type: "object" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "webhook" + reference_object: + type: "object" + properties: + data: + type: "object" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "tracking_request" + - "estimated_event" + - "transport_event" + - "container_updated_event" + required: + - "webhook" diff --git a/docs/openapi/components/schemas/webhook.yaml b/docs/openapi/components/schemas/webhook.yaml new file mode 100644 index 00000000..dce6a0b1 --- /dev/null +++ b/docs/openapi/components/schemas/webhook.yaml @@ -0,0 +1,85 @@ +title: "webhook" +type: "object" +x-examples: {} +properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "webhook" + attributes: + type: "object" + properties: + url: + type: "string" + format: "uri" + description: "https end point" + active: + type: "boolean" + default: true + description: "Whether the webhook will be delivered when events are triggered" + events: + type: "array" + description: "The list of events to enabled for this endpoint" + uniqueItems: true + minItems: 1 + items: + type: "string" + enum: + - "container.transport.vessel_arrived" + - "container.transport.vessel_discharged" + - "container.transport.vessel_loaded" + - "container.transport.vessel_departed" + - "container.transport.rail_departed" + - "container.transport.rail_arrived" + - "container.transport.rail_loaded" + - "container.transport.rail_unloaded" + - "container.transport.transshipment_arrived" + - "container.transport.transshipment_discharged" + - "container.transport.transshipment_loaded" + - "container.transport.transshipment_departed" + - "container.transport.feeder_arrived" + - "container.transport.feeder_discharged" + - "container.transport.feeder_loaded" + - "container.transport.feeder_departed" + - "container.transport.empty_out" + - "container.transport.full_in" + - "container.transport.full_out" + - "container.transport.empty_in" + - "container.transport.vessel_berthed" + - "shipment.estimated.arrival" + - "tracking_request.succeeded" + - "tracking_request.failed" + - "tracking_request.awaiting_manifest" + - "tracking_request.tracking_stopped" + - "container.created" + - "container.updated" + - "container.pod_terminal_changed" + - "container.transport.arrived_at_inland_destination" + - "container.transport.estimated.arrived_at_inland_destination" + - "container.pickup_lfd.changed" + - "container.transport.available" + secret: + type: "string" + description: "A random token that will sign all delivered webhooks" + headers: + type: "array" + nullable: true + items: + type: "object" + properties: + name: + type: "string" + value: + type: "string" + required: + - "url" + - "active" + - "events" + - "secret" +required: + - "id" + - "type" +description: "" diff --git a/docs/openapi/components/securitySchemes/authorization.yaml b/docs/openapi/components/securitySchemes/authorization.yaml new file mode 100644 index 00000000..96428f15 --- /dev/null +++ b/docs/openapi/components/securitySchemes/authorization.yaml @@ -0,0 +1,4 @@ +name: "Authorization" +type: "apiKey" +in: "header" +description: "`Token YOUR_API_TOKEN`\n\nThe APIs require authentication to be done using header-based API Key and Secret Authentication. \n\nAPI key and secret are sent va the `Authorization` request header.\n\nYou send your API key and secret in the following way:\n\n`Authorization: Token YOUR_API_KEY`" diff --git a/docs/openapi/index.yaml b/docs/openapi/index.yaml new file mode 100644 index 00000000..4398d591 --- /dev/null +++ b/docs/openapi/index.yaml @@ -0,0 +1,173 @@ +openapi: "3.0.0" +info: + title: "Terminal49 API Reference" + version: "0.2.0" + contact: + name: "Terminal49 API support" + url: "https://www.terminal49.com" + email: "support@terminal49.com" + description: "The Terminal 49 API offers a convenient way to programmatically track your shipments from origin to destination.\n\nPlease enter your API key into the \"Variables\" tab before using these endpoints within Postman." + x-label: "Beta" + termsOfService: "https://www.terminal49.com/terms" +servers: + - + url: "https://api.terminal49.com/v2" + description: "Production" +tags: + - + name: "Containers" + - + name: "Shipments" + - + name: "Locations" + - + name: "Events" + - + name: "Tracking Requests" + - + name: "Webhooks" + - + name: "Webhook Notifications" + - + name: "Ports" + - + name: "Metro Areas" + - + name: "Terminals" + - + name: "Routing (Paid)" +security: + - + authorization: [] +x-tagGroups: + - + name: "End Points" + tags: + - "Shipments" + - "Containers" + - "Tracking Requests" + - "Webhooks" + - "Webhook Notifications" + - "Metro Areas" + - + name: "Routing (Paid)" + tags: + - "Routing (Paid)" +paths: + /shipments: + $ref: "./paths/shipments.yaml" + "/shipments/{id}": + $ref: "./paths/shipments-id.yaml" + "/shipments/{id}/stop_tracking": + $ref: "./paths/shipments-id-stop-tracking.yaml" + "/shipments/{id}/resume_tracking": + $ref: "./paths/shipments-id-resume-tracking.yaml" + /tracking_requests: + $ref: "./paths/tracking-requests.yaml" + "/tracking_requests/{id}": + $ref: "./paths/tracking-requests-id.yaml" + "/webhooks/{id}": + $ref: "./paths/webhooks-id.yaml" + /webhooks: + $ref: "./paths/webhooks.yaml" + "/webhook_notifications/{id}": + $ref: "./paths/webhook-notifications-id.yaml" + /webhook_notifications: + $ref: "./paths/webhook-notifications.yaml" + /webhook_notifications/examples: + $ref: "./paths/webhook-notifications-examples.yaml" + /webhooks/ips: + $ref: "./paths/webhooks-ips.yaml" + /containers: + $ref: "./paths/containers.yaml" + "/containers/{id}": + $ref: "./paths/containers-id.yaml" + "/containers/{id}/raw_events": + $ref: "./paths/containers-id-raw-events.yaml" + "/containers/{id}/transport_events": + $ref: "./paths/containers-id-transport-events.yaml" + "/containers/{id}/route": + $ref: "./paths/containers-id-route.yaml" + "/containers/{id}/refresh": + $ref: "./paths/containers-id-refresh.yaml" + /shipping_lines: + $ref: "./paths/shipping-lines.yaml" + "/shipping_lines/{id}": + $ref: "./paths/shipping-lines-id.yaml" + "/metro_areas/{id}": + $ref: "./paths/metro-areas-id.yaml" + "/ports/{id}": + $ref: "./paths/ports-id.yaml" + "/vessels/{id}": + $ref: "./paths/vessels-id.yaml" + "/vessels/{imo}": + $ref: "./paths/vessels-imo.yaml" + "/vessels/{id}/future_positions": + $ref: "./paths/vessels-id-future-positions.yaml" + "/vessels/{id}/future_positions_with_coordinates": + $ref: "./paths/vessels-id-future-positions-with-coordinates.yaml" + "/terminals/{id}": + $ref: "./paths/terminals-id.yaml" + /parties: + $ref: "./paths/parties.yaml" + "/parties/{id}": + $ref: "./paths/parties-id.yaml" +components: + schemas: + shipment: + $ref: "./components/schemas/shipment.yaml" + meta: + $ref: "./components/schemas/meta.yaml" + link-self: + $ref: "./components/schemas/link-self.yaml" + links: + $ref: "./components/schemas/links.yaml" + container: + $ref: "./components/schemas/container.yaml" + port: + $ref: "./components/schemas/port.yaml" + shipping_line: + $ref: "./components/schemas/shipping-line.yaml" + account: + $ref: "./components/schemas/account.yaml" + error: + $ref: "./components/schemas/error.yaml" + metro_area: + $ref: "./components/schemas/metro-area.yaml" + terminal: + $ref: "./components/schemas/terminal.yaml" + rail_terminal: + $ref: "./components/schemas/rail-terminal.yaml" + tracking_request: + $ref: "./components/schemas/tracking-request.yaml" + webhook: + $ref: "./components/schemas/webhook.yaml" + vessel: + $ref: "./components/schemas/vessel.yaml" + transport_event: + $ref: "./components/schemas/transport-event.yaml" + estimated_event: + $ref: "./components/schemas/estimated-event.yaml" + webhook_notification: + $ref: "./components/schemas/webhook-notification.yaml" + terminal_hold: + $ref: "./components/schemas/terminal-hold.yaml" + terminal_fee: + $ref: "./components/schemas/terminal-fee.yaml" + container_updated_event: + $ref: "./components/schemas/container-updated-event.yaml" + raw_event: + $ref: "./components/schemas/raw-event.yaml" + container_pod_terminal_changed_event: + $ref: "./components/schemas/container-pod-terminal-changed-event.yaml" + party: + $ref: "./components/schemas/party.yaml" + route: + $ref: "./components/schemas/route.yaml" + route_location: + $ref: "./components/schemas/route-location.yaml" + vessel_with_positions: + $ref: "./components/schemas/vessel-with-positions.yaml" + securitySchemes: + authorization: + $ref: "./components/securitySchemes/authorization.yaml" diff --git a/docs/openapi/paths/containers-id-raw-events.yaml b/docs/openapi/paths/containers-id-raw-events.yaml new file mode 100644 index 00000000..b60c04be --- /dev/null +++ b/docs/openapi/paths/containers-id-raw-events.yaml @@ -0,0 +1,359 @@ +parameters: + - + schema: + type: "string" + name: "id" + in: "path" + required: true +get: + summary: "Get a container's raw events" + tags: + - "Containers" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + type: "array" + items: + $ref: "#/components/schemas/raw_event" + examples: + Example Raw Events: + value: + data: + - + id: "ca6b760f-13e9-4bf6-ab49-3cf2e40757fb" + type: "raw_event" + attributes: + timestamp: "2020-03-03T00:00:00Z" + estimated: false + actual_on: "2020-03-03" + estimated_at: null + actual_at: null + event: "empty_out" + index: 0 + original_event: "Truck Gate out empty" + created_at: "2020-04-18T00:18:27Z" + voyage_number: null + location_name: "Oakland" + location_locode: null + vessel_name: null + vessel_imo: null + timezone: null + relationships: + location: + data: null + vessel: + data: null + - + id: "bcdfc796-0570-4c85-9336-d6c7d0da02d2" + type: "raw_event" + attributes: + timestamp: "2020-03-09T00:00:00Z" + estimated: false + actual_on: "2020-03-09" + estimated_at: null + actual_at: null + event: "full_in" + index: 1 + original_event: "Truck Arrival in" + created_at: "2020-04-18T00:18:27Z" + voyage_number: null + location_name: null + location_locode: null + vessel_name: null + vessel_imo: null + timezone: null + relationships: + location: + data: null + vessel: + data: null + - + id: "a4ff01b0-b374-4123-ae65-3dc0c7ea41ea" + type: "raw_event" + attributes: + timestamp: "2020-03-14T00:00:00Z" + estimated: false + actual_on: "2020-03-14" + estimated_at: null + actual_at: null + event: "vessel_loaded" + index: 2 + original_event: "Vessel Loaded" + created_at: "2020-04-18T00:18:27Z" + voyage_number: "FA009R" + location_name: null + location_locode: null + vessel_name: "MSC FAITH" + vessel_imo: null + timezone: null + relationships: + location: + data: null + vessel: + data: + id: "4b473d0e-7073-4171-8b5b-15e71e9e13cc" + type: "vessel" + - + id: "ca5862ef-6e27-4245-a281-0cec6bbe1fb7" + type: "raw_event" + attributes: + timestamp: "2020-03-15T00:00:00Z" + estimated: false + actual_on: "2020-03-15" + estimated_at: null + actual_at: null + event: "vessel_departed" + index: 3 + original_event: "Vessel departed" + created_at: "2020-04-18T00:18:27Z" + voyage_number: "FA009R" + location_name: null + location_locode: null + vessel_name: "MSC FAITH" + vessel_imo: null + timezone: null + relationships: + location: + data: null + vessel: + data: + id: "4b473d0e-7073-4171-8b5b-15e71e9e13cc" + type: "vessel" + - + id: "f47a903e-e6d1-41c5-aec6-8401b2abf297" + type: "raw_event" + attributes: + timestamp: "2020-03-25T00:00:00Z" + estimated: false + actual_on: "2020-03-25" + estimated_at: null + actual_at: null + event: "transshipment_arrived" + index: 4 + original_event: "Vessel arrived" + created_at: "2020-04-18T00:18:27Z" + voyage_number: "FA009R" + location_name: null + location_locode: null + vessel_name: "MSC FAITH" + vessel_imo: null + timezone: null + relationships: + location: + data: null + vessel: + data: + id: "4b473d0e-7073-4171-8b5b-15e71e9e13cc" + type: "vessel" + - + id: "72a1a13b-a2e0-4ac0-851d-eec41e9e9087" + type: "raw_event" + attributes: + timestamp: "2020-03-25T00:00:00Z" + estimated: false + actual_on: "2020-03-25" + estimated_at: null + actual_at: null + event: "transshipment_discharged" + index: 5 + original_event: "Vessel Discharged" + created_at: "2020-04-18T00:18:27Z" + voyage_number: "FA009R" + location_name: null + location_locode: null + vessel_name: "MSC FAITH" + vessel_imo: null + timezone: null + relationships: + location: + data: null + vessel: + data: + id: "4b473d0e-7073-4171-8b5b-15e71e9e13cc" + type: "vessel" + - + id: "cd91f0cf-ee73-4c47-b99f-63245cb5bc96" + type: "raw_event" + attributes: + timestamp: "2020-04-07T00:00:00Z" + estimated: false + actual_on: "2020-04-07" + estimated_at: null + actual_at: null + event: "transshipment_loaded" + index: 6 + original_event: "Vessel Loaded" + created_at: "2020-04-18T00:18:27Z" + voyage_number: "15W10" + location_name: null + location_locode: null + vessel_name: "SINGAPORE EXPRESS" + vessel_imo: null + timezone: null + relationships: + location: + data: null + vessel: + data: + id: "345c05ab-4217-4ffe-a1a4-6c03b9ad2b36" + type: "vessel" + - + id: "561dbb7e-c3ab-4e63-b09b-957878b1425f" + type: "raw_event" + attributes: + timestamp: "2020-04-07T00:00:00Z" + estimated: false + actual_on: "2020-04-07" + estimated_at: null + actual_at: null + event: "transshipment_departed" + index: 7 + original_event: "Vessel departed" + created_at: "2020-04-18T00:18:27Z" + voyage_number: "15W10" + location_name: null + location_locode: null + vessel_name: "SINGAPORE EXPRESS" + vessel_imo: null + timezone: null + relationships: + location: + data: null + vessel: + data: + id: "345c05ab-4217-4ffe-a1a4-6c03b9ad2b36" + type: "vessel" + - + id: "551711a6-62ad-4205-8da2-00e0c0cbd2db" + type: "raw_event" + attributes: + timestamp: "2020-04-12T00:00:00Z" + estimated: false + actual_on: "2020-04-12" + estimated_at: null + actual_at: null + event: "vessel_arrived" + index: 8 + original_event: "Vessel arrived" + created_at: "2020-04-18T00:18:27Z" + voyage_number: "15W10" + location_name: null + location_locode: null + vessel_name: "SINGAPORE EXPRESS" + vessel_imo: null + timezone: null + relationships: + location: + data: null + vessel: + data: + id: "345c05ab-4217-4ffe-a1a4-6c03b9ad2b36" + type: "vessel" + - + id: "f4027470-75ca-4e2a-b4f0-47654a25ac48" + type: "raw_event" + attributes: + timestamp: "2020-04-13T00:00:00Z" + estimated: false + actual_on: "2020-04-13" + estimated_at: null + actual_at: null + event: "vessel_discharged" + index: 9 + original_event: "Vessel Discharged" + created_at: "2020-04-18T00:18:27Z" + voyage_number: "15W10" + location_name: null + location_locode: null + vessel_name: "SINGAPORE EXPRESS" + vessel_imo: null + timezone: null + relationships: + location: + data: null + vessel: + data: + id: "345c05ab-4217-4ffe-a1a4-6c03b9ad2b36" + type: "vessel" + - + id: "50f11e4f-411e-48e2-8141-64226500df9c" + type: "raw_event" + attributes: + timestamp: "2020-04-14T00:00:00Z" + estimated: false + actual_on: "2020-04-14" + estimated_at: null + actual_at: null + event: "full_out" + index: 10 + original_event: "Truck Departure from" + created_at: "2020-04-18T00:18:27Z" + voyage_number: null + location_name: null + location_locode: null + vessel_name: null + vessel_imo: null + timezone: null + relationships: + location: + data: null + vessel: + data: null + - + id: "49aea23c-b8c5-4a97-b133-f7a9723fa1b4" + type: "raw_event" + attributes: + timestamp: "2020-04-15T00:00:00Z" + estimated: false + actual_on: "2020-04-15" + estimated_at: null + actual_at: null + event: "empty_in" + index: 11 + original_event: "Truck Gate in empty" + created_at: "2020-04-18T00:18:27Z" + voyage_number: null + location_name: null + location_locode: null + vessel_name: null + vessel_imo: null + timezone: null + relationships: + location: + data: null + vessel: + data: null + included: + - + id: "4b473d0e-7073-4171-8b5b-15e71e9e13cc" + type: "vessel" + attributes: + name: "MSC FAITH" + imo: null + mmsi: "636019213" + latitude: 70.22625823437389 + longitude: 45.06279126658865 + nautical_speed_knots: 100 + navigational_heading_degrees: 1 + position_timestamp: "2023-06-05T19:46:18Z" + - + id: "345c05ab-4217-4ffe-a1a4-6c03b9ad2b36" + type: "vessel" + attributes: + name: "SINGAPORE EXPRESS" + imo: null + mmsi: "477300500" + latitude: 70.22625823437389 + longitude: 45.06279126658865 + nautical_speed_knots: 100 + navigational_heading_degrees: 1 + position_timestamp: "2023-06-05T19:46:18Z" + operationId: "get-containers-id-raw_events" + description: "#### Deprecation warning\nThe `raw_events` endpoint is provided as-is.\n\n For past events we recommend consuming `transport_events`.\n\n---\nGet a list of past and future (estimated) milestones for a container as reported by the carrier. Some of the data is normalized even though the API is called raw_events. \n\nNormalized attributes: `event` and `timestamp` timestamp. Not all of the `event` values have been normalized. You can expect the the events related to container movements to be normalized but there are cases where events are not normalized. \n\nFor past historical events we recommend consuming `transport_events`. Although there are fewer events here those events go through additional vetting and normalization to avoid false positives and get you correct data." + deprecated: true diff --git a/docs/openapi/paths/containers-id-refresh.yaml b/docs/openapi/paths/containers-id-refresh.yaml new file mode 100644 index 00000000..2672ffed --- /dev/null +++ b/docs/openapi/paths/containers-id-refresh.yaml @@ -0,0 +1,76 @@ +parameters: + - + schema: + type: "string" + name: "id" + in: "path" + required: true +patch: + summary: "Refresh container" + operationId: "patch-containers-id-refresh" + tags: + - "Containers" + description: "Schedules the container to be refreshed immediately from all relevant sources.

To be alerted of updates you should subscribe to the [relevant webhooks](/api-docs/in-depth-guides/webhooks). This endpoint is limited to 10 requests per minute.This is a paid feature. Please contact sales@terminal49.com." + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + message: + type: "string" + example: "Started refresh for Shipping line, Terminal, Rail" + examples: + Refresh response: + value: + message: "Started refresh for Shipping line, Terminal, Rail" + 403: + description: "Forbidden - This API endpoint is not enabled for your account. Please contact support@terminal49.com" + content: + application/json: + schema: + type: "object" + properties: + errors: + type: "array" + items: + type: "object" + properties: + status: + type: "string" + example: "403" + title: + type: "string" + example: "API access not enabled" + detail: + type: "string" + example: "This API endpoint is not enabled for your account. Please contact support@terminal49.com" + 429: + description: "Too Many Requests - You've hit the refresh limit. Please try again in a minute." + content: + application/json: + schema: + type: "object" + properties: + errors: + type: "array" + items: + type: "object" + properties: + status: + type: "string" + example: "429" + title: + type: "string" + example: "Too Many Requests" + detail: + type: "string" + example: "You've hit the refresh limit. Please try again in a minute." + headers: + Retry-After: + description: "Number of seconds to wait before making another request" + schema: + type: "integer" + example: 60 diff --git a/docs/openapi/paths/containers-id-route.yaml b/docs/openapi/paths/containers-id-route.yaml new file mode 100644 index 00000000..7eef5f4c --- /dev/null +++ b/docs/openapi/paths/containers-id-route.yaml @@ -0,0 +1,57 @@ +parameters: + - + schema: + type: "string" + name: "id" + in: "path" + required: true +get: + summary: "Get container route" + tags: + - "Containers" + - "Routing (Paid)" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/route" + included: + type: "array" + items: + anyOf: + - + $ref: "#/components/schemas/port" + - + $ref: "#/components/schemas/vessel" + - + $ref: "#/components/schemas/route_location" + - + $ref: "#/components/schemas/shipment" + 403: + description: "Forbidden - Routing data feature is not enabled for this account" + content: + application/json: + schema: + type: "object" + properties: + errors: + type: "array" + items: + type: "object" + properties: + status: + type: "string" + example: "403" + title: + type: "string" + example: "Forbidden" + detail: + type: "string" + example: "Routing data feature is not enabled for this account" + operationId: "get-containers-id-route" + description: "Retrieves the route details from the port of lading to the port of discharge, including transshipments. This is a paid feature. Please contact sales@terminal49.com." diff --git a/docs/openapi/paths/containers-id-transport-events.yaml b/docs/openapi/paths/containers-id-transport-events.yaml new file mode 100644 index 00000000..0ee1f0a1 --- /dev/null +++ b/docs/openapi/paths/containers-id-transport-events.yaml @@ -0,0 +1,233 @@ +parameters: + - + schema: + type: "string" + name: "id" + in: "path" + required: true +get: + summary: "Get a container's transport events" + tags: + - "Containers" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + type: "array" + items: + $ref: "#/components/schemas/transport_event" + included: + type: "array" + items: + anyOf: + - + $ref: "#/components/schemas/shipment" + - + $ref: "#/components/schemas/container" + - + $ref: "#/components/schemas/port" + - + $ref: "#/components/schemas/metro_area" + - + $ref: "#/components/schemas/terminal" + - + $ref: "#/components/schemas/rail_terminal" + - + $ref: "#/components/schemas/vessel" + links: + $ref: "#/components/schemas/links" + meta: + $ref: "#/components/schemas/meta" + examples: + Example transport events: + value: + data: + - + id: "efc3f3c1-cdc2-4a7d-a176-762ddec107b8" + type: "transport_event" + attributes: + event: "container.transport.vessel_loaded" + created_at: "2021-01-05T08:41:12Z" + voyage_number: "15W10" + timestamp: null + location_locode: "CLSAI" + timezone: "America/Santiago" + relationships: + shipment: + data: + id: "06264731-503e-498e-bc76-f90b87b31562" + type: "shipment" + container: + data: + id: "eeafd337-72b5-4e5c-87cb-9ef83fa99cf4" + type: "container" + vessel: + data: + id: "345c05ab-4217-4ffe-a1a4-6c03b9ad2b36" + type: "vessel" + location: + data: + id: "0ad2cf2b-e694-4ccc-9cd2-40af0d1fa1b5" + type: "port" + terminal: + data: null + - + id: "951058bd-2c3b-4bcc-94e1-9be2526b9687" + type: "transport_event" + attributes: + event: "container.transport.vessel_departed" + created_at: "2021-01-05T08:41:11Z" + voyage_number: "15W10" + timestamp: null + location_locode: "CLSAI" + timezone: "America/Santiago" + relationships: + shipment: + data: + id: "06264731-503e-498e-bc76-f90b87b31562" + type: "shipment" + container: + data: + id: "eeafd337-72b5-4e5c-87cb-9ef83fa99cf4" + type: "container" + vessel: + data: + id: "345c05ab-4217-4ffe-a1a4-6c03b9ad2b36" + type: "vessel" + location: + data: + id: "0ad2cf2b-e694-4ccc-9cd2-40af0d1fa1b5" + type: "port" + terminal: + data: null + - + id: "69af6795-56c2-4157-9a87-afd761cc85a0" + type: "transport_event" + attributes: + event: "container.transport.full_out" + created_at: "2020-05-14T00:05:41Z" + voyage_number: null + timestamp: "2020-04-14T00:00:00Z" + location_locode: "USOAK" + timezone: "America/Los_Angeles" + relationships: + shipment: + data: + id: "06264731-503e-498e-bc76-f90b87b31562" + type: "shipment" + container: + data: + id: "eeafd337-72b5-4e5c-87cb-9ef83fa99cf4" + type: "container" + vessel: + data: null + location: + data: + id: "42d1ba3a-f4b8-431d-a6fe-49fd748a59e7" + type: "port" + terminal: + data: null + - + id: "68c3c29a-504a-4dbb-ad27-7194ef42d484" + type: "transport_event" + attributes: + event: "container.transport.vessel_discharged" + created_at: "2020-05-14T00:05:41Z" + voyage_number: "15W10" + timestamp: "2020-04-13T00:00:00Z" + location_locode: "USOAK" + timezone: "America/Los_Angeles" + relationships: + shipment: + data: + id: "06264731-503e-498e-bc76-f90b87b31562" + type: "shipment" + container: + data: + id: "eeafd337-72b5-4e5c-87cb-9ef83fa99cf4" + type: "container" + vessel: + data: + id: "345c05ab-4217-4ffe-a1a4-6c03b9ad2b36" + type: "vessel" + location: + data: + id: "42d1ba3a-f4b8-431d-a6fe-49fd748a59e7" + type: "port" + terminal: + data: + id: "3e550f0e-ac2a-48fb-b242-5be45ecf2c78" + type: "terminal" + - + id: "03349405-a9be-4f3e-abde-28f2cb3922bd" + type: "transport_event" + attributes: + event: "container.transport.vessel_arrived" + created_at: "2020-05-14T00:05:41Z" + voyage_number: "15W10" + timestamp: "2020-04-13T01:24:00Z" + location_locode: "USOAK" + timezone: "America/Los_Angeles" + relationships: + shipment: + data: + id: "06264731-503e-498e-bc76-f90b87b31562" + type: "shipment" + container: + data: + id: "eeafd337-72b5-4e5c-87cb-9ef83fa99cf4" + type: "container" + vessel: + data: + id: "345c05ab-4217-4ffe-a1a4-6c03b9ad2b36" + type: "vessel" + location: + data: + id: "42d1ba3a-f4b8-431d-a6fe-49fd748a59e7" + type: "port" + terminal: + data: + id: "3e550f0e-ac2a-48fb-b242-5be45ecf2c78" + type: "terminal" + - + id: "ba9f85b4-658d-4f23-9308-635964df8037" + type: "transport_event" + attributes: + event: "container.transport.empty_in" + created_at: "2020-05-14T00:05:42Z" + voyage_number: null + timestamp: "2020-04-15T00:00:00Z" + location_locode: null + timezone: null + relationships: + shipment: + data: + id: "06264731-503e-498e-bc76-f90b87b31562" + type: "shipment" + container: + data: + id: "eeafd337-72b5-4e5c-87cb-9ef83fa99cf4" + type: "container" + vessel: + data: null + location: + data: null + terminal: + data: null + links: + self: "https://api.terminal49.com/v2/containers/eeafd337-72b5-4e5c-87cb-9ef83fa99cf4/transport_events" + current: "https://api.terminal49.com/v2/containers/eeafd337-72b5-4e5c-87cb-9ef83fa99cf4/transport_events?page[number]=1" + operationId: "get-containers-id-transport_events" + description: "Get a list of past transport events (canonical) for a container. All data has been normalized across all carriers. These are a verified subset of the raw events may also be sent as Webhook Notifications to a webhook endpoint.\n\nThis does not provide any estimated future events. See `container/:id/raw_events` endpoint for that. " + parameters: + - + schema: + type: "string" + in: "query" + name: "include" + description: "Comma delimited list of relations to include" diff --git a/docs/openapi/paths/containers-id.yaml b/docs/openapi/paths/containers-id.yaml new file mode 100644 index 00000000..5e66b43a --- /dev/null +++ b/docs/openapi/paths/containers-id.yaml @@ -0,0 +1,136 @@ +parameters: + - + schema: + type: "string" + name: "id" + in: "path" + required: true +get: + summary: "Get a container" + tags: + - "Containers" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/container" + included: + type: "array" + items: + anyOf: + - + $ref: "#/components/schemas/shipment" + - + $ref: "#/components/schemas/terminal" + - + $ref: "#/components/schemas/transport_event" + examples: + Example Container: + value: + data: + id: "55a700e4-7005-45a9-92fd-1ff38641dbd9" + type: "container" + attributes: + number: "CAIU7432986" + seal_number: null + created_at: "2024-06-26T15:05:21Z" + ref_numbers: [] + pod_arrived_at: null + pod_discharged_at: "2024-06-22T04:00:00Z" + final_destination_full_out_at: null + holds_at_pod_terminal: [] + available_for_pickup: true + equipment_type: "dry" + equipment_length: 40 + equipment_height: "high_cube" + weight_in_lbs: null + pod_full_out_at: null + empty_terminated_at: null + terminal_checked_at: "2024-06-26T17:51:12Z" + fees_at_pod_terminal: [] + pickup_lfd: "2024-07-07T04:00:00Z" + pickup_appointment_at: null + pod_full_out_chassis_number: null + location_at_pod_terminal: "Yard - Y0709A" + pod_last_tracking_request_at: "2024-06-26T17:51:12Z" + shipment_last_tracking_request_at: "2024-06-26T15:05:20Z" + availability_known: true + pod_timezone: "America/New_York" + final_destination_timezone: "US/Eastern" + empty_terminated_timezone: "US/Eastern" + pod_rail_carrier_scac: "CSXT" + ind_rail_carrier_scac: "CSXT" + pod_rail_loaded_at: null + pod_rail_departed_at: null + ind_eta_at: null + ind_ata_at: null + ind_rail_unloaded_at: null + ind_facility_lfd_on: null + import_deadlines: + pickup_lfd_terminal: "2024-07-07T04:00:00Z" + pickup_lfd_rail: null + pickup_lfd_line: "2024-07-07T04:00:00Z" + relationships: + shipment: + data: + id: "02b1bd6f-407c-45bb-8645-06e7ee34e7e3" + type: "shipment" + pickup_facility: + data: null + pod_terminal: + data: + id: "b859f5c3-8515-41da-bf20-39c0a5ada887" + type: "terminal" + transport_events: + data: + - + id: "45b542cb-332b-4684-b915-42e3a0759823" + type: "transport_event" + - + id: "174ed528-a1a9-4002-aef0-f2c9369199da" + type: "transport_event" + - + id: "7a2f30a6-a756-4c14-9477-fbfc1c7fe2f8" + type: "transport_event" + - + id: "e7365004-175a-46e8-96cd-dbed0f3daf21" + type: "transport_event" + - + id: "7c567bf3-7f01-4a3d-a176-eaa1f7165585" + type: "transport_event" + raw_events: + data: + - + id: "2956f71c-bfb9-4e49-b9e2-1b4d53c74cac" + type: "raw_event" + - + id: "391e0eda-65b5-4fc3-a53d-25ecd9570259" + type: "raw_event" + - + id: "74810c04-6c8a-4194-8cff-52936584a965" + type: "raw_event" + - + id: "4b1500e2-b23b-4896-87bd-c38b1d16f385" + type: "raw_event" + - + id: "8b9a7d88-720a-4304-8c1e-a3336e39f481" + type: "raw_event" + - + id: "bf1f59c5-5dd8-4013-87f9-d7056bc87114" + type: "raw_event" + links: + self: "https://api.terminal49.com/v2/containers/55a700e4-7005-45a9-92fd-1ff38641dbd9" + operationId: "get-containers-id" + description: "Retrieves the details of a container." + parameters: + - + schema: + type: "string" + in: "query" + name: "include" + description: "Comma delimited list of relations to include" diff --git a/docs/openapi/paths/containers.yaml b/docs/openapi/paths/containers.yaml new file mode 100644 index 00000000..0d200ce7 --- /dev/null +++ b/docs/openapi/paths/containers.yaml @@ -0,0 +1,747 @@ +get: + summary: "List containers" + tags: + - "Containers" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + type: "array" + items: + $ref: "#/components/schemas/container" + included: + type: "array" + items: + $ref: "#/components/schemas/shipment" + links: + $ref: "#/components/schemas/links" + meta: + $ref: "#/components/schemas/meta" + examples: + Example List of containers: + value: + data: + - + id: "be0b247b-c144-4163-8919-cf9178930736" + type: "container" + attributes: + number: "TCLU6718159" + seal_number: null + created_at: "2024-06-26T15:05:18Z" + ref_numbers: [] + pod_arrived_at: "2024-06-21T14:12:00Z" + pod_discharged_at: "2024-06-23T00:19:00Z" + final_destination_full_out_at: null + holds_at_pod_terminal: [] + available_for_pickup: false + equipment_type: "dry" + equipment_length: 40 + equipment_height: "high_cube" + weight_in_lbs: 53502 + pod_full_out_at: "2024-06-26T16:15:00Z" + empty_terminated_at: null + terminal_checked_at: "2024-06-26T18:47:56Z" + fees_at_pod_terminal: [] + pickup_lfd: null + pickup_appointment_at: null + pod_full_out_chassis_number: null + location_at_pod_terminal: "Community" + pod_last_tracking_request_at: "2024-06-26T18:47:56Z" + shipment_last_tracking_request_at: "2024-06-26T15:05:18Z" + availability_known: true + pod_timezone: "America/New_York" + final_destination_timezone: null + empty_terminated_timezone: "America/New_York" + pod_rail_carrier_scac: null + ind_rail_carrier_scac: null + pod_rail_loaded_at: null + pod_rail_departed_at: null + ind_eta_at: null + ind_ata_at: null + ind_rail_unloaded_at: null + ind_facility_lfd_on: null + import_deadlines: + pickup_lfd_terminal: null + pickup_lfd_rail: null + pickup_lfd_line: null + relationships: + shipment: + data: + id: "cc8f8e43-d6a9-4edb-a8c0-d0ab03c113d3" + type: "shipment" + pickup_facility: + data: null + pod_terminal: + data: + id: "a243bdf8-0da3-4056-a6a7-05fe8ab43999" + type: "terminal" + transport_events: + data: + - + id: "fb53b35c-6a0c-4e22-b196-b623e8ba7db5" + type: "transport_event" + - + id: "179897a3-04f5-450b-86e1-db57970c0248" + type: "transport_event" + - + id: "a119b8e6-10c5-4967-8364-885f7dbf8e50" + type: "transport_event" + - + id: "3372d58c-df89-46a2-b064-b308a9dc7040" + type: "transport_event" + - + id: "800a3e59-8231-4e42-a80f-73c97cfb1be9" + type: "transport_event" + - + id: "d466676b-0073-4b0c-89aa-d42486e9ed4f" + type: "transport_event" + - + id: "85665836-5915-4cb9-ab78-b8487598cd0d" + type: "transport_event" + - + id: "94cca22a-520a-4d19-a551-0554aceb3794" + type: "transport_event" + - + id: "032e812f-d5e4-48af-8d79-2c2b41a07032" + type: "transport_event" + - + id: "1b7dd74d-eff6-4e06-9a15-234295ce6fd5" + type: "transport_event" + - + id: "b9f07b7e-1653-4209-b375-4588653d5275" + type: "transport_event" + - + id: "a35f3c1b-ad35-4347-b0f2-9e08f0d4ca64" + type: "transport_event" + raw_events: + data: + - + id: "e26fc659-f79d-4cc0-8efc-5ce5e8444891" + type: "raw_event" + - + id: "8820af5e-cb77-41c5-a897-906f2c56eb1e" + type: "raw_event" + - + id: "a628a2c2-dab6-4b04-b3ae-d7ec99098a89" + type: "raw_event" + - + id: "6ca157f9-3b58-4db5-8155-fc7b41a62611" + type: "raw_event" + - + id: "6fb06390-4b0a-4c1f-9703-ec89927df7f3" + type: "raw_event" + - + id: "26fe408d-e091-412a-a2fb-23a4d778b6b9" + type: "raw_event" + - + id: "16490dd8-d79f-468a-91b1-dbb30bb45c85" + type: "raw_event" + - + id: "ff3db923-a644-4706-8057-1bd53c95fbd5" + type: "raw_event" + - + id: "3fd27ffd-9618-477f-b1a9-cbc179defefe" + type: "raw_event" + - + id: "f92efdd3-f79c-4a1c-97ce-9a47588b525c" + type: "raw_event" + - + id: "3b2a88ef-df0b-4e61-99c1-d4a175910111" + type: "raw_event" + - + id: "9b367e33-9e43-488f-8217-081698adf40d" + type: "raw_event" + - + id: "ee0915df-e2f8-46b0-acf1-816871ca142d" + type: "raw_event" + - + id: "a9e52f3d-2fa9-467c-8deb-09e90dac2f0b" + type: "container" + attributes: + number: "TCLU2224327" + seal_number: null + created_at: "2024-06-26T15:05:34Z" + ref_numbers: [] + pod_arrived_at: "2024-06-21T14:12:00Z" + pod_discharged_at: "2024-06-23T17:21:00Z" + final_destination_full_out_at: null + holds_at_pod_terminal: [] + available_for_pickup: false + equipment_type: "dry" + equipment_length: 20 + equipment_height: "standard" + weight_in_lbs: 44225 + pod_full_out_at: null + empty_terminated_at: null + terminal_checked_at: "2024-06-26T18:47:56Z" + fees_at_pod_terminal: [] + pickup_lfd: null + pickup_appointment_at: null + pod_full_out_chassis_number: null + location_at_pod_terminal: "Yard" + pod_last_tracking_request_at: "2024-06-26T18:47:56Z" + shipment_last_tracking_request_at: "2024-06-26T15:05:34Z" + availability_known: true + pod_timezone: "America/New_York" + final_destination_timezone: "America/Chicago" + empty_terminated_timezone: "America/Chicago" + pod_rail_carrier_scac: "CSXT" + ind_rail_carrier_scac: "CSXT" + pod_rail_loaded_at: null + pod_rail_departed_at: null + ind_eta_at: "2024-07-02T14:20:00Z" + ind_ata_at: null + ind_rail_unloaded_at: null + ind_facility_lfd_on: null + import_deadlines: + pickup_lfd_terminal: null + pickup_lfd_rail: null + pickup_lfd_line: null + relationships: + shipment: + data: + id: "99f84294-3bda-4765-81b3-31765e6d2a24" + type: "shipment" + pickup_facility: + data: + id: "e6fa9a01-511b-4f43-a7e1-d628315b84ef" + type: "terminal" + pod_terminal: + data: + id: "a243bdf8-0da3-4056-a6a7-05fe8ab43999" + type: "terminal" + transport_events: + data: + - + id: "4a5a04b7-8974-4c46-beaa-bf55004422c9" + type: "transport_event" + - + id: "11c90391-aa9c-408b-b20e-daed8dd09586" + type: "transport_event" + - + id: "d7f23c71-7084-4fbb-9fef-740f624182aa" + type: "transport_event" + - + id: "c4c3537d-5c47-4623-afe0-edc0dd6f75c5" + type: "transport_event" + - + id: "e4002e13-0a74-4bd4-9147-787bb21e2fda" + type: "transport_event" + - + id: "57b5568f-d8a6-443d-b1c8-be5cd080e5ed" + type: "transport_event" + - + id: "0771cff1-79bf-4eaa-9d9d-790cb433ce44" + type: "transport_event" + - + id: "031021b9-7b39-41f7-bd45-26cc8cb799d2" + type: "transport_event" + - + id: "9956448d-34d3-4c23-bcfd-19807eb4034f" + type: "transport_event" + - + id: "f1caf6ea-3e92-4b68-bcea-556828301062" + type: "transport_event" + - + id: "2dd558a8-fa07-454c-acf3-b53d072264af" + type: "transport_event" + - + id: "83118511-d9ed-4b16-b323-5e685d9b266e" + type: "transport_event" + raw_events: + data: + - + id: "f256289f-219d-45f6-b727-56fb9c6bc433" + type: "raw_event" + - + id: "c5581f60-ffb2-4ef0-a855-b70acd3b294f" + type: "raw_event" + - + id: "3c6716f9-814c-4459-9bbb-753f010446b2" + type: "raw_event" + - + id: "62c7b849-c99b-4e37-9861-105141cc0a4c" + type: "raw_event" + - + id: "7db37d43-426a-4f84-82af-2957621ce466" + type: "raw_event" + - + id: "d4342119-db56-46fc-8299-f573f5b52e73" + type: "raw_event" + - + id: "ba159c3b-590c-43ff-bc04-b0354fd326f4" + type: "raw_event" + - + id: "ec1be31a-17f1-4f6f-85ab-c74cb0dbe6cb" + type: "raw_event" + - + id: "d12c4656-0d1f-4f30-a0fa-a2ee887741a8" + type: "raw_event" + - + id: "146d56e2-b41d-4469-8202-0c7d7315e794" + type: "raw_event" + - + id: "6b86b4d1-f85f-4c26-9fbc-3132a62f0fbc" + type: "raw_event" + - + id: "bb2c9105-e421-4372-9265-e61b3fa54851" + type: "raw_event" + - + id: "3a09c49f-c12e-49e9-b2de-b8dca2b3d608" + type: "raw_event" + - + id: "54d91ebc-8f57-4764-b7c6-a3f4dc2459be" + type: "raw_event" + - + id: "9e788c46-9431-41eb-baee-c8b14fb4f590" + type: "raw_event" + - + id: "d3051802-8b6f-497d-ad16-fb35547c8662" + type: "raw_event" + - + id: "af3090e7-c6d3-4d8e-88aa-9cd757102f9b" + type: "raw_event" + - + id: "95daf204-d95d-4a89-bedf-358bedb8b3b8" + type: "raw_event" + - + id: "8d1faeeb-3890-4fac-8659-cd13737b26f1" + type: "container" + attributes: + number: "CMAU0619052" + seal_number: null + created_at: "2024-06-26T15:02:11Z" + ref_numbers: [] + pod_arrived_at: "2024-06-22T22:10:00Z" + pod_discharged_at: "2024-06-23T20:38:00Z" + final_destination_full_out_at: null + holds_at_pod_terminal: [] + available_for_pickup: false + equipment_type: "dry" + equipment_length: 20 + equipment_height: "standard" + weight_in_lbs: null + pod_full_out_at: null + empty_terminated_at: null + terminal_checked_at: "2024-06-26T18:47:47Z" + fees_at_pod_terminal: [] + pickup_lfd: "2024-06-27T07:00:00Z" + pickup_appointment_at: null + pod_full_out_chassis_number: null + location_at_pod_terminal: "Grounded" + pod_last_tracking_request_at: "2024-06-26T18:47:47Z" + shipment_last_tracking_request_at: "2024-06-26T15:02:11Z" + availability_known: true + pod_timezone: "America/Los_Angeles" + final_destination_timezone: "Asia/Shanghai" + empty_terminated_timezone: "Asia/Shanghai" + pod_rail_carrier_scac: null + ind_rail_carrier_scac: null + pod_rail_loaded_at: null + pod_rail_departed_at: null + ind_eta_at: null + ind_ata_at: null + ind_rail_unloaded_at: null + ind_facility_lfd_on: null + import_deadlines: + pickup_lfd_terminal: "2024-06-27T07:00:00Z" + pickup_lfd_rail: null + pickup_lfd_line: "2024-06-27T07:00:00Z" + relationships: + shipment: + data: + id: "f706cbea-3264-473d-8d26-af257f3bc1be" + type: "shipment" + pickup_facility: + data: null + pod_terminal: + data: + id: "eaa2580c-5f5b-4198-85e4-821145d62098" + type: "terminal" + transport_events: + data: + - + id: "1bb3a814-edab-403f-8ef2-a6d0966df423" + type: "transport_event" + - + id: "19f197bf-444c-40ee-8478-6f02abe715a9" + type: "transport_event" + - + id: "4c9223bb-0218-4175-8a2e-7bb99c40642a" + type: "transport_event" + - + id: "432da964-6e99-45e9-b4b1-00b7be858591" + type: "transport_event" + - + id: "b462b4d1-1e02-4037-af7f-6c8fa981f268" + type: "transport_event" + - + id: "e3ca4a25-692f-474a-aa71-48fb9840aef1" + type: "transport_event" + - + id: "014b9d1f-f033-4a3e-89f9-c57569883436" + type: "transport_event" + - + id: "2cec71c9-721a-4060-993f-0ffcf01151cd" + type: "transport_event" + - + id: "24941515-1b5e-4fca-87eb-092e56ed156a" + type: "transport_event" + - + id: "0fd06bc0-1fda-467c-ab67-90a30c6d62ab" + type: "transport_event" + - + id: "0bce915e-b9ba-42a0-a484-136266fe8b9a" + type: "transport_event" + - + id: "582006aa-6547-4712-b964-5637aad839b4" + type: "transport_event" + - + id: "11458420-b354-4288-a275-7572d3c60e33" + type: "transport_event" + - + id: "5c900fa1-11bf-4f96-89e7-b12f6a98edc4" + type: "transport_event" + raw_events: + data: + - + id: "999d7de7-eaed-4313-85df-772a6d24a85e" + type: "raw_event" + - + id: "ac9c2780-240d-443f-87f4-95465fa5447b" + type: "raw_event" + - + id: "a0ee3724-91c3-4b78-af32-2f16e8c2d600" + type: "raw_event" + - + id: "79725b1f-19f7-4fc3-8c69-586e237c1719" + type: "raw_event" + - + id: "4f07f257-ea4f-4e61-94ed-a01598899020" + type: "raw_event" + - + id: "41612acb-b3d4-495f-9138-f34105851d21" + type: "raw_event" + - + id: "84ffdd37-ec39-404a-9b68-d72d8fb96d48" + type: "raw_event" + - + id: "7e9d8a6d-5339-4266-a6fb-22c28f41149f" + type: "raw_event" + - + id: "2359b787-b218-42dc-b9a5-84b608aee671" + type: "raw_event" + - + id: "ea33303e-0e48-4442-9886-0dfe38b726b5" + type: "raw_event" + - + id: "3689d013-8525-418b-92ed-95ec684130b4" + type: "raw_event" + - + id: "a64f7f7e-a6fa-4913-aba0-b28ba189d68b" + type: "raw_event" + - + id: "c264a859-4fcb-4fab-95c0-29be99ec54a4" + type: "raw_event" + - + id: "2aabf25c-9a3e-44bc-b6c8-ed7b1e3c3630" + type: "raw_event" + - + id: "6ae70038-02d7-425a-99c1-8761c69a9033" + type: "raw_event" + - + id: "c30021d8-93e9-4bfd-a978-e9e24de148c8" + type: "raw_event" + - + id: "853f1794-9b94-4118-9970-4e28e549440d" + type: "container" + attributes: + number: "TGHU6578122" + seal_number: null + created_at: "2024-06-26T15:08:30Z" + ref_numbers: [] + pod_arrived_at: "2024-06-23T21:58:00Z" + pod_discharged_at: "2024-06-24T02:28:00Z" + final_destination_full_out_at: null + holds_at_pod_terminal: [] + available_for_pickup: false + equipment_type: "dry" + equipment_length: 40 + equipment_height: "high_cube" + weight_in_lbs: 8898 + pod_full_out_at: null + empty_terminated_at: null + terminal_checked_at: "2024-06-26T18:47:47Z" + fees_at_pod_terminal: [] + pickup_lfd: "2024-06-27T07:00:00Z" + pickup_appointment_at: null + pod_full_out_chassis_number: null + location_at_pod_terminal: "Wheeled" + pod_last_tracking_request_at: "2024-06-26T18:47:46Z" + shipment_last_tracking_request_at: "2024-06-26T15:08:30Z" + availability_known: true + pod_timezone: "America/Los_Angeles" + final_destination_timezone: "America/New_York" + empty_terminated_timezone: "America/New_York" + pod_rail_carrier_scac: "BNSF" + ind_rail_carrier_scac: "CSXT" + pod_rail_loaded_at: null + pod_rail_departed_at: null + ind_eta_at: "2024-07-07T08:00:00Z" + ind_ata_at: null + ind_rail_unloaded_at: null + ind_facility_lfd_on: null + import_deadlines: + pickup_lfd_terminal: "2024-06-27T07:00:00Z" + pickup_lfd_rail: null + pickup_lfd_line: "2024-06-27T07:00:00Z" + relationships: + shipment: + data: + id: "f3cfe624-706e-4a0c-89d5-140980d986fd" + type: "shipment" + pickup_facility: + data: + id: "7e4557b9-cc5a-4298-aaec-1a32e90202c9" + type: "terminal" + pod_terminal: + data: + id: "eaa2580c-5f5b-4198-85e4-821145d62098" + type: "terminal" + transport_events: + data: + - + id: "94f687d0-dc6b-4342-8710-cb98bc98716e" + type: "transport_event" + - + id: "a8d0a842-95fe-4c12-a80e-bd12e87a1421" + type: "transport_event" + - + id: "c1f1a186-3737-41ca-ae2b-f79a17519991" + type: "transport_event" + - + id: "7fcc5496-d402-4b1c-a6c5-8514e6433070" + type: "transport_event" + - + id: "ab7cd84a-edc5-476d-a1c4-190011582314" + type: "transport_event" + - + id: "68d91384-3eb3-4d21-ac7a-c1f688f649c2" + type: "transport_event" + - + id: "5a702f46-4356-4570-bd2e-2b8adab5ba3e" + type: "transport_event" + raw_events: + data: + - + id: "a4b7e4b6-5227-4f34-9e91-9e75223798ae" + type: "raw_event" + - + id: "4f3e3c7b-d1e6-4fde-b95e-ce9a8835445c" + type: "raw_event" + - + id: "39e8570d-1a8f-4e10-8d2e-ac930abc5971" + type: "raw_event" + - + id: "b8015a72-9741-4fbf-8adc-d30b87de6aa3" + type: "raw_event" + - + id: "61512b1a-a94e-4cac-8bab-763588dbbddf" + type: "raw_event" + - + id: "c0bf87f2-37c3-4895-90b0-9f97ac4b5c13" + type: "raw_event" + - + id: "3856c7e7-f832-42ca-873b-096952599e29" + type: "raw_event" + - + id: "485be998-0861-4d10-8a60-f66d27eb46a7" + type: "raw_event" + - + id: "29cde194-bbd9-40c2-adba-5dcb1514f5fc" + type: "raw_event" + - + id: "681d713d-bcd6-4303-b082-b9f893e7d1d9" + type: "container" + attributes: + number: "CSNU8439129" + seal_number: null + created_at: "2024-06-26T15:02:32Z" + ref_numbers: [] + pod_arrived_at: "2024-06-23T21:58:00Z" + pod_discharged_at: "2024-06-26T04:30:00Z" + final_destination_full_out_at: null + holds_at_pod_terminal: [] + available_for_pickup: true + equipment_type: "dry" + equipment_length: 40 + equipment_height: "high_cube" + weight_in_lbs: 40488 + pod_full_out_at: null + empty_terminated_at: null + terminal_checked_at: "2024-06-26T18:47:47Z" + fees_at_pod_terminal: [] + pickup_lfd: "2024-07-01T07:00:00Z" + pickup_appointment_at: "2024-06-28T15:00:00Z" + pod_full_out_chassis_number: null + location_at_pod_terminal: "Grounded" + pod_last_tracking_request_at: "2024-06-26T18:47:46Z" + shipment_last_tracking_request_at: "2024-06-26T15:02:32Z" + availability_known: true + pod_timezone: "America/Los_Angeles" + final_destination_timezone: "America/Chicago" + empty_terminated_timezone: "America/Chicago" + pod_rail_carrier_scac: "BNSF" + ind_rail_carrier_scac: "BNSF" + pod_rail_loaded_at: null + pod_rail_departed_at: null + ind_eta_at: "2024-07-04T22:00:00Z" + ind_ata_at: null + ind_rail_unloaded_at: null + ind_facility_lfd_on: null + import_deadlines: + pickup_lfd_terminal: "2024-07-01T07:00:00Z" + pickup_lfd_rail: null + pickup_lfd_line: "2024-07-01T07:00:00Z" + relationships: + shipment: + data: + id: "edd626cf-b0b5-4679-8a6c-80c8e9fe7698" + type: "shipment" + pickup_facility: + data: + id: "572b372f-21c7-4403-8fb0-948377c74642" + type: "terminal" + pod_terminal: + data: + id: "eaa2580c-5f5b-4198-85e4-821145d62098" + type: "terminal" + transport_events: + data: + - + id: "9d19125a-2944-442c-8132-bf0d83670e5c" + type: "transport_event" + - + id: "b2ff0b47-3151-41e2-8c46-7f95cdbe4167" + type: "transport_event" + - + id: "e52feaa3-7a50-4570-a2ea-bf06f955ce23" + type: "transport_event" + - + id: "c56d95e5-774f-432c-b6f4-c53967f07292" + type: "transport_event" + - + id: "9b1d8b48-e870-46fa-bc46-10f9b30c64d4" + type: "transport_event" + - + id: "3e1d3571-6b24-4ad2-a071-4e70d59af521" + type: "transport_event" + - + id: "60f5eefe-13d5-4f85-9b65-d13b4c67115a" + type: "transport_event" + raw_events: + data: + - + id: "2af51127-0971-4741-9b97-ea1b338e3a7c" + type: "raw_event" + - + id: "4472ded6-eb69-4f21-8666-9a4f2342dfeb" + type: "raw_event" + - + id: "ce238754-d5fd-4dc8-9f55-2ac6efdfbb5e" + type: "raw_event" + - + id: "5cd3b5ef-843f-4f60-87ce-5beaeea86f7b" + type: "raw_event" + - + id: "55291737-98b6-403c-9424-1605e6e01007" + type: "raw_event" + - + id: "cdc55ea8-a075-45b3-9570-ade6fb2f0d94" + type: "raw_event" + - + id: "c0ab5406-4e10-4fdc-85a4-e17ce8d956f5" + type: "raw_event" + - + id: "965f0172-1c20-4342-a44a-7be0e594ff76" + type: "raw_event" + - + id: "db178011-c795-42a4-9537-b4e77ffb4f98" + type: "raw_event" + meta: + size: 5 + total: 59229 + links: + self: "https://api.terminal49.com/v2/containers?page[size]=5" + current: "https://api.terminal49.com/v2/containers?page[number]=1&page[size]=5" + next: "https://api.terminal49.com/v2/containers?page[number]=2&page[size]=5" + last: "https://api.terminal49.com/v2/containers?page[number]=11846&page[size]=5" + operationId: "get-containers" + description: "Returns a list of container. The containers are returned sorted by creation date, with the most recently refreshed containers appearing first.\n\nThis API will return all containers associated with the account." + parameters: + - + schema: + type: "integer" + default: 1 + in: "query" + name: "page[number]" + - + schema: + type: "integer" + default: 30 + in: "query" + name: "page[size]" + description: "" + - + schema: + type: "string" + in: "query" + name: "include" + description: "Comma delimited list of relations to include" + - + schema: + type: "integer" + in: "query" + name: "terminal_checked_before" + description: "Number of seconds in which containers were refreshed" +patch: + summary: "Edit a container" + operationId: "patch-containers-id" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/container" + description: "Update a container" + tags: + - "Containers" + requestBody: + content: + application/json: + schema: + type: "object" + properties: + data: + type: "object" + required: + - "attributes" + - "type" + properties: + attributes: + type: "object" + properties: + ref_numbers: + type: "array" + items: + type: "string" + example: "REF-12345" diff --git a/docs/openapi/paths/metro-areas-id.yaml b/docs/openapi/paths/metro-areas-id.yaml new file mode 100644 index 00000000..68b2ab1a --- /dev/null +++ b/docs/openapi/paths/metro-areas-id.yaml @@ -0,0 +1,23 @@ +parameters: + - + schema: + type: "string" + name: "id" + in: "path" + required: true +get: + summary: "Get a metro area using the un/locode or the id" + tags: + - "Metro Areas" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/metro_area" + operationId: "get-metro-area-id" + description: "Return the details of a single metro area." diff --git a/docs/openapi/paths/parties-id.yaml b/docs/openapi/paths/parties-id.yaml new file mode 100644 index 00000000..115ee335 --- /dev/null +++ b/docs/openapi/paths/parties-id.yaml @@ -0,0 +1,86 @@ +parameters: + - + schema: + type: "string" + name: "id" + in: "path" + required: true +get: + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/party" + links: + $ref: "#/components/schemas/link-self" + operationId: "get-parties-id" + description: "Returns a party by it's given identifier" + tags: + - "Parties" +patch: + description: "Updates a party" + operationId: "edit-party" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/party" + links: + $ref: "#/components/schemas/link-self" + 422: + description: "Unprocessable Entity" + content: + application/json: + schema: + type: "object" + properties: + errors: + type: "array" + items: + $ref: "#/components/schemas/error" + examples: + Error Examples: + value: + errors: + - + status: "422" + source: + pointer: "/data/attributes/company_name" + title: "Unprocessable Entity" + detail: "Company name can't be blank" + - + status: "422" + source: + pointer: "/data/attributes/customer" + title: "Unprocessable Entity" + detail: "'XXXX' already exists in Account" + requestBody: + content: + application/json: + schema: + type: "object" + properties: + data: + type: "object" + required: + - "attributes" + properties: + attributes: + type: "object" + properties: + company_name: + type: "string" + example: "COMPANY NAME" + description: "The name of the company" + tags: + - "Parties" diff --git a/docs/openapi/paths/parties.yaml b/docs/openapi/paths/parties.yaml new file mode 100644 index 00000000..a9975a04 --- /dev/null +++ b/docs/openapi/paths/parties.yaml @@ -0,0 +1,108 @@ +get: + description: "Get a list of parties" + operationId: "list-parties" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + type: "array" + items: + $ref: "#/components/schemas/party" + links: + $ref: "#/components/schemas/links" + meta: + $ref: "#/components/schemas/meta" + parameters: + - + schema: + type: "integer" + default: 1 + in: "query" + name: "page[number]" + - + schema: + type: "integer" + default: 25 + in: "query" + name: "page[size]" + description: "" + tags: + - "Parties" +post: + description: "Creates a new party" + operationId: "post-party" + responses: + 201: + description: "Party Created" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/party" + links: + $ref: "#/components/schemas/link-self" + examples: + New Party: + value: + data: + id: "ba4cb904-827f-4038-8e31-1e92b3356218" + type: "party" + attributes: + company_name: "COMPANY NAME" + links: + self: "/v2/parties/ba4cb904-827f-4038-8e31-1e92b3356218" + headers: {} + 422: + description: "Unprocessable Entity" + content: + application/json: + schema: + type: "object" + properties: + errors: + type: "array" + items: + $ref: "#/components/schemas/error" + examples: + Error Examples: + value: + errors: + - + status: "422" + source: + pointer: "/data/attributes/company_name" + title: "Unprocessable Entity" + detail: "Company name can't be blank" + - + status: "422" + source: + pointer: "/data/attributes/customer" + title: "Unprocessable Entity" + detail: "'XXXX' already exists in Account" + requestBody: + content: + application/json: + schema: + type: "object" + properties: + data: + type: "object" + required: + - "attributes" + properties: + attributes: + type: "object" + properties: + company_name: + type: "string" + example: "COMPANY NAME" + description: "The name of the company" + tags: + - "Parties" diff --git a/docs/openapi/paths/ports-id.yaml b/docs/openapi/paths/ports-id.yaml new file mode 100644 index 00000000..fbc3a1f1 --- /dev/null +++ b/docs/openapi/paths/ports-id.yaml @@ -0,0 +1,23 @@ +parameters: + - + schema: + type: "string" + name: "id" + in: "path" + required: true +get: + summary: "Get a port using the locode or the id" + tags: + - "Ports" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/port" + operationId: "get-port-id" + description: "Return the details of a single port." diff --git a/docs/openapi/paths/shipments-id-resume-tracking.yaml b/docs/openapi/paths/shipments-id-resume-tracking.yaml new file mode 100644 index 00000000..12b1d0af --- /dev/null +++ b/docs/openapi/paths/shipments-id-resume-tracking.yaml @@ -0,0 +1,23 @@ +parameters: + - + schema: + type: "string" + name: "id" + in: "path" + required: true +patch: + summary: "Resume tracking a shipment" + operationId: "patch-shipments-id-resume-tracking" + tags: + - "Shipments" + description: "Resume tracking a shipment. Keep in mind that some information is only made available by our data sources at specific times, so a stopped and resumed shipment may have some information missing." + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/shipment" diff --git a/docs/openapi/paths/shipments-id-stop-tracking.yaml b/docs/openapi/paths/shipments-id-stop-tracking.yaml new file mode 100644 index 00000000..ae89bae5 --- /dev/null +++ b/docs/openapi/paths/shipments-id-stop-tracking.yaml @@ -0,0 +1,23 @@ +parameters: + - + schema: + type: "string" + name: "id" + in: "path" + required: true +patch: + summary: "Stop tracking a shipment" + operationId: "patch-shipments-id-stop-tracking" + tags: + - "Shipments" + description: "We'll stop tracking the shipment, which means that there will be no more updates. You can still access the shipment's previously-collected information via the API or dashboard.\n\nYou can resume tracking a shipment by calling the `resume_tracking` endpoint, but keep in mind that some information is only made available by our data sources at specific times, so a stopped and resumed shipment may have some information missing." + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/shipment" diff --git a/docs/openapi/paths/shipments-id.yaml b/docs/openapi/paths/shipments-id.yaml new file mode 100644 index 00000000..ad354219 --- /dev/null +++ b/docs/openapi/paths/shipments-id.yaml @@ -0,0 +1,397 @@ +parameters: + - + schema: + type: "string" + name: "id" + in: "path" + required: true + description: "Shipment Id" +get: + summary: "Get a shipment" + tags: + - "Shipments" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/shipment" + included: + type: "array" + items: + anyOf: + - + $ref: "#/components/schemas/container" + - + $ref: "#/components/schemas/port" + - + $ref: "#/components/schemas/terminal" + examples: + En-route to NY with inland move: + value: + data: + id: "02b1bd6f-407c-45bb-8645-06e7ee34e7e3" + type: "shipment" + attributes: + created_at: "2024-06-26T15:05:20Z" + ref_numbers: [] + tags: [] + bill_of_lading_number: "MEDUF5399896" + normalized_number: "MEDUF5399896" + shipping_line_scac: "MSCU" + shipping_line_name: "Mediterranean Shipping Company" + shipping_line_short_name: "MSC" + customer_name: "Sodor Steamworks" + port_of_lading_locode: "FRLEH" + port_of_lading_name: "Le Havre" + port_of_discharge_locode: "USNYC" + port_of_discharge_name: "New York / New Jersey" + pod_vessel_name: "MSC ANISHA R." + pod_vessel_imo: "9227297" + pod_voyage_number: "421A" + destination_locode: "USIND" + destination_name: "Indianapolis" + destination_timezone: "US/Eastern" + destination_ata_at: null + destination_eta_at: null + pol_etd_at: null + pol_atd_at: "2024-06-11T22:00:00Z" + pol_timezone: "Europe/Paris" + pod_eta_at: null + pod_original_eta_at: null + pod_ata_at: null + pod_timezone: "America/New_York" + line_tracking_last_attempted_at: "2024-06-26T15:05:20Z" + line_tracking_last_succeeded_at: "2024-06-26T15:05:20Z" + line_tracking_stopped_at: null + line_tracking_stopped_reason: null + links: + self: "/v2/shipments/02b1bd6f-407c-45bb-8645-06e7ee34e7e3" + relationships: + port_of_lading: + data: + id: "fe7fc831-8a81-4079-8938-b90015912e8b" + type: "port" + port_of_discharge: + data: + id: "f7cb530a-9e60-412c-a5bc-205a2f34ba54" + type: "port" + pod_terminal: + data: + id: "b859f5c3-8515-41da-bf20-39c0a5ada887" + type: "terminal" + destination: + data: + id: "e1e492f6-c8ba-45a9-ad1a-67a7e74547ce" + type: "port" + destination_terminal: + data: null + line_tracking_stopped_by_user: + data: null + containers: + data: + - + id: "55a700e4-7005-45a9-92fd-1ff38641dbd9" + type: "container" + links: + self: "https://api.terminal49.com/v2/shipments/02b1bd6f-407c-45bb-8645-06e7ee34e7e3?include=containers" + included: + - + id: "55a700e4-7005-45a9-92fd-1ff38641dbd9" + type: "container" + attributes: + number: "CAIU7432986" + seal_number: null + created_at: "2024-06-26T15:05:21Z" + ref_numbers: [] + pod_arrived_at: null + pod_discharged_at: "2024-06-22T04:00:00Z" + final_destination_full_out_at: null + holds_at_pod_terminal: [] + available_for_pickup: true + equipment_type: "dry" + equipment_length: 40 + equipment_height: "high_cube" + weight_in_lbs: null + pod_full_out_at: null + empty_terminated_at: null + terminal_checked_at: "2024-06-26T17:51:12Z" + fees_at_pod_terminal: [] + pickup_lfd: "2024-07-07T04:00:00Z" + pickup_appointment_at: null + pod_full_out_chassis_number: null + location_at_pod_terminal: "Yard - Y0709A" + pod_last_tracking_request_at: "2024-06-26T17:51:12Z" + shipment_last_tracking_request_at: "2024-06-26T15:05:20Z" + availability_known: true + pod_timezone: "America/New_York" + final_destination_timezone: "US/Eastern" + empty_terminated_timezone: "US/Eastern" + pod_rail_carrier_scac: "CSXT" + ind_rail_carrier_scac: "CSXT" + pod_rail_loaded_at: null + pod_rail_departed_at: null + ind_eta_at: null + ind_ata_at: null + ind_rail_unloaded_at: null + ind_facility_lfd_on: null + import_deadlines: + pickup_lfd_terminal: "2024-07-07T04:00:00Z" + pickup_lfd_rail: null + pickup_lfd_line: "2024-07-07T04:00:00Z" + relationships: + shipment: + data: + id: "02b1bd6f-407c-45bb-8645-06e7ee34e7e3" + type: "shipment" + pickup_facility: + data: null + pod_terminal: + data: + id: "b859f5c3-8515-41da-bf20-39c0a5ada887" + type: "terminal" + transport_events: + data: + - + id: "45b542cb-332b-4684-b915-42e3a0759823" + type: "transport_event" + - + id: "174ed528-a1a9-4002-aef0-f2c9369199da" + type: "transport_event" + - + id: "7a2f30a6-a756-4c14-9477-fbfc1c7fe2f8" + type: "transport_event" + - + id: "e7365004-175a-46e8-96cd-dbed0f3daf21" + type: "transport_event" + - + id: "7c567bf3-7f01-4a3d-a176-eaa1f7165585" + type: "transport_event" + raw_events: + data: + - + id: "2956f71c-bfb9-4e49-b9e2-1b4d53c74cac" + type: "raw_event" + - + id: "391e0eda-65b5-4fc3-a53d-25ecd9570259" + type: "raw_event" + - + id: "74810c04-6c8a-4194-8cff-52936584a965" + type: "raw_event" + - + id: "4b1500e2-b23b-4896-87bd-c38b1d16f385" + type: "raw_event" + - + id: "8b9a7d88-720a-4304-8c1e-a3336e39f481" + type: "raw_event" + - + id: "bf1f59c5-5dd8-4013-87f9-d7056bc87114" + type: "raw_event" + 404: + description: "Not Found" + content: + application/json: + schema: + type: "object" + properties: + errors: + type: "array" + items: + $ref: "#/components/schemas/error" + examples: + En-route to NY with inland move: + value: + data: + id: "512ae32c-a604-44f8-9c15-2ca9cd3d2ae8" + type: "shipment" + attributes: + bill_of_lading_number: "6140575020" + ref_numbers: + - "my-ref-49" + - "PO#18412" + created_at: "2020-02-20T13:37:12Z" + tags: [] + port_of_lading_locode: "INVTZ" + port_of_lading_name: "Visakhapatnam, IN" + port_of_discharge_locode: "USNYC" + port_of_discharge_name: "New York / New Jersey, NY" + destination_locode: "USDET" + destination_name: "Detroit, MI" + shipping_line_scac: "HLCU" + pod_vessel_name: "CMA CGM ALMAVIVA" + pod_voyage_number: "0108" + pol_etd_at: null + pol_atd_at: "2020-02-15T21:53Z" + pol_timezone: "Asia/Calcutta" + pod_eta_at: "2020-03-18T08:00Z" + pod_ata_at: null + pod_timezone: "America/New_York" + destination_eta_at: "2020-03-26T17:00Z" + destination_ata_at: null + destination_timezone: "America/Detroit" + relationships: + containers: + data: + - + id: "c99a81c0-ff69-4bdf-aa5f-8e33a787f5fa" + type: "container" + port_of_lading: + data: + id: "bde5465a-1160-4fde-a026-74df9c362f65" + type: "port" + port_of_discharge: + data: + id: "f7cb530a-9e60-412c-a5bc-205a2f34ba54" + type: "port" + destination: + data: + id: "c9ae2b6b-5088-4e07-ba09-2872121e4fa2" + type: "metro_area" + customer: + data: + id: "ff76b51a-371e-45ec-86d1-9d03ccae566a" + type: "account" + included: + - + id: "c99a81c0-ff69-4bdf-aa5f-8e33a787f5fa" + type: "container" + attributes: + number: "UACU4743531" + equipment_type: "reefer" + length: 40 + height: "high_cube" + weight_in_lbs: 35075 + created_at: "2020-02-20T08:19:52Z" + seal_number: null + pickup_lfd: null + availability_known: false + available_for_pickup: null + current_transportation_mode: "vessel" + pod_discharged_at: null + pod_picked_up_at: null + destination_unloaded_at: null + destination_picked_up_at: null + empty_returned_at: null + pod_timezone: "America/Los_Angeles" + final_destination_timezone: null + empty_terminated_timezone: null + relationships: + most_recent_location: + data: + id: "dd179094-a1d4-4129-842d-b952e43df4b7" + type: "port" + shipment: + data: + id: "512ae32c-a604-44f8-9c15-2ca9cd3d2ae8" + type: "shipment" + - + id: "bde5465a-1160-4fde-a026-74df9c362f65" + type: "port" + attributes: + name: "Visakhapatnam" + code: "INVTZ" + country_code: "IN" + timezone: "Asia/Calcutta" + - + id: "dd179094-a1d4-4129-842d-b952e43df4b7" + type: "port" + attributes: + name: "Damietta" + code: "EGDAM" + country_code: "EG" + time_zone: "Africa/Cairo" + - + id: "f7cb530a-9e60-412c-a5bc-205a2f34ba54" + type: "port" + attributes: + name: "New York / New Jersey" + code: "USNYC" + country_code: "US" + timezone: "America/New_York" + - + id: "c9ae2b6b-5088-4e07-ba09-2872121e4fa2" + type: "metro_area" + attributes: + name: "Detroit" + code: "USDET" + country_code: "US" + state_abbr: "MI" + timezone: "America/Detroit" + - + id: "ff76b51a-371e-45ec-86d1-9d03ccae566a" + type: "account" + attributes: + name: "A-Z Imports" + - + id: "252a5450-2893-4207-b5c4-81ce3152ce84" + type: "vessel" + attributes: + name: "CMA CGM ALMAVIVA" + imo: "9450648" + mmsi: "228339600" + latitude: 70.22625823437389 + longitude: 45.06279126658865 + nautical_speed_knots: 100 + navigational_heading_degrees: 1 + position_timestamp: "2023-06-05T19:46:18Z" + operationId: "get-shipment-id" + description: "Retrieves the details of an existing shipment. You need only supply the unique shipment `id` that was returned upon `tracking_request` creation." + parameters: + - + schema: + type: "string" + in: "query" + name: "include" + description: "Comma delimited list of relations to include" +patch: + summary: "Edit a shipment" + operationId: "patch-shipments-id" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/shipment" + description: "Update a shipment" + tags: + - "Shipments" + requestBody: + content: + application/json: + schema: + type: "object" + properties: + data: + type: "object" + required: + - "attributes" + properties: + attributes: + type: "object" + properties: + ref_numbers: + type: "array" + example: + - "REFNUMBER10" + description: "Shipment ref numbers." + items: + type: "string" + shipment_tags: + type: "array" + x-stoplight: + id: "02itol38fmg55" + uniqueItems: true + description: "Tags related to a shipment" + items: + x-stoplight: + id: "64x90wvr9d6nd" + type: "string" + example: "tag1, tag2" diff --git a/docs/openapi/paths/shipments.yaml b/docs/openapi/paths/shipments.yaml new file mode 100644 index 00000000..7f29b738 --- /dev/null +++ b/docs/openapi/paths/shipments.yaml @@ -0,0 +1,450 @@ +get: + summary: "List shipments" + tags: + - "Shipments" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + type: "array" + items: + $ref: "#/components/schemas/shipment" + included: + type: "array" + items: + anyOf: + - + $ref: "#/components/schemas/container" + - + $ref: "#/components/schemas/port" + - + $ref: "#/components/schemas/terminal" + links: + $ref: "#/components/schemas/links" + meta: + $ref: "#/components/schemas/meta" + examples: + En-route to NY with inland move: + value: + data: + - + id: "62738624-7032-4a50-892e-c55826228c25" + type: "shipment" + attributes: + created_at: "2024-06-26T17:28:59Z" + ref_numbers: [] + tags: [] + bill_of_lading_number: "OOLU2148468620" + normalized_number: "2148468620" + shipping_line_scac: "OOLU" + shipping_line_name: "Orient Overseas Container Line" + shipping_line_short_name: "OOCL" + customer_name: "Sodor Steamworks" + port_of_lading_locode: "CNNBG" + port_of_lading_name: "Ningbo" + port_of_discharge_locode: "USLAX" + port_of_discharge_name: "Los Angeles" + pod_vessel_name: "EVER FORWARD" + pod_vessel_imo: "9850551" + pod_voyage_number: "1119E" + destination_locode: "USCLE" + destination_name: "Cleveland" + destination_timezone: "America/New_York" + destination_ata_at: null + destination_eta_at: "2024-07-02T08:00:00Z" + pol_etd_at: null + pol_atd_at: "2024-06-09T03:42:00Z" + pol_timezone: "Asia/Shanghai" + pod_eta_at: null + pod_original_eta_at: null + pod_ata_at: "2024-06-22T13:36:00Z" + pod_timezone: "America/Los_Angeles" + line_tracking_last_attempted_at: "2024-06-26T17:28:59Z" + line_tracking_last_succeeded_at: "2024-06-26T17:28:59Z" + line_tracking_stopped_at: null + line_tracking_stopped_reason: null + links: + self: "/v2/shipments/62738624-7032-4a50-892e-c55826228c25" + relationships: + port_of_lading: + data: + id: "2a90c27b-c2ee-45e2-892f-5c695d74e2d0" + type: "port" + port_of_discharge: + data: + id: "47b27584-4ec9-4e2f-95e1-7a42928cc40c" + type: "port" + pod_terminal: + data: + id: "42c53b13-0d29-4fa6-8663-7343a56319f1" + type: "terminal" + destination: + data: + id: "3b1cc325-ffe9-400a-82ce-f5c4891af382" + type: "port" + destination_terminal: + data: + id: "ce22669e-14b2-4501-b782-f0a360f07cd0" + type: "terminal" + line_tracking_stopped_by_user: + data: null + containers: + data: + - + id: "7aefc29e-0898-4825-8376-4f998b51d033" + type: "container" + - + id: "baaa725e-aa0e-4937-ac78-54d9e2e8621e" + type: "shipment" + attributes: + created_at: "2024-06-26T16:47:42Z" + ref_numbers: [] + tags: [] + bill_of_lading_number: "HDMUTAOM72244900" + normalized_number: "TAOM72244900" + shipping_line_scac: "HDMU" + shipping_line_name: "Hyundai Merchant Marine" + shipping_line_short_name: "Hyundai" + customer_name: "Sodor Steamworks" + port_of_lading_locode: "CNQDG" + port_of_lading_name: "Qingdao" + port_of_discharge_locode: "USSAV" + port_of_discharge_name: "Savannah" + pod_vessel_name: "UMM SALAL" + pod_vessel_imo: "9525857" + pod_voyage_number: "0038E" + destination_locode: "USROQ" + destination_name: "Rossville" + destination_timezone: "America/Chicago" + destination_ata_at: null + destination_eta_at: "2024-06-30T07:05:00Z" + pol_etd_at: null + pol_atd_at: "2024-05-07T03:01:00Z" + pol_timezone: "Asia/Shanghai" + pod_eta_at: null + pod_original_eta_at: null + pod_ata_at: "2024-06-20T21:27:00Z" + pod_timezone: "America/New_York" + line_tracking_last_attempted_at: "2024-06-26T16:48:04Z" + line_tracking_last_succeeded_at: "2024-06-26T16:48:04Z" + line_tracking_stopped_at: null + line_tracking_stopped_reason: null + links: + self: "/v2/shipments/baaa725e-aa0e-4937-ac78-54d9e2e8621e" + relationships: + port_of_lading: + data: + id: "0ccbe8af-c8d0-4abd-a842-3bfad1d82024" + type: "port" + port_of_discharge: + data: + id: "6129528d-846e-4571-ae16-b5328a4285ab" + type: "port" + pod_terminal: + data: + id: "a243bdf8-0da3-4056-a6a7-05fe8ab43999" + type: "terminal" + destination: + data: + id: "87ca3f37-e4d1-46eb-9eb1-6b5ffafde95d" + type: "port" + destination_terminal: + data: null + line_tracking_stopped_by_user: + data: null + containers: + data: + - + id: "772cd872-9677-4c68-9b7a-4e9e843b00e2" + type: "container" + - + id: "52efc544-0de1-452f-bcf8-0290a6ce5c11" + type: "container" + - + id: "3107692e-61ad-4b4c-b3d4-78348b2e37ff" + type: "container" + - + id: "7721a48c-5e93-43c9-9f5f-5be10a87fdde" + type: "shipment" + attributes: + created_at: "2024-06-26T16:28:39Z" + ref_numbers: [] + tags: [] + bill_of_lading_number: "OOLU2738424980" + normalized_number: "2738424980" + shipping_line_scac: "OOLU" + shipping_line_name: "Orient Overseas Container Line" + shipping_line_short_name: "OOCL" + customer_name: "Sodor Steamworks" + port_of_lading_locode: "ITSPE" + port_of_lading_name: "La Spezia" + port_of_discharge_locode: "USSAV" + port_of_discharge_name: "Savannah" + pod_vessel_name: "OOCL GUANGZHOU" + pod_vessel_imo: "9404869" + pod_voyage_number: "162E" + destination_locode: "USATL" + destination_name: "Atlanta" + destination_timezone: "America/New_York" + destination_ata_at: null + destination_eta_at: "2024-06-27T06:42:00Z" + pol_etd_at: null + pol_atd_at: "2024-06-05T08:03:00Z" + pol_timezone: "Europe/Rome" + pod_eta_at: null + pod_original_eta_at: null + pod_ata_at: "2024-06-23T15:34:00Z" + pod_timezone: "America/New_York" + line_tracking_last_attempted_at: "2024-06-26T16:28:39Z" + line_tracking_last_succeeded_at: "2024-06-26T16:28:39Z" + line_tracking_stopped_at: null + line_tracking_stopped_reason: null + links: + self: "/v2/shipments/7721a48c-5e93-43c9-9f5f-5be10a87fdde" + relationships: + port_of_lading: + data: + id: "b5656766-a56f-4b32-8e03-d240e7519604" + type: "port" + port_of_discharge: + data: + id: "6129528d-846e-4571-ae16-b5328a4285ab" + type: "port" + pod_terminal: + data: + id: "a243bdf8-0da3-4056-a6a7-05fe8ab43999" + type: "terminal" + destination: + data: + id: "7daf9ea3-3018-4d62-b88c-43803df9030c" + type: "port" + destination_terminal: + data: + id: "022ef8fc-1e2a-4ad6-8eae-330d65eb1c8e" + type: "terminal" + line_tracking_stopped_by_user: + data: null + containers: + data: + - + id: "2a25fd3e-a18e-47cc-9cea-62771e82d0f2" + type: "container" + - + id: "6cdc725d-2b31-40f9-86dd-76225390a488" + type: "container" + - + id: "2f1e9a9d-4689-4f4d-84a8-64409b56521d" + type: "container" + - + id: "32b5ad78-43ba-42d9-bdc0-4cf12320e020" + type: "shipment" + attributes: + created_at: "2024-06-26T15:59:52Z" + ref_numbers: [] + tags: [] + bill_of_lading_number: "OOLU2738277190" + normalized_number: "2738277190" + shipping_line_scac: "OOLU" + shipping_line_name: "Orient Overseas Container Line" + shipping_line_short_name: "OOCL" + customer_name: "Sodor Steamworks" + port_of_lading_locode: "CNQDG" + port_of_lading_name: "Qingdao" + port_of_discharge_locode: "USLAX" + port_of_discharge_name: "Los Angeles" + pod_vessel_name: "EVER FORWARD" + pod_vessel_imo: "9850551" + pod_voyage_number: "1119E" + destination_locode: "USMEM" + destination_name: "Memphis" + destination_timezone: "America/Chicago" + destination_ata_at: null + destination_eta_at: "2024-07-01T14:00:00Z" + pol_etd_at: null + pol_atd_at: "2024-06-02T18:22:00Z" + pol_timezone: "Asia/Shanghai" + pod_eta_at: null + pod_original_eta_at: null + pod_ata_at: "2024-06-22T13:36:00Z" + pod_timezone: "America/Los_Angeles" + line_tracking_last_attempted_at: "2024-06-26T15:59:52Z" + line_tracking_last_succeeded_at: "2024-06-26T15:59:52Z" + line_tracking_stopped_at: null + line_tracking_stopped_reason: null + links: + self: "/v2/shipments/32b5ad78-43ba-42d9-bdc0-4cf12320e020" + relationships: + port_of_lading: + data: + id: "0ccbe8af-c8d0-4abd-a842-3bfad1d82024" + type: "port" + port_of_discharge: + data: + id: "47b27584-4ec9-4e2f-95e1-7a42928cc40c" + type: "port" + pod_terminal: + data: + id: "42c53b13-0d29-4fa6-8663-7343a56319f1" + type: "terminal" + destination: + data: + id: "ba0b9f68-2025-40ca-ae12-1c2210cca333" + type: "port" + destination_terminal: + data: + id: "d0ec0da1-8a3a-4b11-b1e3-5716bbc71dc3" + type: "terminal" + line_tracking_stopped_by_user: + data: null + containers: + data: + - + id: "60d2fd62-14e2-4ca2-a927-9633fc58fdff" + type: "container" + - + id: "0ffe3e75-b3df-4d20-b9f4-97bbbcec404d" + type: "container" + - + id: "bd117d3b-8fa4-487c-9bab-25c15e227d1a" + type: "shipment" + attributes: + created_at: "2024-06-26T15:59:35Z" + ref_numbers: [] + tags: [] + bill_of_lading_number: "OOLU2147973020" + normalized_number: "2147973020" + shipping_line_scac: "OOLU" + shipping_line_name: "Orient Overseas Container Line" + shipping_line_short_name: "OOCL" + customer_name: "Sodor Steamworks" + port_of_lading_locode: "IDSUB" + port_of_lading_name: "Surabaya" + port_of_discharge_locode: "USLAX" + port_of_discharge_name: "Los Angeles" + pod_vessel_name: "CMA CGM A.LINCOLN" + pod_vessel_imo: "9780859" + pod_voyage_number: "1TU70E1MA" + destination_locode: null + destination_name: null + destination_timezone: null + destination_ata_at: null + destination_eta_at: null + pol_etd_at: null + pol_atd_at: "2024-05-14T02:37:00Z" + pol_timezone: "Asia/Jakarta" + pod_eta_at: null + pod_original_eta_at: null + pod_ata_at: "2024-06-23T21:58:00Z" + pod_timezone: "America/Los_Angeles" + line_tracking_last_attempted_at: "2024-06-26T15:59:35Z" + line_tracking_last_succeeded_at: "2024-06-26T15:59:35Z" + line_tracking_stopped_at: null + line_tracking_stopped_reason: null + links: + self: "/v2/shipments/bd117d3b-8fa4-487c-9bab-25c15e227d1a" + relationships: + port_of_lading: + data: + id: "4201ab42-c51f-48ac-b7a1-12146e02c6a2" + type: "port" + port_of_discharge: + data: + id: "47b27584-4ec9-4e2f-95e1-7a42928cc40c" + type: "port" + pod_terminal: + data: + id: "eaa2580c-5f5b-4198-85e4-821145d62098" + type: "terminal" + destination: + data: null + destination_terminal: + data: null + line_tracking_stopped_by_user: + data: null + containers: + data: + - + id: "815ff702-fdb5-4455-a28e-314c345d7481" + type: "container" + meta: + size: 5 + total: 34044 + links: + self: "https://api.terminal49.com/v2/shipments?page[size]=5" + current: "https://api.terminal49.com/v2/shipments?page[number]=1&page[size]=5" + next: "https://api.terminal49.com/v2/shipments?page[number]=2&page[size]=5" + last: "https://api.terminal49.com/v2/shipments?page[number]=6809&page[size]=5" + 422: + description: "Unprocessable Entity" + content: + application/json: + schema: + type: "object" + properties: + errors: + type: "array" + items: + $ref: "#/components/schemas/error" + examples: + Errors: + value: + error: + - + title: "Invalid arrival_date_from" + detail: "filter['arrival_from'] must be in the format 'YYYY-MM-DD' and a valid date" + - + title: "Invalid arrival_date_to" + detail: "filter['arrival_from'] must be in the format 'YYYY-MM-DD' and a valid date" + - + title: "Invalid port_of_lading" + detail: "port_of_discharge must be an array of 5 character UN/LOCODEs" + - + title: "Invalid port_of_discharge" + detail: "port_of_discharge must be an array of 5 character UN/LOCODEs" + operationId: "get-shipments" + description: "Returns a list of your shipments. The shipments are returned sorted by creation date, with the most recent shipments appearing first.\n\nThis api will return all shipments associated with the account. Shipments created via the `tracking_request` API aswell as the ones added via the dashboard will be retuned via this endpoint. " + parameters: + - + schema: + type: "integer" + default: 1 + in: "query" + name: "page[number]" + description: "\n" + - + schema: + type: "integer" + default: 30 + in: "query" + name: "page[size]" + description: "\n" + - + schema: + type: "string" + in: "query" + name: "q" + description: "\nSearch shipments by master bill of lading, reference number, or container number." + deprecated: true + - + schema: + type: "string" + in: "query" + name: "include" + description: "Comma delimited list of relations to include" + - + schema: + type: "string" + in: "query" + name: "number" + description: "Search shipments by the original request tracking `request_number`" + - + schema: + type: "boolean" + in: "query" + name: "filter[tracking_stopped]" + description: "Filter shipments by whether they are still tracking or not" diff --git a/docs/openapi/paths/shipping-lines-id.yaml b/docs/openapi/paths/shipping-lines-id.yaml new file mode 100644 index 00000000..a0a17168 --- /dev/null +++ b/docs/openapi/paths/shipping-lines-id.yaml @@ -0,0 +1,23 @@ +parameters: + - + schema: + type: "string" + name: "id" + in: "path" + required: true +get: + summary: "Get a single shipping line" + tags: + - "Shipping Lines" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/shipping_line" + operationId: "get-shipping_lines-id" + description: "Return the details of a single shipping line." diff --git a/docs/openapi/paths/shipping-lines.yaml b/docs/openapi/paths/shipping-lines.yaml new file mode 100644 index 00000000..f798a750 --- /dev/null +++ b/docs/openapi/paths/shipping-lines.yaml @@ -0,0 +1,20 @@ +get: + summary: "Shipping Lines" + tags: + - "Shipping Lines" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + type: "array" + items: + $ref: "#/components/schemas/shipping_line" + links: + $ref: "#/components/schemas/links" + operationId: "get-shipping_lines" + description: "Return a list of shipping lines supported by Terminal49. \nN.B. There is no pagination for this endpoint." diff --git a/docs/openapi/paths/terminals-id.yaml b/docs/openapi/paths/terminals-id.yaml new file mode 100644 index 00000000..b7ba0db4 --- /dev/null +++ b/docs/openapi/paths/terminals-id.yaml @@ -0,0 +1,23 @@ +parameters: + - + schema: + type: "string" + name: "id" + in: "path" + required: true +get: + summary: "Get a terminal using the id" + tags: + - "Terminals" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/terminal" + operationId: "get-terminal-id" + description: "Return the details of a single terminal." diff --git a/docs/openapi/paths/tracking-requests-id.yaml b/docs/openapi/paths/tracking-requests-id.yaml new file mode 100644 index 00000000..5cea3445 --- /dev/null +++ b/docs/openapi/paths/tracking-requests-id.yaml @@ -0,0 +1,252 @@ +parameters: + - + schema: + type: "string" + name: "id" + in: "path" + required: true + description: "Tracking Request ID" +get: + summary: "Get a single tracking request" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/tracking_request" + included: + type: "array" + items: + anyOf: + - + $ref: "#/components/schemas/account" + - + $ref: "#/components/schemas/shipment" + - + $ref: "#/components/schemas/shipping_line" + examples: + With Status Created: + value: + data: + id: "ba4cb904-827f-4038-8e31-1e92b3356218" + type: "tracking_request" + attributes: + request_number: "MEDUFR030802" + request_type: "bill_of_lading" + scac: "MSCU" + ref_numbers: [] + created_at: "2020-04-04T16:13:35-07:00" + updated_at: "2020-04-04T17:13:35-07:00" + status: "created" + failed_reason: null + relationships: + tracked_object: + data: + id: "eb6f218a-0b4a-47f9-8ef9-759aa5e0ea83" + type: "shipment" + links: + self: "/v2/tracking_requests/ba4cb904-827f-4038-8e31-1e92b3356218" + included: + - + id: "eb6f218a-0b4a-47f9-8ef9-759aa5e0ea83" + type: "shipment" + attributes: + created_at: "2020-04-04T16:13:37-07:00" + bill_of_lading_number: "MEDUFR030802" + ref_numbers: [] + shipping_line_scac: "MSCU" + shipping_line_name: "Mediterranean Shipping Company" + port_of_lading_locode: "FRFOS" + port_of_lading_name: "Fos-Sur-Mer" + port_of_discharge_locode: "USOAK" + port_of_discharge_name: "Oakland" + pod_vessel_name: "MSC ALGECIRAS" + pod_vessel_imo: "9605243" + pod_voyage_number: "920A" + destination_locode: "USOAK" + destination_name: "Oakland" + destination_timezone: "America/Los_Angeles" + destination_ata_at: "2019-06-21T18:46:00-07:00" + destination_eta_at: null + pol_etd_at: null + pol_atd_at: "2019-05-24T03:00:00-07:00" + pol_timezone: "Europe/Paris" + pod_eta_at: null + pod_ata_at: "2019-06-21T18:46:00-07:00" + pod_timezone: "America/Los_Angeles" + relationships: + port_of_lading: + data: + id: "6d8c6c29-72a6-49ad-87b7-fd045f202212" + type: "port" + port_of_discharge: + data: + id: "42d1ba3a-f4b8-431d-a6fe-49fd748a59e7" + type: "port" + pod_terminal: + data: null + destination: + data: + id: "42d1ba3a-f4b8-431d-a6fe-49fd748a59e7" + type: "port" + containers: + data: + - + id: "11c1fa10-52a5-48e2-82f4-5523756b3d0f" + type: "container" + links: + self: "/v2/shipments/eb6f218a-0b4a-47f9-8ef9-759aa5e0ea83" + Multiple containers: + value: + data: + id: "62c30bd4-d7fc-40dc-9fd6-fb39224301f5" + type: "tracking_request" + attributes: + request_number: "212157148" + request_type: "bill_of_lading" + scac: "MAEU" + ref_numbers: [] + shipment_tags: [] + created_at: "2021-07-27T16:44:14Z" + updated_at: "2021-07-27T17:44:14Z" + status: "created" + failed_reason: null + is_retrying: false + retry_count: null + relationships: + tracked_object: + data: + id: "dfc9f601-f6fe-412e-a71c-feabcc2dd4e3" + type: "shipment" + customer: + data: null + links: + self: "/v2/tracking_requests/62c30bd4-d7fc-40dc-9fd6-fb39224301f5" + links: + self: "https://api.terminal49.com/v2/tracking_requests/62c30bd4-d7fc-40dc-9fd6-fb39224301f5?filter%5Bstatus%5D=created" + included: + - + id: "dfc9f601-f6fe-412e-a71c-feabcc2dd4e3" + type: "shipment" + attributes: + created_at: "2021-07-27T16:44:16Z" + ref_numbers: null + tags: [] + bill_of_lading_number: "212157148" + shipping_line_scac: "MAEU" + shipping_line_name: "Maersk" + shipping_line_short_name: "Maersk" + port_of_lading_locode: "MYTPP" + port_of_lading_name: "Tanjung Pelepas" + port_of_discharge_locode: null + port_of_discharge_name: null + pod_vessel_name: null + pod_vessel_imo: null + pod_voyage_number: null + destination_locode: null + destination_name: null + destination_timezone: null + destination_ata_at: null + destination_eta_at: null + pol_etd_at: null + pol_atd_at: null + pol_timezone: "Asia/Kuala_Lumpur" + pod_eta_at: "2021-09-15T15:00:00Z" + pod_ata_at: null + pod_timezone: null + line_tracking_last_attempted_at: null + line_tracking_last_succeeded_at: "2021-07-27T16:44:16Z" + line_tracking_stopped_at: null + line_tracking_stopped_reason: null + relationships: + port_of_lading: + data: + id: "6c387786-252c-476d-9f99-7d835b6b978b" + type: "port" + port_of_discharge: + data: null + pod_terminal: + data: null + destination: + data: null + destination_terminal: + data: null + containers: + data: + - + id: "965880c9-a37e-4ed7-a060-9c49c0f0c5ed" + type: "container" + - + id: "ea1f8e08-fcdf-498d-9cb5-0c370b023eeb" + type: "container" + - + id: "67f55105-8ea2-4137-9244-f9cc204f5766" + type: "container" + - + id: "5ab5d058-772c-466c-bc73-0b8767ad5a79" + type: "container" + links: + self: "/v2/shipments/dfc9f601-f6fe-412e-a71c-feabcc2dd4e3" + 404: + description: "Not Found" + content: + application/json: + schema: + type: "object" + properties: + errors: + type: "array" + items: + $ref: "#/components/schemas/error" + examples: {} + operationId: "get-track-request-by-id" + description: "Get the details and status of an existing tracking request. " + tags: + - "Tracking Requests" + parameters: + - + schema: + type: "string" + in: "query" + name: "include" + description: "Comma delimited list of relations to include. 'tracked_object' is included by default." + x-internal: false +patch: + summary: "Edit a tracking request" + operationId: "patch-track-request-by-id" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/tracking_request" + description: "Update a tracking request" + tags: + - "Tracking Requests" + requestBody: + content: + application/json: + schema: + type: "object" + properties: + data: + type: "object" + required: + - "attributes" + - "type" + properties: + attributes: + type: "object" + properties: + ref_number: + type: "string" + example: "REFNUMBER11" + description: "Tracking request ref number." diff --git a/docs/openapi/paths/tracking-requests.yaml b/docs/openapi/paths/tracking-requests.yaml new file mode 100644 index 00000000..44333a55 --- /dev/null +++ b/docs/openapi/paths/tracking-requests.yaml @@ -0,0 +1,332 @@ +post: + summary: "Create a tracking request" + operationId: "post-track" + responses: + 201: + description: "Tracking Request Created" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/tracking_request" + included: + type: "array" + items: + anyOf: + - + $ref: "#/components/schemas/account" + - + $ref: "#/components/schemas/shipping_line" + examples: + Pending Tracking Request: + value: + data: + id: "ba4cb904-827f-4038-8e31-1e92b3356218" + type: "tracking_request" + attributes: + request_number: "MEDUFR030802" + request_type: "bill_of_lading" + scac: "MSCU" + ref_numbers: [] + created_at: "2020-04-04T16:13:35-07:00" + updated_at: "2020-04-04T17:13:35-07:00" + status: "pending" + failed_reason: null + relationships: + tracked_object: + data: null + customer: + data: + id: "f7cb530a-9e60-412c-a5bc-205a2f34ba54" + type: "party" + links: + self: "/v2/tracking_requests/ba4cb904-827f-4038-8e31-1e92b3356218" + headers: {} + 422: + description: "Unprocessable Entity" + content: + application/json: + schema: + type: "object" + properties: + errors: + type: "array" + items: + $ref: "#/components/schemas/error" + examples: + Error Examples: + value: + errors: + - + status: "422" + source: + pointer: "/data/attributes/scac" + title: "Unprocessable Entity" + detail: "Scac can't be blank" + code: "blank" + - + status: "422" + source: + pointer: "/data/attributes/scac" + title: "Unprocessable Entity" + detail: "Scac 'XXXX' is not recognized" + code: "blank" + - + status: "422" + source: + pointer: "/data/attributes/scac" + title: "Unprocessable Entity" + detail: "Scac 'UALC' is not supported. We do not currently integrate with Universal Africa Lines" + code: "blank" + - + status: "422" + source: + pointer: "/data/attributes/request_number" + title: "Unprocessable Entity" + detail: "Request number can't be blank" + code: "blank" + 429: + description: "Too Many Requests - You've hit the create tracking requests limit. Please try again in a minute." + content: + application/json: + schema: + type: "object" + properties: + errors: + type: "array" + items: + type: "object" + properties: + status: + type: "string" + example: "429" + title: + type: "string" + example: "Too Many Requests" + detail: + type: "string" + example: "You've hit the create tracking requests limit. Please try again in a minute." + headers: + Retry-After: + description: "Number of seconds to wait before making another request" + schema: + type: "integer" + example: 60 + requestBody: + content: + application/json: + schema: + type: "object" + properties: + data: + type: "object" + properties: + attributes: + type: "object" + properties: + request_type: + type: "string" + example: "bill_of_lading" + enum: + - "bill_of_lading" + - "booking_number" + - "container" + description: " The type of document number to be supplied. Container number support is currently in BETA." + request_number: + type: "string" + example: "MEDUFR030802" + scac: + type: "string" + example: "MSCU" + minLength: 4 + maxLength: 4 + ref_numbers: + type: "array" + description: "Optional list of reference numbers to be added to the shipment when tracking request completes" + items: + type: "string" + shipment_tags: + type: "array" + description: "Optional list of tags to be added to the shipment when tracking request completes" + items: + type: "string" + required: + - "request_type" + - "request_number" + - "scac" + relationships: + type: "object" + properties: + customer: + type: "object" + properties: + data: + type: "object" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "party" + type: + enum: + - "tracking_request" + type: "string" + required: + - "type" + examples: + "Example: MSC BL": + value: + data: + attributes: + request_type: "bill_of_lading" + request_number: "MEDUFR030802" + ref_numbers: + - "PO12345" + - "HBL12345" + - "CUSREF1234" + shipment_tags: + - "camembert" + scac: "MSCU" + relationships: + customer: + data: + id: "f7cb530a-9e60-412c-a5bc-205a2f34ba54" + type: "party" + type: "tracking_request" + description: "Create a shipment tracking request" + security: + - + authorization: [] + description: "To track an ocean shipment, you create a new tracking request. \nTwo attributes are required to track a shipment. A `bill of lading/booking number` and a shipping line `SCAC`. \n\nOnce a tracking request is created we will attempt to fetch the shipment details and it's related containers from the shipping line. If the attempt is successful we will create in new shipment object including any related container objects. We will send a `tracking_request.succeeded` webhook notification to your webhooks. \n\nIf the attempt to fetch fails then we will send a `tracking_request.failed` webhook notification to your `webhooks`. \n\nA `tracking_request.succeeded` or `tracking_request.failed` webhook notificaiton will only be sent if you have atleast one active webhook.

This endpoint is limited to 100 tracking requests per minute." + tags: + - "Tracking Requests" + parameters: [] +parameters: [] +get: + summary: "List tracking requests" + operationId: "get-tracking-requests" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + type: "array" + items: + $ref: "#/components/schemas/tracking_request" + links: + $ref: "#/components/schemas/links" + meta: + $ref: "#/components/schemas/meta" + included: + type: "array" + items: + anyOf: + - + $ref: "#/components/schemas/account" + - + $ref: "#/components/schemas/shipping_line" + - + type: "object" + properties: + id: + type: "string" + format: "uuid" + type: + type: "string" + enum: + - "shipment" + links: + type: "object" + properties: + self: + type: "string" + format: "uri" + description: "" + examples: {} + 404: + description: "Not Found" + content: + application/json: + schema: + type: "object" + properties: + errors: + type: "array" + items: + $ref: "#/components/schemas/error" + description: "Returns a list of your tracking requests. The tracking requests are returned sorted by creation date, with the most recent tracking request appearing first." + tags: + - "Tracking Requests" + parameters: + - + schema: + type: "string" + in: "query" + name: "q" + description: "A search term to be applied against request_number and reference_numbers." + deprecated: true + - + schema: + type: "string" + enum: + - "created" + - "pending" + - "failed" + example: "created" + in: "query" + name: "filter[status]" + description: "filter by `status`" + - + schema: + type: "string" + example: "MSCU" + in: "query" + name: "filter[scac]" + description: "filter by shipping line `scac`" + - + schema: + type: "string" + example: "2020-04-28T22:59:15Z" + format: "date-time" + in: "query" + name: "filter[created_at][start]" + description: "filter by tracking_requests `created_at` after a certain ISO8601 timestamp" + - + schema: + type: "string" + format: "date-time" + example: "2020-04-28T22:59:15Z" + in: "query" + description: "filter by tracking_requests `created_at` before a certain ISO8601 timestamp" + name: "filter[created_at][end]" + - + schema: + type: "string" + in: "query" + name: "include" + description: "Comma delimited list of relations to include. 'tracked_object' is included by default." + - + schema: + type: "integer" + in: "query" + name: "page[number]" + - + schema: + type: "integer" + in: "query" + name: "page[size]" + - + schema: + type: "string" + in: "query" + name: "filter[request_number]" + description: "filter by `request_number`" diff --git a/docs/openapi/paths/vessels-id-future-positions-with-coordinates.yaml b/docs/openapi/paths/vessels-id-future-positions-with-coordinates.yaml new file mode 100644 index 00000000..337ddd35 --- /dev/null +++ b/docs/openapi/paths/vessels-id-future-positions-with-coordinates.yaml @@ -0,0 +1,82 @@ +parameters: + - + schema: + type: "string" + name: "id" + in: "path" + required: true +get: + summary: "Get vessel future positions from coordinates" + tags: + - "Routing (Paid)" + - "Vessels" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/vessel_with_positions" + links: + type: "object" + properties: + self: + type: "string" + format: "uri" + 403: + description: "Forbidden - Routing data feature is not enabled for this account" + content: + application/json: + schema: + type: "object" + properties: + errors: + type: "array" + items: + type: "object" + properties: + status: + type: "string" + example: "403" + title: + type: "string" + example: "Forbidden" + detail: + type: "string" + example: "Routing data feature is not enabled for this account" + operationId: "get-vessels-id-future-positions-with-coordinates" + description: "Returns the estimated route between two ports for a given vessel from a set of coordinates. The timestamp of the positions has fixed spacing of one minute. This is a paid feature. Please contact sales@terminal49.com." + parameters: + - + schema: + type: "string" + format: "uuid" + in: "query" + name: "port_id" + description: "The destination port id" + required: true + - + schema: + type: "string" + format: "uuid" + in: "query" + name: "previous_port_id" + description: "The previous port id" + required: true + - + schema: + type: "number" + in: "query" + name: "latitude" + description: "Starting latitude coordinate" + required: true + - + schema: + type: "number" + in: "query" + name: "longitude" + description: "Starting longitude coordinate" + required: true diff --git a/docs/openapi/paths/vessels-id-future-positions.yaml b/docs/openapi/paths/vessels-id-future-positions.yaml new file mode 100644 index 00000000..a4dc412d --- /dev/null +++ b/docs/openapi/paths/vessels-id-future-positions.yaml @@ -0,0 +1,68 @@ +parameters: + - + schema: + type: "string" + name: "id" + in: "path" + required: true +get: + summary: "Get vessel future positions" + tags: + - "Routing (Paid)" + - "Vessels" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/vessel_with_positions" + links: + type: "object" + properties: + self: + type: "string" + format: "uri" + 403: + description: "Forbidden - Routing data feature is not enabled for this account" + content: + application/json: + schema: + type: "object" + properties: + errors: + type: "array" + items: + type: "object" + properties: + status: + type: "string" + example: "403" + title: + type: "string" + example: "Forbidden" + detail: + type: "string" + example: "Routing data feature is not enabled for this account" + operationId: "get-vessels-id-future-positions" + description: "Returns the estimated route between two ports for a given vessel. The timestamp of the positions has fixed spacing of one minute. This is a paid feature. Please contact sales@terminal49.com." + parameters: + - + schema: + type: "string" + format: "uuid" + in: "query" + name: "port_id" + description: "The destination port id" + required: true + - + schema: + type: "string" + format: "uuid" + in: "query" + name: "previous_port_id" + description: "The previous port id" + required: true diff --git a/docs/openapi/paths/vessels-id.yaml b/docs/openapi/paths/vessels-id.yaml new file mode 100644 index 00000000..9827523f --- /dev/null +++ b/docs/openapi/paths/vessels-id.yaml @@ -0,0 +1,65 @@ +parameters: + - + schema: + type: "string" + name: "id" + in: "path" + required: true + - + schema: + type: "string" + format: "date-time" + example: "2025-05-20T00:00:00Z" + name: "show_positions[from_timestamp]" + in: "query" + description: "ISO 8601 timestamp to filter positions from. 7 days by default." + required: false + - + schema: + type: "string" + format: "date-time" + example: "2025-05-24T00:00:00Z" + name: "show_positions[to_timestamp]" + in: "query" + description: "ISO 8601 timestamp to filter positions up to. Current time by default." + required: false +get: + summary: "Get a vessel using the id" + tags: + - "Vessels" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/vessel" + 403: + description: "Forbidden - Feature not enabled" + content: + application/json: + schema: + type: "object" + properties: + errors: + type: "array" + items: + type: "object" + properties: + status: + type: "string" + example: "403" + source: + type: "object" + nullable: true + title: + type: "string" + example: "Forbidden" + detail: + type: "string" + example: "Routing data feature is not enabled for this account" + operationId: "get-vessels-id" + description: "Returns a vessel by id. `show_positions` is a paid feature. Please contact sales@terminal49.com." diff --git a/docs/openapi/paths/vessels-imo.yaml b/docs/openapi/paths/vessels-imo.yaml new file mode 100644 index 00000000..d398efa9 --- /dev/null +++ b/docs/openapi/paths/vessels-imo.yaml @@ -0,0 +1,66 @@ +parameters: + - + schema: + type: "string" + name: "imo" + in: "path" + required: true + - + schema: + type: "string" + format: "date-time" + example: "2025-05-20T00:00:00Z" + name: "show_positions[from_timestamp]" + in: "query" + description: "ISO 8601 timestamp to filter positions from. 7 days by default." + required: false + - + schema: + type: "string" + format: "date-time" + example: "2025-05-24T00:00:00Z" + name: "show_positions[to_timestamp]" + in: "query" + description: "ISO 8601 timestamp to filter positions up to. Current time by default." + required: false +get: + summary: "Get a vessel using the imo" + tags: + - "Vessels" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/vessel" + 403: + description: "Forbidden - Feature not enabled" + content: + application/json: + schema: + type: "object" + properties: + errors: + type: "array" + items: + type: "object" + properties: + status: + type: "string" + example: "403" + source: + type: "object" + nullable: true + title: + type: "string" + example: "Forbidden" + detail: + type: "string" + example: "Routing data feature is not enabled for this account" + operationId: "get-vessels-imo" + description: "Returns a vessel by the given IMO number. `show_positions` is a paid feature. Please contact sales@terminal49.com." + x-internal: true diff --git a/docs/openapi/paths/webhook-notifications-examples.yaml b/docs/openapi/paths/webhook-notifications-examples.yaml new file mode 100644 index 00000000..f6dea491 --- /dev/null +++ b/docs/openapi/paths/webhook-notifications-examples.yaml @@ -0,0 +1,77 @@ +get: + summary: "Get webhook notification payload examples" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + type: "array" + items: + $ref: "#/components/schemas/webhook_notification" + links: + $ref: "#/components/schemas/links" + meta: + $ref: "#/components/schemas/meta" + included: + type: "array" + items: + anyOf: + - + $ref: "#/components/schemas/webhook" + - + $ref: "#/components/schemas/tracking_request" + - + $ref: "#/components/schemas/transport_event" + - + $ref: "#/components/schemas/estimated_event" + operationId: "get-webhook-notifications-example" + description: "Returns an example payload as it would be sent to a webhook endpoint for the provided `event` " + tags: + - "Webhook Notifications" + parameters: + - + schema: + type: "string" + enum: + - "container.transport.vessel_arrived" + - "container.transport.vessel_discharged" + - "container.transport.vessel_loaded" + - "container.transport.vessel_departed" + - "container.transport.rail_departed" + - "container.transport.rail_arrived" + - "container.transport.rail_loaded" + - "container.transport.rail_unloaded" + - "container.transport.transshipment_arrived" + - "container.transport.transshipment_discharged" + - "container.transport.transshipment_loaded" + - "container.transport.transshipment_departed" + - "container.transport.feeder_arrived" + - "container.transport.feeder_discharged" + - "container.transport.feeder_loaded" + - "container.transport.feeder_departed" + - "container.transport.empty_out" + - "container.transport.full_in" + - "container.transport.full_out" + - "container.transport.empty_in" + - "container.transport.vessel_berthed" + - "shipment.estimated.arrival" + - "tracking_request.succeeded" + - "tracking_request.failed" + - "tracking_request.awaiting_manifest" + - "tracking_request.tracking_stopped" + - "container.created" + - "container.updated" + - "container.pod_terminal_changed" + - "container.transport.arrived_at_inland_destination" + - "container.transport.estimated.arrived_at_inland_destination" + - "container.pickup_lfd.changed" + - "container.transport.available" + example: "container.transport.full_out" + in: "query" + name: "event" + description: "The webhook notification event name you wish to see an example of" +parameters: [] diff --git a/docs/openapi/paths/webhook-notifications-id.yaml b/docs/openapi/paths/webhook-notifications-id.yaml new file mode 100644 index 00000000..3a8dc45e --- /dev/null +++ b/docs/openapi/paths/webhook-notifications-id.yaml @@ -0,0 +1,504 @@ +parameters: + - + schema: + type: "string" + name: "id" + in: "path" + required: true +get: + summary: "Get a single webhook notification" + responses: + 200: + description: "" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/webhook_notification" + included: + type: "array" + items: + anyOf: + - + $ref: "#/components/schemas/webhook" + - + $ref: "#/components/schemas/tracking_request" + - + $ref: "#/components/schemas/transport_event" + - + $ref: "#/components/schemas/estimated_event" + - + $ref: "#/components/schemas/container_updated_event" + examples: + Tracking Request: + value: + data: + id: "a76187fc-5749-43f9-9053-cfaad9790a31" + type: "webhook_notification" + attributes: + id: "a76187fc-5749-43f9-9053-cfaad9790a31" + event: "tracking_request.succeeded" + delivery_status: "pending" + created_at: "2020-09-11T21:25:34Z" + relationships: + reference_object: + data: + id: "bdeca506-9741-4ab1-a0a7-cfd1d908e923" + type: "tracking_request" + webhook: + data: + id: "914b21ce-dd7d-4c49-8503-65aba488e9a9" + type: "webhook" + webhook_notification_logs: + data: [] + included: + - + id: "bdeca506-9741-4ab1-a0a7-cfd1d908e923" + type: "tracking_request" + attributes: + request_number: "TE497ED1063E" + request_type: "bill_of_lading" + scac: "MSCU" + ref_numbers: [] + created_at: "2020-09-11T21:25:34Z" + updated_at: "2020-09-11T22:25:34Z" + status: "created" + failed_reason: null + is_retrying: false + retry_count: null + relationships: + tracked_object: + data: + id: "b5b10c0a-8d18-46da-b4c2-4e5fa790e7da" + type: "shipment" + links: + self: "/v2/tracking_requests/bdeca506-9741-4ab1-a0a7-cfd1d908e923" + - + id: "b5b10c0a-8d18-46da-b4c2-4e5fa790e7da" + type: "shipment" + attributes: + created_at: "2020-09-11T21:25:33Z" + bill_of_lading_number: "TE497ED1063E" + ref_numbers: [] + shipping_line_scac: "MSCU" + shipping_line_name: "Mediterranean Shipping Company" + port_of_lading_locode: "MXZLO" + port_of_lading_name: "Manzanillo" + port_of_discharge_locode: "USOAK" + port_of_discharge_name: "Port of Oakland" + pod_vessel_name: "MSC CHANNE" + pod_vessel_imo: "9710438" + pod_voyage_number: "098N" + destination_locode: null + destination_name: null + destination_timezone: null + destination_ata_at: null + destination_eta_at: null + pol_etd_at: null + pol_atd_at: "2020-08-29T21:25:33Z" + pol_timezone: "America/Mexico_City" + pod_eta_at: "2020-09-18T21:25:33Z" + pod_ata_at: null + pod_timezone: "America/Los_Angeles" + relationships: + port_of_lading: + data: + id: "4384d6a5-5ccc-43b7-8d19-4a9525e74c08" + type: "port" + port_of_discharge: + data: + id: "2a765fdd-c479-4345-b71d-c4ef839952e2" + type: "port" + pod_terminal: + data: + id: "17891bc8-52da-40bf-8ff0-0247ec05faf1" + type: "terminal" + destination: + data: null + containers: + data: + - + id: "b2fc728c-e2f5-4a99-8899-eb7b34ef22d7" + type: "container" + links: + self: "/v2/shipments/b5b10c0a-8d18-46da-b4c2-4e5fa790e7da" + - + id: "b2fc728c-e2f5-4a99-8899-eb7b34ef22d7" + type: "container" + attributes: + number: "ARDU1824900" + seal_number: "139F1451" + created_at: "2020-09-11T21:25:34Z" + equipment_type: "dry" + equipment_length: 40 + equipment_height: "standard" + weight_in_lbs: 53507 + fees_at_pod_terminal: [] + holds_at_pod_terminal: [] + pickup_lfd: null + pickup_appointment_at: null + availability_known: true + available_for_pickup: false + pod_arrived_at: null + pod_discharged_at: null + final_destination_full_out_at: null + pod_full_out_at: null + empty_terminated_at: null + pod_timezone: "America/Los_Angeles" + final_destination_timezone: null + empty_terminated_timezone: null + relationships: + shipment: + data: + id: "b5b10c0a-8d18-46da-b4c2-4e5fa790e7da" + type: "shipment" + pod_terminal: + data: + id: "17891bc8-52da-40bf-8ff0-0247ec05faf1" + type: "terminal" + transport_events: + data: + - + id: "56078596-5293-4c84-9245-cca00a787265" + type: "transport_event" + - + id: "56078596-5293-4c84-9245-cca00a787265" + type: "transport_event" + attributes: + event: "container.transport.vessel_departed" + created_at: "2020-09-11T21:25:34Z" + voyage_number: null + timestamp: "2020-08-29T21:25:33Z" + location_locode: "MXZLO" + timezone: "America/Los_Angeles" + relationships: + shipment: + data: + id: "b5b10c0a-8d18-46da-b4c2-4e5fa790e7da" + type: "shipment" + container: + data: + id: "b2fc728c-e2f5-4a99-8899-eb7b34ef22d7" + type: "container" + vessel: + data: null + location: + data: + id: "2a765fdd-c479-4345-b71d-c4ef839952e2" + type: "port" + terminal: + data: null + Estimated Event: + value: + data: + id: "d7e04138-b59d-4c41-9d2d-251d95bedd6e" + type: "webhook_notification" + attributes: + id: "d7e04138-b59d-4c41-9d2d-251d95bedd6e" + event: "shipment.estimated.arrival" + delivery_status: "pending" + created_at: "2020-09-11T21:25:34Z" + relationships: + reference_object: + data: + id: "b68bc6cb-2c37-43f6-889b-86a16b2b6fe6" + type: "estimated_event" + webhook: + data: + id: "614eab61-ae3c-4d40-bbe9-41200a172691" + type: "webhook" + included: + - + id: "b68bc6cb-2c37-43f6-889b-86a16b2b6fe6" + type: "estimated_event" + attributes: + created_at: "2020-04-06T19:02:46-07:00" + estimated_timestamp: "2020-04-09T19:02:46-07:00" + voyage_number: "A1C" + event: "shipment.estimated.arrival" + timezone: "America/Los_Angeles" + relationships: + shipment: + data: + id: "715ed64b-6195-49f6-9407-1383a8088bfd" + type: "shipment" + port: + data: + id: "ed4001a5-ad9d-43c3-883c-79354f422510" + type: "port" + vessel: + data: + id: "ebf68c6c-9d0d-4383-aa41-e097009dfb4c" + type: "vessel" + - + id: "ed4001a5-ad9d-43c3-883c-79354f422510" + type: "port" + attributes: + id: "ed4001a5-ad9d-43c3-883c-79354f422510" + name: "Port of Oakland" + code: "USOAK" + state_abbr: "CA" + city: "Oakland" + country_code: "US" + time_zone: "America/Los_Angeles" + - + id: "715ed64b-6195-49f6-9407-1383a8088bfd" + type: "shipment" + attributes: + created_at: "2020-04-06T19:02:46-07:00" + bill_of_lading_number: "TE49DD6650B9" + ref_numbers: + - "REF-4A25EA" + shipping_line_scac: "MSCU" + shipping_line_name: "Mediterranean Shipping Company" + port_of_lading_locode: "MXZLO" + port_of_lading_name: "Manzanillo" + port_of_discharge_locode: "USOAK" + port_of_discharge_name: "Port of Oakland" + pod_vessel_name: "MSC CHANNE" + pod_vessel_imo: "9710438" + pod_voyage_number: "098N" + destination_locode: null + destination_name: null + destination_timezone: null + destination_ata_at: null + destination_eta_at: null + pol_etd_at: null + pol_atd_at: null + pol_timezone: "America/Mexico_City" + pod_eta_at: "2020-04-13T19:02:46-07:00" + pod_ata_at: null + pod_timezone: "America/Los_Angeles" + relationships: + port_of_lading: + data: + id: "1378c720-efe9-4562-a2ad-562002eb4b1d" + type: "port" + port_of_discharge: + data: + id: "ed4001a5-ad9d-43c3-883c-79354f422510" + type: "port" + pod_terminal: + data: + id: "2508d879-4451-4d7f-ab23-92258b5df553" + type: "terminal" + destination: + data: null + containers: + data: [] + links: + self: "/v2/shipments/715ed64b-6195-49f6-9407-1383a8088bfd" + Transport Event: + value: + data: + id: "abec839a-48fe-4540-93d7-d3ea3d67bdbf" + type: "webhook_notification" + attributes: + id: "abec839a-48fe-4540-93d7-d3ea3d67bdbf" + event: "container.transport.vessel_arrived" + delivery_status: "pending" + created_at: "2020-07-28T23:12:53Z" + relationships: + reference_object: + data: + id: "a6ecb8ab-98d6-4cab-8487-ce9dd7be082b" + type: "transport_event" + webhook: + data: + id: "534d498b-8332-439a-accb-129dfd144ceb" + type: "webhook" + webhook_notification_logs: + data: [] + included: + - + id: "a6ecb8ab-98d6-4cab-8487-ce9dd7be082b" + type: "transport_event" + attributes: + event: "container.transport.vessel_arrived" + created_at: "2020-07-28T23:12:53Z" + voyage_number: null + timestamp: "2020-07-28T23:12:53Z" + timezone: "America/Los_Angeles" + relationships: + shipment: + data: + id: "1fc35241-4c8b-420d-803a-9e6661720a05" + type: "shipment" + container: + data: + id: "8c2f335a-b155-4021-87f0-9b040159a981" + type: "container" + vessel: + data: + id: "b381c692-8dad-4f04-873f-d9e567143335" + type: "vessel" + location: + data: + id: "f5a8a49f-d8b2-4d2a-8a43-0e4ff0ce7995" + type: "port" + terminal: + data: + id: "26fede8d-2c6d-4bf5-98d6-5a86d30f17a9" + type: "terminal" + - + id: "f5a8a49f-d8b2-4d2a-8a43-0e4ff0ce7995" + type: "port" + attributes: + id: "f5a8a49f-d8b2-4d2a-8a43-0e4ff0ce7995" + name: "Port of Oakland" + code: "USOAK" + state_abbr: "CA" + city: "Oakland" + country_code: "US" + time_zone: "America/Los_Angeles" + - + id: "1fc35241-4c8b-420d-803a-9e6661720a05" + type: "shipment" + attributes: + created_at: "2020-07-28T23:12:53Z" + bill_of_lading_number: "TE491846459E" + ref_numbers: + - null + shipping_line_scac: "MSCU" + shipping_line_name: "Mediterranean Shipping Company" + port_of_lading_locode: "MXZLO" + port_of_lading_name: "Manzanillo" + port_of_discharge_locode: "USOAK" + port_of_discharge_name: "Port of Oakland" + pod_vessel_name: "MSC CHANNE" + pod_vessel_imo: "9710438" + pod_voyage_number: "098N" + destination_locode: null + destination_name: null + destination_timezone: null + destination_ata_at: null + destination_eta_at: null + pol_etd_at: null + pol_atd_at: "2020-07-15T23:12:53Z" + pol_timezone: "America/Mexico_City" + pod_eta_at: "2020-08-04T23:12:53Z" + pod_ata_at: null + pod_timezone: "America/Los_Angeles" + relationships: + port_of_lading: + data: + id: "06564cb7-77d6-4e0e-8e4a-37756ca21bc9" + type: "port" + port_of_discharge: + data: + id: "f5a8a49f-d8b2-4d2a-8a43-0e4ff0ce7995" + type: "port" + pod_terminal: + data: + id: "06f5d3bb-f258-4f1b-8c2f-db78248f6e29" + type: "terminal" + destination: + data: null + containers: + data: + - + id: "8c2f335a-b155-4021-87f0-9b040159a981" + type: "container" + links: + self: "/v2/shipments/1fc35241-4c8b-420d-803a-9e6661720a05" + Container Updated Event: + value: + data: + id: "416e293f-4423-47f7-abf3-1ae97054f41f" + type: "webhook_notification" + attributes: + id: "416e293f-4423-47f7-abf3-1ae97054f41f" + event: "container.updated" + delivery_status: "pending" + created_at: "2020-06-04T22:03:09Z" + relationships: + reference_object: + data: + id: "fc48cb10-b7a8-47a4-a12f-89bce7434978" + type: "container_updated_event" + webhook: + data: + id: "cda37836-aa40-455e-8b43-5fd74930c7f6" + type: "webhook" + webhook_notification_logs: + data: [] + included: + - + id: "fc48cb10-b7a8-47a4-a12f-89bce7434978" + type: "container_updated_event" + attributes: + changeset: + available_for_pickup: + - false + - true + pod_terminal_holds: + - null + - + - + name: "customs" + status: "hold" + description: "CUST EXAM" + timestamp: "2020-06-04T22:03:09Z" + timezone: "America/Los_Angeles" + relationships: + container: + data: + id: "1445af31-991c-4d52-a183-6c3ea97cd6e8" + type: "container" + terminal: + data: + id: "07db0258-1911-4acf-8e70-0cfe4b100f80" + type: "terminal" + - + id: "1445af31-991c-4d52-a183-6c3ea97cd6e8" + type: "container" + attributes: + number: "GLDU1355602" + seal_number: "431ac97412228532" + created_at: "2020-05-04T22:03:09Z" + equipment_type: "dry" + equipment_length: 40 + equipment_height: "standard" + weight_in_lbs: 55634 + fees_at_pod_terminal: [] + holds_at_pod_terminal: [] + pickup_lfd: null + availability_known: true + available_for_pickup: null + pod_arrived_at: "2020-06-04T22:03:08Z" + pod_discharged_at: "2020-06-04T22:03:08Z" + final_destination_full_out_at: "2020-06-04T22:03:08Z" + pod_full_out_at: null + empty_terminated_at: null + pod_timezone: "America/Los_Angeles" + final_destination_timezone: null + empty_terminated_timezone: null + relationships: + shipment: + data: null + - + id: "07db0258-1911-4acf-8e70-0cfe4b100f80" + type: "terminal" + attributes: + id: "07db0258-1911-4acf-8e70-0cfe4b100f80" + nickname: "Denesik-Hintz" + name: "Adams LLC Terminal" + firms_code: "E005" + relationships: + port: + data: + id: "d8a92775-95f9-47be-a6d2-42542a32d5fc" + type: "port" + operationId: "get-webhook-notification-id" + description: "\n" + tags: + - "Webhook Notifications" + parameters: + - + schema: + type: "string" + in: "query" + description: "Comma delimited list of relations to include." + name: "include" diff --git a/docs/openapi/paths/webhook-notifications.yaml b/docs/openapi/paths/webhook-notifications.yaml new file mode 100644 index 00000000..68db5f34 --- /dev/null +++ b/docs/openapi/paths/webhook-notifications.yaml @@ -0,0 +1,51 @@ +get: + summary: "List webhook notifications" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + type: "array" + items: + $ref: "#/components/schemas/webhook_notification" + links: + $ref: "#/components/schemas/links" + meta: + $ref: "#/components/schemas/meta" + included: + type: "array" + items: + anyOf: + - + $ref: "#/components/schemas/webhook" + - + $ref: "#/components/schemas/tracking_request" + - + $ref: "#/components/schemas/transport_event" + - + $ref: "#/components/schemas/estimated_event" + operationId: "get-webhook-notifications" + description: "Return the list of webhook notifications. This can be useful for reconciling your data if your endpoint has been down. " + tags: + - "Webhook Notifications" + parameters: + - + schema: + type: "integer" + in: "query" + name: "page[number]" + - + schema: + type: "integer" + in: "query" + name: "page[size]" + - + schema: + type: "string" + in: "query" + name: "include" + description: "Comma delimited list of relations to include." diff --git a/docs/openapi/paths/webhooks-id.yaml b/docs/openapi/paths/webhooks-id.yaml new file mode 100644 index 00000000..f65c44b9 --- /dev/null +++ b/docs/openapi/paths/webhooks-id.yaml @@ -0,0 +1,130 @@ +parameters: + - + schema: + type: "string" + name: "id" + in: "path" + required: true +get: + summary: "Get single webhook" + tags: + - "Webhooks" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/webhook" + operationId: "get-webhooks-id" + description: "Get the details of a single webhook" +patch: + summary: "Edit a webhook" + operationId: "patch-webhooks-id" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/webhook" + description: "Update a single webhook" + tags: + - "Webhooks" + requestBody: + content: + application/json: + schema: + type: "object" + properties: + data: + type: "object" + required: + - "attributes" + - "type" + properties: + attributes: + type: "object" + properties: + url: + type: "string" + example: "https://webhook.site/#!/39084fbb-d887-42e8-be08-b9183ad02362" + format: "uri" + description: "The URL of the webhook endpoint." + events: + type: "array" + description: "The list of events to enable for this endpoint." + uniqueItems: true + minItems: 1 + items: + type: "string" + enum: + - "container.transport.vessel_arrived" + - "container.transport.vessel_discharged" + - "container.transport.vessel_loaded" + - "container.transport.vessel_departed" + - "container.transport.rail_departed" + - "container.transport.rail_arrived" + - "container.transport.rail_loaded" + - "container.transport.rail_unloaded" + - "container.transport.transshipment_arrived" + - "container.transport.transshipment_discharged" + - "container.transport.transshipment_loaded" + - "container.transport.transshipment_departed" + - "container.transport.feeder_arrived" + - "container.transport.feeder_discharged" + - "container.transport.feeder_loaded" + - "container.transport.feeder_departed" + - "container.transport.empty_out" + - "container.transport.full_in" + - "container.transport.full_out" + - "container.transport.empty_in" + - "container.transport.vessel_berthed" + - "shipment.estimated.arrival" + - "tracking_request.succeeded" + - "tracking_request.failed" + - "tracking_request.awaiting_manifest" + - "tracking_request.tracking_stopped" + - "container.created" + - "container.updated" + - "container.pod_terminal_changed" + - "container.transport.arrived_at_inland_destination" + - "container.transport.estimated.arrived_at_inland_destination" + - "container.pickup_lfd.changed" + - "container.transport.available" + active: + type: "boolean" + headers: + type: "array" + description: "Optional custom headers to pass with each webhook invocation" + items: + type: "object" + properties: + name: + type: "string" + description: "The name of the header. (Please not this will be auto-capitalized) " + value: + type: "string" + description: "The value to pass for the header\n" + type: + type: "string" + enum: + - "webhook" + required: + - "data" + examples: {} +delete: + summary: "Delete a webhook" + operationId: "delete-webhooks-id" + responses: + 200: + description: "OK" + description: "Delete a webhook" + tags: + - "Webhooks" diff --git a/docs/openapi/paths/webhooks-ips.yaml b/docs/openapi/paths/webhooks-ips.yaml new file mode 100644 index 00000000..dd00b22c --- /dev/null +++ b/docs/openapi/paths/webhooks-ips.yaml @@ -0,0 +1,31 @@ +get: + summary: "List webhook IPs" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + webhook_notification_ips: + type: "array" + items: + type: "string" + format: "ipv4" + last_updated: + type: "string" + format: "date-time" + examples: + Example List of IPs: + value: + webhook_notification_ips: + - "35.222.62.171" + - "3.230.67.145" + - "44.217.15.129" + last_updated: "2023-10-17T21:23:16Z" + operationId: "get-webhooks-ips" + description: "Return the list of IPs used for sending webhook notifications. This can be useful for whitelisting the IPs on the firewall." + tags: + - "Webhooks" + parameters: [] diff --git a/docs/openapi/paths/webhooks.yaml b/docs/openapi/paths/webhooks.yaml new file mode 100644 index 00000000..6843bf21 --- /dev/null +++ b/docs/openapi/paths/webhooks.yaml @@ -0,0 +1,220 @@ +get: + summary: "List webhooks" + tags: + - "Webhooks" + responses: + 200: + description: "OK" + content: + application/json: + schema: + type: "object" + properties: + data: + type: "array" + items: + $ref: "#/components/schemas/webhook" + meta: + $ref: "#/components/schemas/meta" + links: + $ref: "#/components/schemas/links" + examples: + example-1: + value: + data: + - + id: "497f6eca-6276-4993-bfeb-53cbbbba6f08" + type: "webhook" + attributes: + url: "http://example.com" + active: true + events: + - "tracking_request.succeeded" + secret: "672bd7b58b54645934a830d8fa" + headers: + - + name: "x-secret-sauce" + value: "sriracha" + meta: + size: 0 + total: 0 + links: + last: "http://example.com" + next: "http://example.com" + prev: "http://example.com" + first: "http://example.com" + self: "http://example.com" + operationId: "get-webhooks" + description: "Get a list of all the webhooks" + parameters: + - + schema: + type: "integer" + in: "query" + name: "page[number]" + - + schema: + type: "integer" + in: "query" + name: "page[size]" +post: + summary: "Create a webhook" + operationId: "post-webhooks" + tags: + - "Webhooks" + description: "You can configure a webhook via the API to be notified about events that happen in your Terminal49 account. These events can be realted to tracking_requests, shipments and containers. \n\nThis is the recommended way tracking shipments and containers via the API. You should use this instead of polling our the API periodically. " + requestBody: + content: + application/json: + schema: + type: "object" + properties: + data: + type: "object" + required: + - "attributes" + - "type" + properties: + attributes: + type: "object" + required: + - "url" + - "active" + properties: + url: + type: "string" + example: "https://webhook.site/#!/39084fbb-d887-42e8-be08-b9183ad02362" + format: "uri" + description: "The URL of the webhook endpoint." + events: + type: "array" + uniqueItems: true + description: "The list of events to enable for this endpoint." + minItems: 1 + items: + type: "string" + enum: + - "container.transport.vessel_arrived" + - "container.transport.vessel_discharged" + - "container.transport.vessel_loaded" + - "container.transport.vessel_departed" + - "container.transport.rail_departed" + - "container.transport.rail_arrived" + - "container.transport.rail_loaded" + - "container.transport.rail_unloaded" + - "container.transport.transshipment_arrived" + - "container.transport.transshipment_discharged" + - "container.transport.transshipment_loaded" + - "container.transport.transshipment_departed" + - "container.transport.feeder_arrived" + - "container.transport.feeder_discharged" + - "container.transport.feeder_loaded" + - "container.transport.feeder_departed" + - "container.transport.empty_out" + - "container.transport.full_in" + - "container.transport.full_out" + - "container.transport.empty_in" + - "container.transport.vessel_berthed" + - "shipment.estimated.arrival" + - "tracking_request.succeeded" + - "tracking_request.failed" + - "tracking_request.awaiting_manifest" + - "tracking_request.tracking_stopped" + - "container.created" + - "container.updated" + - "container.pod_terminal_changed" + - "container.transport.arrived_at_inland_destination" + - "container.transport.estimated.arrived_at_inland_destination" + - "container.pickup_lfd.changed" + - "container.transport.available" + example: "tracking_request.succeeded" + active: + type: "boolean" + headers: + type: "array" + description: "Optional custom headers to pass with each webhook invocation" + items: + type: "object" + properties: + name: + type: "string" + description: "The name of the header. (Please note this will be auto-capitalized) " + value: + type: "string" + description: "The value to pass for the header\n" + type: + type: "string" + enum: + - "webhook" + required: + - "data" + examples: + Test Webhook (all events): + value: + data: + attributes: + url: "https://webhook.site/" + events: + - "container.transport.vessel_arrived" + - "container.transport.vessel_discharged" + - "container.transport.vessel_loaded" + - "container.transport.vessel_departed" + - "container.transport.rail_departed" + - "container.transport.rail_arrived" + - "container.transport.rail_loaded" + - "container.transport.rail_unloaded" + - "container.transport.transshipment_arrived" + - "container.transport.transshipment_discharged" + - "container.transport.transshipment_loaded" + - "container.transport.transshipment_departed" + - "container.transport.feeder_arrived" + - "container.transport.feeder_discharged" + - "container.transport.feeder_loaded" + - "container.transport.feeder_departed" + - "container.transport.empty_out" + - "container.transport.full_in" + - "container.transport.full_out" + - "container.transport.empty_in" + - "container.transport.vessel_berthed" + - "shipment.estimated.arrival" + - "tracking_request.succeeded" + - "tracking_request.failed" + - "tracking_request.awaiting_manifest" + - "tracking_request.tracking_stopped" + - "container.created" + - "container.updated" + - "container.pod_terminal_changed" + - "container.transport.arrived_at_inland_destination" + - "container.transport.estimated.arrived_at_inland_destination" + - "container.pickup_lfd.changed" + - "container.transport.available" + active: true + type: "webhook" + description: "" + responses: + 201: + description: "Create a test webhook endpoint" + content: + application/json: + schema: + type: "object" + properties: + data: + $ref: "#/components/schemas/webhook" + examples: + Test Endpoint Created: + value: + data: + type: "webhook" + id: "9809fb96-7754-488f-99df-29ca8d410d89" + attributes: + url: "https://webhook.site/" + active: true + events: + - "tracking_request.succeeded" + secret: "C193J3QOXMFH" + created_at: "2020-06-05T19:06:13Z" + application/xml: + schema: + $ref: "#/components/schemas/webhook" +parameters: [] diff --git a/scripts/split_openapi.py b/scripts/split_openapi.py new file mode 100644 index 00000000..d554ebb8 --- /dev/null +++ b/scripts/split_openapi.py @@ -0,0 +1,114 @@ +from __future__ import annotations + +import json +import re +from pathlib import Path +from typing import Dict + +import sys + +sys.path.append(str(Path(__file__).resolve().parents[1])) + +from tools.openapi_yaml import write_yaml + + +ROOT = Path(__file__).resolve().parents[1] +OPENAPI_JSON = ROOT / "docs" / "openapi.json" +OPENAPI_ROOT = ROOT / "docs" / "openapi" +PATHS_DIR = OPENAPI_ROOT / "paths" +SCHEMAS_DIR = OPENAPI_ROOT / "components" / "schemas" +SECURITY_DIR = OPENAPI_ROOT / "components" / "securitySchemes" + + +def _slugify(value: str) -> str: + value = value.strip().lower() + value = re.sub(r"[^a-z0-9]+", "-", value) + value = re.sub(r"-+", "-", value).strip("-") + return value or "root" + + +def _path_filename(path: str, existing: Dict[str, int]) -> str: + base = _slugify(path.replace("{", "").replace("}", "").replace("/", "-")) + count = existing.get(base, 0) + existing[base] = count + 1 + if count: + return f"{base}-{count+1}.yaml" + return f"{base}.yaml" + + +def _component_filename(name: str, existing: Dict[str, int]) -> str: + base = _slugify(name) + count = existing.get(base, 0) + existing[base] = count + 1 + if count: + return f"{base}-{count+1}.yaml" + return f"{base}.yaml" + + +def split() -> None: + data = json.loads(OPENAPI_JSON.read_text()) + + OPENAPI_ROOT.mkdir(parents=True, exist_ok=True) + PATHS_DIR.mkdir(parents=True, exist_ok=True) + SCHEMAS_DIR.mkdir(parents=True, exist_ok=True) + SECURITY_DIR.mkdir(parents=True, exist_ok=True) + + path_files: Dict[str, str] = {} + path_counts: Dict[str, int] = {} + for route, definition in data.get("paths", {}).items(): + filename = _path_filename(route, path_counts) + write_yaml(PATHS_DIR / filename, definition) + path_files[route] = filename + + schema_files: Dict[str, str] = {} + schema_counts: Dict[str, int] = {} + for name, definition in data.get("components", {}).get("schemas", {}).items(): + filename = _component_filename(name, schema_counts) + write_yaml(SCHEMAS_DIR / filename, definition) + schema_files[name] = filename + + security_files: Dict[str, str] = {} + security_counts: Dict[str, int] = {} + for name, definition in data.get("components", {}).get("securitySchemes", {}).items(): + filename = _component_filename(name, security_counts) + write_yaml(SECURITY_DIR / filename, definition) + security_files[name] = filename + + index: Dict[str, object] = { + "openapi": data.get("openapi"), + "info": data.get("info"), + } + if data.get("servers"): + index["servers"] = data["servers"] + if data.get("tags"): + index["tags"] = data["tags"] + if data.get("security"): + index["security"] = data["security"] + if data.get("x-tagGroups"): + index["x-tagGroups"] = data["x-tagGroups"] + + index_paths = {} + for route, filename in path_files.items(): + index_paths[route] = {"$ref": f"./paths/{filename}"} + if index_paths: + index["paths"] = index_paths + + components: Dict[str, Dict[str, Dict[str, str]]] = {} + if schema_files: + components["schemas"] = { + name: {"$ref": f"./components/schemas/{filename}"} + for name, filename in schema_files.items() + } + if security_files: + components["securitySchemes"] = { + name: {"$ref": f"./components/securitySchemes/{filename}"} + for name, filename in security_files.items() + } + if components: + index["components"] = components + + write_yaml(OPENAPI_ROOT / "index.yaml", index) + + +if __name__ == "__main__": + split() diff --git a/tests/test_openapi_bundle.py b/tests/test_openapi_bundle.py new file mode 100644 index 00000000..4642d31c --- /dev/null +++ b/tests/test_openapi_bundle.py @@ -0,0 +1,19 @@ +from __future__ import annotations + +import json +from pathlib import Path +import unittest + +from tools.openapi_bundle import bundle_openapi + + +class OpenAPIBundleTest(unittest.TestCase): + def test_bundle_matches_single_file_spec(self) -> None: + root = Path(__file__).resolve().parents[1] + bundled = bundle_openapi(root / "docs" / "openapi" / "index.yaml") + single = json.loads((root / "docs" / "openapi.json").read_text()) + self.assertEqual(single, bundled) + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/__init__.py b/tools/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tools/openapi_bundle.py b/tools/openapi_bundle.py new file mode 100644 index 00000000..0a711c4f --- /dev/null +++ b/tools/openapi_bundle.py @@ -0,0 +1,74 @@ +from __future__ import annotations + +from pathlib import Path +from typing import Any, Dict, Tuple + +from .openapi_yaml import load_yaml + + +class BundleError(RuntimeError): + """Raised when a referenced document cannot be resolved.""" + + +def _split_ref(ref: str) -> Tuple[str, str | None]: + if "#" in ref: + path, fragment = ref.split("#", 1) + return path, fragment or None + return ref, None + + +def _resolve(value: Any, current_file: Path, stack: set[Tuple[Path, str | None]]) -> Any: + if isinstance(value, dict): + if set(value.keys()) == {"$ref"}: + ref = value["$ref"] + if not ref or ref.startswith("#") or "://" in ref: + return value + target_path, fragment = _split_ref(ref) + target_file = (current_file.parent / target_path).resolve() + if not target_file.exists(): + raise BundleError(f"Referenced file not found: {ref} from {current_file}") + key = (target_file, fragment) + if key in stack: + raise BundleError(f"Circular $ref detected for {ref}") + data = load_yaml(target_file) + resolved = _resolve(data, target_file, stack | {key}) + if fragment: + fragment = fragment.lstrip("/") + for part in fragment.split("/"): + if part: + if isinstance(resolved, dict) and part in resolved: + resolved = resolved[part] + else: + raise BundleError(f"Fragment '{fragment}' not found in {ref}") + return _resolve(resolved, target_file, stack | {key}) + return {k: _resolve(v, current_file, stack) for k, v in value.items()} + if isinstance(value, list): + return [_resolve(item, current_file, stack) for item in value] + return value + + +def bundle_openapi(root: Path) -> Dict[str, Any]: + document = load_yaml(root) + return _resolve(document, root.resolve(), set()) + + +def write_bundle(source: Path, destination: Path) -> None: + import json + + bundled = bundle_openapi(source) + destination.write_text(json.dumps(bundled, indent=2, sort_keys=False) + "\n") + + +def main() -> None: + import argparse + + parser = argparse.ArgumentParser(description="Bundle a multi-file OpenAPI spec into a single JSON document") + parser.add_argument("source", type=Path, help="Path to the root OpenAPI YAML file") + parser.add_argument("destination", type=Path, help="Where to write the bundled JSON output") + args = parser.parse_args() + + write_bundle(args.source, args.destination) + + +if __name__ == "__main__": + main() diff --git a/tools/openapi_yaml.py b/tools/openapi_yaml.py new file mode 100644 index 00000000..9dc8c542 --- /dev/null +++ b/tools/openapi_yaml.py @@ -0,0 +1,200 @@ +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path +from typing import Any, List, Tuple +import json + + +class YamlError(RuntimeError): + """Raised when the lightweight YAML parser encounters invalid syntax.""" + + +def _needs_quotes(value: str) -> bool: + if value == "" or value.strip() != value: + return True + if value.lower() in {"null", "true", "false"}: + return True + if value and value[0] in "-?:[]{}#&,*!|>'\"%@`": + return True + return any(ch in value for ch in ":#{}[]\n\r\t") + + +def _format_key(key: str) -> str: + if _needs_quotes(key): + return json.dumps(key) + return key + + +def _format_scalar(value: Any) -> str: + if value is None: + return "null" + if isinstance(value, bool): + return "true" if value else "false" + if isinstance(value, (int, float)): + return str(value) + if isinstance(value, str): + return json.dumps(value) + raise TypeError(f"Unsupported scalar type: {type(value)!r}") + + +def dump_yaml(data: Any, indent: int = 0) -> str: + prefix = " " * indent + if isinstance(data, dict): + lines: List[str] = [] + for key, value in data.items(): + if not isinstance(key, str): + raise TypeError("Dictionary keys must be strings") + formatted_key = _format_key(key) + if isinstance(value, dict): + if value: + lines.append(f"{prefix}{formatted_key}:") + lines.append(dump_yaml(value, indent + 1)) + else: + lines.append(f"{prefix}{formatted_key}: {{}}") + elif isinstance(value, list): + if value: + lines.append(f"{prefix}{formatted_key}:") + lines.append(dump_yaml(value, indent + 1)) + else: + lines.append(f"{prefix}{formatted_key}: []") + else: + lines.append(f"{prefix}{formatted_key}: {_format_scalar(value)}") + return "\n".join(lines) if lines else f"{prefix}{{}}" + if isinstance(data, list): + lines = [] + for item in data: + if isinstance(item, (dict, list)): + lines.append(f"{prefix}-") + lines.append(dump_yaml(item, indent + 1)) + else: + lines.append(f"{prefix}- {_format_scalar(item)}") + return "\n".join(lines) if lines else f"{prefix}[]" + return f"{prefix}{_format_scalar(data)}" + + +@dataclass +class _Line: + indent: int + content: str + + +def _tokenize(text: str) -> List[_Line]: + lines: List[_Line] = [] + for raw in text.splitlines(): + if not raw.strip(): + continue + stripped = raw.lstrip(" ") + if not stripped or stripped.startswith("#"): + continue + indent = (len(raw) - len(stripped)) + if indent % 2: + raise YamlError("Indentation must be multiples of two spaces") + lines.append(_Line(indent // 2, stripped)) + return lines + + +def _parse_value(token: str) -> Any: + if not token: + return None + if token == "null": + return None + if token == "true": + return True + if token == "false": + return False + if token == "[]": + return [] + if token == "{}": + return {} + if token.startswith('"') and token.endswith('"'): + return json.loads(token) + try: + if "." in token or "e" in token or "E" in token: + return float(token) + return int(token) + except ValueError: + return token + + +def _split_mapping_line(content: str) -> Tuple[str, str]: + in_quotes = False + escape = False + for idx, ch in enumerate(content): + if escape: + escape = False + continue + if ch == '\\': + escape = True + continue + if ch == '"': + in_quotes = not in_quotes + continue + if ch == ':' and not in_quotes: + return content[:idx], content[idx + 1 :] + raise YamlError(f"Missing ':' in mapping line: {content}") + + +def _parse_block(lines: List[_Line], index: int, indent: int) -> Tuple[Any, int]: + items: List[Any] = [] + mapping: dict[str, Any] = {} + mode: str | None = None # "list" or "map" + + while index < len(lines): + line = lines[index] + if line.indent < indent: + break + if line.indent > indent: + raise YamlError(f"Unexpected indentation before: {line.content}") + + content = line.content + index += 1 + + if content.startswith("- ") or content == "-": + if mode == "map": + raise YamlError("Cannot mix list and map entries at the same level") + mode = "list" + if content == "-": + value, index = _parse_block(lines, index, indent + 1) + else: + value = _parse_value(content[2:].strip()) + items.append(value) + continue + + if ":" not in content: + raise YamlError(f"Missing ':' in mapping line: {content}") + if mode == "list": + raise YamlError("Cannot mix list and map entries at the same level") + mode = "map" + key, rest = _split_mapping_line(content) + key = key.strip() + if key.startswith('"') and key.endswith('"'): + key = json.loads(key) + rest = rest.strip() + if rest: + value = _parse_value(rest) + else: + value, index = _parse_block(lines, index, indent + 1) + mapping[key] = value + + if mode is None: + return {}, index + if mode == "list": + return items, index + return mapping, index + + +def load_yaml(source: Path | str) -> Any: + if isinstance(source, Path): + text = source.read_text() + else: + text = str(source) + lines = _tokenize(text) + value, index = _parse_block(lines, 0, 0) + if index != len(lines): + raise YamlError("Unexpected trailing content") + return value + + +def write_yaml(path: Path, data: Any) -> None: + path.write_text(dump_yaml(data) + "\n") From 6adebfd6cc1b96259e86d8b9881eee1813fba2fc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Oct 2025 05:57:07 +0000 Subject: [PATCH 2/7] chore: Auto-generate Postman collection from openapi.json [skip ci] --- Terminal49-API.postman_collection.json | 268 ++++++++++++------------- 1 file changed, 134 insertions(+), 134 deletions(-) diff --git a/Terminal49-API.postman_collection.json b/Terminal49-API.postman_collection.json index bd4be677..e5fc19ec 100644 --- a/Terminal49-API.postman_collection.json +++ b/Terminal49-API.postman_collection.json @@ -5,7 +5,7 @@ "description": "", "item": [ { - "id": "a42114ef-1a2a-497b-ad45-0cbc3b4212a0", + "id": "0e6eb99c-50c3-456a-a227-a044dd77af77", "name": "List containers", "request": { "name": "List containers", @@ -72,7 +72,7 @@ }, "response": [ { - "id": "ab93ee57-6a69-4a3b-816d-c586d05bddee", + "id": "f818b35a-6705-4d98-abf5-03dbe40e5365", "name": "OK", "originalRequest": { "url": { @@ -147,7 +147,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"tank\",\n \"equipment_length\": 40,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"total\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"extended_dwell_time\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"bulk\",\n \"equipment_length\": null,\n \"equipment_height\": null,\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"other\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"extended_dwell_time\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"past_arrival_window\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"all_containers_terminated\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"open top\",\n \"equipment_length\": 10,\n \"equipment_height\": \"high_cube\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"other\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"open top\",\n \"equipment_length\": 20,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"all_containers_terminated\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"no_updates_at_line\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -158,7 +158,7 @@ } }, { - "id": "5b8ad045-a91c-42b5-ab1e-33f9590ffb12", + "id": "d74f0fcb-f4ac-4a86-8866-0e604eeb38a3", "name": "Edit a container", "request": { "name": "Edit a container", @@ -201,7 +201,7 @@ }, "response": [ { - "id": "5d8984c3-1f14-445d-a522-9057b44d8ce7", + "id": "95a38819-fbe8-4fc9-a921-d69d949aeed4", "name": "OK", "originalRequest": { "url": { @@ -252,7 +252,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"bulk\",\n \"equipment_length\": 45,\n \"equipment_height\": null,\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"other\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"open top\",\n \"equipment_length\": null,\n \"equipment_height\": \"high_cube\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"extended_dwell_time\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -263,7 +263,7 @@ } }, { - "id": "5399e250-400f-464e-9913-7d068a2b30d4", + "id": "433fac44-572c-40ca-ae55-2744281c2592", "name": "Get a container", "request": { "name": "Get a container", @@ -315,7 +315,7 @@ }, "response": [ { - "id": "17bdd69c-7694-41fa-9fa9-430602f34f09", + "id": "183958a6-0685-4441-8740-dd47e012c426", "name": "OK", "originalRequest": { "url": { @@ -364,7 +364,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"open top\",\n \"equipment_length\": 20,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"extended_dwell_time\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"all_containers_terminated\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"all_containers_terminated\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ]\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"tank\",\n \"equipment_length\": 45,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"total\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -375,7 +375,7 @@ } }, { - "id": "4a96adc4-bea7-45f7-a720-7368f6c20bb5", + "id": "40b64bf0-e5e5-440f-b4a9-a1979f424f7b", "name": "Get a container's raw events", "request": { "name": "Get a container's raw events", @@ -418,7 +418,7 @@ }, "response": [ { - "id": "569a638b-8fd9-49e5-b030-dbff7f398c93", + "id": "c9db1244-7133-443b-b9e4-3a22066b71cd", "name": "OK", "originalRequest": { "url": { @@ -458,7 +458,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\",\n \"attributes\": {\n \"event\": \"vessel_departed\",\n \"original_event\": \"\",\n \"timestamp\": \"\",\n \"estimated\": \"\",\n \"actual_on\": \"\",\n \"estimated_on\": \"\",\n \"actual_at\": \"\",\n \"estimated_at\": \"\",\n \"timezone\": \"\",\n \"created_at\": \"\",\n \"location_name\": \"\",\n \"location_locode\": \"\",\n \"vessel_name\": \"\",\n \"vessel_imo\": \"\",\n \"index\": \"\",\n \"voyage_number\": \"\"\n },\n \"relationships\": {\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"port\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"vessel\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\",\n \"attributes\": {\n \"event\": \"positioned_in\",\n \"original_event\": \"\",\n \"timestamp\": \"\",\n \"estimated\": \"\",\n \"actual_on\": \"\",\n \"estimated_on\": \"\",\n \"actual_at\": \"\",\n \"estimated_at\": \"\",\n \"timezone\": \"\",\n \"created_at\": \"\",\n \"location_name\": \"\",\n \"location_locode\": \"\",\n \"vessel_name\": \"\",\n \"vessel_imo\": \"\",\n \"index\": \"\",\n \"voyage_number\": \"\"\n },\n \"relationships\": {\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"metro_area\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"vessel\"\n }\n }\n }\n }\n ]\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\",\n \"attributes\": {\n \"event\": \"vessel_arrived\",\n \"original_event\": \"\",\n \"timestamp\": \"\",\n \"estimated\": \"\",\n \"actual_on\": \"\",\n \"estimated_on\": \"\",\n \"actual_at\": \"\",\n \"estimated_at\": \"\",\n \"timezone\": \"\",\n \"created_at\": \"\",\n \"location_name\": \"\",\n \"location_locode\": \"\",\n \"vessel_name\": \"\",\n \"vessel_imo\": \"\",\n \"index\": \"\",\n \"voyage_number\": \"\"\n },\n \"relationships\": {\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"port\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"vessel\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\",\n \"attributes\": {\n \"event\": \"feeder_arrived\",\n \"original_event\": \"\",\n \"timestamp\": \"\",\n \"estimated\": \"\",\n \"actual_on\": \"\",\n \"estimated_on\": \"\",\n \"actual_at\": \"\",\n \"estimated_at\": \"\",\n \"timezone\": \"\",\n \"created_at\": \"\",\n \"location_name\": \"\",\n \"location_locode\": \"\",\n \"vessel_name\": \"\",\n \"vessel_imo\": \"\",\n \"index\": \"\",\n \"voyage_number\": \"\"\n },\n \"relationships\": {\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"port\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"vessel\"\n }\n }\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -469,7 +469,7 @@ } }, { - "id": "3251ddcf-c052-44fc-9d2a-3b2dda863624", + "id": "72bceef8-6627-4133-98bb-898af95a6029", "name": "Get a container's transport events", "request": { "name": "Get a container's transport events", @@ -522,7 +522,7 @@ }, "response": [ { - "id": "d70e048a-5c79-4657-b34b-818689e17ec0", + "id": "77db3cd1-b54c-4bf4-8c7d-4650ea9709c0", "name": "OK", "originalRequest": { "url": { @@ -572,7 +572,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\",\n \"attributes\": {\n \"event\": \"container.transport.transshipment_loaded\",\n \"voyage_number\": \"\",\n \"timestamp\": \"\",\n \"timezone\": \"\",\n \"location_locode\": \"\",\n \"created_at\": \"\",\n \"data_source\": \"ais\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"metro_area\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"name\": \"vessel\"\n }\n },\n \"terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"rail_terminal\"\n }\n },\n \"container\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\",\n \"attributes\": {\n \"event\": \"container.transport.vessel_loaded\",\n \"voyage_number\": \"\",\n \"timestamp\": \"\",\n \"timezone\": \"\",\n \"location_locode\": \"\",\n \"created_at\": \"\",\n \"data_source\": \"shipping_line\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"port\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"name\": \"vessel\"\n }\n },\n \"terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"container\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\"\n }\n }\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"no_updates_at_line\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"cancelled_by_user\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\",\n \"attributes\": {\n \"event\": \"container.transport.estimated.arrived_at_inland_destination\",\n \"voyage_number\": \"\",\n \"timestamp\": \"\",\n \"timezone\": \"\",\n \"location_locode\": \"\",\n \"created_at\": \"\",\n \"data_source\": \"shipping_line\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"port\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"name\": \"vessel\"\n }\n },\n \"terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"container\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\",\n \"attributes\": {\n \"event\": \"container.transport.rail_unloaded\",\n \"voyage_number\": \"\",\n \"timestamp\": \"\",\n \"timezone\": \"\",\n \"location_locode\": \"\",\n \"created_at\": \"\",\n \"data_source\": \"ais\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"metro_area\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"name\": \"vessel\"\n }\n },\n \"terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"rail_terminal\"\n }\n },\n \"container\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\"\n }\n }\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"all_containers_terminated\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"no_updates_at_line\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -583,7 +583,7 @@ } }, { - "id": "6cfa11b0-8930-4e20-b2ca-0245b161b5ca", + "id": "66a2f9c6-37b2-4938-9e0f-5e863d81816d", "name": "Get container route", "request": { "name": "Get container route", @@ -626,7 +626,7 @@ }, "response": [ { - "id": "32b03d0c-f276-4a94-bbd1-5757d153cda0", + "id": "708b122d-e156-40f1-b02f-b2e48732969a", "name": "OK", "originalRequest": { "url": { @@ -671,7 +671,7 @@ "_postman_previewlanguage": "json" }, { - "id": "405c0fa1-293c-4f82-860f-9ff748c35b74", + "id": "dd6a9a65-af8c-47c2-a1c8-52eb9d2f1d4a", "name": "Forbidden - Routing data feature is not enabled for this account", "originalRequest": { "url": { @@ -722,7 +722,7 @@ } }, { - "id": "1ff7d075-fb82-4af9-bacb-73ce5128e721", + "id": "2b73f8ae-c286-4593-932f-b07fa7776912", "name": "Refresh container", "request": { "name": "Refresh container", @@ -765,7 +765,7 @@ }, "response": [ { - "id": "ba9c4004-ac7d-4c5c-9645-1aad3e5697f1", + "id": "653a6958-49fe-4eba-80cb-7523eeecc73b", "name": "OK", "originalRequest": { "url": { @@ -810,7 +810,7 @@ "_postman_previewlanguage": "json" }, { - "id": "94e223bf-616a-4f2b-a09d-c58a8bc5164c", + "id": "3c6a832c-b798-4efe-b29a-041bf09056d9", "name": "Forbidden - This API endpoint is not enabled for your account. Please contact support@terminal49.com", "originalRequest": { "url": { @@ -855,7 +855,7 @@ "_postman_previewlanguage": "json" }, { - "id": "958cf332-98e5-4cc0-9732-787932a5352b", + "id": "7fe5f320-5ad3-46e3-bed2-80e33cb6edfe", "name": "Too Many Requests - You've hit the refresh limit. Please try again in a minute.", "originalRequest": { "url": { @@ -921,7 +921,7 @@ "description": "", "item": [ { - "id": "2deb1214-28d8-48e4-97db-8a37fc44e099", + "id": "73b1bace-2052-4f04-8626-43bcd3b50bd2", "name": "List shipments", "request": { "name": "List shipments", @@ -1006,7 +1006,7 @@ }, "response": [ { - "id": "987b6842-b686-44a3-bf6c-94be7788bc07", + "id": "b4419697-f28f-4cb6-aa4b-e9ca082554df", "name": "OK", "originalRequest": { "url": { @@ -1099,12 +1099,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"all_containers_terminated\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"past_arrival_window\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"tank\",\n \"equipment_length\": 10,\n \"equipment_height\": \"high_cube\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"extended_dwell_time\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": null,\n \"equipment_length\": 40,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"extended_dwell_time\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"extended_dwell_time\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"open top\",\n \"equipment_length\": 20,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"extended_dwell_time\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"other\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"open top\",\n \"equipment_length\": 10,\n \"equipment_height\": \"high_cube\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "ca5524f1-c42b-45a3-90cb-6f855afb5f2e", + "id": "2e9ec3a9-6df1-4963-b42a-6b82cb9b462e", "name": "Unprocessable Entity", "originalRequest": { "url": { @@ -1208,7 +1208,7 @@ } }, { - "id": "dd1c6f2a-9eae-44f7-924b-704f8ad2b593", + "id": "4e0c7dea-4917-4b10-84cd-5a1b59912d19", "name": "Get a shipment", "request": { "name": "Get a shipment", @@ -1260,7 +1260,7 @@ }, "response": [ { - "id": "337a8b19-edb4-4253-bfc1-c54fd1f8f54c", + "id": "218ce425-dd0b-488a-9f7c-21dc597472d2", "name": "OK", "originalRequest": { "url": { @@ -1309,12 +1309,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"no_updates_at_line\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"bulk\",\n \"equipment_length\": 40,\n \"equipment_height\": null,\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"extended_dwell_time\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": null,\n \"equipment_length\": null,\n \"equipment_height\": \"high_cube\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"total\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n ]\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"past_arrival_window\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": null,\n \"equipment_length\": 20,\n \"equipment_height\": \"high_cube\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"reefer\",\n \"equipment_length\": 20,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"other\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "b9f56b5d-bfa1-4a73-bab6-62608b6b4f7d", + "id": "151775a8-efbf-4f78-b8e2-2e1340bf7004", "name": "Not Found", "originalRequest": { "url": { @@ -1374,7 +1374,7 @@ } }, { - "id": "597e98cb-5ee6-4e7b-924b-26945b554643", + "id": "2946c575-22d8-435b-9b3c-6956fcc07b10", "name": "Edit a shipment", "request": { "name": "Edit a shipment", @@ -1429,7 +1429,7 @@ }, "response": [ { - "id": "95de3cbc-fbac-460c-b8d9-cf2edbc67f4e", + "id": "b0a040b3-e3d9-41ce-99e6-9c21ff36eff2", "name": "OK", "originalRequest": { "url": { @@ -1481,7 +1481,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"past_arrival_window\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -1492,7 +1492,7 @@ } }, { - "id": "846e40a6-ae31-4eaf-8384-3997efff8cd2", + "id": "ea3da58c-fc39-4a23-95cc-20b4ebac8851", "name": "Stop tracking a shipment", "request": { "name": "Stop tracking a shipment", @@ -1535,7 +1535,7 @@ }, "response": [ { - "id": "89c95cf6-d7cf-4100-b4fd-ab7395e0da7a", + "id": "d1657693-eeb1-4212-bfe6-36a040c67dd6", "name": "OK", "originalRequest": { "url": { @@ -1575,7 +1575,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"past_arrival_window\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -1586,7 +1586,7 @@ } }, { - "id": "e24cd2eb-7f82-4282-b9f8-38550053f4cc", + "id": "55d0ac8c-8743-4410-a6bd-0b3b2440f870", "name": "Resume tracking a shipment", "request": { "name": "Resume tracking a shipment", @@ -1629,7 +1629,7 @@ }, "response": [ { - "id": "af2a2495-a878-4b9d-9bf9-b3096aaa7bfc", + "id": "e216f90c-6c33-48f0-96d0-6ed704bfb797", "name": "OK", "originalRequest": { "url": { @@ -1669,7 +1669,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"past_arrival_window\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -1696,7 +1696,7 @@ "description": "", "item": [ { - "id": "ab528c3a-0dab-4759-bcf8-905e5c8844d0", + "id": "642c186b-9b9a-4b7e-85a3-4445a8512e2f", "name": "Create a tracking request", "request": { "name": "Create a tracking request", @@ -1727,7 +1727,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"container\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"bill_of_lading\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -1755,7 +1755,7 @@ }, "response": [ { - "id": "dd752113-57d4-46f0-8bf4-9737b249c1a5", + "id": "6490aa04-f8f8-4709-8e9a-08cdffc83fd1", "name": "Tracking Request Created", "originalRequest": { "url": { @@ -1789,7 +1789,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"container\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"bill_of_lading\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -1806,12 +1806,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"created\",\n \"request_type\": \"bill_of_lading\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"not_found\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ]\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"pending\",\n \"request_type\": \"booking_number\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"internal_processing_error\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "cf19e2bd-715a-4be8-8813-b7cfae7a81c2", + "id": "b79ecc84-8717-4469-bf26-837adee6a750", "name": "Unprocessable Entity", "originalRequest": { "url": { @@ -1845,7 +1845,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"container\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"bill_of_lading\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -1867,7 +1867,7 @@ "_postman_previewlanguage": "json" }, { - "id": "a22a88e7-7ceb-4d31-87c9-d8b52e3ad6ba", + "id": "d7cae8d1-6db2-4e8b-a90d-54ae11850a21", "name": "Too Many Requests - You've hit the create tracking requests limit. Please try again in a minute.", "originalRequest": { "url": { @@ -1901,7 +1901,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"container\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"bill_of_lading\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -1938,7 +1938,7 @@ } }, { - "id": "cc5ef3e5-f795-4ae6-968a-82c6c5038ad3", + "id": "7585808e-0e23-474b-8740-5963e66cad70", "name": "List tracking requests", "request": { "name": "List tracking requests", @@ -2050,7 +2050,7 @@ }, "response": [ { - "id": "4fac7b8f-1315-482d-9f0e-8f8e30a6cbc0", + "id": "04cc4f4b-2b17-4f5b-ba02-5d23f47987b2", "name": "OK", "originalRequest": { "url": { @@ -2170,12 +2170,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"tracking_stopped\",\n \"request_type\": \"container\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"unrecognized_response\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"awaiting_manifest\",\n \"request_type\": \"bill_of_lading\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": null,\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ]\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"failed\",\n \"request_type\": \"booking_number\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"not_found\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"awaiting_manifest\",\n \"request_type\": \"bill_of_lading\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"duplicate\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "423ed82b-88f9-4172-8e91-690a93a2b592", + "id": "adf1317d-b490-44cd-b474-3e26d808087b", "name": "Not Found", "originalRequest": { "url": { @@ -2306,7 +2306,7 @@ } }, { - "id": "8cd27526-82e5-45fd-ad31-4db4ca10ac1e", + "id": "ac0387ad-731b-4ea8-9003-3f990ae72d4b", "name": "Get a single tracking request", "request": { "name": "Get a single tracking request", @@ -2358,7 +2358,7 @@ }, "response": [ { - "id": "5ba6ecf9-8d5a-4490-8016-7b9272db5b28", + "id": "caf38ead-d640-40e2-9eca-e9cece46a158", "name": "OK", "originalRequest": { "url": { @@ -2407,12 +2407,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"created\",\n \"request_type\": \"bill_of_lading\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"not_found\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ]\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"pending\",\n \"request_type\": \"booking_number\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"internal_processing_error\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "fdc42544-506e-4be4-ae72-afe0dad8b044", + "id": "562e9533-b4ce-48d4-a05a-de1f4e381d2e", "name": "Not Found", "originalRequest": { "url": { @@ -2472,7 +2472,7 @@ } }, { - "id": "91842574-6917-4a61-82d8-58bf7e629604", + "id": "0b83d173-df3f-4e59-a516-0f5ef5e10b06", "name": "Edit a tracking request", "request": { "name": "Edit a tracking request", @@ -2515,7 +2515,7 @@ "method": "PATCH", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"attributes\": {\n \"ref_number\": \"\"\n },\n \"type\": 8411.224044762535\n }\n}", + "raw": "{\n \"data\": {\n \"attributes\": {\n \"ref_number\": \"\"\n },\n \"type\": 2751.0305178836256\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -2527,7 +2527,7 @@ }, "response": [ { - "id": "8c191c16-7e72-44b1-865d-81c208f7a461", + "id": "f013cbce-aec1-4bfa-b088-eb9c9e21474b", "name": "OK", "originalRequest": { "url": { @@ -2562,7 +2562,7 @@ "method": "PATCH", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"attributes\": {\n \"ref_number\": \"\"\n },\n \"type\": 8411.224044762535\n }\n}", + "raw": "{\n \"data\": {\n \"attributes\": {\n \"ref_number\": \"\"\n },\n \"type\": 2751.0305178836256\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -2579,7 +2579,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"created\",\n \"request_type\": \"booking_number\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"retries_exhausted\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"pending\",\n \"request_type\": \"bill_of_lading\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"internal_processing_error\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -2596,7 +2596,7 @@ "description": "", "item": [ { - "id": "bbe1a001-dc3f-4c1a-99b9-079d9bd12a3d", + "id": "8d4016f5-2c50-425a-9357-99a286367b2a", "name": "Get single webhook", "request": { "name": "Get single webhook", @@ -2638,7 +2638,7 @@ }, "response": [ { - "id": "e7b88eb3-c223-4f29-9c22-10bc8900ed96", + "id": "e6bb0ed4-bda6-4e28-b1da-61f291c1b603", "name": "OK", "originalRequest": { "url": { @@ -2677,7 +2677,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.full_out\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.empty_in\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -2688,7 +2688,7 @@ } }, { - "id": "bb8578e6-48bf-4d42-bd3f-03078c239f3c", + "id": "581ccb43-9284-47f0-b43f-4ef91ff332e5", "name": "Edit a webhook", "request": { "name": "Edit a webhook", @@ -2731,7 +2731,7 @@ "method": "PATCH", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"events\": [\n \"container.transport.vessel_berthed\"\n ],\n \"active\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", + "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"events\": [\n \"container.updated\"\n ],\n \"active\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -2743,7 +2743,7 @@ }, "response": [ { - "id": "d07559b9-5b23-4187-8c23-6d64aaeb65ce", + "id": "de39d009-d7a6-4de4-943f-de7a1552844b", "name": "OK", "originalRequest": { "url": { @@ -2778,7 +2778,7 @@ "method": "PATCH", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"events\": [\n \"container.transport.vessel_berthed\"\n ],\n \"active\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", + "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"events\": [\n \"container.updated\"\n ],\n \"active\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -2795,7 +2795,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.full_out\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.empty_in\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -2806,7 +2806,7 @@ } }, { - "id": "6030a919-a80a-4a2b-a1bb-0c7713886260", + "id": "2471cfe3-4285-40d7-a298-a87da6ac57c8", "name": "Delete a webhook", "request": { "name": "Delete a webhook", @@ -2842,7 +2842,7 @@ }, "response": [ { - "id": "2d4457a2-3381-40c2-963d-9066b0d945dc", + "id": "8ee1fa0f-601c-40f4-a87e-f09b76f15fe5", "name": "OK", "originalRequest": { "url": { @@ -2882,7 +2882,7 @@ } }, { - "id": "5b20414e-ba99-44f1-9a45-bb3d4eb413ba", + "id": "747636d0-0820-4bcf-b6f8-aa0952d189bb", "name": "List webhooks", "request": { "name": "List webhooks", @@ -2931,7 +2931,7 @@ }, "response": [ { - "id": "71762ddc-5b2f-4f25-80fc-2c142b6c0937", + "id": "8743438f-ec97-4a71-a19c-761a489e11f4", "name": "OK", "originalRequest": { "url": { @@ -2988,7 +2988,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.pod_terminal_changed\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.rail_arrived\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ],\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n }\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.updated\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.vessel_discharged\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ],\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -2999,7 +2999,7 @@ } }, { - "id": "0581659f-be2e-4c7f-8ea9-8adc6b156e9e", + "id": "5fcc80f4-4100-4606-8488-8d8297d3b848", "name": "Create a webhook", "request": { "name": "Create a webhook", @@ -3030,7 +3030,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"active\": \"\",\n \"events\": [\n \"container.transport.transshipment_departed\"\n ],\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", + "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"active\": \"\",\n \"events\": [\n \"container.transport.feeder_loaded\"\n ],\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -3042,7 +3042,7 @@ }, "response": [ { - "id": "9259df73-ac58-4a42-9b4b-ff49aef8c4b9", + "id": "0e52fb19-84a8-43ed-aaab-4bc6df9ab5a9", "name": "Create a test webhook endpoint", "originalRequest": { "url": { @@ -3076,7 +3076,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"active\": \"\",\n \"events\": [\n \"container.transport.transshipment_departed\"\n ],\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", + "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"active\": \"\",\n \"events\": [\n \"container.transport.feeder_loaded\"\n ],\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -3093,7 +3093,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.full_out\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.empty_in\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -3104,7 +3104,7 @@ } }, { - "id": "666a14bc-2c3d-45d1-96d4-a7456dac7053", + "id": "02ee5993-a88c-4d7d-a962-b2e21f5980ac", "name": "List webhook IPs", "request": { "name": "List webhook IPs", @@ -3135,7 +3135,7 @@ }, "response": [ { - "id": "84c5c8df-e4fd-4d61-90c5-c8b0f12a4136", + "id": "4e092934-a8b6-42b4-b6cb-e4b9939a07de", "name": "OK", "originalRequest": { "url": { @@ -3191,7 +3191,7 @@ "description": "", "item": [ { - "id": "41983e19-298d-4cd4-8922-aeaa328e7ca7", + "id": "f03b98d0-a83a-4d86-bf31-a9d6187b53f9", "name": "Get a single webhook notification", "request": { "name": "Get a single webhook notification", @@ -3243,7 +3243,7 @@ }, "response": [ { - "id": "2e4e95bf-08ca-451f-93e7-ddd5d475f39d", + "id": "2def6d6a-b5a1-4fd8-848b-c52e14b848ab", "originalRequest": { "url": { "path": [ @@ -3291,7 +3291,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"tracking_request.succeeded\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\"\n }\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.vessel_discharged\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.available\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ]\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.estimated.arrived_at_inland_destination\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"estimated_event\"\n }\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.feeder_discharged\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.rail_unloaded\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -3302,7 +3302,7 @@ } }, { - "id": "713e2dd0-3d7a-4e41-8ae1-1c032611a39c", + "id": "210f16ce-0b39-412f-80c7-903bae11de12", "name": "List webhook notifications", "request": { "name": "List webhook notifications", @@ -3360,7 +3360,7 @@ }, "response": [ { - "id": "cea6763a-b186-4f93-a6b2-f3d394ee32e2", + "id": "d9d1661b-7223-4312-9f5c-19bbaafad901", "name": "OK", "originalRequest": { "url": { @@ -3426,7 +3426,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.vessel_loaded\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.transshipment_departed\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.vessel_berthed\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.full_out\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ]\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"tracking_request.awaiting_manifest\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.transshipment_loaded\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"tracking_request.failed\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.rail_departed\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -3437,7 +3437,7 @@ } }, { - "id": "429e3270-5e4e-4c5d-a828-92e5ecabcfec", + "id": "6c108013-790f-4b64-82d0-33637a4ab535", "name": "Get webhook notification payload examples", "request": { "name": "Get webhook notification payload examples", @@ -3461,7 +3461,7 @@ "type": "text/plain" }, "key": "event", - "value": "container.transport.transshipment_arrived" + "value": "container.transport.full_out" } ], "variable": [] @@ -3478,7 +3478,7 @@ }, "response": [ { - "id": "70e15505-3abc-4a62-b3bf-eee51b9a8cee", + "id": "0b0243e7-fc87-4224-9f77-a4c856cca96f", "name": "OK", "originalRequest": { "url": { @@ -3497,7 +3497,7 @@ "type": "text/plain" }, "key": "event", - "value": "container.transport.transshipment_arrived" + "value": "container.transport.full_out" } ], "variable": [] @@ -3527,7 +3527,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.vessel_loaded\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.transshipment_departed\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.vessel_berthed\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.full_out\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ]\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"tracking_request.awaiting_manifest\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.transshipment_loaded\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"tracking_request.failed\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.rail_departed\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -3544,7 +3544,7 @@ "description": "", "item": [ { - "id": "c9c8ace6-c04e-4da8-aee5-b451b125954f", + "id": "94ae31c1-e4c9-4ee3-bf2b-069e7b67022b", "name": "Get a port using the locode or the id", "request": { "name": "Get a port using the locode or the id", @@ -3586,7 +3586,7 @@ }, "response": [ { - "id": "84ee9186-9053-4624-b30c-42fd4111c7c1", + "id": "8df6147f-be79-4900-ba50-528873323ed3", "name": "OK", "originalRequest": { "url": { @@ -3642,7 +3642,7 @@ "description": "", "item": [ { - "id": "7393d011-34c3-4a47-8ade-42f37a157520", + "id": "017222b2-d3f8-4f4d-a750-fee124510664", "name": "Get a metro area using the un/locode or the id", "request": { "name": "Get a metro area using the un/locode or the id", @@ -3684,7 +3684,7 @@ }, "response": [ { - "id": "ca463633-f9c7-46b4-970e-fc04f4ed6683", + "id": "e5fff2f3-6cb1-4223-9121-93ba2c6c5ae6", "name": "OK", "originalRequest": { "url": { @@ -3740,7 +3740,7 @@ "description": "", "item": [ { - "id": "71a82348-0244-48d5-b304-8514d96c5fff", + "id": "3d736892-801e-4133-b6bf-926d3cac9f53", "name": "Get a terminal using the id", "request": { "name": "Get a terminal using the id", @@ -3782,7 +3782,7 @@ }, "response": [ { - "id": "9ac17ff6-e1f4-4d0d-84e8-5ad774e3b53f", + "id": "9734ed23-5246-478a-bbcf-3e19d98f13d2", "name": "OK", "originalRequest": { "url": { @@ -3838,7 +3838,7 @@ "description": "", "item": [ { - "id": "80411dd2-d20e-4ab5-bd47-343701e0d590", + "id": "95e1527d-daac-48a0-b9e8-cc09320b6f86", "name": "Get container route", "request": { "name": "Get container route", @@ -3881,7 +3881,7 @@ }, "response": [ { - "id": "5181895c-47b0-41b5-8e71-dbc352f90a43", + "id": "2b401dab-a732-4e99-aeb6-7d1b9b62880c", "name": "OK", "originalRequest": { "url": { @@ -3926,7 +3926,7 @@ "_postman_previewlanguage": "json" }, { - "id": "335be4c2-24e2-4159-808c-704d49253008", + "id": "869caab5-a296-4c85-9a85-05486833da9e", "name": "Forbidden - Routing data feature is not enabled for this account", "originalRequest": { "url": { @@ -3977,7 +3977,7 @@ } }, { - "id": "568a817f-cc9a-4da8-9ce9-68d594a27442", + "id": "90d5e49f-0e53-47fd-92ba-bc0d71e7587a", "name": "Get vessel future positions", "request": { "name": "Get vessel future positions", @@ -4039,7 +4039,7 @@ }, "response": [ { - "id": "59035b04-09be-4b61-9927-84c877c9f5e2", + "id": "d1ec28fd-917f-49e6-8f1c-4d4d84bd78e1", "name": "OK", "originalRequest": { "url": { @@ -4103,7 +4103,7 @@ "_postman_previewlanguage": "json" }, { - "id": "f5c08d74-19b6-4279-84c0-908588979a1a", + "id": "bb377147-25ec-416c-a2ba-b6abafeace4c", "name": "Forbidden - Routing data feature is not enabled for this account", "originalRequest": { "url": { @@ -4173,7 +4173,7 @@ } }, { - "id": "6ff42c92-c095-4a0f-9270-bcc3844aa10d", + "id": "177cbb12-8ed2-4191-952c-9d6e8c0f178a", "name": "Get vessel future positions from coordinates", "request": { "name": "Get vessel future positions from coordinates", @@ -4253,7 +4253,7 @@ }, "response": [ { - "id": "fade7837-51ff-4644-84ec-f89d482030d5", + "id": "16a78dcf-3abc-4792-8cf7-b626e273ca91", "name": "OK", "originalRequest": { "url": { @@ -4335,7 +4335,7 @@ "_postman_previewlanguage": "json" }, { - "id": "53ef7681-7e20-476a-989f-3e5f8130c9eb", + "id": "e6dfc1fb-8d74-48d9-9fb3-6d20495d2c83", "name": "Forbidden - Routing data feature is not enabled for this account", "originalRequest": { "url": { @@ -4429,7 +4429,7 @@ "description": "", "item": [ { - "id": "86a2150b-dc3a-4574-bac5-d5a4ada787ae", + "id": "1c081f68-b3bd-4ea1-937b-966486b76053", "name": "Shipping Lines", "request": { "name": "Shipping Lines", @@ -4459,7 +4459,7 @@ }, "response": [ { - "id": "c9007e7e-8240-4bbc-a796-2e1afc45cb3a", + "id": "a1f91328-6841-45cc-991c-b291699c1a3f", "name": "OK", "originalRequest": { "url": { @@ -4508,7 +4508,7 @@ } }, { - "id": "dbdfbd50-9fa2-4a8c-9862-c723369b30d1", + "id": "fd678831-5c50-40df-b9b0-3f68e9c6cbb0", "name": "Get a single shipping line", "request": { "name": "Get a single shipping line", @@ -4550,7 +4550,7 @@ }, "response": [ { - "id": "ac5c3290-6d46-4a8a-b914-e7f97524a128", + "id": "f0c78294-0dcd-416f-8472-85bc2ec732c8", "name": "OK", "originalRequest": { "url": { @@ -4606,7 +4606,7 @@ "description": "", "item": [ { - "id": "277fc3bc-1f3b-424e-be34-e0dedbe97592", + "id": "27e3537c-8e86-4d65-b40f-0f5e4163b11c", "name": "Get a vessel using the id", "request": { "name": "Get a vessel using the id", @@ -4667,7 +4667,7 @@ }, "response": [ { - "id": "fffa1a09-2a7c-4a44-8064-b1b01fcf0934", + "id": "433c7f40-2445-4c43-9891-78034996b9d4", "name": "OK", "originalRequest": { "url": { @@ -4730,7 +4730,7 @@ "_postman_previewlanguage": "json" }, { - "id": "0a6a6410-29d3-442e-ade6-f02477e7c527", + "id": "31b26aca-b0fe-4896-abbe-6c52a2bb011b", "name": "Forbidden - Feature not enabled", "originalRequest": { "url": { @@ -4799,7 +4799,7 @@ } }, { - "id": "d345c694-bac3-4b82-b37a-f751e2787130", + "id": "350a7314-0950-403a-bf23-c9bbb6304ce7", "name": "Get a vessel using the imo", "request": { "name": "Get a vessel using the imo", @@ -4860,7 +4860,7 @@ }, "response": [ { - "id": "e54542e9-8770-48b2-b778-ceda06446c54", + "id": "a32220a4-b92e-4e88-ad60-0560c87874e9", "name": "OK", "originalRequest": { "url": { @@ -4923,7 +4923,7 @@ "_postman_previewlanguage": "json" }, { - "id": "4a42a498-62d7-4b00-a5cb-4ab48477d240", + "id": "efe9ac23-387e-4877-b883-69e777f3fa21", "name": "Forbidden - Feature not enabled", "originalRequest": { "url": { @@ -4992,7 +4992,7 @@ } }, { - "id": "8c299763-bd6d-4bad-974c-210d803b1435", + "id": "c6dd4d77-3fca-411e-8765-ac8c88196d20", "name": "Get vessel future positions", "request": { "name": "Get vessel future positions", @@ -5054,7 +5054,7 @@ }, "response": [ { - "id": "fccec457-db9e-45b8-b1c3-2d6f88616604", + "id": "42ea7e37-ce1a-48d0-9904-b0671ca2c394", "name": "OK", "originalRequest": { "url": { @@ -5118,7 +5118,7 @@ "_postman_previewlanguage": "json" }, { - "id": "2549bf40-2317-45bc-9b47-747eb97d06e8", + "id": "180c67b4-8833-4423-8109-738e09243f08", "name": "Forbidden - Routing data feature is not enabled for this account", "originalRequest": { "url": { @@ -5188,7 +5188,7 @@ } }, { - "id": "71cf899c-5135-4ac7-9547-2148bfe5ba2c", + "id": "44a5427c-7498-49f0-8a56-7978dd69f2b8", "name": "Get vessel future positions from coordinates", "request": { "name": "Get vessel future positions from coordinates", @@ -5268,7 +5268,7 @@ }, "response": [ { - "id": "2a53420f-c86d-42b7-b4a3-c63fd7ecf7d9", + "id": "c27f1c92-c2b0-4f78-a043-911cd6dedfd6", "name": "OK", "originalRequest": { "url": { @@ -5350,7 +5350,7 @@ "_postman_previewlanguage": "json" }, { - "id": "b74d9d21-48d8-4378-b8fc-f4a81b8a4611", + "id": "d0eb8cc0-271c-4944-8d71-d8946db7dd13", "name": "Forbidden - Routing data feature is not enabled for this account", "originalRequest": { "url": { @@ -5444,7 +5444,7 @@ "description": "", "item": [ { - "id": "a4f58971-7e32-4556-b9c5-7ec2c04a6de2", + "id": "c3827aaf-0c46-4935-af15-1f8e293ff663", "name": "list-parties", "request": { "name": "list-parties", @@ -5493,7 +5493,7 @@ }, "response": [ { - "id": "45e96957-6371-4d88-8325-289a4945e348", + "id": "c066e13b-fa84-45fb-a612-2640c9d820ce", "name": "OK", "originalRequest": { "url": { @@ -5561,7 +5561,7 @@ } }, { - "id": "3aec52da-334f-4d06-ae2d-e0c187ae3322", + "id": "49c74097-9876-4d13-9670-00c8c37bcf44", "name": "post-party", "request": { "name": "post-party", @@ -5604,7 +5604,7 @@ }, "response": [ { - "id": "4a918e8a-8919-4de9-9b31-eda822178c3c", + "id": "fea55bdf-e4f6-435f-9749-f7ffeb3d49e7", "name": "Party Created", "originalRequest": { "url": { @@ -5660,7 +5660,7 @@ "_postman_previewlanguage": "json" }, { - "id": "e4e1dee3-fb08-4375-896f-dce4235bf42a", + "id": "e9554f43-13f4-4b57-b503-de0dac40b3cb", "name": "Unprocessable Entity", "originalRequest": { "url": { @@ -5722,7 +5722,7 @@ } }, { - "id": "1765308c-bcfb-4950-8485-7f8c6dacc1e7", + "id": "074b1445-e3ef-4816-a754-116c3983abb3", "name": "get-parties-id", "request": { "name": "get-parties-id", @@ -5764,7 +5764,7 @@ }, "response": [ { - "id": "68b98449-2b80-48db-9d7e-2ce4133c769a", + "id": "2e85a06f-0f69-4a3a-adf7-df1cce3c9d5d", "name": "OK", "originalRequest": { "url": { @@ -5814,7 +5814,7 @@ } }, { - "id": "6b33f3d4-4b31-4fc9-8040-c3a9402a6ddb", + "id": "d752579b-0329-406d-98f1-089ed2070eab", "name": "edit-party", "request": { "name": "edit-party", @@ -5869,7 +5869,7 @@ }, "response": [ { - "id": "d54dc38c-e94d-49e7-a2b5-5d1d99aa7dc6", + "id": "d9a3fc40-0ffd-4eb8-88bb-e51db88746ee", "name": "OK", "originalRequest": { "url": { @@ -5926,7 +5926,7 @@ "_postman_previewlanguage": "json" }, { - "id": "f22cff89-18f0-4031-b137-3aa901b8f033", + "id": "4833278a-cac2-444c-9a36-a30f6f5c4869", "name": "Unprocessable Entity", "originalRequest": { "url": { @@ -6019,7 +6019,7 @@ } ], "info": { - "_postman_id": "c5c5e55f-84c8-46f4-8df1-9df7b5e5d4b5", + "_postman_id": "98f7ee2d-e01a-46ef-bde7-ae10d3591440", "name": "Terminal49 API Reference", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", "description": { From 07aea5d83186b9fcaa3fc246746771af1b9e7465 Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Wed, 22 Oct 2025 00:41:39 -0700 Subject: [PATCH 3/7] test: verify pre-commit hook works --- docs/openapi.json | 197 ++++++------------ docs/openapi/components/schemas/shipment.yaml | 3 + 2 files changed, 72 insertions(+), 128 deletions(-) diff --git a/docs/openapi.json b/docs/openapi.json index 5675abca..d4914f4e 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -25,6 +25,9 @@ { "name": "Shipments" }, + { + "name": "Shipping Lines" + }, { "name": "Locations" }, @@ -51,6 +54,12 @@ }, { "name": "Routing (Paid)" + }, + { + "name": "Vessels" + }, + { + "name": "Parties" } ], "security": [ @@ -164,7 +173,7 @@ "line_tracking_stopped_reason": null }, "links": { - "self": "/v2/shipments/62738624-7032-4a50-892e-c55826228c25" + "self": "https://api.terminal49.com/v2/shipments/62738624-7032-4a50-892e-c55826228c25" }, "relationships": { "port_of_lading": { @@ -248,7 +257,7 @@ "line_tracking_stopped_reason": null }, "links": { - "self": "/v2/shipments/baaa725e-aa0e-4937-ac78-54d9e2e8621e" + "self": "https://api.terminal49.com/v2/shipments/baaa725e-aa0e-4937-ac78-54d9e2e8621e" }, "relationships": { "port_of_lading": { @@ -337,7 +346,7 @@ "line_tracking_stopped_reason": null }, "links": { - "self": "/v2/shipments/7721a48c-5e93-43c9-9f5f-5be10a87fdde" + "self": "https://api.terminal49.com/v2/shipments/7721a48c-5e93-43c9-9f5f-5be10a87fdde" }, "relationships": { "port_of_lading": { @@ -429,7 +438,7 @@ "line_tracking_stopped_reason": null }, "links": { - "self": "/v2/shipments/32b5ad78-43ba-42d9-bdc0-4cf12320e020" + "self": "https://api.terminal49.com/v2/shipments/32b5ad78-43ba-42d9-bdc0-4cf12320e020" }, "relationships": { "port_of_lading": { @@ -517,7 +526,7 @@ "line_tracking_stopped_reason": null }, "links": { - "self": "/v2/shipments/bd117d3b-8fa4-487c-9bab-25c15e227d1a" + "self": "https://api.terminal49.com/v2/shipments/bd117d3b-8fa4-487c-9bab-25c15e227d1a" }, "relationships": { "port_of_lading": { @@ -563,10 +572,10 @@ "total": 34044 }, "links": { - "self": "https://api.terminal49.com/v2/shipments?page[size]=5", - "current": "https://api.terminal49.com/v2/shipments?page[number]=1&page[size]=5", - "next": "https://api.terminal49.com/v2/shipments?page[number]=2&page[size]=5", - "last": "https://api.terminal49.com/v2/shipments?page[number]=6809&page[size]=5" + "self": "https://api.terminal49.com/v2/shipments?page%5Bsize%5D=5", + "current": "https://api.terminal49.com/v2/shipments?page%5Bnumber%5D=1&page%5Bsize%5D=5", + "next": "https://api.terminal49.com/v2/shipments?page%5Bnumber%5D=2&page%5Bsize%5D=5", + "last": "https://api.terminal49.com/v2/shipments?page%5Bnumber%5D=6809&page%5Bsize%5D=5" } } } @@ -626,7 +635,7 @@ "default": 1 }, "in": "query", - "name": "page[number]", + "name": "page%5Bnumber%5D", "description": "\n" }, { @@ -635,7 +644,7 @@ "default": 30 }, "in": "query", - "name": "page[size]", + "name": "page%5Bsize%5D", "description": "\n" }, { @@ -761,7 +770,7 @@ "line_tracking_stopped_reason": null }, "links": { - "self": "/v2/shipments/02b1bd6f-407c-45bb-8645-06e7ee34e7e3" + "self": "https://api.terminal49.com/v2/shipments/02b1bd6f-407c-45bb-8645-06e7ee34e7e3" }, "relationships": { "port_of_lading": { @@ -1343,7 +1352,7 @@ } }, "links": { - "self": "/v2/tracking_requests/ba4cb904-827f-4038-8e31-1e92b3356218" + "self": "https://api.terminal49.com/v2/tracking_requests/ba4cb904-827f-4038-8e31-1e92b3356218" } } } @@ -1838,7 +1847,7 @@ } }, "links": { - "self": "/v2/tracking_requests/ba4cb904-827f-4038-8e31-1e92b3356218" + "self": "https://api.terminal49.com/v2/tracking_requests/ba4cb904-827f-4038-8e31-1e92b3356218" } }, "included": [ @@ -1902,7 +1911,7 @@ } }, "links": { - "self": "/v2/shipments/eb6f218a-0b4a-47f9-8ef9-759aa5e0ea83" + "self": "https://api.terminal49.com/v2/shipments/eb6f218a-0b4a-47f9-8ef9-759aa5e0ea83" } } ] @@ -1938,7 +1947,7 @@ } }, "links": { - "self": "/v2/tracking_requests/62c30bd4-d7fc-40dc-9fd6-fb39224301f5" + "self": "https://api.terminal49.com/v2/tracking_requests/62c30bd4-d7fc-40dc-9fd6-fb39224301f5" } }, "links": { @@ -2020,7 +2029,7 @@ } }, "links": { - "self": "/v2/shipments/dfc9f601-f6fe-412e-a71c-feabcc2dd4e3" + "self": "https://api.terminal49.com/v2/shipments/dfc9f601-f6fe-412e-a71c-feabcc2dd4e3" } } ] @@ -2642,6 +2651,27 @@ }, { "$ref": "#/components/schemas/container_updated_event" + }, + { + "$ref": "#/components/schemas/shipment" + }, + { + "$ref": "#/components/schemas/container" + }, + { + "$ref": "#/components/schemas/port" + }, + { + "$ref": "#/components/schemas/terminal" + }, + { + "$ref": "#/components/schemas/vessel" + }, + { + "$ref": "#/components/schemas/metro_area" + }, + { + "$ref": "#/components/schemas/rail_terminal" } ] } @@ -2703,7 +2733,7 @@ } }, "links": { - "self": "/v2/tracking_requests/bdeca506-9741-4ab1-a0a7-cfd1d908e923" + "self": "https://api.terminal49.com/v2/tracking_requests/bdeca506-9741-4ab1-a0a7-cfd1d908e923" } }, { @@ -2766,7 +2796,7 @@ } }, "links": { - "self": "/v2/shipments/b5b10c0a-8d18-46da-b4c2-4e5fa790e7da" + "self": "https://api.terminal49.com/v2/shipments/b5b10c0a-8d18-46da-b4c2-4e5fa790e7da" } }, { @@ -2987,7 +3017,7 @@ } }, "links": { - "self": "/v2/shipments/715ed64b-6195-49f6-9407-1383a8088bfd" + "self": "https://api.terminal49.com/v2/shipments/715ed64b-6195-49f6-9407-1383a8088bfd" } } ] @@ -3085,9 +3115,7 @@ "attributes": { "created_at": "2020-07-28T23:12:53Z", "bill_of_lading_number": "TE491846459E", - "ref_numbers": [ - null - ], + "ref_numbers": [], "shipping_line_scac": "MSCU", "shipping_line_name": "Mediterranean Shipping Company", "port_of_lading_locode": "MXZLO", @@ -3141,7 +3169,7 @@ } }, "links": { - "self": "/v2/shipments/1fc35241-4c8b-420d-803a-9e6661720a05" + "self": "https://api.terminal49.com/v2/shipments/1fc35241-4c8b-420d-803a-9e6661720a05" } } ] @@ -4394,10 +4422,10 @@ "total": 59229 }, "links": { - "self": "https://api.terminal49.com/v2/containers?page[size]=5", - "current": "https://api.terminal49.com/v2/containers?page[number]=1&page[size]=5", - "next": "https://api.terminal49.com/v2/containers?page[number]=2&page[size]=5", - "last": "https://api.terminal49.com/v2/containers?page[number]=11846&page[size]=5" + "self": "https://api.terminal49.com/v2/containers?page%5Bsize%5D=5", + "current": "https://api.terminal49.com/v2/containers?page%5Bnumber%5D=1&page%5Bsize%5D=5", + "next": "https://api.terminal49.com/v2/containers?page%5Bnumber%5D=2&page%5Bsize%5D=5", + "last": "https://api.terminal49.com/v2/containers?page%5Bnumber%5D=11846&page%5Bsize%5D=5" } } } @@ -4415,7 +4443,7 @@ "default": 1 }, "in": "query", - "name": "page[number]" + "name": "page%5Bnumber%5D" }, { "schema": { @@ -4423,7 +4451,7 @@ "default": 30 }, "in": "query", - "name": "page[size]", + "name": "page%5Bsize%5D", "description": "" }, { @@ -5925,102 +5953,6 @@ "description": "Returns a vessel by id. `show_positions` is a paid feature. Please contact sales@terminal49.com." } }, - "/vessels/{imo}": { - "parameters": [ - { - "schema": { - "type": "string" - }, - "name": "imo", - "in": "path", - "required": true - }, - { - "schema": { - "type": "string", - "format": "date-time", - "example": "2025-05-20T00:00:00Z" - }, - "name": "show_positions[from_timestamp]", - "in": "query", - "description": "ISO 8601 timestamp to filter positions from. 7 days by default.", - "required": false - }, - { - "schema": { - "type": "string", - "format": "date-time", - "example": "2025-05-24T00:00:00Z" - }, - "name": "show_positions[to_timestamp]", - "in": "query", - "description": "ISO 8601 timestamp to filter positions up to. Current time by default.", - "required": false - } - ], - "get": { - "summary": "Get a vessel using the imo", - "tags": [ - "Vessels" - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/vessel" - } - } - } - } - } - }, - "403": { - "description": "Forbidden - Feature not enabled", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "status": { - "type": "string", - "example": "403" - }, - "source": { - "type": "object", - "nullable": true - }, - "title": { - "type": "string", - "example": "Forbidden" - }, - "detail": { - "type": "string", - "example": "Routing data feature is not enabled for this account" - } - } - } - } - } - } - } - } - } - }, - "operationId": "get-vessels-imo", - "description": "Returns a vessel by the given IMO number. `show_positions` is a paid feature. Please contact sales@terminal49.com.", - "x-internal": true - } - }, "/vessels/{id}/future_positions": { "parameters": [ { @@ -6361,7 +6293,7 @@ } }, "links": { - "self": "/v2/parties/ba4cb904-827f-4038-8e31-1e92b3356218" + "self": "https://api.terminal49.com/v2/parties/ba4cb904-827f-4038-8e31-1e92b3356218" } } } @@ -6708,6 +6640,7 @@ "properties": { "data": { "type": "object", + "nullable": true, "properties": { "type": { "type": "string", @@ -6732,6 +6665,7 @@ "properties": { "data": { "type": "object", + "nullable": true, "properties": { "type": { "type": "string", @@ -6757,6 +6691,7 @@ "properties": { "data": { "type": "object", + "nullable": true, "properties": { "type": { "type": "string", @@ -7410,6 +7345,7 @@ "properties": { "data": { "type": "object", + "nullable": true, "properties": { "id": { "type": "string" @@ -7429,6 +7365,7 @@ "properties": { "data": { "type": "object", + "nullable": true, "properties": { "id": { "type": "string" @@ -8120,6 +8057,7 @@ "properties": { "data": { "type": "object", + "nullable": true, "properties": { "id": { "type": "string", @@ -9086,7 +9024,8 @@ }, "location_name": { "type": "string", - "description": "The city or facility name of the event location" + "description": "The city or facility name of the event location", + "nullable": true }, "location_locode": { "type": "string", @@ -9121,6 +9060,7 @@ "properties": { "data": { "type": "object", + "nullable": true, "properties": { "id": { "type": "string", @@ -9142,6 +9082,7 @@ "properties": { "data": { "type": "object", + "nullable": true, "properties": { "id": { "type": "string", diff --git a/docs/openapi/components/schemas/shipment.yaml b/docs/openapi/components/schemas/shipment.yaml index aade0e59..f40cd7f5 100644 --- a/docs/openapi/components/schemas/shipment.yaml +++ b/docs/openapi/components/schemas/shipment.yaml @@ -84,6 +84,7 @@ properties: properties: data: type: "object" + nullable: true properties: type: type: "string" @@ -100,6 +101,7 @@ properties: properties: data: type: "object" + nullable: true properties: type: type: "string" @@ -117,6 +119,7 @@ properties: properties: data: type: "object" + nullable: true properties: type: type: "string" From 89389a24c0fd61f58066df2057ae2835ca9c22ea Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Wed, 22 Oct 2025 01:01:30 -0700 Subject: [PATCH 4/7] fix: resolve OpenAPI validation errors and setup automated workflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed all 13 Spectral validation errors in OpenAPI specification: - Added missing schema types to webhook_notifications included array (shipment, container, port, terminal, vessel, metro_area, rail_terminal) - Converted relative URIs to absolute format (https://api.terminal49.com/v2/...) - URL-encoded pagination parameters (page[size] → page%5Bsize%5D) - Added nullable: true to optional relationship fields (shipment.data, location_name) - Fixed ref_numbers array example (removed null value) - Added "Shipping Lines" to global tags Setup automated development workflow: - Added justfile task runner with comprehensive commands (bundle, lint, watch, preview) - Configured bun/npm scripts for bundling, linting, and watch mode - Updated Python bundler to use standard yaml.safe_load (custom parser was too strict) - Added enhanced validation with detailed error messages - Setup chokidar file watcher for auto-bundling on YAML changes - Configured Mintlify with explicit openapi.json reference - Fixed pre-commit hook line endings (CRLF → LF) Added comprehensive documentation: - CLAUDE.md with complete project overview and workflows - docs/openapi/DEVELOPER_GUIDE.md with detailed development instructions - Enhanced README.md with modular OpenAPI workflow documentation - Added inline validation error context and helpful tips Tooling improvements: - Added .spectral.yaml linter config (replaced .spectral.mjs) - Added .redocly.yaml config for Redocly CLI - Added .watchmanconfig for file watching - Added bun.lock and package.json with dev dependencies - Fixed containers-id.yaml indentation for custom parser compatibility 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .gitignore | 70 + .redocly.yaml | 49 + .spectral.mjs | 2 - .spectral.mjs.bak | 57 + .spectral.yaml | 2 + .watchmanconfig | 12 + CLAUDE.md | 419 +++ bun.lock | 2333 +++++++++++++++++ docs/mint.json | 1 + docs/openapi/DEVELOPER_GUIDE.md | 665 +++++ docs/openapi/README.md | 343 ++- .../openapi/components/schemas/container.yaml | 2 + .../openapi/components/schemas/raw-event.yaml | 3 + .../components/schemas/tracking-request.yaml | 1 + docs/openapi/index.yaml | 8 +- docs/openapi/paths/containers-id.yaml | 48 +- docs/openapi/paths/containers.yaml | 12 +- docs/openapi/paths/parties.yaml | 2 +- docs/openapi/paths/shipments-id.yaml | 2 +- docs/openapi/paths/shipments.yaml | 22 +- docs/openapi/paths/tracking-requests-id.yaml | 8 +- docs/openapi/paths/tracking-requests.yaml | 2 +- .../paths/webhook-notifications-id.yaml | 25 +- justfile | 244 ++ package.json | 36 + scripts/pre-commit.sh | 61 + tools/openapi_bundle.py | 141 +- 27 files changed, 4460 insertions(+), 110 deletions(-) create mode 100644 .redocly.yaml delete mode 100644 .spectral.mjs create mode 100644 .spectral.mjs.bak create mode 100644 .spectral.yaml create mode 100644 .watchmanconfig create mode 100644 CLAUDE.md create mode 100644 bun.lock create mode 100644 docs/openapi/DEVELOPER_GUIDE.md create mode 100644 justfile create mode 100644 package.json create mode 100644 scripts/pre-commit.sh diff --git a/.gitignore b/.gitignore index e43b0f98..0e10c03b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,71 @@ +# macOS .DS_Store + +# Node.js / Bun +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# Bun specific +# Note: we DO track bun.lockb for reproducible builds +# If you want to ignore it, uncomment the line below: +# bun.lockb + +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST +*.pytest_cache/ +.coverage +htmlcov/ +.tox/ +.nox/ + +# IDEs and Editors +.vscode/settings.json +.idea/ +*.swp +*.swo +*~ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Environment variables +.env +.env.local +.env.*.local + +# Temporary files +*.tmp +*.temp +.cache/ + +# Generated files (do NOT ignore docs/openapi.json - it's committed) +# docs/openapi.json is intentionally tracked + +# Watchman +.watchman-cookie-* diff --git a/.redocly.yaml b/.redocly.yaml new file mode 100644 index 00000000..a48f509f --- /dev/null +++ b/.redocly.yaml @@ -0,0 +1,49 @@ +# Redocly configuration for Terminal49 API +# See https://redocly.com/docs/cli/rules/ for all available rules + +extends: + - recommended + +# Customize rules to match our API style +rules: + # Turn off overly strict rules + operation-operationId: off # We don't require operationId on every operation + operation-summary: warn # Warn instead of error for missing summaries + operation-description: off # Don't require descriptions on every operation + + # Info section rules + info-contact: warn + info-license: off # We have terms of service instead + + # Tag rules + tag-description: off # Tags don't need descriptions + operation-tag-defined: warn # Warn if tag not defined in global tags + + # Security rules + operation-security-defined: warn # Warn if security scheme not defined + + # Parameter rules + parameter-description: warn # Warn instead of error for missing parameter descriptions + + # Response rules + response-contains-header: off # Don't require specific headers + + # Schema rules + no-invalid-media-type-examples: error # Keep this as error + no-enum-type-mismatch: error + + # Structural rules + no-identical-paths: error + no-ambiguous-paths: error + no-path-trailing-slash: error + + # Best practices (as warnings) + operation-2xx-response: warn # Warn if no 2xx response defined + operation-4xx-response: warn # Warn if no 4xx response defined + + # Deprecated fields + no-deprecated: off # We use deprecated fields intentionally for backwards compatibility + +# Ignore patterns (if needed) +# ignore: +# - 'docs/openapi/paths/legacy-*.yaml' diff --git a/.spectral.mjs b/.spectral.mjs deleted file mode 100644 index ad97e95e..00000000 --- a/.spectral.mjs +++ /dev/null @@ -1,2 +0,0 @@ -import ruleset from "https://stoplight.io/api/v1/projects/cHJqOjMxNg/spectral.js?branch_slug=feat%2Fcontainer-event-timestamps&token=0049d374-6767-468e-8313-d3f211429e84"; -export default { extends: ruleset }; \ No newline at end of file diff --git a/.spectral.mjs.bak b/.spectral.mjs.bak new file mode 100644 index 00000000..c528a9eb --- /dev/null +++ b/.spectral.mjs.bak @@ -0,0 +1,57 @@ +// Spectral configuration for Terminal49 API +// Uses the recommended OpenAPI ruleset with custom rules + +import { oas } from "@stoplight/spectral-rulesets"; + +export default { + extends: [oas], + + rules: { + // Customize rules to match our API style + + // Info section - relax some requirements + "info-contact": "warn", + "info-description": "warn", + "info-license": "off", // We use terms of service instead + + // Operation rules - be practical + "operation-description": "warn", // Warn instead of error + "operation-operationId": "off", // Don't require operationId everywhere + "operation-operationId-unique": "error", + "operation-summary": "warn", + "operation-tags": "warn", + "operation-tag-defined": "warn", + + // Parameter rules + "operation-parameters": "warn", + "path-params": "error", + + // Response rules + "operation-success-response": "warn", // Warn if no 2xx response + + // Schema rules - keep strict + "oas3-schema": "error", + "oas3-valid-media-example": "error", + "oas3-valid-schema-example": "error", + + // Path rules + "no-$ref-siblings": "error", + "path-declarations-must-exist": "error", + "path-keys-no-trailing-slash": "error", + "path-not-include-query": "error", + + // Security + "operation-security-defined": "warn", + + // Misc + "no-eval-in-markdown": "error", + "no-script-tags-in-markdown": "error", + "openapi-tags-alphabetical": "off", + "openapi-tags": "warn", + + // Turn off overly strict rules + "contact-properties": "off", + "license-url": "off", + "tag-description": "off" + } +}; \ No newline at end of file diff --git a/.spectral.yaml b/.spectral.yaml new file mode 100644 index 00000000..6c32026c --- /dev/null +++ b/.spectral.yaml @@ -0,0 +1,2 @@ +# Spectral configuration for Terminal49 API +extends: spectral:oas diff --git a/.watchmanconfig b/.watchmanconfig new file mode 100644 index 00000000..9e72e320 --- /dev/null +++ b/.watchmanconfig @@ -0,0 +1,12 @@ +{ + "ignore_dirs": [ + ".git", + "node_modules", + "__pycache__", + ".pytest_cache", + "terminal49_mcp.egg-info", + "dist", + "build" + ], + "settle": 100 +} diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..d62868c3 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,419 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Overview + +This is the Terminal49 API documentation repository. It contains modular OpenAPI specifications, MDX documentation files, and automated workflows for generating and deploying documentation to Postman and Mintlify (docs.terminal49.com). + +**Important:** This repository contains documentation only - no actual API implementation code. The production API runs at `https://api.terminal49.com/v2`. + +## Core Concepts + +Terminal49 provides container and shipment tracking via two methods: + +1. **API** - Direct REST API access with webhooks for real-time updates +2. **DataSync** - Automated data synchronization to customer databases/data warehouses + +The API follows JSONAPI specifications and supports tracking shipments, containers, webhooks, tracking requests, and related entities (ports, terminals, vessels, shipping lines, parties). + +## Repository Structure + +``` +docs/ +├── openapi/ # Modular OpenAPI YAML sources (SOURCE OF TRUTH) +│ ├── index.yaml # Root OpenAPI document +│ ├── paths/ # One file per REST endpoint +│ └── components/ +│ ├── schemas/ # Reusable schema definitions +│ └── securitySchemes/ # Authentication descriptions +├── openapi.json # Auto-generated bundle (DO NOT EDIT DIRECTLY) +├── mint.json # Mintlify docs configuration +├── home.mdx # Documentation homepage +├── api-docs/ # API documentation (MDX files) +│ ├── getting-started/ +│ ├── in-depth-guides/ +│ ├── useful-info/ +│ └── api-reference/ # Organized by resource type +└── datasync/ # DataSync documentation (MDX files) + └── table-properties/ + +tools/ +├── openapi_bundle.py # Python bundler (production, used in CI) +└── openapi_yaml.py # Minimal YAML parser + +scripts/ +├── split_openapi.py # Convert monolithic JSON to modular YAML +└── pre-commit.sh # Pre-commit hook for auto-bundling + +tests/ +└── test_openapi_bundle.py # Regression test for bundle consistency + +justfile # Task runner (like Make, but better) +package.json # Bun/Node.js dependencies (optional dev tools) +.watchmanconfig # File watching configuration + +Terminal49-API.postman_collection.json # Auto-generated from openapi.json +.github/workflows/ +├── generate_postman.yml # Auto-generates Postman collection on openapi.json changes +├── deploy_postman.yml # Deploys collection to Postman API on main branch +└── openapi-validation.yml # Validates OpenAPI YAML on PRs +``` + +## **Critical: Modular OpenAPI Workflow** + +### Source of Truth + +**⚠️ The YAML files in `docs/openapi/` are the ONLY source of truth!** + +- ✅ **Edit:** `docs/openapi/**/*.yaml` files +- ❌ **Never edit:** `docs/openapi.json` (it's auto-generated) + +The `docs/openapi.json` file is bundled from modular YAML sources. If you edit it directly, your changes will be overwritten! + +### Hybrid Bundling Approach + +We support **two bundling methods** – developers choose their preference: + +1. **Python Bundler** (Production, CI/CD) + + - Zero dependencies, fast, proven + - Used in GitHub Actions + - Command: `just bundle` or `python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json` + +2. **Redocly CLI** (Optional, Development) + - Industry standard, better error messages, more features + - Requires Bun/Node.js + - Command: `just bundle-redocly` or `bun redocly bundle docs/openapi/index.yaml -o docs/openapi.json` + +Both produce **identical output**. Use whichever you prefer during development. + +### Task Runner: Justfile + +We use `just` (modern alternative to Make) for task running: + +```bash +just --list # Show all commands +just setup # First-time setup +just bundle # Bundle with Python +just bundle-redocly # Bundle with Redocly CLI +just lint # Lint with Spectral +just validate # Bundle + lint + test +just watch # Auto-bundle on file changes +just preview # Preview OpenAPI with Redocly +just preview-mintlify # Preview full docs with Mintlify +just dev # Bundle + lint + preview (recommended workflow) +``` + +For full command list, see `justfile`. + +**Recommended Development Workflow:** + +```bash +just dev +# This bundles OpenAPI, runs linting, then starts Mintlify preview +# Opens http://localhost:3000 with full documentation +# Perfect for active development +``` + +### Pre-commit Hook + +Install once to auto-bundle on commit: + +```bash +just install-hooks +``` + +The hook automatically: + +- Detects OpenAPI YAML changes +- Regenerates `docs/openapi.json` +- Validates the bundle +- Stages the updated JSON + +## Common Workflows + +### Updating API Documentation + +1. **Edit OpenAPI specs:** + + ```bash + # Edit modular YAML sources + vim docs/openapi/paths/shipments.yaml + vim docs/openapi/components/schemas/shipment.yaml + ``` + +2. **Bundle and validate:** + + ```bash + just validate # or: just bundle && just lint && just test + ``` + +3. **Commit:** + + ```bash + git add docs/openapi/ + git commit -m "feat: update shipment schema" + # Pre-commit hook auto-bundles if installed + ``` + +4. **Auto-generation triggers:** + - When you push changes to `docs/openapi.json`, GitHub Actions generates `Terminal49-API.postman_collection.json` + - When merged to `main`, the Postman collection deploys to the Postman API + +### Adding a New Endpoint + +1. Create `docs/openapi/paths/your-endpoint.yaml` +2. Add path reference in `docs/openapi/index.yaml`: + ```yaml + paths: + /your_endpoint: + $ref: "./paths/your-endpoint.yaml" + ``` +3. Bundle and validate: `just validate` +4. Commit both YAML and bundled JSON + +### Adding a New Schema + +1. Create `docs/openapi/components/schemas/your-model.yaml` +2. Add schema reference in `docs/openapi/index.yaml`: + ```yaml + components: + schemas: + your_model: + $ref: "./components/schemas/your-model.yaml" + ``` +3. Bundle and validate: `just validate` +4. Commit both YAML and bundled JSON + +### Editing Documentation Content + +MDX files in `docs/api-docs/` and `docs/datasync/` are manually edited: + +- Follow the existing structure in `mint.json` +- Include proper frontmatter (title, og:title, og:description) +- Reference API endpoints using absolute paths like `/api-docs/api-reference/shipments/list-shipments` + +### Working with Postman Collections + +The Postman collection is **auto-generated** - never edit `Terminal49-API.postman_collection.json` directly! + +To manually regenerate (if needed): + +```bash +just postman +# or: openapi2postmanv2 -s docs/openapi.json -o Terminal49-API.postman_collection.json -p -O folderStrategy=Tags +``` + +## Important Files + +- **docs/openapi/index.yaml** - Root OpenAPI spec (references all modular files) +- **docs/openapi/paths/** - Individual endpoint definitions +- **docs/openapi/components/schemas/** - Reusable data models +- **docs/openapi.json** - Bundled output (auto-generated, don't edit) +- **justfile** - All available commands +- **tools/openapi_bundle.py** - Python bundler with validation +- **package.json** - Optional Bun/Node.js tools (Redocly, etc.) +- **scripts/pre-commit.sh** - Auto-bundling hook +- **docs/mint.json** - Navigation structure, tabs, branding +- **.spectral.mjs** - Stoplight linting configuration + +## Development Setup + +**First-time setup:** + +```bash +just setup +``` + +This installs: + +- Bun dependencies (Redocly CLI, Spectral, chokidar) +- Pre-commit hook for auto-bundling + +**Manual setup:** + +```bash +# Install Bun dependencies (optional) +bun install + +# Install pre-commit hook +just install-hooks +``` + +## Validation & Testing + +### Linting + +Two linters available: + +```bash +just lint # Spectral (default, fast) +just lint-redocly # Redocly CLI (better errors, requires Bun) +just lint-all # Run both +``` + +### Schema Validation + +The Python bundler includes automatic validation: + +- Checks schema structure (type, properties, etc.) +- Validates `$ref` resolution +- Detects circular references +- Provides helpful error messages with context + +To skip validation (faster): + +```bash +just bundle-fast +``` + +### Testing + +```bash +just test # Run regression test +just validate # Bundle + lint + test +``` + +## Authentication + +API uses Token-based auth with header format: + +``` +Authorization: Token YOUR_API_KEY +``` + +API keys are obtained from https://app.terminal49.com/developers/api-keys + +## Rate Limiting + +The API has a **100 requests/minute** rate limit for tracking requests. This is documented in the OpenAPI spec and should be mentioned when adding documentation about tracking requests. + +## Deployment + +Documentation is deployed via: + +1. **Mintlify** - Hosts docs.terminal49.com (configured via `mint.json`) +2. **Render** - Legacy Redoc deployment (see `render.yaml` and `Dockerfile`) +3. **Postman** - Collection synced via GitHub Actions to Postman API + +## Key API Resources + +Primary entities tracked in the system: + +- **Shipments** - Bill of lading (BOL) tracking +- **Containers** - Individual container tracking with transport events +- **Tracking Requests** - Requests to track new shipments +- **Webhooks** - Event subscriptions for real-time updates +- **Transport Events** - Container movement events (empty out, vessel loaded, etc.) +- **Ports, Terminals, Vessels** - Reference data +- **Parties** - Business entities (customers, consignees, etc.) + +## Commit Conventions + +Follow conventional commits style: + +- `feat:` - New features or endpoints +- `fix:` - Bug fixes in documentation +- `chore:` - Maintenance, auto-generated files +- Use `[skip ci]` to prevent workflow triggers on auto-generated commits + +## GitHub Actions + +Workflows require secrets: + +- `POSTMAN_API_KEY` - For deploying to Postman +- `POSTMAN_COLLECTION_UID` - Collection identifier: `5900de09-f05a-4528-8b12-9ad1d0477023` + +Workflows use `[skip ci]` in auto-generated commits to prevent infinite loops. + +## Performance Notes + +**Bundling speed** (9700+ line spec): + +- Python bundler: ~100-200ms +- Redocly CLI: ~150-300ms + +**Linting speed:** + +- Spectral: ~1-2s for 1MB spec +- Redocly CLI: <1s for 1MB spec + +Both are fast enough for local development. Python is used in CI for zero Node.js dependency. + +## Troubleshooting + +### "Referenced file not found" + +- Check path is correct relative to current file +- Verify filename/extension match exactly (case-sensitive) +- See enhanced error message for tips + +### "Circular $ref detected" + +- A file references itself through a $ref chain +- Check the reference chain in the error message +- Restructure schemas to break the cycle + +### Bundle out of sync + +- Run `just bundle` to regenerate +- Install pre-commit hook to automate: `just install-hooks` +- Check CI will fail if bundle doesn't match + +### Watchman not working + +- Ensure `.watchmanconfig` exists +- Check Watchman daemon: `watchman watch-list` +- Try: `watchman shutdown-server && just watch` + +## Data Files + +CSV files contain supported shipping lines and terminals: + +- `Terminal49 Shiping Line Support.csv` [sic - typo in filename] +- `Terminal49 Terminal Support.csv` + +These are reference data used in documentation or validation. + +## Getting Help + +- **Justfile commands:** `just --list` or `just help` +- **OpenAPI workflow:** `docs/openapi/README.md` +- **Detailed guide:** `docs/openapi/DEVELOPER_GUIDE.md` +- **Python bundler:** `python -m tools.openapi_bundle --help` +- **Redocly docs:** https://redocly.com/docs/cli + +## When Claude Code Works on This Repo + +### Adding/Editing Endpoints + +1. Always edit YAML files in `docs/openapi/` +2. Never edit `docs/openapi.json` directly +3. After editing, run `just validate` +4. Commit both YAML sources and bundled JSON + +### Reviewing Code + +- Check that `docs/openapi.json` is in sync with YAML sources +- Verify CI passes (lint + bundle test) +- Suggest running `just validate` if changes seem incomplete + +### Troubleshooting Build Failures + +- Check if `just bundle` succeeds locally +- Look for helpful error messages (enhanced in Python bundler) +- Verify all `$ref` paths are correct + +### Documentation Changes + +- OpenAPI changes go in `docs/openapi/**/*.yaml` +- Human-readable guides go in `docs/api-docs/**/*.mdx` +- Keep `mint.json` structure aligned with file organization + +**When to suggest these tools to developers**: + +- Suggest `rg` over `grep` for code searches +- Suggest `fd` over `find` for file discovery +- Suggest `ast-grep` for refactoring that needs to understand code structure +- Suggest `jq`/`yq` when parsing JSON/YAML in scripts diff --git a/bun.lock b/bun.lock new file mode 100644 index 00000000..3288ee0d --- /dev/null +++ b/bun.lock @@ -0,0 +1,2333 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "terminal49-api-docs", + "devDependencies": { + "@redocly/cli": "^1.25.14", + "@stoplight/spectral-cli": "^6.13.1", + "chokidar-cli": "^3.0.0", + "mintlify": "^4.0.0", + }, + }, + }, + "packages": { + "@alcalzone/ansi-tokenize": ["@alcalzone/ansi-tokenize@0.2.1", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-0rJMGIohyuFVf/uq9wCTtVLmVs/+7zoCGYkj7T8igV3XMPpjaSspXx/JvD9zmGprPVsIVvVRYVCaBkEz+SvN9g=="], + + "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], + + "@ark/regex": ["@ark/regex@0.0.0", "", { "dependencies": { "@ark/util": "0.50.0" } }, "sha512-p4vsWnd/LRGOdGQglbwOguIVhPmCAf5UzquvnDoxqhhPWTP84wWgi1INea8MgJ4SnI2gp37f13oA4Waz9vwNYg=="], + + "@ark/schema": ["@ark/schema@0.50.0", "", { "dependencies": { "@ark/util": "0.50.0" } }, "sha512-hfmP82GltBZDadIOeR3argKNlYYyB2wyzHp0eeAqAOFBQguglMV/S7Ip2q007bRtKxIMLDqFY6tfPie1dtssaQ=="], + + "@ark/util": ["@ark/util@0.50.0", "", {}, "sha512-tIkgIMVRpkfXRQIEf0G2CJryZVtHVrqcWHMDa5QKo0OEEBu0tHkRSIMm4Ln8cd8Bn9TPZtvc/kE2Gma8RESPSg=="], + + "@asyncapi/parser": ["@asyncapi/parser@3.4.0", "", { "dependencies": { "@asyncapi/specs": "^6.8.0", "@openapi-contrib/openapi-schema-to-json-schema": "~3.2.0", "@stoplight/json": "3.21.0", "@stoplight/json-ref-readers": "^1.2.2", "@stoplight/json-ref-resolver": "^3.1.5", "@stoplight/spectral-core": "^1.18.3", "@stoplight/spectral-functions": "^1.7.2", "@stoplight/spectral-parsers": "^1.0.2", "@stoplight/spectral-ref-resolver": "^1.0.3", "@stoplight/types": "^13.12.0", "@types/json-schema": "^7.0.11", "@types/urijs": "^1.19.19", "ajv": "^8.17.1", "ajv-errors": "^3.0.0", "ajv-formats": "^2.1.1", "avsc": "^5.7.5", "js-yaml": "^4.1.0", "jsonpath-plus": "^10.0.0", "node-fetch": "2.6.7" } }, "sha512-Sxn74oHiZSU6+cVeZy62iPZMFMvKp4jupMFHelSICCMw1qELmUHPvuZSr+ZHDmNGgHcEpzJM5HN02kR7T4g+PQ=="], + + "@asyncapi/specs": ["@asyncapi/specs@6.10.0", "", { "dependencies": { "@types/json-schema": "^7.0.11" } }, "sha512-vB5oKLsdrLUORIZ5BXortZTlVyGWWMC1Nud/0LtgxQ3Yn2738HigAD6EVqScvpPsDUI/bcLVsYEXN4dtXQHVng=="], + + "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + + "@babel/runtime": ["@babel/runtime@7.28.4", "", {}, "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ=="], + + "@canvas/image-data": ["@canvas/image-data@1.1.0", "", {}, "sha512-QdObRRjRbcXGmM1tmJ+MrHcaz1MftF2+W7YI+MsphnsCrmtyfS0d5qJbk0MeSbUeyM/jCb0hmnkXPsy026L7dA=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.6.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA=="], + + "@emotion/is-prop-valid": ["@emotion/is-prop-valid@1.2.2", "", { "dependencies": { "@emotion/memoize": "^0.8.1" } }, "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw=="], + + "@emotion/memoize": ["@emotion/memoize@0.8.1", "", {}, "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA=="], + + "@emotion/unitless": ["@emotion/unitless@0.8.1", "", {}, "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="], + + "@exodus/schemasafe": ["@exodus/schemasafe@1.3.0", "", {}, "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw=="], + + "@faker-js/faker": ["@faker-js/faker@7.6.0", "", {}, "sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw=="], + + "@floating-ui/core": ["@floating-ui/core@1.7.3", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.7.4", "", { "dependencies": { "@floating-ui/core": "^1.7.3", "@floating-ui/utils": "^0.2.10" } }, "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA=="], + + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.6", "", { "dependencies": { "@floating-ui/dom": "^1.7.4" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], + + "@humanwhocodes/momoa": ["@humanwhocodes/momoa@2.0.4", "", {}, "sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA=="], + + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], + + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], + + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="], + + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="], + + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="], + + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="], + + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.0.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="], + + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="], + + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="], + + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="], + + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="], + + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="], + + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.0.4" }, "os": "linux", "cpu": "s390x" }, "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="], + + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="], + + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="], + + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="], + + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.33.5", "", { "dependencies": { "@emnapi/runtime": "^1.2.0" }, "cpu": "none" }, "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="], + + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.33.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], + + "@inquirer/ansi": ["@inquirer/ansi@1.0.1", "", {}, "sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw=="], + + "@inquirer/checkbox": ["@inquirer/checkbox@4.3.0", "", { "dependencies": { "@inquirer/ansi": "^1.0.1", "@inquirer/core": "^10.3.0", "@inquirer/figures": "^1.0.14", "@inquirer/type": "^3.0.9", "yoctocolors-cjs": "^2.1.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-5+Q3PKH35YsnoPTh75LucALdAxom6xh5D1oeY561x4cqBuH24ZFVyFREPe14xgnrtmGu3EEt1dIi60wRVSnGCw=="], + + "@inquirer/confirm": ["@inquirer/confirm@5.1.19", "", { "dependencies": { "@inquirer/core": "^10.3.0", "@inquirer/type": "^3.0.9" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ=="], + + "@inquirer/core": ["@inquirer/core@10.3.0", "", { "dependencies": { "@inquirer/ansi": "^1.0.1", "@inquirer/figures": "^1.0.14", "@inquirer/type": "^3.0.9", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA=="], + + "@inquirer/editor": ["@inquirer/editor@4.2.21", "", { "dependencies": { "@inquirer/core": "^10.3.0", "@inquirer/external-editor": "^1.0.2", "@inquirer/type": "^3.0.9" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-MjtjOGjr0Kh4BciaFShYpZ1s9400idOdvQ5D7u7lE6VztPFoyLcVNE5dXBmEEIQq5zi4B9h2kU+q7AVBxJMAkQ=="], + + "@inquirer/expand": ["@inquirer/expand@4.0.21", "", { "dependencies": { "@inquirer/core": "^10.3.0", "@inquirer/type": "^3.0.9", "yoctocolors-cjs": "^2.1.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-+mScLhIcbPFmuvU3tAGBed78XvYHSvCl6dBiYMlzCLhpr0bzGzd8tfivMMeqND6XZiaZ1tgusbUHJEfc6YzOdA=="], + + "@inquirer/external-editor": ["@inquirer/external-editor@1.0.2", "", { "dependencies": { "chardet": "^2.1.0", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ=="], + + "@inquirer/figures": ["@inquirer/figures@1.0.14", "", {}, "sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ=="], + + "@inquirer/input": ["@inquirer/input@4.2.5", "", { "dependencies": { "@inquirer/core": "^10.3.0", "@inquirer/type": "^3.0.9" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-7GoWev7P6s7t0oJbenH0eQ0ThNdDJbEAEtVt9vsrYZ9FulIokvd823yLyhQlWHJPGce1wzP53ttfdCZmonMHyA=="], + + "@inquirer/number": ["@inquirer/number@3.0.21", "", { "dependencies": { "@inquirer/core": "^10.3.0", "@inquirer/type": "^3.0.9" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-5QWs0KGaNMlhbdhOSCFfKsW+/dcAVC2g4wT/z2MCiZM47uLgatC5N20kpkDQf7dHx+XFct/MJvvNGy6aYJn4Pw=="], + + "@inquirer/password": ["@inquirer/password@4.0.21", "", { "dependencies": { "@inquirer/ansi": "^1.0.1", "@inquirer/core": "^10.3.0", "@inquirer/type": "^3.0.9" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-xxeW1V5SbNFNig2pLfetsDb0svWlKuhmr7MPJZMYuDnCTkpVBI+X/doudg4pznc1/U+yYmWFFOi4hNvGgUo7EA=="], + + "@inquirer/prompts": ["@inquirer/prompts@7.9.0", "", { "dependencies": { "@inquirer/checkbox": "^4.3.0", "@inquirer/confirm": "^5.1.19", "@inquirer/editor": "^4.2.21", "@inquirer/expand": "^4.0.21", "@inquirer/input": "^4.2.5", "@inquirer/number": "^3.0.21", "@inquirer/password": "^4.0.21", "@inquirer/rawlist": "^4.1.9", "@inquirer/search": "^3.2.0", "@inquirer/select": "^4.4.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-X7/+dG9SLpSzRkwgG5/xiIzW0oMrV3C0HOa7YHG1WnrLK+vCQHfte4k/T80059YBdei29RBC3s+pSMvPJDU9/A=="], + + "@inquirer/rawlist": ["@inquirer/rawlist@4.1.9", "", { "dependencies": { "@inquirer/core": "^10.3.0", "@inquirer/type": "^3.0.9", "yoctocolors-cjs": "^2.1.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-AWpxB7MuJrRiSfTKGJ7Y68imYt8P9N3Gaa7ySdkFj1iWjr6WfbGAhdZvw/UnhFXTHITJzxGUI9k8IX7akAEBCg=="], + + "@inquirer/search": ["@inquirer/search@3.2.0", "", { "dependencies": { "@inquirer/core": "^10.3.0", "@inquirer/figures": "^1.0.14", "@inquirer/type": "^3.0.9", "yoctocolors-cjs": "^2.1.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-a5SzB/qrXafDX1Z4AZW3CsVoiNxcIYCzYP7r9RzrfMpaLpB+yWi5U8BWagZyLmwR0pKbbL5umnGRd0RzGVI8bQ=="], + + "@inquirer/select": ["@inquirer/select@4.4.0", "", { "dependencies": { "@inquirer/ansi": "^1.0.1", "@inquirer/core": "^10.3.0", "@inquirer/figures": "^1.0.14", "@inquirer/type": "^3.0.9", "yoctocolors-cjs": "^2.1.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-kaC3FHsJZvVyIjYBs5Ih8y8Bj4P/QItQWrZW22WJax7zTN+ZPXVGuOM55vzbdCP9zKUiBd9iEJVdesujfF+cAA=="], + + "@inquirer/type": ["@inquirer/type@3.0.9", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w=="], + + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@jsep-plugin/assignment": ["@jsep-plugin/assignment@1.3.0", "", { "peerDependencies": { "jsep": "^0.4.0||^1.0.0" } }, "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ=="], + + "@jsep-plugin/regex": ["@jsep-plugin/regex@1.0.4", "", { "peerDependencies": { "jsep": "^0.4.0||^1.0.0" } }, "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg=="], + + "@jsep-plugin/ternary": ["@jsep-plugin/ternary@1.1.4", "", { "peerDependencies": { "jsep": "^0.4.0||^1.0.0" } }, "sha512-ck5wiqIbqdMX6WRQztBL7ASDty9YLgJ3sSAK5ZpBzXeySvFGCzIvM6UiAI4hTZ22fEcYQVV/zhUbNscggW+Ukg=="], + + "@leichtgewicht/ip-codec": ["@leichtgewicht/ip-codec@2.0.5", "", {}, "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw=="], + + "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="], + + "@mdx-js/react": ["@mdx-js/react@3.1.1", "", { "dependencies": { "@types/mdx": "^2.0.0" }, "peerDependencies": { "@types/react": ">=16", "react": ">=16" } }, "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw=="], + + "@mintlify/cli": ["@mintlify/cli@4.0.781", "", { "dependencies": { "@mintlify/common": "1.0.583", "@mintlify/link-rot": "3.0.724", "@mintlify/models": "0.0.236", "@mintlify/prebuild": "1.0.711", "@mintlify/previewing": "4.0.760", "@mintlify/validation": "0.1.507", "chalk": "^5.2.0", "color": "^4.2.3", "detect-port": "^1.5.1", "fs-extra": "^11.2.0", "gray-matter": "^4.0.3", "ink": "^6.0.1", "inquirer": "^12.3.0", "js-yaml": "^4.1.0", "mdast": "^3.0.0", "mdast-util-mdx-jsx": "^3.2.0", "react": "^19.1.0", "semver": "^7.7.2", "unist-util-visit": "^5.0.0", "yargs": "^17.6.0" }, "bin": { "mint": "bin/index.js", "mintlify": "bin/index.js" } }, "sha512-Td0XlzbCKIVBQh6wnDAvbRAsPle7CH8VZXwUxnomMaGw2KeyDvh9vmR3zFec4l8GjSnJF7UoADY9+fREBWny+A=="], + + "@mintlify/common": ["@mintlify/common@1.0.583", "", { "dependencies": { "@asyncapi/parser": "^3.4.0", "@mintlify/mdx": "^3.0.0", "@mintlify/models": "0.0.236", "@mintlify/openapi-parser": "^0.0.8", "@mintlify/validation": "0.1.507", "@sindresorhus/slugify": "^2.1.1", "acorn": "^8.11.2", "acorn-jsx": "^5.3.2", "color-blend": "^4.0.0", "estree-util-to-js": "^2.0.0", "estree-walker": "^3.0.3", "gray-matter": "^4.0.3", "hast-util-from-html": "^2.0.3", "hast-util-to-html": "^9.0.4", "hast-util-to-text": "^4.0.2", "hex-rgb": "^5.0.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", "mdast": "^3.0.0", "mdast-util-from-markdown": "^2.0.2", "mdast-util-gfm": "^3.0.0", "mdast-util-mdx": "^3.0.0", "mdast-util-mdx-jsx": "^3.1.3", "micromark-extension-gfm": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.1", "micromark-extension-mdxjs": "^3.0.0", "openapi-types": "^12.0.0", "postcss": "^8.5.6", "remark": "^15.0.1", "remark-frontmatter": "^5.0.0", "remark-gfm": "^4.0.0", "remark-math": "^6.0.0", "remark-mdx": "^3.1.0", "remark-stringify": "^11.0.0", "tailwindcss": "^3.4.4", "unified": "^11.0.5", "unist-builder": "^4.0.0", "unist-util-map": "^4.0.0", "unist-util-remove": "^4.0.0", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.1", "vfile": "^6.0.3" } }, "sha512-X8+AgnjtokrMabYWpzAHk9WvJ0iEjwXq+wYj1mZiBVO+SF7+PbVGrMzRcfYkogE4c4kb41r+vXYV7Y46ADGGMg=="], + + "@mintlify/link-rot": ["@mintlify/link-rot@3.0.724", "", { "dependencies": { "@mintlify/common": "1.0.583", "@mintlify/prebuild": "1.0.711", "@mintlify/previewing": "4.0.760", "@mintlify/validation": "0.1.507", "fs-extra": "^11.1.0", "unist-util-visit": "^4.1.1" } }, "sha512-aaAjbo81T2q+K3TrWGpVBoY+q/4rWUgyXgfWzbfqIiHcNDt+ZZjrgW+W4hGDVxype4oBkX/4GX/XjIec+29ziw=="], + + "@mintlify/mdx": ["@mintlify/mdx@3.0.0", "", { "dependencies": { "@shikijs/transformers": "^3.11.0", "@shikijs/twoslash": "^3.12.2", "hast-util-to-string": "^3.0.1", "mdast-util-from-markdown": "^2.0.2", "mdast-util-gfm": "^3.1.0", "mdast-util-mdx-jsx": "^3.2.0", "mdast-util-to-hast": "^13.2.0", "next-mdx-remote-client": "^1.0.3", "rehype-katex": "^7.0.1", "remark-gfm": "^4.0.0", "remark-math": "^6.0.0", "remark-smartypants": "^3.0.2", "shiki": "^3.11.0", "unified": "^11.0.0", "unist-util-visit": "^5.0.0" }, "peerDependencies": { "@radix-ui/react-popover": "^1.1.15", "react": "^18.3.1", "react-dom": "^18.3.1" } }, "sha512-Ao7AidkbRPeR9xb2BZvRtUB7V0qo4XitCbrSCwEolagzlJxboSFkiLDFuxb6P4GCC84Nysee1au5ngcz2PndFQ=="], + + "@mintlify/models": ["@mintlify/models@0.0.236", "", { "dependencies": { "axios": "^1.8.3", "openapi-types": "^12.0.0" } }, "sha512-aGnFq4/SGnGAoj+xcdF6O7BJogQnFwQcD9Fy6Sys/rkDKRg5WLtiH+8XuoiNZFIWjDP9wDn6DwzC7zluitb3Gg=="], + + "@mintlify/openapi-parser": ["@mintlify/openapi-parser@0.0.8", "", { "dependencies": { "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-formats": "^3.0.1", "jsonpointer": "^5.0.1", "leven": "^4.0.0", "yaml": "^2.4.5" } }, "sha512-9MBRq9lS4l4HITYCrqCL7T61MOb20q9IdU7HWhqYMNMM1jGO1nHjXasFy61yZ8V6gMZyyKQARGVoZ0ZrYN48Og=="], + + "@mintlify/prebuild": ["@mintlify/prebuild@1.0.711", "", { "dependencies": { "@mintlify/common": "1.0.583", "@mintlify/openapi-parser": "^0.0.8", "@mintlify/scraping": "4.0.443", "@mintlify/validation": "0.1.507", "chalk": "^5.3.0", "favicons": "^7.2.0", "fs-extra": "^11.1.0", "gray-matter": "^4.0.3", "js-yaml": "^4.1.0", "mdast": "^3.0.0", "openapi-types": "^12.0.0", "sharp": "^0.33.1", "sharp-ico": "^0.1.5", "unist-util-visit": "^4.1.1", "uuid": "^11.1.0" } }, "sha512-AB1BfdkPGs/7emqBdCfYpPTisjdh7jEYfY8kVNmpgQeNlyLMYyHy/e9PGrBleN5lQP/R85la7ccZW/FzXN2Fiw=="], + + "@mintlify/previewing": ["@mintlify/previewing@4.0.760", "", { "dependencies": { "@mintlify/common": "1.0.583", "@mintlify/prebuild": "1.0.711", "@mintlify/validation": "0.1.507", "better-opn": "^3.0.2", "chalk": "^5.1.0", "chokidar": "^3.5.3", "express": "^4.18.2", "fs-extra": "^11.1.0", "got": "^13.0.0", "gray-matter": "^4.0.3", "ink": "^6.0.1", "ink-spinner": "^5.0.0", "is-online": "^10.0.0", "js-yaml": "^4.1.0", "mdast": "^3.0.0", "openapi-types": "^12.0.0", "react": "^19.1.0", "socket.io": "^4.7.2", "tar": "^6.1.15", "unist-util-visit": "^4.1.1", "yargs": "^17.6.0" } }, "sha512-NPiYLzd4qSM8NQxT2638uVN0vNHP5sfl/F5paeGhUed/wFjkBNSXDrmedXcxtnc3styFd+1yj+HuAV5AjG9pfQ=="], + + "@mintlify/scraping": ["@mintlify/scraping@4.0.443", "", { "dependencies": { "@mintlify/common": "1.0.583", "@mintlify/openapi-parser": "^0.0.8", "fs-extra": "^11.1.1", "hast-util-to-mdast": "^10.1.0", "js-yaml": "^4.1.0", "mdast-util-mdx-jsx": "^3.1.3", "neotraverse": "^0.6.18", "puppeteer": "^22.14.0", "rehype-parse": "^9.0.0", "remark-gfm": "^4.0.0", "remark-mdx": "^3.0.1", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.5", "unist-util-visit": "^5.0.0", "yargs": "^17.6.0", "zod": "^3.20.6" }, "bin": { "mintlify-scrape": "bin/cli.js" } }, "sha512-FeyMaekec4qBzkeQLoaMw0S733WN6M4MESdoUBqFm0cbh7NtLQvqxMolgz/Fs6HimyzxWeqtW4G6GgxqWy09gA=="], + + "@mintlify/validation": ["@mintlify/validation@0.1.507", "", { "dependencies": { "@mintlify/mdx": "^3.0.0", "@mintlify/models": "0.0.236", "arktype": "^2.1.20", "js-yaml": "^4.1.0", "lcm": "^0.0.3", "lodash": "^4.17.21", "object-hash": "^3.0.0", "openapi-types": "^12.0.0", "uuid": "^11.1.0", "zod": "^3.20.6", "zod-to-json-schema": "^3.20.3" } }, "sha512-0kpXfyIjMdd2Z+J9xAM7Dbn44JAOxFEt1ZesmIjerMPQgCCwrKlPyho0pXRS/wqremD2rSzx94yCLxo6dvaZSw=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@openapi-contrib/openapi-schema-to-json-schema": ["@openapi-contrib/openapi-schema-to-json-schema@3.2.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" } }, "sha512-Gj6C0JwCr8arj0sYuslWXUBSP/KnUlEGnPW4qxlXvAl543oaNQgMgIgkQUA6vs5BCCvwTEiL8m/wdWzfl4UvSw=="], + + "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], + + "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.53.0", "", { "dependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw=="], + + "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@1.26.0", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HedpXXYzzbaoutw6DFLWLDket2FwLkLpil4hGCZ1xYEIMTcivdfwEOISgdbLEWyG3HW52gTq2V9mOVJrONgiwg=="], + + "@opentelemetry/core": ["@opentelemetry/core@1.26.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.27.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ=="], + + "@opentelemetry/exporter-trace-otlp-http": ["@opentelemetry/exporter-trace-otlp-http@0.53.0", "", { "dependencies": { "@opentelemetry/core": "1.26.0", "@opentelemetry/otlp-exporter-base": "0.53.0", "@opentelemetry/otlp-transformer": "0.53.0", "@opentelemetry/resources": "1.26.0", "@opentelemetry/sdk-trace-base": "1.26.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-m7F5ZTq+V9mKGWYpX8EnZ7NjoqAU7VemQ1E2HAG+W/u0wpY1x0OmbxAXfGKFHCspdJk8UKlwPGrpcB8nay3P8A=="], + + "@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.53.0", "", { "dependencies": { "@opentelemetry/core": "1.26.0", "@opentelemetry/otlp-transformer": "0.53.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-UCWPreGQEhD6FjBaeDuXhiMf6kkBODF0ZQzrk/tuQcaVDJ+dDQ/xhJp192H9yWnKxVpEjFrSSLnpqmX4VwX+eA=="], + + "@opentelemetry/otlp-transformer": ["@opentelemetry/otlp-transformer@0.53.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.53.0", "@opentelemetry/core": "1.26.0", "@opentelemetry/resources": "1.26.0", "@opentelemetry/sdk-logs": "0.53.0", "@opentelemetry/sdk-metrics": "1.26.0", "@opentelemetry/sdk-trace-base": "1.26.0", "protobufjs": "^7.3.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-rM0sDA9HD8dluwuBxLetUmoqGJKSAbWenwD65KY9iZhUxdBHRLrIdrABfNDP7aiTjcgK8XFyTn5fhDz7N+W6DA=="], + + "@opentelemetry/propagator-b3": ["@opentelemetry/propagator-b3@1.26.0", "", { "dependencies": { "@opentelemetry/core": "1.26.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-vvVkQLQ/lGGyEy9GT8uFnI047pajSOVnZI2poJqVGD3nJ+B9sFGdlHNnQKophE3lHfnIH0pw2ubrCTjZCgIj+Q=="], + + "@opentelemetry/propagator-jaeger": ["@opentelemetry/propagator-jaeger@1.26.0", "", { "dependencies": { "@opentelemetry/core": "1.26.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-DelFGkCdaxA1C/QA0Xilszfr0t4YbGd3DjxiCDPh34lfnFr+VkkrjV9S8ZTJvAzfdKERXhfOxIKBoGPJwoSz7Q=="], + + "@opentelemetry/resources": ["@opentelemetry/resources@1.26.0", "", { "dependencies": { "@opentelemetry/core": "1.26.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw=="], + + "@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.53.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.53.0", "@opentelemetry/core": "1.26.0", "@opentelemetry/resources": "1.26.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-dhSisnEgIj/vJZXZV6f6KcTnyLDx/VuQ6l3ejuZpMpPlh9S1qMHiZU9NMmOkVkwwHkMy3G6mEBwdP23vUZVr4g=="], + + "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@1.26.0", "", { "dependencies": { "@opentelemetry/core": "1.26.0", "@opentelemetry/resources": "1.26.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-0SvDXmou/JjzSDOjUmetAAvcKQW6ZrvosU0rkbDGpXvvZN+pQF6JbK/Kd4hNdK4q/22yeruqvukXEJyySTzyTQ=="], + + "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.26.0", "", { "dependencies": { "@opentelemetry/core": "1.26.0", "@opentelemetry/resources": "1.26.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw=="], + + "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@1.26.0", "", { "dependencies": { "@opentelemetry/context-async-hooks": "1.26.0", "@opentelemetry/core": "1.26.0", "@opentelemetry/propagator-b3": "1.26.0", "@opentelemetry/propagator-jaeger": "1.26.0", "@opentelemetry/sdk-trace-base": "1.26.0", "semver": "^7.5.2" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-Fj5IVKrj0yeUwlewCRwzOVcr5avTuNnMHWf7GPc1t6WaT78J6CJyF3saZ/0RkZfdeNO8IcBl/bNcWMVZBMRW8Q=="], + + "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.27.0", "", {}, "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg=="], + + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], + + "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], + + "@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="], + + "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="], + + "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="], + + "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], + + "@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="], + + "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], + + "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], + + "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], + + "@puppeteer/browsers": ["@puppeteer/browsers@2.3.0", "", { "dependencies": { "debug": "^4.3.5", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.4.0", "semver": "^7.6.3", "tar-fs": "^3.0.6", "unbzip2-stream": "^1.4.3", "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" } }, "sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA=="], + + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="], + + "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w=="], + + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], + + "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], + + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg=="], + + "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw=="], + + "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw=="], + + "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="], + + "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA=="], + + "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.8", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw=="], + + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.9", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ=="], + + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.5", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ=="], + + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="], + + "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="], + + "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="], + + "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g=="], + + "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], + + "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.1", "", { "dependencies": { "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w=="], + + "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ=="], + + "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], + + "@redocly/ajv": ["@redocly/ajv@8.11.2", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js-replace": "^1.0.1" } }, "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg=="], + + "@redocly/cli": ["@redocly/cli@1.34.5", "", { "dependencies": { "@opentelemetry/api": "1.9.0", "@opentelemetry/exporter-trace-otlp-http": "0.53.0", "@opentelemetry/resources": "1.26.0", "@opentelemetry/sdk-trace-node": "1.26.0", "@opentelemetry/semantic-conventions": "1.27.0", "@redocly/config": "^0.22.0", "@redocly/openapi-core": "1.34.5", "@redocly/respect-core": "1.34.5", "abort-controller": "^3.0.0", "chokidar": "^3.5.1", "colorette": "^1.2.0", "core-js": "^3.32.1", "dotenv": "16.4.7", "form-data": "^4.0.4", "get-port-please": "^3.0.1", "glob": "^7.1.6", "handlebars": "^4.7.6", "mobx": "^6.0.4", "pluralize": "^8.0.0", "react": "^17.0.0 || ^18.2.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.2.0 || ^19.0.0", "redoc": "2.5.0", "semver": "^7.5.2", "simple-websocket": "^9.0.0", "styled-components": "^6.0.7", "yargs": "17.0.1" }, "bin": { "openapi": "bin/cli.js", "redocly": "bin/cli.js" } }, "sha512-5IEwxs7SGP5KEXjBKLU8Ffdz9by/KqNSeBk6YUVQaGxMXK//uYlTJIPntgUXbo1KAGG2d2q2XF8y4iFz6qNeiw=="], + + "@redocly/config": ["@redocly/config@0.22.2", "", {}, "sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ=="], + + "@redocly/openapi-core": ["@redocly/openapi-core@1.34.5", "", { "dependencies": { "@redocly/ajv": "^8.11.2", "@redocly/config": "^0.22.0", "colorette": "^1.2.0", "https-proxy-agent": "^7.0.5", "js-levenshtein": "^1.1.6", "js-yaml": "^4.1.0", "minimatch": "^5.0.1", "pluralize": "^8.0.0", "yaml-ast-parser": "0.0.43" } }, "sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA=="], + + "@redocly/respect-core": ["@redocly/respect-core@1.34.5", "", { "dependencies": { "@faker-js/faker": "^7.6.0", "@redocly/ajv": "8.11.2", "@redocly/openapi-core": "1.34.5", "better-ajv-errors": "^1.2.0", "colorette": "^2.0.20", "concat-stream": "^2.0.0", "cookie": "^0.7.2", "dotenv": "16.4.7", "form-data": "^4.0.4", "jest-diff": "^29.3.1", "jest-matcher-utils": "^29.3.1", "js-yaml": "4.1.0", "json-pointer": "^0.6.2", "jsonpath-plus": "^10.0.6", "open": "^10.1.0", "openapi-sampler": "^1.6.1", "outdent": "^0.8.0", "set-cookie-parser": "^2.3.5", "undici": "^6.21.1" } }, "sha512-GheC/g/QFztPe9UA9LamooSplQuy9pe0Yr8XGTqkz0ahivLDl7svoy/LSQNn1QH3XGtLKwFYMfTwFR2TAYyh5Q=="], + + "@rollup/plugin-commonjs": ["@rollup/plugin-commonjs@22.0.2", "", { "dependencies": { "@rollup/pluginutils": "^3.1.0", "commondir": "^1.0.1", "estree-walker": "^2.0.1", "glob": "^7.1.6", "is-reference": "^1.2.1", "magic-string": "^0.25.7", "resolve": "^1.17.0" }, "peerDependencies": { "rollup": "^2.68.0" } }, "sha512-//NdP6iIwPbMTcazYsiBMbJW7gfmpHom33u1beiIoHDEM0Q9clvtQB1T0efvMqHeKsGohiHo97BCPCkBXdscwg=="], + + "@rollup/pluginutils": ["@rollup/pluginutils@3.1.0", "", { "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0" } }, "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg=="], + + "@shikijs/core": ["@shikijs/core@3.13.0", "", { "dependencies": { "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA=="], + + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.13.0", "", { "dependencies": { "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.3" } }, "sha512-Ty7xv32XCp8u0eQt8rItpMs6rU9Ki6LJ1dQOW3V/56PKDcpvfHPnYFbsx5FFUP2Yim34m/UkazidamMNVR4vKg=="], + + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.13.0", "", { "dependencies": { "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg=="], + + "@shikijs/langs": ["@shikijs/langs@3.13.0", "", { "dependencies": { "@shikijs/types": "3.13.0" } }, "sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ=="], + + "@shikijs/themes": ["@shikijs/themes@3.13.0", "", { "dependencies": { "@shikijs/types": "3.13.0" } }, "sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg=="], + + "@shikijs/transformers": ["@shikijs/transformers@3.13.0", "", { "dependencies": { "@shikijs/core": "3.13.0", "@shikijs/types": "3.13.0" } }, "sha512-833lcuVzcRiG+fXvgslWsM2f4gHpjEgui1ipIknSizRuTgMkNZupiXE5/TVJ6eSYfhNBFhBZKkReKWO2GgYmqA=="], + + "@shikijs/twoslash": ["@shikijs/twoslash@3.13.0", "", { "dependencies": { "@shikijs/core": "3.13.0", "@shikijs/types": "3.13.0", "twoslash": "^0.3.4" }, "peerDependencies": { "typescript": ">=5.5.0" } }, "sha512-OmNKNoZ8Hevt4VKQHfJL+hrsrqLSnW/Nz7RMutuBqXBCIYZWk80HnF9pcXEwRmy9MN0MGRmZCW2rDDP8K7Bxkw=="], + + "@shikijs/types": ["@shikijs/types@3.13.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw=="], + + "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], + + "@sinclair/typebox": ["@sinclair/typebox@0.27.8", "", {}, "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="], + + "@sindresorhus/is": ["@sindresorhus/is@5.6.0", "", {}, "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g=="], + + "@sindresorhus/slugify": ["@sindresorhus/slugify@2.2.1", "", { "dependencies": { "@sindresorhus/transliterate": "^1.0.0", "escape-string-regexp": "^5.0.0" } }, "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw=="], + + "@sindresorhus/transliterate": ["@sindresorhus/transliterate@1.6.0", "", { "dependencies": { "escape-string-regexp": "^5.0.0" } }, "sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ=="], + + "@socket.io/component-emitter": ["@socket.io/component-emitter@3.1.2", "", {}, "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="], + + "@stoplight/better-ajv-errors": ["@stoplight/better-ajv-errors@1.0.3", "", { "dependencies": { "jsonpointer": "^5.0.0", "leven": "^3.1.0" }, "peerDependencies": { "ajv": ">=8" } }, "sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA=="], + + "@stoplight/json": ["@stoplight/json@3.21.7", "", { "dependencies": { "@stoplight/ordered-object-literal": "^1.0.3", "@stoplight/path": "^1.3.2", "@stoplight/types": "^13.6.0", "jsonc-parser": "~2.2.1", "lodash": "^4.17.21", "safe-stable-stringify": "^1.1" } }, "sha512-xcJXgKFqv/uCEgtGlPxy3tPA+4I+ZI4vAuMJ885+ThkTHFVkC+0Fm58lA9NlsyjnkpxFh4YiQWpH+KefHdbA0A=="], + + "@stoplight/json-ref-readers": ["@stoplight/json-ref-readers@1.2.2", "", { "dependencies": { "node-fetch": "^2.6.0", "tslib": "^1.14.1" } }, "sha512-nty0tHUq2f1IKuFYsLM4CXLZGHdMn+X/IwEUIpeSOXt0QjMUbL0Em57iJUDzz+2MkWG83smIigNZ3fauGjqgdQ=="], + + "@stoplight/json-ref-resolver": ["@stoplight/json-ref-resolver@3.1.6", "", { "dependencies": { "@stoplight/json": "^3.21.0", "@stoplight/path": "^1.3.2", "@stoplight/types": "^12.3.0 || ^13.0.0", "@types/urijs": "^1.19.19", "dependency-graph": "~0.11.0", "fast-memoize": "^2.5.2", "immer": "^9.0.6", "lodash": "^4.17.21", "tslib": "^2.6.0", "urijs": "^1.19.11" } }, "sha512-YNcWv3R3n3U6iQYBsFOiWSuRGE5su1tJSiX6pAPRVk7dP0L7lqCteXGzuVRQ0gMZqUl8v1P0+fAKxF6PLo9B5A=="], + + "@stoplight/ordered-object-literal": ["@stoplight/ordered-object-literal@1.0.5", "", {}, "sha512-COTiuCU5bgMUtbIFBuyyh2/yVVzlr5Om0v5utQDgBCuQUOPgU1DwoffkTfg4UBQOvByi5foF4w4T+H9CoRe5wg=="], + + "@stoplight/path": ["@stoplight/path@1.3.2", "", {}, "sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ=="], + + "@stoplight/spectral-cli": ["@stoplight/spectral-cli@6.15.0", "", { "dependencies": { "@stoplight/json": "~3.21.0", "@stoplight/path": "1.3.2", "@stoplight/spectral-core": "^1.19.5", "@stoplight/spectral-formatters": "^1.4.1", "@stoplight/spectral-parsers": "^1.0.4", "@stoplight/spectral-ref-resolver": "^1.0.4", "@stoplight/spectral-ruleset-bundler": "^1.6.0", "@stoplight/spectral-ruleset-migrator": "^1.11.0", "@stoplight/spectral-rulesets": ">=1", "@stoplight/spectral-runtime": "^1.1.2", "@stoplight/types": "^13.6.0", "chalk": "4.1.2", "fast-glob": "~3.2.12", "hpagent": "~1.2.0", "lodash": "~4.17.21", "pony-cause": "^1.1.1", "stacktracey": "^2.1.8", "tslib": "^2.8.1", "yargs": "~17.7.2" }, "bin": { "spectral": "dist/index.js" } }, "sha512-FVeQIuqQQnnLfa8vy+oatTKUve7uU+3SaaAfdjpX/B+uB1NcfkKRJYhKT9wMEehDRaMPL5AKIRYMCFerdEbIpw=="], + + "@stoplight/spectral-core": ["@stoplight/spectral-core@1.20.0", "", { "dependencies": { "@stoplight/better-ajv-errors": "1.0.3", "@stoplight/json": "~3.21.0", "@stoplight/path": "1.3.2", "@stoplight/spectral-parsers": "^1.0.0", "@stoplight/spectral-ref-resolver": "^1.0.4", "@stoplight/spectral-runtime": "^1.1.2", "@stoplight/types": "~13.6.0", "@types/es-aggregate-error": "^1.0.2", "@types/json-schema": "^7.0.11", "ajv": "^8.17.1", "ajv-errors": "~3.0.0", "ajv-formats": "~2.1.1", "es-aggregate-error": "^1.0.7", "jsonpath-plus": "^10.3.0", "lodash": "~4.17.21", "lodash.topath": "^4.5.2", "minimatch": "3.1.2", "nimma": "0.2.3", "pony-cause": "^1.1.1", "simple-eval": "1.0.1", "tslib": "^2.8.1" } }, "sha512-5hBP81nCC1zn1hJXL/uxPNRKNcB+/pEIHgCjPRpl/w/qy9yC9ver04tw1W0l/PMiv0UeB5dYgozXVQ4j5a6QQQ=="], + + "@stoplight/spectral-formats": ["@stoplight/spectral-formats@1.8.2", "", { "dependencies": { "@stoplight/json": "^3.17.0", "@stoplight/spectral-core": "^1.19.2", "@types/json-schema": "^7.0.7", "tslib": "^2.8.1" } }, "sha512-c06HB+rOKfe7tuxg0IdKDEA5XnjL2vrn/m/OVIIxtINtBzphZrOgtRn7epQ5bQF5SWp84Ue7UJWaGgDwVngMFw=="], + + "@stoplight/spectral-formatters": ["@stoplight/spectral-formatters@1.5.0", "", { "dependencies": { "@stoplight/path": "^1.3.2", "@stoplight/spectral-core": "^1.19.4", "@stoplight/spectral-runtime": "^1.1.2", "@stoplight/types": "^13.15.0", "@types/markdown-escape": "^1.1.3", "chalk": "4.1.2", "cliui": "7.0.4", "lodash": "^4.17.21", "markdown-escape": "^2.0.0", "node-sarif-builder": "^2.0.3", "strip-ansi": "6.0", "text-table": "^0.2.0", "tslib": "^2.8.1" } }, "sha512-lR7s41Z00Mf8TdXBBZQ3oi2uR8wqAtR6NO0KA8Ltk4FSpmAy0i6CKUmJG9hZQjanTnGmwpQkT/WP66p1GY3iXA=="], + + "@stoplight/spectral-functions": ["@stoplight/spectral-functions@1.10.1", "", { "dependencies": { "@stoplight/better-ajv-errors": "1.0.3", "@stoplight/json": "^3.17.1", "@stoplight/spectral-core": "^1.19.4", "@stoplight/spectral-formats": "^1.8.1", "@stoplight/spectral-runtime": "^1.1.2", "ajv": "^8.17.1", "ajv-draft-04": "~1.0.0", "ajv-errors": "~3.0.0", "ajv-formats": "~2.1.1", "lodash": "~4.17.21", "tslib": "^2.8.1" } }, "sha512-obu8ZfoHxELOapfGsCJixKZXZcffjg+lSoNuttpmUFuDzVLT3VmH8QkPXfOGOL5Pz80BR35ClNAToDkdnYIURg=="], + + "@stoplight/spectral-parsers": ["@stoplight/spectral-parsers@1.0.5", "", { "dependencies": { "@stoplight/json": "~3.21.0", "@stoplight/types": "^14.1.1", "@stoplight/yaml": "~4.3.0", "tslib": "^2.8.1" } }, "sha512-ANDTp2IHWGvsQDAY85/jQi9ZrF4mRrA5bciNHX+PUxPr4DwS6iv4h+FVWJMVwcEYdpyoIdyL+SRmHdJfQEPmwQ=="], + + "@stoplight/spectral-ref-resolver": ["@stoplight/spectral-ref-resolver@1.0.5", "", { "dependencies": { "@stoplight/json-ref-readers": "1.2.2", "@stoplight/json-ref-resolver": "~3.1.6", "@stoplight/spectral-runtime": "^1.1.2", "dependency-graph": "0.11.0", "tslib": "^2.8.1" } }, "sha512-gj3TieX5a9zMW29z3mBlAtDOCgN3GEc1VgZnCVlr5irmR4Qi5LuECuFItAq4pTn5Zu+sW5bqutsCH7D4PkpyAA=="], + + "@stoplight/spectral-ruleset-bundler": ["@stoplight/spectral-ruleset-bundler@1.6.3", "", { "dependencies": { "@rollup/plugin-commonjs": "~22.0.2", "@stoplight/path": "1.3.2", "@stoplight/spectral-core": ">=1", "@stoplight/spectral-formats": "^1.8.1", "@stoplight/spectral-functions": ">=1", "@stoplight/spectral-parsers": ">=1", "@stoplight/spectral-ref-resolver": "^1.0.4", "@stoplight/spectral-ruleset-migrator": "^1.9.6", "@stoplight/spectral-rulesets": ">=1", "@stoplight/spectral-runtime": "^1.1.2", "@stoplight/types": "^13.6.0", "@types/node": "*", "pony-cause": "1.1.1", "rollup": "~2.79.2", "tslib": "^2.8.1", "validate-npm-package-name": "3.0.0" } }, "sha512-AQFRO6OCKg8SZJUupnr3+OzI1LrMieDTEUHsYgmaRpNiDRPvzImE3bzM1KyQg99q58kTQyZ8kpr7sG8Lp94RRA=="], + + "@stoplight/spectral-ruleset-migrator": ["@stoplight/spectral-ruleset-migrator@1.11.2", "", { "dependencies": { "@stoplight/json": "~3.21.0", "@stoplight/ordered-object-literal": "~1.0.4", "@stoplight/path": "1.3.2", "@stoplight/spectral-functions": "^1.9.1", "@stoplight/spectral-runtime": "^1.1.2", "@stoplight/types": "^13.6.0", "@stoplight/yaml": "~4.2.3", "@types/node": "*", "ajv": "^8.17.1", "ast-types": "0.14.2", "astring": "^1.9.0", "reserved": "0.1.2", "tslib": "^2.8.1", "validate-npm-package-name": "3.0.0" } }, "sha512-6r5i4hrDmppspSSxdUKKNHc07NGSSIkvwKNk3M5ukCwvSslImvDEimeWAhPBryhmSJ82YAsKr8erZZpKullxWw=="], + + "@stoplight/spectral-rulesets": ["@stoplight/spectral-rulesets@1.22.0", "", { "dependencies": { "@asyncapi/specs": "^6.8.0", "@stoplight/better-ajv-errors": "1.0.3", "@stoplight/json": "^3.17.0", "@stoplight/spectral-core": "^1.19.4", "@stoplight/spectral-formats": "^1.8.1", "@stoplight/spectral-functions": "^1.9.1", "@stoplight/spectral-runtime": "^1.1.2", "@stoplight/types": "^13.6.0", "@types/json-schema": "^7.0.7", "ajv": "^8.17.1", "ajv-formats": "~2.1.1", "json-schema-traverse": "^1.0.0", "leven": "3.1.0", "lodash": "~4.17.21", "tslib": "^2.8.1" } }, "sha512-l2EY2jiKKLsvnPfGy+pXC0LeGsbJzcQP5G/AojHgf+cwN//VYxW1Wvv4WKFx/CLmLxc42mJYF2juwWofjWYNIQ=="], + + "@stoplight/spectral-runtime": ["@stoplight/spectral-runtime@1.1.4", "", { "dependencies": { "@stoplight/json": "^3.20.1", "@stoplight/path": "^1.3.2", "@stoplight/types": "^13.6.0", "abort-controller": "^3.0.0", "lodash": "^4.17.21", "node-fetch": "^2.7.0", "tslib": "^2.8.1" } }, "sha512-YHbhX3dqW0do6DhiPSgSGQzr6yQLlWybhKwWx0cqxjMwxej3TqLv3BXMfIUYFKKUqIwH4Q2mV8rrMM8qD2N0rQ=="], + + "@stoplight/types": ["@stoplight/types@13.20.0", "", { "dependencies": { "@types/json-schema": "^7.0.4", "utility-types": "^3.10.0" } }, "sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA=="], + + "@stoplight/yaml": ["@stoplight/yaml@4.3.0", "", { "dependencies": { "@stoplight/ordered-object-literal": "^1.0.5", "@stoplight/types": "^14.1.1", "@stoplight/yaml-ast-parser": "0.0.50", "tslib": "^2.2.0" } }, "sha512-JZlVFE6/dYpP9tQmV0/ADfn32L9uFarHWxfcRhReKUnljz1ZiUM5zpX+PH8h5CJs6lao3TuFqnPm9IJJCEkE2w=="], + + "@stoplight/yaml-ast-parser": ["@stoplight/yaml-ast-parser@0.0.50", "", {}, "sha512-Pb6M8TDO9DtSVla9yXSTAxmo9GVEouq5P40DWXdOie69bXogZTkgvopCq+yEvTMA0F6PEvdJmbtTV3ccIp11VQ=="], + + "@szmarczak/http-timer": ["@szmarczak/http-timer@5.0.1", "", { "dependencies": { "defer-to-connect": "^2.0.1" } }, "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw=="], + + "@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="], + + "@types/cors": ["@types/cors@2.8.19", "", { "dependencies": { "@types/node": "*" } }, "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg=="], + + "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], + + "@types/es-aggregate-error": ["@types/es-aggregate-error@1.0.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-qJ7LIFp06h1QE1aVxbVd+zJP2wdaugYXYfd6JxsyRMrYHaxb6itXPogW2tz+ylUJ1n1b+JF1PHyYCfYHm0dvUg=="], + + "@types/estree": ["@types/estree@0.0.39", "", {}, "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="], + + "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], + + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + + "@types/http-cache-semantics": ["@types/http-cache-semantics@4.0.4", "", {}, "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/katex": ["@types/katex@0.16.7", "", {}, "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ=="], + + "@types/markdown-escape": ["@types/markdown-escape@1.1.3", "", {}, "sha512-JIc1+s3y5ujKnt/+N+wq6s/QdL2qZ11fP79MijrVXsAAnzSxCbT2j/3prHRouJdZ2yFLN3vkP0HytfnoCczjOw=="], + + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + + "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="], + + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + + "@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="], + + "@types/node": ["@types/node@24.9.1", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg=="], + + "@types/react": ["@types/react@19.2.2", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA=="], + + "@types/sarif": ["@types/sarif@2.1.7", "", {}, "sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ=="], + + "@types/stylis": ["@types/stylis@4.2.5", "", {}, "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw=="], + + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], + + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@types/urijs": ["@types/urijs@1.19.25", "", {}, "sha512-XOfUup9r3Y06nFAZh3WvO0rBU4OtlfPB/vgxpjg+NRdGU6CN6djdc6OEiH+PcqHCY6eFLo9Ista73uarf4gnBg=="], + + "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], + + "@typescript/vfs": ["@typescript/vfs@1.6.1", "", { "dependencies": { "debug": "^4.1.1" }, "peerDependencies": { "typescript": "*" } }, "sha512-JwoxboBh7Oz1v38tPbkrZ62ZXNHAk9bJ7c9x0eI5zBfBnBYGhURdbnh7Z4smN/MV48Y5OCcZb58n972UtbazsA=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], + + "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], + + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "address": ["address@1.2.2", "", {}, "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA=="], + + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + + "aggregate-error": ["aggregate-error@4.0.1", "", { "dependencies": { "clean-stack": "^4.0.0", "indent-string": "^5.0.0" } }, "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w=="], + + "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "ajv-draft-04": ["ajv-draft-04@1.0.0", "", { "peerDependencies": { "ajv": "^8.5.0" }, "optionalPeers": ["ajv"] }, "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw=="], + + "ajv-errors": ["ajv-errors@3.0.0", "", { "peerDependencies": { "ajv": "^8.0.1" } }, "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ=="], + + "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="], + + "ansi-escapes": ["ansi-escapes@7.1.1", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], + + "arktype": ["arktype@2.1.23", "", { "dependencies": { "@ark/regex": "0.0.0", "@ark/schema": "0.50.0", "@ark/util": "0.50.0" } }, "sha512-tyxNWX6xJVMb2EPJJ3OjgQS1G/vIeQRrZuY4DeBNQmh8n7geS+czgbauQWB6Pr+RXiOO8ChEey44XdmxsqGmfQ=="], + + "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], + + "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], + + "array-iterate": ["array-iterate@2.0.1", "", {}, "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg=="], + + "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], + + "as-table": ["as-table@1.0.55", "", { "dependencies": { "printable-characters": "^1.0.42" } }, "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ=="], + + "ast-types": ["ast-types@0.14.2", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA=="], + + "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], + + "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "auto-bind": ["auto-bind@5.0.1", "", {}, "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg=="], + + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + + "avsc": ["avsc@5.7.9", "", {}, "sha512-yOA4wFeI7ET3v32Di/sUybQ+ttP20JHSW3mxLuNGeO0uD6PPcvLrIQXSvy/rhJOWU5JrYh7U4OHplWMmtAtjMg=="], + + "axios": ["axios@1.12.2", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw=="], + + "b4a": ["b4a@1.7.3", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q=="], + + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "bare-events": ["bare-events@2.8.0", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-AOhh6Bg5QmFIXdViHbMc2tLDsBIRxdkIaIddPslJF9Z5De3APBScuqGP2uThXnIpqFrgoxMNC6km7uXNIMLHXA=="], + + "bare-fs": ["bare-fs@4.4.11", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4", "bare-url": "^2.2.2", "fast-fifo": "^1.3.2" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-Bejmm9zRMvMTRoHS+2adgmXw1ANZnCNx+B5dgZpGwlP1E3x6Yuxea8RToddHUbWtVV0iUMWqsgZr8+jcgUI2SA=="], + + "bare-os": ["bare-os@3.6.2", "", {}, "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A=="], + + "bare-path": ["bare-path@3.0.0", "", { "dependencies": { "bare-os": "^3.0.1" } }, "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw=="], + + "bare-stream": ["bare-stream@2.7.0", "", { "dependencies": { "streamx": "^2.21.0" }, "peerDependencies": { "bare-buffer": "*", "bare-events": "*" }, "optionalPeers": ["bare-buffer", "bare-events"] }, "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A=="], + + "bare-url": ["bare-url@2.3.1", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-v2yl0TnaZTdEnelkKtXZGnotiV6qATBlnNuUMrHl6v9Lmmrh9mw9RYyImPU7/4RahumSwQS1k2oKXcRfXcbjJw=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "base64id": ["base64id@2.0.0", "", {}, "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="], + + "basic-ftp": ["basic-ftp@5.0.5", "", {}, "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg=="], + + "better-ajv-errors": ["better-ajv-errors@1.2.0", "", { "dependencies": { "@babel/code-frame": "^7.16.0", "@humanwhocodes/momoa": "^2.0.2", "chalk": "^4.1.2", "jsonpointer": "^5.0.0", "leven": "^3.1.0 < 4" }, "peerDependencies": { "ajv": "4.11.8 - 8" } }, "sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA=="], + + "better-opn": ["better-opn@3.0.2", "", { "dependencies": { "open": "^8.0.4" } }, "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "body-parser": ["body-parser@1.20.3", "", { "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" } }, "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g=="], + + "brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + + "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "builtins": ["builtins@1.0.3", "", {}, "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ=="], + + "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], + + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "cacheable-lookup": ["cacheable-lookup@7.0.0", "", {}, "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w=="], + + "cacheable-request": ["cacheable-request@10.2.14", "", { "dependencies": { "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", "http-cache-semantics": "^4.1.1", "keyv": "^4.5.3", "mimic-response": "^4.0.0", "normalize-url": "^8.0.0", "responselike": "^3.0.0" } }, "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ=="], + + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "call-me-maybe": ["call-me-maybe@1.0.2", "", {}, "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], + + "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], + + "camelize": ["camelize@1.0.1", "", {}, "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ=="], + + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], + + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], + + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], + + "chardet": ["chardet@2.1.0", "", {}, "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA=="], + + "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "chokidar-cli": ["chokidar-cli@3.0.0", "", { "dependencies": { "chokidar": "^3.5.2", "lodash.debounce": "^4.0.8", "lodash.throttle": "^4.1.1", "yargs": "^13.3.0" }, "bin": { "chokidar": "index.js" } }, "sha512-xVW+Qeh7z15uZRxHOkP93Ux8A0xbPzwK4GaqD8dQOYc34TlkqUhVSS59fK36DOp5WdJlrRzlYSy02Ht99FjZqQ=="], + + "chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], + + "chromium-bidi": ["chromium-bidi@0.6.3", "", { "dependencies": { "mitt": "3.0.1", "urlpattern-polyfill": "10.0.0", "zod": "3.23.8" }, "peerDependencies": { "devtools-protocol": "*" } }, "sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A=="], + + "classnames": ["classnames@2.5.1", "", {}, "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="], + + "clean-stack": ["clean-stack@4.2.0", "", { "dependencies": { "escape-string-regexp": "5.0.0" } }, "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg=="], + + "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="], + + "cli-cursor": ["cli-cursor@4.0.0", "", { "dependencies": { "restore-cursor": "^4.0.0" } }, "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg=="], + + "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], + + "cli-truncate": ["cli-truncate@4.0.0", "", { "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" } }, "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA=="], + + "cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="], + + "cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "code-excerpt": ["code-excerpt@4.0.0", "", { "dependencies": { "convert-to-spaces": "^2.0.1" } }, "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA=="], + + "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="], + + "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], + + "color-blend": ["color-blend@4.0.0", "", {}, "sha512-fYODTHhI/NG+B5GnzvuL3kiFrK/UnkUezWFTgEPBTY5V+kpyfAn95Vn9sJeeCX6omrCOdxnqCL3CvH+6sXtIbw=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], + + "colorette": ["colorette@1.4.0", "", {}, "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + + "commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], + + "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "concat-stream": ["concat-stream@2.0.0", "", { "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.0.2", "typedarray": "^0.0.6" } }, "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A=="], + + "content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], + + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + + "convert-to-spaces": ["convert-to-spaces@2.0.1", "", {}, "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ=="], + + "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], + + "cookie-signature": ["cookie-signature@1.0.6", "", {}, "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="], + + "core-js": ["core-js@3.46.0", "", {}, "sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA=="], + + "cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="], + + "cosmiconfig": ["cosmiconfig@9.0.0", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "css-color-keywords": ["css-color-keywords@1.0.0", "", {}, "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg=="], + + "css-to-react-native": ["css-to-react-native@3.2.0", "", { "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", "postcss-value-parser": "^4.0.2" } }, "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "data-uri-to-buffer": ["data-uri-to-buffer@2.0.2", "", {}, "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA=="], + + "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], + + "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], + + "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decamelize": ["decamelize@1.2.0", "", {}, "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="], + + "decko": ["decko@1.2.0", "", {}, "sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ=="], + + "decode-bmp": ["decode-bmp@0.2.1", "", { "dependencies": { "@canvas/image-data": "^1.0.0", "to-data-view": "^1.1.0" } }, "sha512-NiOaGe+GN0KJqi2STf24hfMkFitDUaIoUU3eKvP/wAbLe8o6FuW5n/x7MHPR0HKvBokp6MQY/j7w8lewEeVCIA=="], + + "decode-ico": ["decode-ico@0.4.1", "", { "dependencies": { "@canvas/image-data": "^1.0.0", "decode-bmp": "^0.2.0", "to-data-view": "^1.1.0" } }, "sha512-69NZfbKIzux1vBOd31al3XnMnH+2mqDhEgLdpygErm4d60N+UwA5Sq5WFjmEDQzumgB9fElojGwWG0vybVfFmA=="], + + "decode-named-character-reference": ["decode-named-character-reference@1.2.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q=="], + + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], + + "default-browser": ["default-browser@5.2.1", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg=="], + + "default-browser-id": ["default-browser-id@5.0.0", "", {}, "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA=="], + + "defer-to-connect": ["defer-to-connect@2.0.1", "", {}, "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "degenerator": ["degenerator@5.0.1", "", { "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", "esprima": "^4.0.1" } }, "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "dependency-graph": ["dependency-graph@0.11.0", "", {}, "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], + + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], + + "detect-port": ["detect-port@1.6.1", "", { "dependencies": { "address": "^1.0.1", "debug": "4" }, "bin": { "detect": "bin/detect-port.js", "detect-port": "bin/detect-port.js" } }, "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q=="], + + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "devtools-protocol": ["devtools-protocol@0.0.1312386", "", {}, "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA=="], + + "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="], + + "diff-sequences": ["diff-sequences@29.6.3", "", {}, "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q=="], + + "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], + + "dns-packet": ["dns-packet@5.6.1", "", { "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" } }, "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw=="], + + "dns-socket": ["dns-socket@4.2.2", "", { "dependencies": { "dns-packet": "^5.2.4" } }, "sha512-BDeBd8najI4/lS00HSKpdFia+OvUMytaVjfzR9n5Lq8MlZRSvtbI+uLtx1+XmQFls5wFU9dssccTmQQ6nfpjdg=="], + + "dompurify": ["dompurify@3.3.0", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ=="], + + "dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], + + "engine.io": ["engine.io@6.6.4", "", { "dependencies": { "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", "ws": "~8.17.1" } }, "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g=="], + + "engine.io-parser": ["engine.io-parser@5.2.3", "", {}, "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q=="], + + "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + + "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + + "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], + + "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], + + "es-abstract": ["es-abstract@1.24.0", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg=="], + + "es-aggregate-error": ["es-aggregate-error@1.0.14", "", { "dependencies": { "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "globalthis": "^1.0.4", "has-property-descriptors": "^1.0.2", "set-function-name": "^2.0.2" } }, "sha512-3YxX6rVb07B5TV11AV5wsL7nQCHXNwoHPsQC8S4AmBiqYhyNCJ5BRKXkXyDJvs8QzXN20NgRtxe3dEEQD9NLHA=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], + + "es-toolkit": ["es-toolkit@1.40.0", "", {}, "sha512-8o6w0KFmU0CiIl0/Q/BCEOabF2IJaELM1T2PWj6e8KqzHv1gdx+7JtFnDwOx1kJH/isJ5NwlDG1nCr1HrRF94Q=="], + + "es6-promise": ["es6-promise@3.3.1", "", {}, "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg=="], + + "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="], + + "esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], + + "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="], + + "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], + + "estree-util-scope": ["estree-util-scope@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ=="], + + "estree-util-to-js": ["estree-util-to-js@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg=="], + + "estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="], + + "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], + + "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="], + + "express": ["express@4.21.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.19.0", "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], + + "extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], + + "fast-glob": ["fast-glob@3.2.12", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w=="], + + "fast-memoize": ["fast-memoize@2.5.2", "", {}, "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw=="], + + "fast-safe-stringify": ["fast-safe-stringify@2.1.1", "", {}, "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="], + + "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], + + "fast-xml-parser": ["fast-xml-parser@4.5.3", "", { "dependencies": { "strnum": "^1.1.1" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig=="], + + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "fault": ["fault@2.0.1", "", { "dependencies": { "format": "^0.2.0" } }, "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ=="], + + "favicons": ["favicons@7.2.0", "", { "dependencies": { "escape-html": "^1.0.3", "sharp": "^0.33.1", "xml2js": "^0.6.1" } }, "sha512-k/2rVBRIRzOeom3wI9jBPaSEvoTSQEW4iM0EveBmBBKFxO8mSyyRWtDlfC3VnEfu0avmjrMzy8/ZFPSe6F71Hw=="], + + "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "finalhandler": ["finalhandler@1.3.1", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" } }, "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ=="], + + "find-up": ["find-up@3.0.0", "", { "dependencies": { "locate-path": "^3.0.0" } }, "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="], + + "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], + + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + + "foreach": ["foreach@2.0.6", "", {}, "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg=="], + + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], + + "form-data-encoder": ["form-data-encoder@2.1.4", "", {}, "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw=="], + + "format": ["format@0.2.2", "", {}, "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww=="], + + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + + "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], + + "fs-extra": ["fs-extra@11.3.2", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A=="], + + "fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], + + "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], + + "gcd": ["gcd@0.0.1", "", {}, "sha512-VNx3UEGr+ILJTiMs1+xc5SX1cMgJCrXezKPa003APUWNqQqaF6n25W8VcR7nHN6yRWbvvUTwCpZCFJeWC2kXlw=="], + + "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], + + "get-port-please": ["get-port-please@3.2.0", "", {}, "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-source": ["get-source@2.0.12", "", { "dependencies": { "data-uri-to-buffer": "^2.0.0", "source-map": "^0.6.1" } }, "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w=="], + + "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + + "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], + + "get-uri": ["get-uri@6.0.5", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg=="], + + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "got": ["got@13.0.0", "", { "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", "cacheable-lookup": "^7.0.0", "cacheable-request": "^10.2.8", "decompress-response": "^6.0.0", "form-data-encoder": "^2.1.2", "get-stream": "^6.0.1", "http2-wrapper": "^2.1.10", "lowercase-keys": "^3.0.0", "p-cancelable": "^3.0.0", "responselike": "^3.0.0" } }, "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "gray-matter": ["gray-matter@4.0.3", "", { "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" } }, "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="], + + "handlebars": ["handlebars@4.7.8", "", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" }, "bin": { "handlebars": "bin/handlebars" } }, "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ=="], + + "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hast-util-embedded": ["hast-util-embedded@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-is-element": "^3.0.0" } }, "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA=="], + + "hast-util-from-dom": ["hast-util-from-dom@5.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hastscript": "^9.0.0", "web-namespaces": "^2.0.0" } }, "sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q=="], + + "hast-util-from-html": ["hast-util-from-html@2.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="], + + "hast-util-from-html-isomorphic": ["hast-util-from-html-isomorphic@2.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-dom": "^5.0.0", "hast-util-from-html": "^2.0.0", "unist-util-remove-position": "^5.0.0" } }, "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw=="], + + "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="], + + "hast-util-has-property": ["hast-util-has-property@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA=="], + + "hast-util-is-body-ok-link": ["hast-util-is-body-ok-link@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ=="], + + "hast-util-is-element": ["hast-util-is-element@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g=="], + + "hast-util-minify-whitespace": ["hast-util-minify-whitespace@1.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-embedded": "^3.0.0", "hast-util-is-element": "^3.0.0", "hast-util-whitespace": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw=="], + + "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], + + "hast-util-phrasing": ["hast-util-phrasing@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-embedded": "^3.0.0", "hast-util-has-property": "^3.0.0", "hast-util-is-body-ok-link": "^3.0.0", "hast-util-is-element": "^3.0.0" } }, "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ=="], + + "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="], + + "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], + + "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="], + + "hast-util-to-mdast": ["hast-util-to-mdast@10.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-phrasing": "^3.0.0", "hast-util-to-html": "^9.0.0", "hast-util-to-text": "^4.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "mdast-util-to-string": "^4.0.0", "rehype-minify-whitespace": "^6.0.0", "trim-trailing-lines": "^2.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-FiCRI7NmOvM4y+f5w32jPRzcxDIz+PUqDwEqn1A+1q2cdp3B8Gx7aVrXORdOKjMNDQsD1ogOr896+0jJHW1EFQ=="], + + "hast-util-to-string": ["hast-util-to-string@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A=="], + + "hast-util-to-text": ["hast-util-to-text@4.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "hast-util-is-element": "^3.0.0", "unist-util-find-after": "^5.0.0" } }, "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A=="], + + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + + "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], + + "hex-rgb": ["hex-rgb@5.0.0", "", {}, "sha512-NQO+lgVUCtHxZ792FodgW0zflK+ozS9X9dwGp9XvvmPlH7pyxd588cn24TD3rmPm/N0AIRXF10Otah8yKqGw4w=="], + + "hpagent": ["hpagent@1.2.0", "", {}, "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA=="], + + "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], + + "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], + + "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + + "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], + + "http2-client": ["http2-client@1.3.5", "", {}, "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA=="], + + "http2-wrapper": ["http2-wrapper@2.2.1", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" } }, "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ=="], + + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + + "ico-endec": ["ico-endec@0.1.6", "", {}, "sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ=="], + + "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "immer": ["immer@9.0.21", "", {}, "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "indent-string": ["indent-string@5.0.0", "", {}, "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ink": ["ink@6.3.1", "", { "dependencies": { "@alcalzone/ansi-tokenize": "^0.2.0", "ansi-escapes": "^7.0.0", "ansi-styles": "^6.2.1", "auto-bind": "^5.0.1", "chalk": "^5.6.0", "cli-boxes": "^3.0.0", "cli-cursor": "^4.0.0", "cli-truncate": "^4.0.0", "code-excerpt": "^4.0.0", "es-toolkit": "^1.39.10", "indent-string": "^5.0.0", "is-in-ci": "^2.0.0", "patch-console": "^2.0.0", "react-reconciler": "^0.32.0", "signal-exit": "^3.0.7", "slice-ansi": "^7.1.0", "stack-utils": "^2.0.6", "string-width": "^7.2.0", "type-fest": "^4.27.0", "widest-line": "^5.0.0", "wrap-ansi": "^9.0.0", "ws": "^8.18.0", "yoga-layout": "~3.2.1" }, "peerDependencies": { "@types/react": ">=19.0.0", "react": ">=19.0.0", "react-devtools-core": "^6.1.2" }, "optionalPeers": ["@types/react", "react-devtools-core"] }, "sha512-3wGwITGrzL6rkWsi2gEKzgwdafGn4ZYd3u4oRp+sOPvfoxEHlnoB5Vnk9Uy5dMRUhDOqF3hqr4rLQ4lEzBc2sQ=="], + + "ink-spinner": ["ink-spinner@5.0.0", "", { "dependencies": { "cli-spinners": "^2.7.0" }, "peerDependencies": { "ink": ">=4.0.0", "react": ">=18.0.0" } }, "sha512-EYEasbEjkqLGyPOUc8hBJZNuC5GvXGMLu0w5gdTNskPc7Izc5vO3tdQEYnzvshucyGCBXc86ig0ujXPMWaQCdA=="], + + "inline-style-parser": ["inline-style-parser@0.2.4", "", {}, "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q=="], + + "inquirer": ["inquirer@12.10.0", "", { "dependencies": { "@inquirer/ansi": "^1.0.1", "@inquirer/core": "^10.3.0", "@inquirer/prompts": "^7.9.0", "@inquirer/type": "^3.0.9", "mute-stream": "^2.0.0", "run-async": "^4.0.5", "rxjs": "^7.8.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-K/epfEnDBZj2Q3NMDcgXWZye3nhSPeoJnOh8lcKWrldw54UEZfS4EmAMsAsmVbl7qKi+vjAsy39Sz4fbgRMewg=="], + + "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], + + "ip-address": ["ip-address@10.0.1", "", {}, "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA=="], + + "ip-regex": ["ip-regex@4.3.0", "", {}, "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q=="], + + "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], + + "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], + + "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], + + "is-arrayish": ["is-arrayish@0.3.4", "", {}, "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA=="], + + "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], + + "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], + + "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], + + "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], + + "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], + + "is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-generator-function": ["is-generator-function@1.1.2", "", { "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], + + "is-in-ci": ["is-in-ci@2.0.0", "", { "bin": { "is-in-ci": "cli.js" } }, "sha512-cFeerHriAnhrQSbpAxL37W1wcJKUUX07HyLWZCW1URJT/ra3GyUTzBgUnh24TMVfNTV2Hij2HLxkPHFZfOZy5w=="], + + "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], + + "is-ip": ["is-ip@3.1.0", "", { "dependencies": { "ip-regex": "^4.0.0" } }, "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q=="], + + "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], + + "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], + + "is-online": ["is-online@10.0.0", "", { "dependencies": { "got": "^12.1.0", "p-any": "^4.0.0", "p-timeout": "^5.1.0", "public-ip": "^5.0.0" } }, "sha512-WCPdKwNDjXJJmUubf2VHLMDBkUZEtuOvpXUfUnUFbEnM6In9ByiScL4f4jKACz/fsb2qDkesFerW3snf/AYz3A=="], + + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "is-reference": ["is-reference@1.2.1", "", { "dependencies": { "@types/estree": "*" } }, "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ=="], + + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + + "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], + + "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], + + "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], + + "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], + + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + + "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], + + "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], + + "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], + + "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="], + + "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "jest-diff": ["jest-diff@29.7.0", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw=="], + + "jest-get-type": ["jest-get-type@29.6.3", "", {}, "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw=="], + + "jest-matcher-utils": ["jest-matcher-utils@29.7.0", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g=="], + + "jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], + + "js-levenshtein": ["js-levenshtein@1.1.6", "", {}, "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "jsep": ["jsep@1.4.0", "", {}, "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + + "json-pointer": ["json-pointer@0.6.2", "", { "dependencies": { "foreach": "^2.0.4" } }, "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw=="], + + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "jsonc-parser": ["jsonc-parser@2.2.1", "", {}, "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w=="], + + "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + + "jsonpath-plus": ["jsonpath-plus@10.3.0", "", { "dependencies": { "@jsep-plugin/assignment": "^1.3.0", "@jsep-plugin/regex": "^1.0.4", "jsep": "^1.4.0" }, "bin": { "jsonpath": "bin/jsonpath-cli.js", "jsonpath-plus": "bin/jsonpath-cli.js" } }, "sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA=="], + + "jsonpointer": ["jsonpointer@5.0.1", "", {}, "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ=="], + + "katex": ["katex@0.16.25", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], + + "lcm": ["lcm@0.0.3", "", { "dependencies": { "gcd": "^0.0.1" } }, "sha512-TB+ZjoillV6B26Vspf9l2L/vKaRY/4ep3hahcyVkCGFgsTNRUQdc24bQeNFiZeoxH0vr5+7SfNRMQuPHv/1IrQ=="], + + "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], + + "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "locate-path": ["locate-path@3.0.0", "", { "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], + + "lodash.throttle": ["lodash.throttle@4.1.1", "", {}, "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="], + + "lodash.topath": ["lodash.topath@4.5.2", "", {}, "sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg=="], + + "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], + + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], + + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "lowercase-keys": ["lowercase-keys@3.0.0", "", {}, "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ=="], + + "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "lunr": ["lunr@2.3.9", "", {}, "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow=="], + + "magic-string": ["magic-string@0.25.9", "", { "dependencies": { "sourcemap-codec": "^1.4.8" } }, "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ=="], + + "mark.js": ["mark.js@8.11.1", "", {}, "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ=="], + + "markdown-escape": ["markdown-escape@2.0.0", "", {}, "sha512-Trz4v0+XWlwy68LJIyw3bLbsJiC8XAbRCKF9DbEtZjyndKOGVx6n+wNB0VfoRmY2LKboQLeniap3xrb6LGSJ8A=="], + + "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="], + + "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], + + "marked": ["marked@4.3.0", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "mdast": ["mdast@3.0.0", "", {}, "sha512-xySmf8g4fPKMeC07jXGz971EkLbWAJ83s4US2Tj9lEdnZ142UP5grN73H1Xd3HzrdbU5o9GYYP/y8F9ZSwLE9g=="], + + "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], + + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA=="], + + "mdast-util-frontmatter": ["mdast-util-frontmatter@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "escape-string-regexp": "^5.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-extension-frontmatter": "^2.0.0" } }, "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA=="], + + "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], + + "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="], + + "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="], + + "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="], + + "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="], + + "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], + + "mdast-util-math": ["mdast-util-math@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "longest-streak": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.1.0", "unist-util-remove-position": "^5.0.0" } }, "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w=="], + + "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="], + + "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], + + "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], + + "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="], + + "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], + + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA=="], + + "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="], + + "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], + + "media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], + + "merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], + + "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], + + "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="], + + "micromark-extension-frontmatter": ["micromark-extension-frontmatter@2.0.0", "", { "dependencies": { "fault": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg=="], + + "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="], + + "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="], + + "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="], + + "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="], + + "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg=="], + + "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="], + + "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], + + "micromark-extension-math": ["micromark-extension-math@3.1.0", "", { "dependencies": { "@types/katex": "^0.16.0", "devlop": "^1.0.0", "katex": "^0.16.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg=="], + + "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="], + + "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="], + + "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="], + + "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "", { "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="], + + "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="], + + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], + + "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], + + "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="], + + "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], + + "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="], + + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="], + + "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="], + + "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="], + + "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="], + + "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="], + + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], + + "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], + + "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="], + + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + + "mimic-response": ["mimic-response@4.0.0", "", {}, "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg=="], + + "minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], + + "minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], + + "mintlify": ["mintlify@4.2.177", "", { "dependencies": { "@mintlify/cli": "4.0.781" }, "bin": { "mint": "index.js", "mintlify": "index.js" } }, "sha512-muM499ag3sbveM75tWpfB0z7NG97nslm/+7ZrKan5r76KqdhspGbHdUlnTcvltHizreR78Hjrfnzd7UjuRg+Dw=="], + + "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="], + + "mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "mobx": ["mobx@6.15.0", "", {}, "sha512-UczzB+0nnwGotYSgllfARAqWCJ5e/skuV2K/l+Zyck/H6pJIhLXuBnz+6vn2i211o7DtbE78HQtsYEKICHGI+g=="], + + "mobx-react": ["mobx-react@9.2.1", "", { "dependencies": { "mobx-react-lite": "^4.1.1" }, "peerDependencies": { "mobx": "^6.9.0", "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-WJNNm0FB2n0Z0u+jS1QHmmWyV8l2WiAj8V8I/96kbUEN2YbYCoKW+hbbqKKRUBqElu0llxM7nWKehvRIkhBVJw=="], + + "mobx-react-lite": ["mobx-react-lite@4.1.1", "", { "dependencies": { "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "mobx": "^6.9.0", "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "mute-stream": ["mute-stream@2.0.0", "", {}, "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA=="], + + "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + + "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], + + "neotraverse": ["neotraverse@0.6.18", "", {}, "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA=="], + + "netmask": ["netmask@2.0.2", "", {}, "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg=="], + + "next-mdx-remote-client": ["next-mdx-remote-client@1.1.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@mdx-js/mdx": "^3.1.1", "@mdx-js/react": "^3.1.1", "remark-mdx-remove-esm": "^1.2.1", "serialize-error": "^12.0.0", "vfile": "^6.0.3", "vfile-matter": "^5.0.1" }, "peerDependencies": { "react": ">= 18.3.0 < 19.0.0", "react-dom": ">= 18.3.0 < 19.0.0" } }, "sha512-psCMdO50tfoT1kAH7OGXZvhyRfiHVK6IqwjmWFV5gtLo4dnqjAgcjcLNeJ92iI26UNlKShxYrBs1GQ6UXxk97A=="], + + "nimma": ["nimma@0.2.3", "", { "dependencies": { "@jsep-plugin/regex": "^1.0.1", "@jsep-plugin/ternary": "^1.0.2", "astring": "^1.8.1", "jsep": "^1.2.0" }, "optionalDependencies": { "jsonpath-plus": "^6.0.1 || ^10.1.0", "lodash.topath": "^4.5.2" } }, "sha512-1ZOI8J+1PKKGceo/5CT5GfQOG6H8I2BencSK06YarZ2wXwH37BSSUWldqJmMJYA5JfqDqffxDXynt6f11AyKcA=="], + + "nlcst-to-string": ["nlcst-to-string@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "node-fetch-h2": ["node-fetch-h2@2.3.0", "", { "dependencies": { "http2-client": "^1.2.5" } }, "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg=="], + + "node-readfiles": ["node-readfiles@0.2.0", "", { "dependencies": { "es6-promise": "^3.2.1" } }, "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA=="], + + "node-sarif-builder": ["node-sarif-builder@2.0.3", "", { "dependencies": { "@types/sarif": "^2.1.4", "fs-extra": "^10.0.0" } }, "sha512-Pzr3rol8fvhG/oJjIq2NTVB0vmdNNlz22FENhhPojYRZ4/ee08CfK4YuKmuL54V9MLhI1kpzxfOJ/63LzmZzDg=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "normalize-url": ["normalize-url@8.1.0", "", {}, "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w=="], + + "oas-kit-common": ["oas-kit-common@1.0.8", "", { "dependencies": { "fast-safe-stringify": "^2.0.7" } }, "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ=="], + + "oas-linter": ["oas-linter@3.2.2", "", { "dependencies": { "@exodus/schemasafe": "^1.0.0-rc.2", "should": "^13.2.1", "yaml": "^1.10.0" } }, "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ=="], + + "oas-resolver": ["oas-resolver@2.5.6", "", { "dependencies": { "node-fetch-h2": "^2.3.0", "oas-kit-common": "^1.0.8", "reftools": "^1.1.9", "yaml": "^1.10.0", "yargs": "^17.0.1" }, "bin": { "resolve": "resolve.js" } }, "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ=="], + + "oas-schema-walker": ["oas-schema-walker@1.1.5", "", {}, "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ=="], + + "oas-validator": ["oas-validator@5.0.8", "", { "dependencies": { "call-me-maybe": "^1.0.1", "oas-kit-common": "^1.0.8", "oas-linter": "^3.2.2", "oas-resolver": "^2.5.6", "oas-schema-walker": "^1.1.5", "reftools": "^1.1.9", "should": "^13.2.1", "yaml": "^1.10.0" } }, "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "oniguruma-parser": ["oniguruma-parser@0.12.1", "", {}, "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w=="], + + "oniguruma-to-es": ["oniguruma-to-es@4.3.3", "", { "dependencies": { "oniguruma-parser": "^0.12.1", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg=="], + + "open": ["open@10.2.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "wsl-utils": "^0.1.0" } }, "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA=="], + + "openapi-sampler": ["openapi-sampler@1.6.2", "", { "dependencies": { "@types/json-schema": "^7.0.7", "fast-xml-parser": "^4.5.0", "json-pointer": "0.6.2" } }, "sha512-NyKGiFKfSWAZr4srD/5WDhInOWDhfml32h/FKUqLpEwKJt0kG0LGUU0MdyNkKrVGuJnw6DuPWq/sHCwAMpiRxg=="], + + "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], + + "outdent": ["outdent@0.8.0", "", {}, "sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A=="], + + "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], + + "p-any": ["p-any@4.0.0", "", { "dependencies": { "p-cancelable": "^3.0.0", "p-some": "^6.0.0" } }, "sha512-S/B50s+pAVe0wmEZHmBs/9yJXeZ5KhHzOsgKzt0hRdgkoR3DxW9ts46fcsWi/r3VnzsnkKS7q4uimze+zjdryw=="], + + "p-cancelable": ["p-cancelable@3.0.0", "", {}, "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw=="], + + "p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "p-locate": ["p-locate@3.0.0", "", { "dependencies": { "p-limit": "^2.0.0" } }, "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="], + + "p-some": ["p-some@6.0.0", "", { "dependencies": { "aggregate-error": "^4.0.0", "p-cancelable": "^3.0.0" } }, "sha512-CJbQCKdfSX3fIh8/QKgS+9rjm7OBNUTmwWswAFQAhc8j1NR1dsEDETUEuVUtQHZpV+J03LqWBEwvu0g1Yn+TYg=="], + + "p-timeout": ["p-timeout@5.1.0", "", {}, "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew=="], + + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + + "pac-proxy-agent": ["pac-proxy-agent@7.2.0", "", { "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", "socks-proxy-agent": "^8.0.5" } }, "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA=="], + + "pac-resolver": ["pac-resolver@7.0.1", "", { "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" } }, "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg=="], + + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], + + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + + "parse-latin": ["parse-latin@7.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "@types/unist": "^3.0.0", "nlcst-to-string": "^4.0.0", "unist-util-modify-children": "^4.0.0", "unist-util-visit-children": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ=="], + + "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "patch-console": ["patch-console@2.0.0", "", {}, "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA=="], + + "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], + + "path-exists": ["path-exists@3.0.0", "", {}, "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "path-to-regexp": ["path-to-regexp@0.1.12", "", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="], + + "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], + + "perfect-scrollbar": ["perfect-scrollbar@1.5.6", "", {}, "sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="], + + "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], + + "pluralize": ["pluralize@8.0.0", "", {}, "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="], + + "polished": ["polished@4.3.1", "", { "dependencies": { "@babel/runtime": "^7.17.8" } }, "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA=="], + + "pony-cause": ["pony-cause@1.1.1", "", {}, "sha512-PxkIc/2ZpLiEzQXu5YRDOUgBlfGYBY8156HY5ZcRAwwonMk5W/MrJP2LLkG/hF7GEQzaHo2aS7ho6ZLCOvf+6g=="], + + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], + + "postcss": ["postcss@8.4.49", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA=="], + + "postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="], + + "postcss-js": ["postcss-js@4.1.0", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw=="], + + "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="], + + "postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="], + + "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], + + "pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="], + + "printable-characters": ["printable-characters@1.0.42", "", {}, "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ=="], + + "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], + + "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], + + "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], + + "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], + + "protobufjs": ["protobufjs@7.5.4", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg=="], + + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + + "proxy-agent": ["proxy-agent@6.5.0", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "http-proxy-agent": "^7.0.1", "https-proxy-agent": "^7.0.6", "lru-cache": "^7.14.1", "pac-proxy-agent": "^7.1.0", "proxy-from-env": "^1.1.0", "socks-proxy-agent": "^8.0.5" } }, "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "public-ip": ["public-ip@5.0.0", "", { "dependencies": { "dns-socket": "^4.2.2", "got": "^12.0.0", "is-ip": "^3.1.0" } }, "sha512-xaH3pZMni/R2BG7ZXXaWS9Wc9wFlhyDVJF47IJ+3ali0TGv+2PsckKxbmo+rnx3ZxiV2wblVhtdS3bohAP6GGw=="], + + "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], + + "puppeteer": ["puppeteer@22.15.0", "", { "dependencies": { "@puppeteer/browsers": "2.3.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1312386", "puppeteer-core": "22.15.0" }, "bin": { "puppeteer": "lib/esm/puppeteer/node/cli.js" } }, "sha512-XjCY1SiSEi1T7iSYuxS82ft85kwDJUS7wj1Z0eGVXKdtr5g4xnVcbjwxhq5xBnpK/E7x1VZZoJDxpjAOasHT4Q=="], + + "puppeteer-core": ["puppeteer-core@22.15.0", "", { "dependencies": { "@puppeteer/browsers": "2.3.0", "chromium-bidi": "0.6.3", "debug": "^4.3.6", "devtools-protocol": "0.0.1312386", "ws": "^8.18.0" } }, "sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA=="], + + "qs": ["qs@6.13.0", "", { "dependencies": { "side-channel": "^1.0.6" } }, "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], + + "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], + + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "raw-body": ["raw-body@2.5.2", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA=="], + + "react": ["react@19.2.0", "", {}, "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ=="], + + "react-dom": ["react-dom@19.2.0", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.0" } }, "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ=="], + + "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "react-reconciler": ["react-reconciler@0.32.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-2NPMOzgTlG0ZWdIf3qG+dcbLSoAc/uLfOwckc3ofy5sSK0pLJqnQLpUFxvGcN2rlXSjnVtGeeFLNimCQEj5gOQ=="], + + "react-remove-scroll": ["react-remove-scroll@2.7.1", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA=="], + + "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], + + "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], + + "react-tabs": ["react-tabs@6.1.0", "", { "dependencies": { "clsx": "^2.0.0", "prop-types": "^15.5.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0" } }, "sha512-6QtbTRDKM+jA/MZTTefvigNxo0zz+gnBTVFw2CFVvq+f2BuH0nF0vDLNClL045nuTAdOoK/IL1vTP0ZLX0DAyQ=="], + + "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], + + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="], + + "recma-jsx": ["recma-jsx@1.0.1", "", { "dependencies": { "acorn-jsx": "^5.0.0", "estree-util-to-js": "^2.0.0", "recma-parse": "^1.0.0", "recma-stringify": "^1.0.0", "unified": "^11.0.0" }, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w=="], + + "recma-parse": ["recma-parse@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ=="], + + "recma-stringify": ["recma-stringify@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="], + + "redoc": ["redoc@2.5.0", "", { "dependencies": { "@redocly/openapi-core": "^1.4.0", "classnames": "^2.3.2", "decko": "^1.2.0", "dompurify": "^3.2.4", "eventemitter3": "^5.0.1", "json-pointer": "^0.6.2", "lunr": "^2.3.9", "mark.js": "^8.11.1", "marked": "^4.3.0", "mobx-react": "^9.1.1", "openapi-sampler": "^1.5.0", "path-browserify": "^1.0.1", "perfect-scrollbar": "^1.5.5", "polished": "^4.2.2", "prismjs": "^1.29.0", "prop-types": "^15.8.1", "react-tabs": "^6.0.2", "slugify": "~1.4.7", "stickyfill": "^1.1.1", "swagger2openapi": "^7.0.8", "url-template": "^2.0.8" }, "peerDependencies": { "core-js": "^3.1.4", "mobx": "^6.0.4", "react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", "styled-components": "^4.1.1 || ^5.1.1 || ^6.0.5" } }, "sha512-NpYsOZ1PD9qFdjbLVBZJWptqE+4Y6TkUuvEOqPUmoH7AKOmPcE+hYjotLxQNTqVoWL4z0T2uxILmcc8JGDci+Q=="], + + "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], + + "reftools": ["reftools@1.1.9", "", {}, "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w=="], + + "regex": ["regex@6.0.1", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA=="], + + "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="], + + "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], + + "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], + + "rehype-katex": ["rehype-katex@7.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/katex": "^0.16.0", "hast-util-from-html-isomorphic": "^2.0.0", "hast-util-to-text": "^4.0.0", "katex": "^0.16.0", "unist-util-visit-parents": "^6.0.0", "vfile": "^6.0.0" } }, "sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA=="], + + "rehype-minify-whitespace": ["rehype-minify-whitespace@6.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-minify-whitespace": "^1.0.0" } }, "sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw=="], + + "rehype-parse": ["rehype-parse@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-html": "^2.0.0", "unified": "^11.0.0" } }, "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag=="], + + "rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="], + + "remark": ["remark@15.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A=="], + + "remark-frontmatter": ["remark-frontmatter@5.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-frontmatter": "^2.0.0", "micromark-extension-frontmatter": "^2.0.0", "unified": "^11.0.0" } }, "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ=="], + + "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], + + "remark-math": ["remark-math@6.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-math": "^3.0.0", "micromark-extension-math": "^3.0.0", "unified": "^11.0.0" } }, "sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA=="], + + "remark-mdx": ["remark-mdx@3.1.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="], + + "remark-mdx-remove-esm": ["remark-mdx-remove-esm@1.2.1", "", { "dependencies": { "@types/mdast": "^4.0.4", "mdast-util-mdxjs-esm": "^2.0.1", "unist-util-remove": "^4.0.0" }, "peerDependencies": { "unified": "^11" } }, "sha512-Vz1GKmRR9u7ij8TTf88DK8dFc/mVror9YUJekl1uP+S0sTzHxGdszJMeBbh96aIR+ZiI2QRKHu2UsV+/pWj7uQ=="], + + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], + + "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], + + "remark-smartypants": ["remark-smartypants@3.0.2", "", { "dependencies": { "retext": "^9.0.0", "retext-smartypants": "^6.0.0", "unified": "^11.0.4", "unist-util-visit": "^5.0.0" } }, "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA=="], + + "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "require-main-filename": ["require-main-filename@2.0.0", "", {}, "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="], + + "reserved": ["reserved@0.1.2", "", {}, "sha512-/qO54MWj5L8WCBP9/UNe2iefJc+L9yETbH32xO/ft/EYPOTCR5k+azvDUgdCOKwZH8hXwPd0b8XBL78Nn2U69g=="], + + "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], + + "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "responselike": ["responselike@3.0.0", "", { "dependencies": { "lowercase-keys": "^3.0.0" } }, "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg=="], + + "restore-cursor": ["restore-cursor@4.0.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg=="], + + "retext": ["retext@9.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "retext-latin": "^4.0.0", "retext-stringify": "^4.0.0", "unified": "^11.0.0" } }, "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA=="], + + "retext-latin": ["retext-latin@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "parse-latin": "^7.0.0", "unified": "^11.0.0" } }, "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA=="], + + "retext-smartypants": ["retext-smartypants@6.2.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ=="], + + "retext-stringify": ["retext-stringify@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unified": "^11.0.0" } }, "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rollup": ["rollup@2.79.2", "", { "optionalDependencies": { "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ=="], + + "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], + + "run-async": ["run-async@4.0.6", "", {}, "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], + + "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], + + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], + + "safe-stable-stringify": ["safe-stable-stringify@1.1.1", "", {}, "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "sax": ["sax@1.4.1", "", {}, "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="], + + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="], + + "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + + "send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], + + "serialize-error": ["serialize-error@12.0.0", "", { "dependencies": { "type-fest": "^4.31.0" } }, "sha512-ZYkZLAvKTKQXWuh5XpBw7CdbSzagarX39WyZ2H07CDLC5/KfsRGlIXV8d4+tfqX1M7916mRqR1QfNHSij+c9Pw=="], + + "serve-static": ["serve-static@1.16.2", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" } }, "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw=="], + + "set-blocking": ["set-blocking@2.0.0", "", {}, "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="], + + "set-cookie-parser": ["set-cookie-parser@2.7.1", "", {}, "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], + + "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "shallowequal": ["shallowequal@1.1.0", "", {}, "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="], + + "sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="], + + "sharp-ico": ["sharp-ico@0.1.5", "", { "dependencies": { "decode-ico": "*", "ico-endec": "*", "sharp": "*" } }, "sha512-a3jODQl82NPp1d5OYb0wY+oFaPk7AvyxipIowCHk7pBsZCWgbe0yAkU2OOXdoH0ENyANhyOQbs9xkAiRHcF02Q=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "shiki": ["shiki@3.13.0", "", { "dependencies": { "@shikijs/core": "3.13.0", "@shikijs/engine-javascript": "3.13.0", "@shikijs/engine-oniguruma": "3.13.0", "@shikijs/langs": "3.13.0", "@shikijs/themes": "3.13.0", "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-aZW4l8Og16CokuCLf8CF8kq+KK2yOygapU5m3+hoGw0Mdosc6fPitjM+ujYarppj5ZIKGyPDPP1vqmQhr+5/0g=="], + + "should": ["should@13.2.3", "", { "dependencies": { "should-equal": "^2.0.0", "should-format": "^3.0.3", "should-type": "^1.4.0", "should-type-adaptors": "^1.0.1", "should-util": "^1.0.0" } }, "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ=="], + + "should-equal": ["should-equal@2.0.0", "", { "dependencies": { "should-type": "^1.4.0" } }, "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA=="], + + "should-format": ["should-format@3.0.3", "", { "dependencies": { "should-type": "^1.3.0", "should-type-adaptors": "^1.0.1" } }, "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q=="], + + "should-type": ["should-type@1.4.0", "", {}, "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ=="], + + "should-type-adaptors": ["should-type-adaptors@1.1.0", "", { "dependencies": { "should-type": "^1.3.0", "should-util": "^1.0.0" } }, "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA=="], + + "should-util": ["should-util@1.0.1", "", {}, "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "simple-eval": ["simple-eval@1.0.1", "", { "dependencies": { "jsep": "^1.3.6" } }, "sha512-LH7FpTAkeD+y5xQC4fzS+tFtaNlvt3Ib1zKzvhjv/Y+cioV4zIuw4IZr2yhRLu67CWL7FR9/6KXKnjRoZTvGGQ=="], + + "simple-swizzle": ["simple-swizzle@0.2.4", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw=="], + + "simple-websocket": ["simple-websocket@9.1.0", "", { "dependencies": { "debug": "^4.3.1", "queue-microtask": "^1.2.2", "randombytes": "^2.1.0", "readable-stream": "^3.6.0", "ws": "^7.4.2" } }, "sha512-8MJPnjRN6A8UCp1I+H/dSFyjwJhp6wta4hsVRhjf8w9qBHRzxYt14RaOcjvQnhD1N4yKOddEjflwMnQM4VtXjQ=="], + + "slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], + + "slugify": ["slugify@1.4.7", "", {}, "sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg=="], + + "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], + + "socket.io": ["socket.io@4.8.1", "", { "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", "debug": "~4.3.2", "engine.io": "~6.6.0", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" } }, "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg=="], + + "socket.io-adapter": ["socket.io-adapter@2.5.5", "", { "dependencies": { "debug": "~4.3.4", "ws": "~8.17.1" } }, "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg=="], + + "socket.io-parser": ["socket.io-parser@4.2.4", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" } }, "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew=="], + + "socks": ["socks@2.8.7", "", { "dependencies": { "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" } }, "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A=="], + + "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], + + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "sourcemap-codec": ["sourcemap-codec@1.4.8", "", {}, "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="], + + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], + + "stacktracey": ["stacktracey@2.1.8", "", { "dependencies": { "as-table": "^1.0.36", "get-source": "^2.0.12" } }, "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw=="], + + "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "stickyfill": ["stickyfill@1.1.1", "", {}, "sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA=="], + + "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="], + + "streamx": ["streamx@2.23.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], + + "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], + + "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-bom-string": ["strip-bom-string@1.0.0", "", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="], + + "strnum": ["strnum@1.1.2", "", {}, "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA=="], + + "style-to-js": ["style-to-js@1.1.18", "", { "dependencies": { "style-to-object": "1.0.11" } }, "sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg=="], + + "style-to-object": ["style-to-object@1.0.11", "", { "dependencies": { "inline-style-parser": "0.2.4" } }, "sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow=="], + + "styled-components": ["styled-components@6.1.19", "", { "dependencies": { "@emotion/is-prop-valid": "1.2.2", "@emotion/unitless": "0.8.1", "@types/stylis": "4.2.5", "css-to-react-native": "3.2.0", "csstype": "3.1.3", "postcss": "8.4.49", "shallowequal": "1.1.0", "stylis": "4.3.2", "tslib": "2.6.2" }, "peerDependencies": { "react": ">= 16.8.0", "react-dom": ">= 16.8.0" } }, "sha512-1v/e3Dl1BknC37cXMhwGomhO8AkYmN41CqyX9xhUDxry1ns3BFQy2lLDRQXJRdVVWB9OHemv/53xaStimvWyuA=="], + + "stylis": ["stylis@4.3.2", "", {}, "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg=="], + + "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "swagger2openapi": ["swagger2openapi@7.0.8", "", { "dependencies": { "call-me-maybe": "^1.0.1", "node-fetch": "^2.6.1", "node-fetch-h2": "^2.3.0", "node-readfiles": "^0.2.0", "oas-kit-common": "^1.0.8", "oas-resolver": "^2.5.6", "oas-schema-walker": "^1.1.5", "oas-validator": "^5.0.8", "reftools": "^1.1.9", "yaml": "^1.10.0", "yargs": "^17.0.1" }, "bin": { "swagger2openapi": "swagger2openapi.js", "oas-validate": "oas-validate.js", "boast": "boast.js" } }, "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g=="], + + "tailwindcss": ["tailwindcss@3.4.18", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ=="], + + "tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], + + "tar-fs": ["tar-fs@3.1.1", "", { "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { "bare-fs": "^4.0.1", "bare-path": "^3.0.0" } }, "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg=="], + + "tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="], + + "text-decoder": ["text-decoder@1.2.3", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA=="], + + "text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="], + + "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], + + "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], + + "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], + + "to-data-view": ["to-data-view@1.1.0", "", {}, "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "trim-trailing-lines": ["trim-trailing-lines@2.1.0", "", {}, "sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg=="], + + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + + "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "twoslash": ["twoslash@0.3.4", "", { "dependencies": { "@typescript/vfs": "^1.6.1", "twoslash-protocol": "0.3.4" }, "peerDependencies": { "typescript": "^5.5.0" } }, "sha512-RtJURJlGRxrkJmTcZMjpr7jdYly1rfgpujJr1sBM9ch7SKVht/SjFk23IOAyvwT1NLCk+SJiMrvW4rIAUM2Wug=="], + + "twoslash-protocol": ["twoslash-protocol@0.3.4", "", {}, "sha512-HHd7lzZNLUvjPzG/IE6js502gEzLC1x7HaO1up/f72d8G8ScWAs9Yfa97igelQRDl5h9tGcdFsRp+lNVre1EeQ=="], + + "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + + "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], + + "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], + + "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], + + "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], + + "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], + + "typedarray": ["typedarray@0.0.6", "", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="], + + "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], + + "unbzip2-stream": ["unbzip2-stream@1.4.3", "", { "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" } }, "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg=="], + + "undici": ["undici@6.22.0", "", {}, "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw=="], + + "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], + + "unist-builder": ["unist-builder@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg=="], + + "unist-util-find-after": ["unist-util-find-after@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="], + + "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], + + "unist-util-map": ["unist-util-map@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-HJs1tpkSmRJUzj6fskQrS5oYhBYlmtcvy4SepdDEEsL04FjBrgF0Mgggvxc1/qGBGgW7hRh9+UBK1aqTEnBpIA=="], + + "unist-util-modify-children": ["unist-util-modify-children@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "array-iterate": "^2.0.0" } }, "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw=="], + + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + + "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="], + + "unist-util-remove": ["unist-util-remove@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg=="], + + "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], + + "unist-util-visit-children": ["unist-util-visit-children@3.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], + + "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + + "uri-js-replace": ["uri-js-replace@1.0.1", "", {}, "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g=="], + + "urijs": ["urijs@1.19.11", "", {}, "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ=="], + + "url-template": ["url-template@2.0.8", "", {}, "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw=="], + + "urlpattern-polyfill": ["urlpattern-polyfill@10.0.0", "", {}, "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg=="], + + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], + + "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], + + "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "utility-types": ["utility-types@3.11.0", "", {}, "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw=="], + + "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], + + "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], + + "validate-npm-package-name": ["validate-npm-package-name@3.0.0", "", { "dependencies": { "builtins": "^1.0.3" } }, "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw=="], + + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="], + + "vfile-matter": ["vfile-matter@5.0.1", "", { "dependencies": { "vfile": "^6.0.0", "yaml": "^2.0.0" } }, "sha512-o6roP82AiX0XfkyTHyRCMXgHfltUNlXSEqCIS80f+mbAyiQBE2fxtDVMtseyytGx75sihiJFo/zR6r/4LTs2Cw=="], + + "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], + + "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], + + "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="], + + "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], + + "which-module": ["which-module@2.0.1", "", {}, "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="], + + "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], + + "widest-line": ["widest-line@5.0.0", "", { "dependencies": { "string-width": "^7.0.0" } }, "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA=="], + + "wordwrap": ["wordwrap@1.0.0", "", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "wsl-utils": ["wsl-utils@0.1.0", "", { "dependencies": { "is-wsl": "^3.1.0" } }, "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw=="], + + "xml2js": ["xml2js@0.6.2", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA=="], + + "xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + + "yaml-ast-parser": ["yaml-ast-parser@0.0.43", "", {}, "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A=="], + + "yargs": ["yargs@17.0.1", "", { "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } }, "sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ=="], + + "yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], + + "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], + + "yoctocolors-cjs": ["yoctocolors-cjs@2.1.3", "", {}, "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw=="], + + "yoga-layout": ["yoga-layout@3.2.1", "", {}, "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ=="], + + "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + + "zod-to-json-schema": ["zod-to-json-schema@3.24.6", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg=="], + + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + + "@alcalzone/ansi-tokenize/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "@alcalzone/ansi-tokenize/is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], + + "@asyncapi/parser/@stoplight/json": ["@stoplight/json@3.21.0", "", { "dependencies": { "@stoplight/ordered-object-literal": "^1.0.3", "@stoplight/path": "^1.3.2", "@stoplight/types": "^13.6.0", "jsonc-parser": "~2.2.1", "lodash": "^4.17.21", "safe-stable-stringify": "^1.1" } }, "sha512-5O0apqJ/t4sIevXCO3SBN9AHCEKKR/Zb4gaj7wYe5863jme9g02Q0n/GhM7ZCALkL+vGPTe4ZzTETP8TFtsw3g=="], + + "@asyncapi/parser/node-fetch": ["node-fetch@2.6.7", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ=="], + + "@inquirer/core/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "@inquirer/core/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], + + "@inquirer/external-editor/iconv-lite": ["iconv-lite@0.7.0", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ=="], + + "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "@mdx-js/mdx/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@mdx-js/mdx/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "@mdx-js/mdx/source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], + + "@mintlify/cli/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "@mintlify/cli/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "@mintlify/common/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "@mintlify/common/postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "@mintlify/link-rot/unist-util-visit": ["unist-util-visit@4.1.2", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.1.1" } }, "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg=="], + + "@mintlify/openapi-parser/ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], + + "@mintlify/openapi-parser/leven": ["leven@4.1.0", "", {}, "sha512-KZ9W9nWDT7rF7Dazg8xyLHGLrmpgq2nVNFUckhqdW3szVP6YhCpp/RAnpmVExA9JvrMynjwSLVrEj3AepHR6ew=="], + + "@mintlify/openapi-parser/yaml": ["yaml@2.8.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw=="], + + "@mintlify/prebuild/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "@mintlify/prebuild/unist-util-visit": ["unist-util-visit@4.1.2", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.1.1" } }, "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg=="], + + "@mintlify/previewing/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "@mintlify/previewing/unist-util-visit": ["unist-util-visit@4.1.2", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.1.1" } }, "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg=="], + + "@mintlify/previewing/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "@mintlify/scraping/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "@puppeteer/browsers/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "@redocly/respect-core/colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + + "@rollup/pluginutils/estree-walker": ["estree-walker@1.0.1", "", {}, "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="], + + "@stoplight/json-ref-readers/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + + "@stoplight/spectral-cli/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "@stoplight/spectral-core/@stoplight/types": ["@stoplight/types@13.6.0", "", { "dependencies": { "@types/json-schema": "^7.0.4", "utility-types": "^3.10.0" } }, "sha512-dzyuzvUjv3m1wmhPfq82lCVYGcXG0xUYgqnWfCq3PCVR4BKFhjdkHrnJ+jIDoMKvXb05AZP/ObQF6+NpDo29IQ=="], + + "@stoplight/spectral-core/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "@stoplight/spectral-parsers/@stoplight/types": ["@stoplight/types@14.1.1", "", { "dependencies": { "@types/json-schema": "^7.0.4", "utility-types": "^3.10.0" } }, "sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g=="], + + "@stoplight/spectral-ruleset-migrator/@stoplight/yaml": ["@stoplight/yaml@4.2.3", "", { "dependencies": { "@stoplight/ordered-object-literal": "^1.0.1", "@stoplight/types": "^13.0.0", "@stoplight/yaml-ast-parser": "0.0.48", "tslib": "^2.2.0" } }, "sha512-Mx01wjRAR9C7yLMUyYFTfbUf5DimEpHMkRDQ1PKLe9dfNILbgdxyrncsOXM3vCpsQ1Hfj4bPiGl+u4u6e9Akqw=="], + + "@stoplight/yaml/@stoplight/types": ["@stoplight/types@14.1.1", "", { "dependencies": { "@types/json-schema": "^7.0.4", "utility-types": "^3.10.0" } }, "sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g=="], + + "@types/estree-jsx/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "better-opn/open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], + + "body-parser/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "chokidar-cli/yargs": ["yargs@13.3.2", "", { "dependencies": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^13.1.2" } }, "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw=="], + + "chromium-bidi/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], + + "cli-truncate/slice-ansi": ["slice-ansi@5.0.0", "", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="], + + "cli-truncate/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + + "decompress-response/mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], + + "degenerator/ast-types": ["ast-types@0.13.4", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="], + + "engine.io/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], + + "engine.io/ws": ["ws@8.17.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ=="], + + "error-ex/is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "estree-util-attach-comments/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "estree-util-build-jsx/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "estree-util-scope/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "estree-util-to-js/source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], + + "express/cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], + + "express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "extract-zip/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], + + "finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "get-uri/data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="], + + "glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "gray-matter/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + + "hast-util-to-estree/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "hast-util-to-jsx-runtime/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "ink/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "ink/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "ink/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + + "ink/wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], + + "ink/ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], + + "is-online/got": ["got@12.6.1", "", { "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", "cacheable-lookup": "^7.0.0", "cacheable-request": "^10.2.8", "decompress-response": "^6.0.0", "form-data-encoder": "^2.1.2", "get-stream": "^6.0.1", "http2-wrapper": "^2.1.10", "lowercase-keys": "^3.0.0", "p-cancelable": "^3.0.0", "responselike": "^3.0.0" } }, "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ=="], + + "is-reference/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "katex/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], + + "micromark-extension-mdx-expression/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "micromark-extension-mdx-jsx/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "micromark-extension-mdxjs-esm/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "micromark-factory-mdx-expression/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "micromark-util-events-to-acorn/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "node-sarif-builder/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], + + "oas-resolver/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "path-scurry/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "proxy-agent/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], + + "public-ip/got": ["got@12.6.1", "", { "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", "cacheable-lookup": "^7.0.0", "cacheable-request": "^10.2.8", "decompress-response": "^6.0.0", "form-data-encoder": "^2.1.2", "get-stream": "^6.0.1", "http2-wrapper": "^2.1.10", "lowercase-keys": "^3.0.0", "p-cancelable": "^3.0.0", "responselike": "^3.0.0" } }, "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ=="], + + "puppeteer-core/ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], + + "react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], + + "recma-build-jsx/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "recma-parse/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "recma-stringify/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "rehype-recma/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], + + "socket.io/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], + + "socket.io-adapter/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], + + "socket.io-adapter/ws": ["ws@8.17.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ=="], + + "socket.io-parser/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], + + "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], + + "styled-components/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "sucrase/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "swagger2openapi/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "tailwindcss/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "tailwindcss/glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "tailwindcss/postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "vfile-matter/yaml": ["yaml@2.8.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw=="], + + "widest-line/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "@mintlify/cli/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "@mintlify/cli/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "@mintlify/common/estree-walker/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@mintlify/link-rot/unist-util-visit/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "@mintlify/link-rot/unist-util-visit/unist-util-is": ["unist-util-is@5.2.1", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw=="], + + "@mintlify/link-rot/unist-util-visit/unist-util-visit-parents": ["unist-util-visit-parents@5.1.3", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } }, "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg=="], + + "@mintlify/prebuild/unist-util-visit/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "@mintlify/prebuild/unist-util-visit/unist-util-is": ["unist-util-is@5.2.1", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw=="], + + "@mintlify/prebuild/unist-util-visit/unist-util-visit-parents": ["unist-util-visit-parents@5.1.3", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } }, "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg=="], + + "@mintlify/previewing/unist-util-visit/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "@mintlify/previewing/unist-util-visit/unist-util-is": ["unist-util-is@5.2.1", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw=="], + + "@mintlify/previewing/unist-util-visit/unist-util-visit-parents": ["unist-util-visit-parents@5.1.3", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } }, "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg=="], + + "@mintlify/previewing/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "@mintlify/previewing/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "@mintlify/scraping/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "@mintlify/scraping/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "@puppeteer/browsers/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "@puppeteer/browsers/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "@stoplight/spectral-cli/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "@stoplight/spectral-cli/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "@stoplight/spectral-core/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "@stoplight/spectral-ruleset-migrator/@stoplight/yaml/@stoplight/yaml-ast-parser": ["@stoplight/yaml-ast-parser@0.0.48", "", {}, "sha512-sV+51I7WYnLJnKPn2EMWgS4EUfoP4iWEbrWwbXsj0MZCB/xOK8j6+C9fntIdOM50kpx45ZLC3s6kwKivWuqvyg=="], + + "better-opn/open/define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], + + "better-opn/open/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "better-opn/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "chokidar-cli/yargs/cliui": ["cliui@5.0.0", "", { "dependencies": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", "wrap-ansi": "^5.1.0" } }, "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA=="], + + "chokidar-cli/yargs/string-width": ["string-width@3.1.0", "", { "dependencies": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } }, "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w=="], + + "chokidar-cli/yargs/y18n": ["y18n@4.0.3", "", {}, "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="], + + "chokidar-cli/yargs/yargs-parser": ["yargs-parser@13.1.2", "", { "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg=="], + + "cli-truncate/slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "cli-truncate/slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@4.0.0", "", {}, "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ=="], + + "cli-truncate/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + + "cli-truncate/string-width/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "estree-util-build-jsx/estree-walker/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "glob/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "ink/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + + "ink/string-width/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "ink/wrap-ansi/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "oas-resolver/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "oas-resolver/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "sucrase/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "sucrase/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "swagger2openapi/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "swagger2openapi/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "tailwindcss/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "widest-line/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + + "widest-line/string-width/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "chokidar-cli/yargs/cliui/strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="], + + "chokidar-cli/yargs/cliui/wrap-ansi": ["wrap-ansi@5.1.0", "", { "dependencies": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", "strip-ansi": "^5.0.0" } }, "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q=="], + + "chokidar-cli/yargs/string-width/emoji-regex": ["emoji-regex@7.0.3", "", {}, "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="], + + "chokidar-cli/yargs/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@2.0.0", "", {}, "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w=="], + + "chokidar-cli/yargs/string-width/strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="], + + "cli-truncate/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "ink/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "ink/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "widest-line/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "chokidar-cli/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], + + "chokidar-cli/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "chokidar-cli/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], + + "chokidar-cli/yargs/cliui/wrap-ansi/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "chokidar-cli/yargs/cliui/wrap-ansi/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + } +} diff --git a/docs/mint.json b/docs/mint.json index eaeb1e4d..d92e74f5 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -2,6 +2,7 @@ "name": "Terminal 49", "logo": "/logos/light.svg", "favicon": "/logos/favicon.svg", + "openapi": "openapi.json", "colors": { "primary": "#00A2FF", "light": "#52bfff", diff --git a/docs/openapi/DEVELOPER_GUIDE.md b/docs/openapi/DEVELOPER_GUIDE.md new file mode 100644 index 00000000..5fa44e43 --- /dev/null +++ b/docs/openapi/DEVELOPER_GUIDE.md @@ -0,0 +1,665 @@ +# OpenAPI Developer Guide + +This guide provides detailed workflows for working with Terminal49's modular OpenAPI specification. + +## Table of Contents + +- [Quick Reference](#quick-reference) +- [Understanding the Architecture](#understanding-the-architecture) +- [Development Workflows](#development-workflows) +- [Best Practices](#best-practices) +- [Advanced Topics](#advanced-topics) +- [Troubleshooting](#troubleshooting) + +## Quick Reference + +### Most Common Commands + +```bash +# Setup (first time only) +just setup + +# Bundle OpenAPI +just bundle # Python (production method) +just bundle-redocly # Redocly CLI (optional) + +# Validate everything +just validate # Bundle + lint + test + +# Development +just watch # Auto-bundle on file changes +just preview # Preview docs locally + +# Maintenance +just lint # Lint with Spectral +just test # Run regression test +``` + +### File Locations Cheat Sheet + +| What | Where | +|------|-------| +| Endpoint definitions | `docs/openapi/paths/*.yaml` | +| Data models (schemas) | `docs/openapi/components/schemas/*.yaml` | +| Root OpenAPI document | `docs/openapi/index.yaml` | +| Bundled output | `docs/openapi.json` (auto-generated) | +| Task commands | `justfile` (root directory) | +| Bundler implementation | `tools/openapi_bundle.py` | +| Pre-commit hook | `scripts/pre-commit.sh` | + +## Understanding the Architecture + +### Why Modular OpenAPI? + +**Problem:** A 9700+ line `openapi.json` file is: +- Hard to navigate and edit +- Prone to merge conflicts +- Difficult to review in PRs +- Easy to introduce errors + +**Solution:** Split into small, focused YAML files: +- One file per endpoint (`paths/shipments.yaml`) +- One file per schema (`components/schemas/shipment.yaml`) +- Easy to find, edit, and review +- Git diffs are meaningful + +### How References Work + +OpenAPI uses `$ref` to reference other parts of the specification. + +**Internal references** (same file): +```yaml +# Points to #/components/schemas/shipment in bundled output +$ref: "#/components/schemas/shipment" +``` + +**External references** (different file): +```yaml +# Points to another YAML file +$ref: "./shipment.yaml" +$ref: "../schemas/container.yaml" +``` + +**Fragment references** (specific property): +```yaml +# Points to a nested property +$ref: "./shipment.yaml#/properties/id" +``` + +The bundler resolves all external `$ref`s into a single `openapi.json` file. + +### The Two Bundlers + +| Feature | Python Bundler | Redocly CLI | +|---------|---------------|-------------| +| **Production use** | ✅ Yes (CI/CD) | ❌ No (dev only) | +| **Dependencies** | None (stdlib only) | Requires Bun/Node.js | +| **Speed** | ~100-200ms | ~150-300ms | +| **Error messages** | Good (enhanced) | Excellent | +| **Extra features** | Schema validation | Lint, preview, stats | +| **Command** | `just bundle` | `just bundle-redocly` | + +**Recommendation:** Use either during development, but Python is required for CI/CD. + +## Development Workflows + +### Workflow 1: Quick Edit (With Pre-commit Hook) + +**Best for:** Small changes, fixing typos, updating examples + +1. **Setup** (once): + ```bash + just install-hooks + ``` + +2. **Edit** any YAML file: + ```bash + vim docs/openapi/paths/shipments.yaml + ``` + +3. **Commit**: + ```bash + git add docs/openapi/ + git commit -m "fix: update shipment example" + # Hook auto-bundles and stages openapi.json + ``` + +4. **Push**: + ```bash + git push + ``` + +### Workflow 2: Active Development (With Watch Mode) + +**Best for:** Adding new endpoints, refactoring schemas, bulk edits + +1. **Start watch mode**: + ```bash + just watch + # Watches docs/openapi/**/*.yaml, auto-bundles on save + ``` + +2. **Edit** files in your editor – bundle updates automatically + +3. **Check** the diff: + ```bash + git diff docs/openapi.json + ``` + +4. **Validate** when done: + ```bash + just validate + ``` + +5. **Commit**: + ```bash + git add docs/openapi/ + git commit -m "feat: add tracking status endpoint" + git push + ``` + +### Workflow 3: Large Refactoring (Manual Control) + +**Best for:** Structural changes, testing different approaches + +1. **Create a branch**: + ```bash + git checkout -b refactor/shipment-schema + ``` + +2. **Make changes** to YAML files + +3. **Bundle and check**: + ```bash + just bundle + git diff docs/openapi.json + ``` + +4. **Validate**: + ```bash + just validate + # or run each step: + just lint + just test + ``` + +5. **Iterate** until satisfied + +6. **Commit and push**: + ```bash + git add docs/openapi/ + git commit -m "refactor: simplify shipment relationships" + git push origin refactor/shipment-schema + ``` + +7. **Create PR** for review + +### Workflow 4: Preview Docs Locally + +**Best for:** Seeing how changes look before deploying + +#### Option A: Redocly Preview (OpenAPI Only) + +1. **Start preview server**: + ```bash + just preview + # Opens http://localhost:8080 + # Shows interactive API docs from openapi.json + ``` + +2. **Make changes** to YAML files + +3. **Rebuild** (in another terminal): + ```bash + just bundle + ``` + +4. **Refresh** browser to see changes + +#### Option B: Mintlify Preview (Full Documentation) + +**Recommended for comprehensive preview** + +1. **Quick start**: + ```bash + just dev + # Bundles + lints + starts Mintlify preview + # Opens http://localhost:3000 + ``` + + This runs: + - Bundle OpenAPI with Python + - Lint with Spectral + - Start Mintlify dev server + +2. **Or with full validation**: + ```bash + just dev-full + # Bundles + validates + tests + starts Mintlify + # Use this before creating a PR + ``` + +3. **Make changes** and Mintlify auto-reloads + +4. **Commit** when satisfied + +**Why Mintlify Preview?** +- ✅ Shows the full docs (OpenAPI + MDX content) +- ✅ Exact replica of docs.terminal49.com +- ✅ Auto-reloads on changes +- ✅ Tests navigation and layout + +## Best Practices + +### File Organization + +**DO:** +- ✅ One endpoint per file: `paths/shipments.yaml`, `paths/shipments-id.yaml` +- ✅ One schema per file: `components/schemas/shipment.yaml` +- ✅ Use descriptive filenames that match the resource +- ✅ Group related paths in subdirectories if needed + +**DON'T:** +- ❌ Put multiple endpoints in one file +- ❌ Put all schemas in `components/schemas.yaml` +- ❌ Use generic names like `endpoint1.yaml` + +### Naming Conventions + +**Paths:** +- Use kebab-case: `shipments-id-stop-tracking.yaml` +- Match the URL path: `/shipments/{id}/stop_tracking` → `shipments-id-stop-tracking.yaml` + +**Schemas:** +- Use kebab-case: `shipping-line.yaml` +- Match the schema name: `shipping_line` → `shipping-line.yaml` + +**Components:** +- Use kebab-case for files +- Use snake_case for OpenAPI identifiers + +### Schema Design + +**Keep schemas focused:** +```yaml +# Good: Focused schema +title: "Shipment model" +type: "object" +properties: + id: + type: "string" + format: "uuid" + bill_of_lading_number: + type: "string" +``` + +**Use $ref for reusability:** +```yaml +# Good: Reuse common patterns +properties: + port_of_lading: + $ref: "#/components/schemas/port" +``` + +**Avoid deep nesting:** +```yaml +# Bad: Too deeply nested +properties: + data: + properties: + attributes: + properties: + relationships: + properties: + # ... too deep! +``` + +Instead, extract to separate schemas and use `$ref`. + +### Documentation + +**Add descriptions:** +```yaml +# Good: Helpful description +pol_timezone: + type: "string" + description: "IANA tz database timezone (e.g., America/New_York)" + nullable: true +``` + +**Include examples:** +```yaml +# Good: Real-world example +examples: + En-route to NY: + value: + id: "62738624-7032-4a50-892e-c55826228c25" + type: "shipment" + # ... full example +``` + +**Mark deprecated fields:** +```yaml +# Good: Clear deprecation +q: + schema: + type: "string" + in: "query" + name: "q" + description: "Search shipments (deprecated: use filter[] params instead)" + deprecated: true +``` + +### Validation + +**Always validate before committing:** +```bash +just validate +``` + +This runs: +1. Bundle with schema validation +2. Spectral lint +3. Regression test (ensures bundle matches) + +**Check lint errors seriously:** +```bash +just lint +# Fix all errors and warnings +``` + +**Test CI locally:** +```bash +just ci +# Simulates GitHub Actions workflow +``` + +## Advanced Topics + +### Custom Validation Rules + +The Python bundler includes schema validation. To add custom rules, edit `tools/openapi_bundle.py`: + +```python +def _validate_schema_file(path: Path, data: Any) -> None: + # Add custom validation logic here + if "deprecated" in data.get("attributes", {}): + # Warn about deprecated fields + pass +``` + +### Resolving Circular References + +If you get "Circular $ref detected": + +1. **Identify the chain** from error message: + ``` + Reference chain: + 1. docs/openapi/components/schemas/shipment.yaml + 2. docs/openapi/components/schemas/container.yaml + 3. docs/openapi/components/schemas/shipment.yaml + ``` + +2. **Break the cycle** by: + - Using `nullable` instead of `$ref` for one direction + - Extracting common properties to a base schema + - Using `allOf` composition + +3. **Example fix:** + ```yaml + # Before (circular): + # shipment.yaml references container + # container.yaml references shipment + + # After (break cycle): + # shipment.yaml references container + # container.yaml just includes shipment_id (string) + ``` + +### Working with Large Schemas + +For very large schemas (200+ lines): + +1. **Split into logical sections:** + ``` + components/schemas/ + ├── shipment/ + │ ├── base.yaml # Core properties + │ ├── relationships.yaml # Relationship properties + │ └── index.yaml # Combines base + relationships + ``` + +2. **Use composition:** + ```yaml + # shipment/index.yaml + allOf: + - $ref: "./base.yaml" + - $ref: "./relationships.yaml" + ``` + +### Programmatic Bundling + +Use the Python bundler in scripts: + +```python +from pathlib import Path +from tools.openapi_bundle import bundle_openapi, write_bundle + +# Bundle to dict +spec = bundle_openapi(Path("docs/openapi/index.yaml")) + +# Or write to file +write_bundle( + Path("docs/openapi/index.yaml"), + Path("docs/openapi.json"), + validate_schemas=True +) +``` + +Use Redocly in Node.js: + +```javascript +import { bundle, loadConfig } from '@redocly/openapi-core'; + +const config = await loadConfig(); +const result = await bundle({ + ref: 'docs/openapi/index.yaml', + config +}); +``` + +### Automation Ideas + +**Auto-format on save** (VS Code): +```json +// .vscode/settings.json +{ + "files.associations": { + "*.yaml": "yaml" + }, + "editor.formatOnSave": true +} +``` + +**Git pre-push hook** (extra safety): +```bash +# .git/hooks/pre-push +#!/bin/bash +just validate || { + echo "Validation failed! Fix errors before pushing." + exit 1 +} +``` + +## Troubleshooting + +### Problem: "Bundle is out of sync" + +**Symptom:** CI fails with "Bundle doesn't match YAML sources" + +**Solution:** +```bash +just bundle +git add docs/openapi.json +git commit --amend --no-edit +``` + +### Problem: "Referenced file not found" + +**Symptom:** +``` +Referenced file not found: ./schemas/shipment.yaml + Referenced from: docs/openapi/paths/shipments.yaml +``` + +**Solutions:** +1. Check path is relative to current file +2. Verify file exists: `ls docs/openapi/components/schemas/shipment.yaml` +3. Check spelling and case (case-sensitive!) + +### Problem: "Schema validation failed" + +**Symptom:** +``` +Schema file appears to be missing expected fields: container.yaml +Expected at least one of: type, properties, anyOf, oneOf, allOf, $ref, enum +``` + +**Solutions:** +1. Check schema has proper structure +2. Verify it's not missing `type: "object"` or `properties:` +3. Look at similar schemas for reference + +### Problem: Watch mode not working + +**Symptom:** Changes to YAML don't trigger rebuild + +**Solutions:** +```bash +# Restart Watchman daemon +watchman shutdown-server +just watch + +# Or use simple watch +bun run watch +``` + +### Problem: Merge conflicts in openapi.json + +**Symptom:** Git conflicts in the 9700-line bundle + +**Solution:** +```bash +# 1. Accept your YAML changes +git checkout --ours docs/openapi/ +git checkout --theirs docs/openapi/ + +# 2. Rebuild from YAML +just bundle + +# 3. Commit the regenerated bundle +git add docs/openapi.json +git commit +``` + +### Problem: Slow bundling + +**Symptom:** Bundle takes >1s + +**Solutions:** +```bash +# Skip validation (faster) +just bundle-fast + +# Or use Redocly (faster bundler) +just bundle-redocly +``` + +## Getting More Help + +- **README:** `docs/openapi/README.md` +- **Justfile commands:** `just --list` or `cat justfile` +- **Python bundler help:** `python -m tools.openapi_bundle --help` +- **Redocly docs:** https://redocly.com/docs/cli +- **OpenAPI spec:** https://spec.openapis.org/oas/v3.0.3 +- **JSONAPI spec:** https://jsonapi.org/format/ + +## Contributing + +When contributing OpenAPI changes: + +1. **Follow existing patterns** in similar files +2. **Add examples** for new endpoints +3. **Document** all fields with descriptions +4. **Validate** before committing: `just validate` +5. **Test** that docs render correctly: `just preview` +6. **Keep PRs focused** – one feature/fix per PR + +## Appendix: File Structure Example + +Complete example of a new endpoint: + +### 1. Create path file +```yaml +# docs/openapi/paths/tracking-status.yaml +get: + summary: "Get tracking status" + tags: + - "Tracking" + parameters: + - name: "shipment_id" + in: "query" + required: true + schema: + type: "string" + format: "uuid" + responses: + 200: + description: "OK" + content: + application/json: + schema: + $ref: "#/components/schemas/tracking_status" +``` + +### 2. Create schema file +```yaml +# docs/openapi/components/schemas/tracking-status.yaml +title: "Tracking Status" +type: "object" +properties: + status: + type: "string" + enum: ["pending", "in_transit", "delivered"] + updated_at: + type: "string" + format: "date-time" +required: + - "status" +``` + +### 3. Update index +```yaml +# docs/openapi/index.yaml (add to existing sections) +paths: + /tracking_status: + $ref: "./paths/tracking-status.yaml" + +components: + schemas: + tracking_status: + $ref: "./components/schemas/tracking-status.yaml" +``` + +### 4. Bundle and validate +```bash +just validate +``` + +### 5. Commit +```bash +git add docs/openapi/ +git commit -m "feat: add tracking status endpoint" +``` + +Done! 🎉 diff --git a/docs/openapi/README.md b/docs/openapi/README.md index 2606cd27..30e1f7f7 100644 --- a/docs/openapi/README.md +++ b/docs/openapi/README.md @@ -1,10 +1,13 @@ -# OpenAPI authoring workflow +# OpenAPI Authoring Workflow -This repository maintains the API reference as a modular OpenAPI 3.0 specification. The -single `docs/openapi.json` file that Mintlify consumes is generated from the YAML sources in -this folder. +This repository maintains the API reference as a modular OpenAPI 3.0 specification. The +single `docs/openapi.json` file that Mintlify consumes is **auto-generated** from the YAML +sources in this folder. -## Directory layout +**⚠️ Important:** The YAML files are the **source of truth**. Never edit `docs/openapi.json` +directly – it will be overwritten! + +## Directory Layout ``` docs/openapi/ @@ -16,54 +19,326 @@ docs/openapi/ └── README.md # You are here ``` -All references between files use relative `$ref` pointers (for example, -`$ref: ../components/schemas/shipment.yaml`). Feel free to group related paths inside +All references between files use relative `$ref` pointers (e.g., +`$ref: ../components/schemas/shipment.yaml`). Feel free to group related paths inside subdirectories – the bundler resolves file references relative to where they are declared. -## Editing workflow +## Quick Start + +**🚀 Recommended Development Workflow:** +```bash +# First-time setup +just setup + +# Start developing (bundle + lint + preview) +just dev +# Opens http://localhost:3000 with full Mintlify documentation +# Auto-reloads on changes +``` + +**Alternative commands:** +```bash +# Bundle OpenAPI only +just bundle + +# Lint and validate +just validate + +# Watch for changes and auto-bundle +just watch + +# Preview with Redocly (OpenAPI only) +just preview +``` + +**Traditional commands (without justfile):** +```bash +# Bundle with Python (production method) +python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json + +# Or bundle with Redocly CLI (optional, requires Bun) +bun redocly bundle docs/openapi/index.yaml -o docs/openapi.json + +# Preview with Mintlify +bun mintlify dev +``` + +## Editing Workflow -1. Update the relevant YAML file(s) under `docs/openapi/`. -2. Regenerate the bundled JSON and check the diff: +### Option 1: With Pre-commit Hook (Recommended) + +1. Install the pre-commit hook once: ```bash - python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json + just install-hooks + # or: cp scripts/pre-commit.sh .git/hooks/pre-commit && chmod +x .git/hooks/pre-commit ``` -3. Run the regression test to ensure the bundle matches the checked-in artifact: + +2. Edit YAML files under `docs/openapi/` + +3. Commit your changes – the hook automatically: + - Regenerates `docs/openapi.json` + - Validates the bundle + - Stages the updated JSON file + +### Option 2: Manual Workflow + +1. Edit YAML file(s) under `docs/openapi/` + +2. Regenerate the bundled JSON: + ```bash + just bundle + # or: python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json + ``` + +3. Validate your changes: ```bash - python -m unittest tests.test_openapi_bundle + just validate + # or: spectral lint docs/openapi/index.yaml && python -m unittest tests.test_openapi_bundle ``` -4. Commit both the YAML sources and the regenerated `docs/openapi.json`. -If you need to re-split a monolithic OpenAPI document, the helper script below reproduces the -current tree from `docs/openapi.json`: +4. Commit both the YAML sources and regenerated `docs/openapi.json` + +### Option 3: Watch Mode (Development) + +For active development, auto-bundle on file changes: + +```bash +just watch +# or: bun run watch +``` + +This watches `docs/openapi/**/*.yaml` and auto-runs the bundler whenever you save changes. + +## Bundling Methods: Python vs. Redocly + +We support **two bundling methods** – choose based on your workflow: + +| Method | Command | Use Case | Pros | Cons | +|--------|---------|----------|------|------| +| **Python** | `just bundle` | Production, CI/CD | Zero dependencies, fast, proven | Fewer features | +| **Redocly** | `just bundle-redocly` | Local development | Industry standard, better errors, more features | Requires Node.js/Bun | + +Both produce identical `docs/openapi.json` output. **CI/CD uses Python only** (no Node.js dependency). + +## Adding New Endpoints or Schemas + +### Adding a New Endpoint + +1. Create `docs/openapi/paths/your-endpoint.yaml` +2. Define the path operation(s) (GET, POST, etc.) +3. Reference schemas using `$ref: "#/components/schemas/your-schema"` +4. Add the path to `docs/openapi/index.yaml`: + ```yaml + paths: + /your_endpoint: + $ref: "./paths/your-endpoint.yaml" + ``` +5. Bundle and validate: `just validate` + +### Adding a New Schema + +1. Create `docs/openapi/components/schemas/your-model.yaml` +2. Define the schema structure (type, properties, etc.) +3. Add the schema to `docs/openapi/index.yaml`: + ```yaml + components: + schemas: + your_model: + $ref: "./components/schemas/your-model.yaml" + ``` +4. Reference it from paths: `$ref: "#/components/schemas/your_model"` +5. Bundle and validate: `just validate` + +## Linting and Validation + +We support **two linters** with different philosophies: + +### Spectral (Primary Linter) +```bash +just lint +# or: bunx spectral lint docs/openapi/index.yaml +``` + +- **Used in CI/CD** - must pass for PRs to merge +- Uses `.spectral.mjs` ruleset +- Focused on OpenAPI spec compliance +- Less strict, more practical + +### Redocly CLI (Optional, Stricter) +```bash +just lint-redocly +# or: bunx redocly lint docs/openapi/index.yaml +``` + +- **Optional** - for extra validation during development +- Uses `.redocly.yaml` config (customized for our API) +- Stricter rules, catches more style issues +- May show warnings that Spectral doesn't flag +- Requires Bun/Node.js +**Recommendation:** Run `just lint` (Spectral) before committing. Use `just lint-redocly` optionally for deeper validation. + +### Run Both ```bash -python scripts/split_openapi.py +just lint-all +# Runs Spectral + Redocly +``` + +## Schema Validation + +The Python bundler includes automatic schema validation: + +- Checks that schema files have expected structure (type, properties, etc.) +- Validates references are resolvable +- Detects circular references +- Shows helpful error messages with context + +To skip validation (faster, use with caution): +```bash +just bundle-fast +``` + +## Common Patterns + +### Internal References (Same File) +```yaml +# In docs/openapi/paths/shipments.yaml +$ref: "#/components/schemas/shipment" +``` + +### External References (Different File) +```yaml +# In docs/openapi/components/schemas/container.yaml +properties: + shipment: + $ref: "./shipment.yaml" +``` + +### Fragment References +```yaml +# Reference a specific property +$ref: "./shipment.yaml#/properties/id" ``` -## Linting and validation +## Troubleshooting + +### "Referenced file not found" +- Check the path is correct relative to the current file +- Verify filename and extension match exactly (case-sensitive) +- Ensure the file exists in your working directory + +### "Circular $ref detected" +- A file is referencing itself through a chain of $refs +- Check the reference chain shown in the error message +- Restructure your schemas to break the cycle + +### "Fragment not found" +- The path after `#` doesn't exist in the referenced file +- Check available keys shown in the error message +- Verify the fragment path is correct + +### Bundle doesn't match after editing +- Run `just bundle` to regenerate +- Check for syntax errors in your YAML (run `just lint`) +- Verify all $refs point to existing files -We use [Spectral](https://github.com/stoplightio/spectral) with the shared ruleset defined in -`.spectral.mjs` to lint the spec. You can lint locally with: +## Re-splitting a Monolithic File + +If you need to convert a monolithic `openapi.json` back to modular YAML files: ```bash -npx -y @stoplight/spectral-cli lint docs/openapi/index.yaml +just split +# or: python scripts/split_openapi.py ``` -> Tip: install `@stoplight/spectral-cli` globally if you run the lint frequently. +⚠️ **Warning:** This overwrites existing YAML files! + +## Continuous Integration + +A GitHub Actions workflow (`.github/workflows/openapi-validation.yml`) runs on every PR: + +1. Lints with Spectral +2. Bundles with Python +3. Validates bundle matches committed `openapi.json` + +If you forget to bundle or have lint errors, CI will fail. + +## Related Files -## Continuous integration +- `justfile` – Task runner with all commands +- `tools/openapi_bundle.py` – Python bundler (production) +- `tools/openapi_yaml.py` – Minimal YAML parser +- `tests/test_openapi_bundle.py` – Bundle regression test +- `scripts/pre-commit.sh` – Pre-commit hook for auto-bundling +- `package.json` – Bun/Node.js dependencies (Redocly, etc.) +- `.spectral.mjs` – Spectral lint configuration +- `.watchmanconfig` – Watchman file watching config + +## Performance Comparison + +**Bundling speed** (9700+ line OpenAPI spec): + +- Python bundler: ~100-200ms +- Redocly CLI: ~150-300ms + +Both are fast enough for development. Python is used in CI for zero dependencies. + +**Linting speed:** + +- Spectral: ~1-2s for 1MB spec +- Redocly CLI: <1s for 1MB spec + +## Additional Tools + +### Preview Docs Locally + +Two preview options available: + +**Redocly Preview** (OpenAPI only): +```bash +just preview +# Opens http://localhost:8080 with interactive API docs +# Only shows OpenAPI spec, no MDX content +``` + +**Mintlify Preview** (Full documentation): +```bash +just preview-mintlify +# Opens http://localhost:3000 with full docs +# Includes OpenAPI + MDX content + navigation +# This is what's deployed to docs.terminal49.com +``` + +**Quick Development Workflow:** +```bash +just dev +# Bundles OpenAPI + lints + starts Mintlify preview +# Perfect for active development with full docs preview + +# Or with full validation: +just dev-full +# Bundles + validates + tests + starts Mintlify +``` + +### Show Spec Statistics +```bash +just stats +# Shows endpoints, schemas, operations count +``` + +### Format YAML Files +```bash +just format +# or: bunx prettier --write "docs/openapi/**/*.yaml" +``` -A GitHub Actions workflow (`.github/workflows/openapi-validation.yml`) runs on every pull -request that touches the OpenAPI sources. It lints the modular spec with Spectral and executes -`python -m unittest tests.test_openapi_bundle` to confirm the bundled JSON stays in sync. If -you push commits that break the lint or forget to regenerate `docs/openapi.json`, the workflow -will fail and point at the offending step. +## Getting Help -## Related files +- **Justfile commands:** `just --list` or `just help` +- **Python bundler:** `python -m tools.openapi_bundle --help` +- **Redocly CLI:** `bun redocly --help` +- **Spectral docs:** https://docs.stoplight.io/docs/spectral +- **Redocly docs:** https://redocly.com/docs/cli -- `tools/openapi_bundle.py` – Bundler CLI used by both local developers and CI. -- `tools/openapi_yaml.py` – Minimal YAML reader/writer used by the bundler and split script. -- `tests/test_openapi_bundle.py` – Regression test that compares the bundled JSON to the - committed artifact. -- `.spectral.mjs` – Spectral configuration shared by local runs and CI. +For detailed developer workflows, see `docs/openapi/DEVELOPER_GUIDE.md`. diff --git a/docs/openapi/components/schemas/container.yaml b/docs/openapi/components/schemas/container.yaml index 7772f98c..15df5361 100644 --- a/docs/openapi/components/schemas/container.yaml +++ b/docs/openapi/components/schemas/container.yaml @@ -307,6 +307,7 @@ properties: properties: data: type: "object" + nullable: true properties: id: type: "string" @@ -319,6 +320,7 @@ properties: properties: data: type: "object" + nullable: true properties: id: type: "string" diff --git a/docs/openapi/components/schemas/raw-event.yaml b/docs/openapi/components/schemas/raw-event.yaml index b37a2273..f51fdedb 100644 --- a/docs/openapi/components/schemas/raw-event.yaml +++ b/docs/openapi/components/schemas/raw-event.yaml @@ -86,6 +86,7 @@ properties: location_name: type: "string" description: "The city or facility name of the event location" + nullable: true location_locode: type: "string" description: "UNLOCODE of the event location" @@ -112,6 +113,7 @@ properties: properties: data: type: "object" + nullable: true properties: id: type: "string" @@ -126,6 +128,7 @@ properties: properties: data: type: "object" + nullable: true properties: id: type: "string" diff --git a/docs/openapi/components/schemas/tracking-request.yaml b/docs/openapi/components/schemas/tracking-request.yaml index 21cc195c..191b4fbb 100644 --- a/docs/openapi/components/schemas/tracking-request.yaml +++ b/docs/openapi/components/schemas/tracking-request.yaml @@ -99,6 +99,7 @@ properties: properties: data: type: "object" + nullable: true properties: id: type: "string" diff --git a/docs/openapi/index.yaml b/docs/openapi/index.yaml index 4398d591..ecc60d77 100644 --- a/docs/openapi/index.yaml +++ b/docs/openapi/index.yaml @@ -18,6 +18,8 @@ tags: name: "Containers" - name: "Shipments" + - + name: "Shipping Lines" - name: "Locations" - @@ -36,6 +38,10 @@ tags: name: "Terminals" - name: "Routing (Paid)" + - + name: "Vessels" + - + name: "Parties" security: - authorization: [] @@ -100,8 +106,6 @@ paths: $ref: "./paths/ports-id.yaml" "/vessels/{id}": $ref: "./paths/vessels-id.yaml" - "/vessels/{imo}": - $ref: "./paths/vessels-imo.yaml" "/vessels/{id}/future_positions": $ref: "./paths/vessels-id-future-positions.yaml" "/vessels/{id}/future_positions_with_coordinates": diff --git a/docs/openapi/paths/containers-id.yaml b/docs/openapi/paths/containers-id.yaml index 5e66b43a..da788216 100644 --- a/docs/openapi/paths/containers-id.yaml +++ b/docs/openapi/paths/containers-id.yaml @@ -1,6 +1,5 @@ parameters: - - - schema: + - schema: type: "string" name: "id" in: "path" @@ -23,12 +22,9 @@ get: type: "array" items: anyOf: - - - $ref: "#/components/schemas/shipment" - - - $ref: "#/components/schemas/terminal" - - - $ref: "#/components/schemas/transport_event" + - $ref: "#/components/schemas/shipment" + - $ref: "#/components/schemas/terminal" + - $ref: "#/components/schemas/transport_event" examples: Example Container: value: @@ -88,48 +84,36 @@ get: type: "terminal" transport_events: data: - - - id: "45b542cb-332b-4684-b915-42e3a0759823" + - id: "45b542cb-332b-4684-b915-42e3a0759823" type: "transport_event" - - - id: "174ed528-a1a9-4002-aef0-f2c9369199da" + - id: "174ed528-a1a9-4002-aef0-f2c9369199da" type: "transport_event" - - - id: "7a2f30a6-a756-4c14-9477-fbfc1c7fe2f8" + - id: "7a2f30a6-a756-4c14-9477-fbfc1c7fe2f8" type: "transport_event" - - - id: "e7365004-175a-46e8-96cd-dbed0f3daf21" + - id: "e7365004-175a-46e8-96cd-dbed0f3daf21" type: "transport_event" - - - id: "7c567bf3-7f01-4a3d-a176-eaa1f7165585" + - id: "7c567bf3-7f01-4a3d-a176-eaa1f7165585" type: "transport_event" raw_events: data: - - - id: "2956f71c-bfb9-4e49-b9e2-1b4d53c74cac" + - id: "2956f71c-bfb9-4e49-b9e2-1b4d53c74cac" type: "raw_event" - - - id: "391e0eda-65b5-4fc3-a53d-25ecd9570259" + - id: "391e0eda-65b5-4fc3-a53d-25ecd9570259" type: "raw_event" - - - id: "74810c04-6c8a-4194-8cff-52936584a965" + - id: "74810c04-6c8a-4194-8cff-52936584a965" type: "raw_event" - - - id: "4b1500e2-b23b-4896-87bd-c38b1d16f385" + - id: "4b1500e2-b23b-4896-87bd-c38b1d16f385" type: "raw_event" - - - id: "8b9a7d88-720a-4304-8c1e-a3336e39f481" + - id: "8b9a7d88-720a-4304-8c1e-a3336e39f481" type: "raw_event" - - - id: "bf1f59c5-5dd8-4013-87f9-d7056bc87114" + - id: "bf1f59c5-5dd8-4013-87f9-d7056bc87114" type: "raw_event" links: self: "https://api.terminal49.com/v2/containers/55a700e4-7005-45a9-92fd-1ff38641dbd9" operationId: "get-containers-id" description: "Retrieves the details of a container." parameters: - - - schema: + - schema: type: "string" in: "query" name: "include" diff --git a/docs/openapi/paths/containers.yaml b/docs/openapi/paths/containers.yaml index 0d200ce7..4418b7c4 100644 --- a/docs/openapi/paths/containers.yaml +++ b/docs/openapi/paths/containers.yaml @@ -677,10 +677,10 @@ get: size: 5 total: 59229 links: - self: "https://api.terminal49.com/v2/containers?page[size]=5" - current: "https://api.terminal49.com/v2/containers?page[number]=1&page[size]=5" - next: "https://api.terminal49.com/v2/containers?page[number]=2&page[size]=5" - last: "https://api.terminal49.com/v2/containers?page[number]=11846&page[size]=5" + self: "https://api.terminal49.com/v2/containers?page%5Bsize%5D=5" + current: "https://api.terminal49.com/v2/containers?page%5Bnumber%5D=1&page%5Bsize%5D=5" + next: "https://api.terminal49.com/v2/containers?page%5Bnumber%5D=2&page%5Bsize%5D=5" + last: "https://api.terminal49.com/v2/containers?page%5Bnumber%5D=11846&page%5Bsize%5D=5" operationId: "get-containers" description: "Returns a list of container. The containers are returned sorted by creation date, with the most recently refreshed containers appearing first.\n\nThis API will return all containers associated with the account." parameters: @@ -689,13 +689,13 @@ get: type: "integer" default: 1 in: "query" - name: "page[number]" + name: "page%5Bnumber%5D" - schema: type: "integer" default: 30 in: "query" - name: "page[size]" + name: "page%5Bsize%5D" description: "" - schema: diff --git a/docs/openapi/paths/parties.yaml b/docs/openapi/paths/parties.yaml index a9975a04..7291f7c5 100644 --- a/docs/openapi/paths/parties.yaml +++ b/docs/openapi/paths/parties.yaml @@ -57,7 +57,7 @@ post: attributes: company_name: "COMPANY NAME" links: - self: "/v2/parties/ba4cb904-827f-4038-8e31-1e92b3356218" + self: "https://api.terminal49.com/v2/parties/ba4cb904-827f-4038-8e31-1e92b3356218" headers: {} 422: description: "Unprocessable Entity" diff --git a/docs/openapi/paths/shipments-id.yaml b/docs/openapi/paths/shipments-id.yaml index ad354219..d2540cf2 100644 --- a/docs/openapi/paths/shipments-id.yaml +++ b/docs/openapi/paths/shipments-id.yaml @@ -70,7 +70,7 @@ get: line_tracking_stopped_at: null line_tracking_stopped_reason: null links: - self: "/v2/shipments/02b1bd6f-407c-45bb-8645-06e7ee34e7e3" + self: "https://api.terminal49.com/v2/shipments/02b1bd6f-407c-45bb-8645-06e7ee34e7e3" relationships: port_of_lading: data: diff --git a/docs/openapi/paths/shipments.yaml b/docs/openapi/paths/shipments.yaml index 7f29b738..a88d1b5f 100644 --- a/docs/openapi/paths/shipments.yaml +++ b/docs/openapi/paths/shipments.yaml @@ -69,7 +69,7 @@ get: line_tracking_stopped_at: null line_tracking_stopped_reason: null links: - self: "/v2/shipments/62738624-7032-4a50-892e-c55826228c25" + self: "https://api.terminal49.com/v2/shipments/62738624-7032-4a50-892e-c55826228c25" relationships: port_of_lading: data: @@ -135,7 +135,7 @@ get: line_tracking_stopped_at: null line_tracking_stopped_reason: null links: - self: "/v2/shipments/baaa725e-aa0e-4937-ac78-54d9e2e8621e" + self: "https://api.terminal49.com/v2/shipments/baaa725e-aa0e-4937-ac78-54d9e2e8621e" relationships: port_of_lading: data: @@ -205,7 +205,7 @@ get: line_tracking_stopped_at: null line_tracking_stopped_reason: null links: - self: "/v2/shipments/7721a48c-5e93-43c9-9f5f-5be10a87fdde" + self: "https://api.terminal49.com/v2/shipments/7721a48c-5e93-43c9-9f5f-5be10a87fdde" relationships: port_of_lading: data: @@ -277,7 +277,7 @@ get: line_tracking_stopped_at: null line_tracking_stopped_reason: null links: - self: "/v2/shipments/32b5ad78-43ba-42d9-bdc0-4cf12320e020" + self: "https://api.terminal49.com/v2/shipments/32b5ad78-43ba-42d9-bdc0-4cf12320e020" relationships: port_of_lading: data: @@ -346,7 +346,7 @@ get: line_tracking_stopped_at: null line_tracking_stopped_reason: null links: - self: "/v2/shipments/bd117d3b-8fa4-487c-9bab-25c15e227d1a" + self: "https://api.terminal49.com/v2/shipments/bd117d3b-8fa4-487c-9bab-25c15e227d1a" relationships: port_of_lading: data: @@ -375,10 +375,10 @@ get: size: 5 total: 34044 links: - self: "https://api.terminal49.com/v2/shipments?page[size]=5" - current: "https://api.terminal49.com/v2/shipments?page[number]=1&page[size]=5" - next: "https://api.terminal49.com/v2/shipments?page[number]=2&page[size]=5" - last: "https://api.terminal49.com/v2/shipments?page[number]=6809&page[size]=5" + self: "https://api.terminal49.com/v2/shipments?page%5Bsize%5D=5" + current: "https://api.terminal49.com/v2/shipments?page%5Bnumber%5D=1&page%5Bsize%5D=5" + next: "https://api.terminal49.com/v2/shipments?page%5Bnumber%5D=2&page%5Bsize%5D=5" + last: "https://api.terminal49.com/v2/shipments?page%5Bnumber%5D=6809&page%5Bsize%5D=5" 422: description: "Unprocessable Entity" content: @@ -414,14 +414,14 @@ get: type: "integer" default: 1 in: "query" - name: "page[number]" + name: "page%5Bnumber%5D" description: "\n" - schema: type: "integer" default: 30 in: "query" - name: "page[size]" + name: "page%5Bsize%5D" description: "\n" - schema: diff --git a/docs/openapi/paths/tracking-requests-id.yaml b/docs/openapi/paths/tracking-requests-id.yaml index 5cea3445..ec7d9124 100644 --- a/docs/openapi/paths/tracking-requests-id.yaml +++ b/docs/openapi/paths/tracking-requests-id.yaml @@ -49,7 +49,7 @@ get: id: "eb6f218a-0b4a-47f9-8ef9-759aa5e0ea83" type: "shipment" links: - self: "/v2/tracking_requests/ba4cb904-827f-4038-8e31-1e92b3356218" + self: "https://api.terminal49.com/v2/tracking_requests/ba4cb904-827f-4038-8e31-1e92b3356218" included: - id: "eb6f218a-0b4a-47f9-8ef9-759aa5e0ea83" @@ -99,7 +99,7 @@ get: id: "11c1fa10-52a5-48e2-82f4-5523756b3d0f" type: "container" links: - self: "/v2/shipments/eb6f218a-0b4a-47f9-8ef9-759aa5e0ea83" + self: "https://api.terminal49.com/v2/shipments/eb6f218a-0b4a-47f9-8ef9-759aa5e0ea83" Multiple containers: value: data: @@ -125,7 +125,7 @@ get: customer: data: null links: - self: "/v2/tracking_requests/62c30bd4-d7fc-40dc-9fd6-fb39224301f5" + self: "https://api.terminal49.com/v2/tracking_requests/62c30bd4-d7fc-40dc-9fd6-fb39224301f5" links: self: "https://api.terminal49.com/v2/tracking_requests/62c30bd4-d7fc-40dc-9fd6-fb39224301f5?filter%5Bstatus%5D=created" included: @@ -190,7 +190,7 @@ get: id: "5ab5d058-772c-466c-bc73-0b8767ad5a79" type: "container" links: - self: "/v2/shipments/dfc9f601-f6fe-412e-a71c-feabcc2dd4e3" + self: "https://api.terminal49.com/v2/shipments/dfc9f601-f6fe-412e-a71c-feabcc2dd4e3" 404: description: "Not Found" content: diff --git a/docs/openapi/paths/tracking-requests.yaml b/docs/openapi/paths/tracking-requests.yaml index 44333a55..7fb420dd 100644 --- a/docs/openapi/paths/tracking-requests.yaml +++ b/docs/openapi/paths/tracking-requests.yaml @@ -42,7 +42,7 @@ post: id: "f7cb530a-9e60-412c-a5bc-205a2f34ba54" type: "party" links: - self: "/v2/tracking_requests/ba4cb904-827f-4038-8e31-1e92b3356218" + self: "https://api.terminal49.com/v2/tracking_requests/ba4cb904-827f-4038-8e31-1e92b3356218" headers: {} 422: description: "Unprocessable Entity" diff --git a/docs/openapi/paths/webhook-notifications-id.yaml b/docs/openapi/paths/webhook-notifications-id.yaml index 3a8dc45e..b254c896 100644 --- a/docs/openapi/paths/webhook-notifications-id.yaml +++ b/docs/openapi/paths/webhook-notifications-id.yaml @@ -31,6 +31,20 @@ get: $ref: "#/components/schemas/estimated_event" - $ref: "#/components/schemas/container_updated_event" + - + $ref: "#/components/schemas/shipment" + - + $ref: "#/components/schemas/container" + - + $ref: "#/components/schemas/port" + - + $ref: "#/components/schemas/terminal" + - + $ref: "#/components/schemas/vessel" + - + $ref: "#/components/schemas/metro_area" + - + $ref: "#/components/schemas/rail_terminal" examples: Tracking Request: value: @@ -74,7 +88,7 @@ get: id: "b5b10c0a-8d18-46da-b4c2-4e5fa790e7da" type: "shipment" links: - self: "/v2/tracking_requests/bdeca506-9741-4ab1-a0a7-cfd1d908e923" + self: "https://api.terminal49.com/v2/tracking_requests/bdeca506-9741-4ab1-a0a7-cfd1d908e923" - id: "b5b10c0a-8d18-46da-b4c2-4e5fa790e7da" type: "shipment" @@ -123,7 +137,7 @@ get: id: "b2fc728c-e2f5-4a99-8899-eb7b34ef22d7" type: "container" links: - self: "/v2/shipments/b5b10c0a-8d18-46da-b4c2-4e5fa790e7da" + self: "https://api.terminal49.com/v2/shipments/b5b10c0a-8d18-46da-b4c2-4e5fa790e7da" - id: "b2fc728c-e2f5-4a99-8899-eb7b34ef22d7" type: "container" @@ -289,7 +303,7 @@ get: containers: data: [] links: - self: "/v2/shipments/715ed64b-6195-49f6-9407-1383a8088bfd" + self: "https://api.terminal49.com/v2/shipments/715ed64b-6195-49f6-9407-1383a8088bfd" Transport Event: value: data: @@ -359,8 +373,7 @@ get: attributes: created_at: "2020-07-28T23:12:53Z" bill_of_lading_number: "TE491846459E" - ref_numbers: - - null + ref_numbers: [] shipping_line_scac: "MSCU" shipping_line_name: "Mediterranean Shipping Company" port_of_lading_locode: "MXZLO" @@ -402,7 +415,7 @@ get: id: "8c2f335a-b155-4021-87f0-9b040159a981" type: "container" links: - self: "/v2/shipments/1fc35241-4c8b-420d-803a-9e6661720a05" + self: "https://api.terminal49.com/v2/shipments/1fc35241-4c8b-420d-803a-9e6661720a05" Container Updated Event: value: data: diff --git a/justfile b/justfile new file mode 100644 index 00000000..0847c447 --- /dev/null +++ b/justfile @@ -0,0 +1,244 @@ +# Terminal49 API Documentation - Task Runner +# Usage: just +# List all commands: just --list + +# Default: show available commands +default: + @just --list + +# ======================================== +# OpenAPI Bundling (Python - Production) +# ======================================== + +# Bundle OpenAPI using Python (production method, used in CI) +bundle: + @echo "🔄 Bundling with Python..." + python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json + @echo "✅ Bundle complete" + +# Bundle without schema validation (faster, use with caution) +bundle-fast: + @echo "🔄 Bundling without validation..." + python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json --no-validate + @echo "✅ Bundle complete (validation skipped)" + +# ======================================== +# OpenAPI Bundling (Redocly - Optional) +# ======================================== + +# Bundle using Redocly CLI (requires Bun/Node.js) +bundle-redocly: + @echo "🔄 Bundling with Redocly CLI..." + bunx redocly bundle docs/openapi/index.yaml -o docs/openapi.json + @echo "✅ Bundle complete" + +# Bundle with full dereferencing (no $ref in output) +bundle-dereferenced: + @echo "🔄 Bundling with full dereferencing..." + bunx redocly bundle docs/openapi/index.yaml -o docs/openapi-dereferenced.json --dereferenced + @echo "✅ Dereferenced bundle created" + +# ======================================== +# Linting & Validation +# ======================================== + +# Lint with Spectral (default linter, used in CI) +# Note: Lints the bundled JSON file, not modular YAML +lint: + @echo "🔍 Linting bundled OpenAPI with Spectral..." + bunx spectral lint docs/openapi.json + +# Lint with Redocly CLI (optional, stricter rules) +# Note: May show more warnings than Spectral +# Configure rules in .redocly.yaml +lint-redocly: + @echo "🔍 Linting with Redocly (stricter rules)..." + bunx redocly lint docs/openapi/index.yaml + +# Run both linters +lint-all: + @echo "🔍 Running all linters..." + @just lint + @just lint-redocly + +# ======================================== +# Testing +# ======================================== + +# Run OpenAPI bundle regression test +test: + @echo "🧪 Running bundle regression test..." + python -m unittest tests.test_openapi_bundle + +# Validate everything (bundle + lint + test) +validate: bundle lint test + @echo "✅ All validations passed" + +# Full validation with both linters +validate-full: bundle lint-all test + @echo "✅ All validations passed (full)" + +# ======================================== +# Development Workflow +# ======================================== + +# Watch for changes and auto-bundle (requires Bun + chokidar) +watch: + @echo "👀 Watching docs/openapi/**/*.yaml for changes..." + @echo "Press Ctrl+C to stop" + bun run watch + +# Watch and use Redocly +watch-redocly: + @echo "👀 Watching with Redocly..." + bunx chokidar 'docs/openapi/**/*.yaml' -c 'bunx redocly bundle docs/openapi/index.yaml -o docs/openapi.json' --initial + +# Show OpenAPI spec statistics +stats: + @echo "📊 OpenAPI Statistics:" + bunx redocly stats docs/openapi/index.yaml + +# ======================================== +# Documentation Preview +# ======================================== + +# Preview OpenAPI with Redocly (interactive API docs) +preview: + @echo "🌐 Starting Redocly preview server..." + @echo "Opens at http://localhost:8080" + bunx redocly preview-docs docs/openapi/index.yaml + +# Preview full docs with Mintlify (includes MDX content) +preview-mintlify: + @echo "📦 Ensuring OpenAPI bundle is up to date..." + @just bundle-fast + @echo "📚 Starting Mintlify dev server..." + @echo "Opens at http://localhost:3000" + @echo "Mintlify will use docs/openapi.json" + cd docs && npx -y mintlify dev + +# Bundle, lint, then preview with Mintlify +dev: bundle lint preview-mintlify + +# Bundle, validate, then preview with Mintlify (thorough) +dev-full: validate preview-mintlify + +# ======================================== +# Git Hooks +# ======================================== + +# Install pre-commit hook +install-hooks: + @echo "🪝 Installing pre-commit hook..." + cp scripts/pre-commit.sh .git/hooks/pre-commit + chmod +x .git/hooks/pre-commit + @echo "✅ Pre-commit hook installed" + +# Uninstall pre-commit hook +uninstall-hooks: + @echo "🗑️ Removing pre-commit hook..." + rm -f .git/hooks/pre-commit + @echo "✅ Pre-commit hook removed" + +# ======================================== +# Setup & Dependencies +# ======================================== + +# Setup development environment (Python + Bun + hooks) +setup: + @echo "🚀 Setting up development environment..." + @echo "" + @echo "📦 Installing Bun dependencies..." + bun install + @echo "" + @echo "🪝 Installing pre-commit hook..." + @just install-hooks + @echo "" + @echo "✅ Setup complete!" + @echo "" + @echo "Try these commands:" + @echo " just bundle - Bundle with Python (production)" + @echo " just lint - Lint with Spectral" + @echo " just watch - Auto-bundle on file changes" + @echo " just preview - Preview docs locally" + +# Install Bun dependencies +install: + @echo "📦 Installing Bun dependencies..." + bun install + +# Update dependencies +update: + @echo "⬆️ Updating dependencies..." + bun update + +# ======================================== +# Utilities +# ======================================== + +# Split a monolithic openapi.json back into modular files (destructive!) +split: + @echo "⚠️ This will overwrite existing YAML files!" + @echo "Press Ctrl+C to cancel, or Enter to continue..." + @read + python scripts/split_openapi.py + @echo "✅ Split complete" + +# Clean generated files +clean: + @echo "🧹 Cleaning generated files..." + rm -f docs/openapi-dereferenced.json + @echo "✅ Clean complete" + +# Format YAML files (requires prettier) +format: + @echo "💅 Formatting YAML files..." + bunx prettier --write "docs/openapi/**/*.yaml" + +# Check YAML formatting +format-check: + @echo "🔍 Checking YAML formatting..." + bunx prettier --check "docs/openapi/**/*.yaml" + +# ======================================== +# CI/CD Simulation +# ======================================== + +# Simulate CI workflow +ci: bundle lint test + @echo "✅ CI workflow passed" + +# Generate Postman collection (used in GitHub Actions) +postman: + @echo "📮 Generating Postman collection..." + openapi2postmanv2 -s docs/openapi.json -o Terminal49-API.postman_collection.json -p -O folderStrategy=Tags + @echo "✅ Postman collection generated" + +# ======================================== +# Help & Documentation +# ======================================== + +# Show detailed help +help: + @echo "Terminal49 API Documentation - Task Runner" + @echo "" + @echo "🚀 Quick Start:" + @echo " just dev - Bundle + lint + preview with Mintlify" + @echo " just setup - First-time setup (install deps + hooks)" + @echo "" + @echo "📦 Building:" + @echo " just bundle - Bundle OpenAPI with Python (production)" + @echo " just bundle-redocly - Bundle OpenAPI with Redocly CLI (optional)" + @echo " just validate - Bundle + lint + test" + @echo "" + @echo "👀 Development:" + @echo " just watch - Auto-bundle on file changes" + @echo " just preview - Preview OpenAPI with Redocly" + @echo " just preview-mintlify - Preview full docs with Mintlify" + @echo "" + @echo "🔍 Quality:" + @echo " just lint - Lint with Spectral" + @echo " just test - Run regression tests" + @echo "" + @echo "For full command list: just --list" + @echo "For justfile documentation: cat justfile" diff --git a/package.json b/package.json new file mode 100644 index 00000000..56310d6d --- /dev/null +++ b/package.json @@ -0,0 +1,36 @@ +{ + "name": "terminal49-api-docs", + "version": "1.0.0", + "private": true, + "description": "Terminal49 API documentation with modular OpenAPI specifications", + "scripts": { + "bundle": "python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json", + "bundle:redocly": "redocly bundle docs/openapi/index.yaml -o docs/openapi.json", + "bundle:dereferenced": "redocly bundle docs/openapi/index.yaml -o docs/openapi.json --dereferenced", + "lint": "redocly lint docs/openapi/index.yaml", + "lint:spectral": "spectral lint docs/openapi/index.yaml", + "validate": "bun run bundle && bun run lint && python -m unittest tests.test_openapi_bundle", + "watch": "chokidar 'docs/openapi/**/*.yaml' -c 'python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json --no-validate' --initial", + "preview": "redocly preview-docs docs/openapi/index.yaml", + "preview:mintlify": "mintlify dev", + "stats": "redocly stats docs/openapi/index.yaml" + }, + "devDependencies": { + "@redocly/cli": "^1.25.14", + "@stoplight/spectral-cli": "^6.13.1", + "@stoplight/spectral-rulesets": "^1.20.2", + "chokidar-cli": "^3.0.0", + "mintlify": "^4.0.0" + }, + "engines": { + "node": ">=18.0.0", + "bun": ">=1.0.0" + }, + "keywords": [ + "openapi", + "api-documentation", + "terminal49", + "shipping", + "container-tracking" + ] +} diff --git a/scripts/pre-commit.sh b/scripts/pre-commit.sh new file mode 100644 index 00000000..218daf4e --- /dev/null +++ b/scripts/pre-commit.sh @@ -0,0 +1,61 @@ +#!/bin/bash +# Pre-commit hook for OpenAPI bundling +# This ensures the bundled openapi.json is always in sync with the modular YAML sources + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Check if any OpenAPI YAML files were modified +if git diff --cached --name-only | grep -q "^docs/openapi/.*\.yaml$"; then + echo -e "${YELLOW}🔄 OpenAPI YAML files changed, regenerating bundle...${NC}" + + # Run the bundler + if python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json; then + echo -e "${GREEN}✅ Bundle regenerated successfully${NC}" + + # Check if the bundle changed + if git diff --name-only docs/openapi.json | grep -q "openapi.json"; then + echo -e "${YELLOW}📝 Staging updated openapi.json${NC}" + git add docs/openapi.json + echo -e "${GREEN}✅ Updated openapi.json staged for commit${NC}" + else + echo -e "${GREEN}✅ Bundle is already up to date${NC}" + fi + else + echo -e "${RED}❌ Failed to regenerate bundle${NC}" + echo -e "${RED}Please fix the errors above and try again${NC}" + exit 1 + fi +fi + +# Check that openapi.json is in sync (extra safety check) +if git diff --cached --name-only | grep -q "^docs/openapi.json$"; then + # If openapi.json is being committed, verify it matches the bundle + echo -e "${YELLOW}🔍 Verifying openapi.json is in sync...${NC}" + + # Create a temp file with the freshly bundled version + TEMP_BUNDLE=$(mktemp) + python -m tools.openapi_bundle docs/openapi/index.yaml "$TEMP_BUNDLE" 2>/dev/null || { + echo -e "${RED}❌ Failed to create verification bundle${NC}" + rm -f "$TEMP_BUNDLE" + exit 1 + } + + # Compare the staged version with the freshly bundled version + if ! diff -q docs/openapi.json "$TEMP_BUNDLE" > /dev/null 2>&1; then + echo -e "${RED}❌ openapi.json is out of sync with YAML sources!${NC}" + echo -e "${YELLOW}Run: python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json${NC}" + rm -f "$TEMP_BUNDLE" + exit 1 + fi + + rm -f "$TEMP_BUNDLE" + echo -e "${GREEN}✅ openapi.json is in sync${NC}" +fi + +exit 0 diff --git a/tools/openapi_bundle.py b/tools/openapi_bundle.py index 0a711c4f..20580e46 100644 --- a/tools/openapi_bundle.py +++ b/tools/openapi_bundle.py @@ -2,14 +2,23 @@ from pathlib import Path from typing import Any, Dict, Tuple +import yaml -from .openapi_yaml import load_yaml + +def load_yaml(source: Path) -> Any: + """Load YAML from a file using the standard library parser.""" + with open(source, 'r', encoding='utf-8') as f: + return yaml.safe_load(f) class BundleError(RuntimeError): """Raised when a referenced document cannot be resolved.""" +class ValidationError(RuntimeError): + """Raised when schema validation fails.""" + + def _split_ref(ref: str) -> Tuple[str, str | None]: if "#" in ref: path, fragment = ref.split("#", 1) @@ -26,20 +35,59 @@ def _resolve(value: Any, current_file: Path, stack: set[Tuple[Path, str | None]] target_path, fragment = _split_ref(ref) target_file = (current_file.parent / target_path).resolve() if not target_file.exists(): - raise BundleError(f"Referenced file not found: {ref} from {current_file}") + # Enhanced error message with helpful context + rel_path = target_file.relative_to(current_file.parent.parent) if target_file.is_relative_to(current_file.parent.parent) else target_file + current_rel = current_file.relative_to(current_file.parent.parent) if current_file.is_relative_to(current_file.parent.parent) else current_file + + error_msg = [ + f"Referenced file not found: {ref}", + f" Referenced from: {current_rel}", + f" Looking for: {rel_path}", + f" Resolved path: {target_file}", + f"", + f"💡 Tips:", + f" - Check if the path is correct relative to {current_file.parent}", + f" - Verify the file exists in your working directory", + f" - Make sure the filename and extension match exactly (case-sensitive)", + ] + raise BundleError("\n".join(error_msg)) key = (target_file, fragment) if key in stack: - raise BundleError(f"Circular $ref detected for {ref}") + # Show the circular reference chain + chain = [str(f.relative_to(current_file.parent.parent) if f.is_relative_to(current_file.parent.parent) else f) for f, _ in stack] + chain.append(str(target_file.relative_to(current_file.parent.parent) if target_file.is_relative_to(current_file.parent.parent) else target_file)) + error_msg = [ + f"Circular $ref detected: {ref}", + f"", + f"Reference chain:", + ] + [f" {i+1}. {path}" for i, path in enumerate(chain)] + raise BundleError("\n".join(error_msg)) data = load_yaml(target_file) resolved = _resolve(data, target_file, stack | {key}) if fragment: fragment = fragment.lstrip("/") - for part in fragment.split("/"): + original_resolved = resolved + parts = fragment.split("/") + for i, part in enumerate(parts): if part: if isinstance(resolved, dict) and part in resolved: resolved = resolved[part] else: - raise BundleError(f"Fragment '{fragment}' not found in {ref}") + # Enhanced fragment error with available keys + available = list(resolved.keys())[:10] if isinstance(resolved, dict) else [] + error_msg = [ + f"Fragment '{fragment}' not found in {ref}", + f" Looking for: {part}", + f" At path: {'/' + '/'.join(parts[:i]) if i > 0 else '(root)'}", + ] + if available: + error_msg.append(f"") + error_msg.append(f"Available keys at this level:") + for key in available: + error_msg.append(f" - {key}") + if len(resolved.keys()) > 10: + error_msg.append(f" ... and {len(resolved.keys()) - 10} more") + raise BundleError("\n".join(error_msg)) return _resolve(resolved, target_file, stack | {key}) return {k: _resolve(v, current_file, stack) for k, v in value.items()} if isinstance(value, list): @@ -47,27 +95,100 @@ def _resolve(value: Any, current_file: Path, stack: set[Tuple[Path, str | None]] return value -def bundle_openapi(root: Path) -> Dict[str, Any]: +def _validate_schema_file(path: Path, data: Any) -> None: + """Validate that a schema file has the expected structure.""" + if not isinstance(data, dict): + raise ValidationError( + f"Schema file must be a dictionary: {path}\n" + f" Got: {type(data).__name__}" + ) + + # Check if it's a $ref-only file (which is valid) + if set(data.keys()) == {"$ref"}: + return + + # Check if it has at least one of the expected schema fields + expected_fields = {"type", "properties", "anyOf", "oneOf", "allOf", "$ref", "enum"} + if not any(field in data for field in expected_fields): + error_msg = [ + f"Schema file appears to be missing expected fields: {path}", + f"", + f"Expected at least one of: {', '.join(sorted(expected_fields))}", + f"Found keys: {', '.join(sorted(data.keys()))}", + f"", + f"💡 Tip: Schema files should define a type structure or reference another schema", + ] + raise ValidationError("\n".join(error_msg)) + + +def bundle_openapi(root: Path, validate_schemas: bool = True) -> Dict[str, Any]: + """ + Bundle a multi-file OpenAPI specification into a single document. + + Args: + root: Path to the root OpenAPI YAML file + validate_schemas: If True, validate schema files before bundling + + Returns: + The bundled OpenAPI document as a dictionary + + Raises: + BundleError: If a referenced file cannot be resolved or circular refs detected + ValidationError: If schema validation fails + """ document = load_yaml(root) + + # Optionally validate schema files before bundling + if validate_schemas: + schemas_dir = root.parent / "components" / "schemas" + if schemas_dir.exists(): + for schema_file in schemas_dir.glob("*.yaml"): + try: + schema_data = load_yaml(schema_file) + _validate_schema_file(schema_file, schema_data) + except ValidationError: + raise + except Exception as e: + raise ValidationError( + f"Failed to validate schema file: {schema_file}\n" + f" Error: {e}" + ) + return _resolve(document, root.resolve(), set()) -def write_bundle(source: Path, destination: Path) -> None: +def write_bundle(source: Path, destination: Path, validate_schemas: bool = True) -> None: import json - bundled = bundle_openapi(source) + bundled = bundle_openapi(source, validate_schemas=validate_schemas) destination.write_text(json.dumps(bundled, indent=2, sort_keys=False) + "\n") def main() -> None: import argparse - parser = argparse.ArgumentParser(description="Bundle a multi-file OpenAPI spec into a single JSON document") + parser = argparse.ArgumentParser( + description="Bundle a multi-file OpenAPI spec into a single JSON document", + epilog="Example: python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json" + ) parser.add_argument("source", type=Path, help="Path to the root OpenAPI YAML file") parser.add_argument("destination", type=Path, help="Where to write the bundled JSON output") + parser.add_argument( + "--no-validate", + action="store_true", + help="Skip schema validation before bundling" + ) args = parser.parse_args() - write_bundle(args.source, args.destination) + try: + write_bundle(args.source, args.destination, validate_schemas=not args.no_validate) + print(f"✅ Successfully bundled {args.source} → {args.destination}") + except (BundleError, ValidationError) as e: + print(f"❌ Error: {e}", file=__import__('sys').stderr) + exit(1) + except Exception as e: + print(f"❌ Unexpected error: {e}", file=__import__('sys').stderr) + exit(1) if __name__ == "__main__": From 70839fc5f8b19c2f7156e35692ad99aa484eb5c7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 22 Oct 2025 08:01:56 +0000 Subject: [PATCH 5/7] chore: Auto-generate Postman collection from openapi.json [skip ci] --- Terminal49-API.postman_collection.json | 953 ++++++++++--------------- 1 file changed, 380 insertions(+), 573 deletions(-) diff --git a/Terminal49-API.postman_collection.json b/Terminal49-API.postman_collection.json index e5fc19ec..4bc52211 100644 --- a/Terminal49-API.postman_collection.json +++ b/Terminal49-API.postman_collection.json @@ -5,7 +5,7 @@ "description": "", "item": [ { - "id": "0e6eb99c-50c3-456a-a227-a044dd77af77", + "id": "b5af49c7-82e5-471f-8c57-6932cbd49bf1", "name": "List containers", "request": { "name": "List containers", @@ -27,7 +27,7 @@ "content": "", "type": "text/plain" }, - "key": "page[number]", + "key": "page%5Bnumber%5D", "value": "1" }, { @@ -36,7 +36,7 @@ "content": "", "type": "text/plain" }, - "key": "page[size]", + "key": "page%5Bsize%5D", "value": "30" }, { @@ -72,7 +72,7 @@ }, "response": [ { - "id": "f818b35a-6705-4d98-abf5-03dbe40e5365", + "id": "56287ae0-9532-45fd-82b7-7de341a97319", "name": "OK", "originalRequest": { "url": { @@ -89,7 +89,7 @@ "content": "", "type": "text/plain" }, - "key": "page[number]", + "key": "page%5Bnumber%5D", "value": "1" }, { @@ -98,7 +98,7 @@ "content": "", "type": "text/plain" }, - "key": "page[size]", + "key": "page%5Bsize%5D", "value": "30" }, { @@ -147,7 +147,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"open top\",\n \"equipment_length\": 10,\n \"equipment_height\": \"high_cube\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"other\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"open top\",\n \"equipment_length\": 20,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"all_containers_terminated\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"no_updates_at_line\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"flat rack\",\n \"equipment_length\": 20,\n \"equipment_height\": \"high_cube\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"total\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"extended_dwell_time\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": null,\n \"equipment_length\": 20,\n \"equipment_height\": \"high_cube\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"extended_dwell_time\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"total\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"cancelled_by_user\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -158,7 +158,7 @@ } }, { - "id": "d74f0fcb-f4ac-4a86-8866-0e604eeb38a3", + "id": "63269de6-a1b0-41f1-bbfb-53e63d53ab32", "name": "Edit a container", "request": { "name": "Edit a container", @@ -189,7 +189,7 @@ "method": "PATCH", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"attributes\": {\n \"ref_numbers\": [\n \"\",\n \"\"\n ]\n },\n \"type\": false\n }\n}", + "raw": "{\n \"data\": {\n \"attributes\": {\n \"ref_numbers\": [\n \"\",\n \"\"\n ]\n },\n \"type\": 4579.588772762338\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -201,7 +201,7 @@ }, "response": [ { - "id": "95a38819-fbe8-4fc9-a921-d69d949aeed4", + "id": "7d331d34-55a6-47a9-abd1-342976fccd70", "name": "OK", "originalRequest": { "url": { @@ -235,7 +235,7 @@ "method": "PATCH", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"attributes\": {\n \"ref_numbers\": [\n \"\",\n \"\"\n ]\n },\n \"type\": false\n }\n}", + "raw": "{\n \"data\": {\n \"attributes\": {\n \"ref_numbers\": [\n \"\",\n \"\"\n ]\n },\n \"type\": 4579.588772762338\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -252,7 +252,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"open top\",\n \"equipment_length\": null,\n \"equipment_height\": \"high_cube\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"extended_dwell_time\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"reefer\",\n \"equipment_length\": 40,\n \"equipment_height\": null,\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"total\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -263,7 +263,7 @@ } }, { - "id": "433fac44-572c-40ca-ae55-2744281c2592", + "id": "4603e173-ad02-4730-bd8b-875dc9a38524", "name": "Get a container", "request": { "name": "Get a container", @@ -315,7 +315,7 @@ }, "response": [ { - "id": "183958a6-0685-4441-8740-dd47e012c426", + "id": "d85450ae-887c-4eda-a016-b23ad22906c0", "name": "OK", "originalRequest": { "url": { @@ -364,7 +364,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"tank\",\n \"equipment_length\": 45,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"total\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ]\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": null,\n \"equipment_length\": 20,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"no_updates_at_line\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"past_arrival_window\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -375,7 +375,7 @@ } }, { - "id": "40b64bf0-e5e5-440f-b4a9-a1979f424f7b", + "id": "6752585c-f34e-48be-ab87-7f3b00f04ca2", "name": "Get a container's raw events", "request": { "name": "Get a container's raw events", @@ -418,7 +418,7 @@ }, "response": [ { - "id": "c9db1244-7133-443b-b9e4-3a22066b71cd", + "id": "a33282bb-432b-434f-a67b-4cd418a0ace1", "name": "OK", "originalRequest": { "url": { @@ -458,7 +458,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\",\n \"attributes\": {\n \"event\": \"vessel_arrived\",\n \"original_event\": \"\",\n \"timestamp\": \"\",\n \"estimated\": \"\",\n \"actual_on\": \"\",\n \"estimated_on\": \"\",\n \"actual_at\": \"\",\n \"estimated_at\": \"\",\n \"timezone\": \"\",\n \"created_at\": \"\",\n \"location_name\": \"\",\n \"location_locode\": \"\",\n \"vessel_name\": \"\",\n \"vessel_imo\": \"\",\n \"index\": \"\",\n \"voyage_number\": \"\"\n },\n \"relationships\": {\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"port\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"vessel\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\",\n \"attributes\": {\n \"event\": \"feeder_arrived\",\n \"original_event\": \"\",\n \"timestamp\": \"\",\n \"estimated\": \"\",\n \"actual_on\": \"\",\n \"estimated_on\": \"\",\n \"actual_at\": \"\",\n \"estimated_at\": \"\",\n \"timezone\": \"\",\n \"created_at\": \"\",\n \"location_name\": \"\",\n \"location_locode\": \"\",\n \"vessel_name\": \"\",\n \"vessel_imo\": \"\",\n \"index\": \"\",\n \"voyage_number\": \"\"\n },\n \"relationships\": {\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"port\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"vessel\"\n }\n }\n }\n }\n ]\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\",\n \"attributes\": {\n \"event\": \"transshipment_arrived\",\n \"original_event\": \"\",\n \"timestamp\": \"\",\n \"estimated\": \"\",\n \"actual_on\": \"\",\n \"estimated_on\": \"\",\n \"actual_at\": \"\",\n \"estimated_at\": \"\",\n \"timezone\": \"\",\n \"created_at\": \"\",\n \"location_name\": \"\",\n \"location_locode\": \"\",\n \"vessel_name\": \"\",\n \"vessel_imo\": \"\",\n \"index\": \"\",\n \"voyage_number\": \"\"\n },\n \"relationships\": {\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"metro_area\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"vessel\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\",\n \"attributes\": {\n \"event\": \"positioned_in\",\n \"original_event\": \"\",\n \"timestamp\": \"\",\n \"estimated\": \"\",\n \"actual_on\": \"\",\n \"estimated_on\": \"\",\n \"actual_at\": \"\",\n \"estimated_at\": \"\",\n \"timezone\": \"\",\n \"created_at\": \"\",\n \"location_name\": \"\",\n \"location_locode\": \"\",\n \"vessel_name\": \"\",\n \"vessel_imo\": \"\",\n \"index\": \"\",\n \"voyage_number\": \"\"\n },\n \"relationships\": {\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"metro_area\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"vessel\"\n }\n }\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -469,7 +469,7 @@ } }, { - "id": "72bceef8-6627-4133-98bb-898af95a6029", + "id": "ae642966-b51b-47eb-a6b2-2beaa9434f6f", "name": "Get a container's transport events", "request": { "name": "Get a container's transport events", @@ -522,7 +522,7 @@ }, "response": [ { - "id": "77db3cd1-b54c-4bf4-8c7d-4650ea9709c0", + "id": "2d28def7-8d98-46d9-8c54-f9de299a9cd4", "name": "OK", "originalRequest": { "url": { @@ -572,7 +572,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\",\n \"attributes\": {\n \"event\": \"container.transport.estimated.arrived_at_inland_destination\",\n \"voyage_number\": \"\",\n \"timestamp\": \"\",\n \"timezone\": \"\",\n \"location_locode\": \"\",\n \"created_at\": \"\",\n \"data_source\": \"shipping_line\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"port\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"name\": \"vessel\"\n }\n },\n \"terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"container\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\",\n \"attributes\": {\n \"event\": \"container.transport.rail_unloaded\",\n \"voyage_number\": \"\",\n \"timestamp\": \"\",\n \"timezone\": \"\",\n \"location_locode\": \"\",\n \"created_at\": \"\",\n \"data_source\": \"ais\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"metro_area\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"name\": \"vessel\"\n }\n },\n \"terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"rail_terminal\"\n }\n },\n \"container\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\"\n }\n }\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"all_containers_terminated\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"no_updates_at_line\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\",\n \"attributes\": {\n \"event\": \"container.transport.feeder_arrived\",\n \"voyage_number\": \"\",\n \"timestamp\": \"\",\n \"timezone\": \"\",\n \"location_locode\": \"\",\n \"created_at\": \"\",\n \"data_source\": \"shipping_line\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"port\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"name\": \"vessel\"\n }\n },\n \"terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"container\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\",\n \"attributes\": {\n \"event\": \"container.transport.vessel_departed\",\n \"voyage_number\": \"\",\n \"timestamp\": \"\",\n \"timezone\": \"\",\n \"location_locode\": \"\",\n \"created_at\": \"\",\n \"data_source\": \"shipping_line\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"metro_area\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"name\": \"vessel\"\n }\n },\n \"terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"container\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\"\n }\n }\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -583,7 +583,7 @@ } }, { - "id": "66a2f9c6-37b2-4938-9e0f-5e863d81816d", + "id": "5ae4f861-e7e9-4451-b6fb-ca9a6ca537ee", "name": "Get container route", "request": { "name": "Get container route", @@ -626,7 +626,7 @@ }, "response": [ { - "id": "708b122d-e156-40f1-b02f-b2e48732969a", + "id": "e4eebf49-9fb9-4124-a8d2-9de6cf00dff8", "name": "OK", "originalRequest": { "url": { @@ -671,7 +671,7 @@ "_postman_previewlanguage": "json" }, { - "id": "dd6a9a65-af8c-47c2-a1c8-52eb9d2f1d4a", + "id": "f469bf97-ff4a-49f4-b7f7-64a7e43377f7", "name": "Forbidden - Routing data feature is not enabled for this account", "originalRequest": { "url": { @@ -722,7 +722,7 @@ } }, { - "id": "2b73f8ae-c286-4593-932f-b07fa7776912", + "id": "228e3070-dccb-4405-a98c-fea91921b343", "name": "Refresh container", "request": { "name": "Refresh container", @@ -765,7 +765,7 @@ }, "response": [ { - "id": "653a6958-49fe-4eba-80cb-7523eeecc73b", + "id": "427aa117-b7dc-4b04-a6ea-f8a764e73eb1", "name": "OK", "originalRequest": { "url": { @@ -810,7 +810,7 @@ "_postman_previewlanguage": "json" }, { - "id": "3c6a832c-b798-4efe-b29a-041bf09056d9", + "id": "e72c1735-748a-413f-8464-d49067da81a2", "name": "Forbidden - This API endpoint is not enabled for your account. Please contact support@terminal49.com", "originalRequest": { "url": { @@ -855,7 +855,7 @@ "_postman_previewlanguage": "json" }, { - "id": "7fe5f320-5ad3-46e3-bed2-80e33cb6edfe", + "id": "44576d29-fbea-40f0-88c4-5fe7d5214b27", "name": "Too Many Requests - You've hit the refresh limit. Please try again in a minute.", "originalRequest": { "url": { @@ -921,7 +921,7 @@ "description": "", "item": [ { - "id": "73b1bace-2052-4f04-8626-43bcd3b50bd2", + "id": "c1241f20-f34c-4fd7-b06f-fcba557d8a28", "name": "List shipments", "request": { "name": "List shipments", @@ -943,7 +943,7 @@ "content": "\n", "type": "text/plain" }, - "key": "page[number]", + "key": "page%5Bnumber%5D", "value": "1" }, { @@ -952,7 +952,7 @@ "content": "\n", "type": "text/plain" }, - "key": "page[size]", + "key": "page%5Bsize%5D", "value": "30" }, { @@ -1006,7 +1006,7 @@ }, "response": [ { - "id": "b4419697-f28f-4cb6-aa4b-e9ca082554df", + "id": "38c9e768-4f7d-4428-8b71-abd43816e371", "name": "OK", "originalRequest": { "url": { @@ -1023,7 +1023,7 @@ "content": "\n", "type": "text/plain" }, - "key": "page[number]", + "key": "page%5Bnumber%5D", "value": "1" }, { @@ -1032,7 +1032,7 @@ "content": "\n", "type": "text/plain" }, - "key": "page[size]", + "key": "page%5Bsize%5D", "value": "30" }, { @@ -1099,12 +1099,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"open top\",\n \"equipment_length\": 20,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"extended_dwell_time\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"other\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"open top\",\n \"equipment_length\": 10,\n \"equipment_height\": \"high_cube\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"cancelled_by_user\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"cancelled_by_user\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": null,\n \"equipment_length\": 20,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"flat rack\",\n \"equipment_length\": null,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"total\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "2e9ec3a9-6df1-4963-b42a-6b82cb9b462e", + "id": "9d2279ef-306a-4462-acf6-4739737c0d63", "name": "Unprocessable Entity", "originalRequest": { "url": { @@ -1121,7 +1121,7 @@ "content": "\n", "type": "text/plain" }, - "key": "page[number]", + "key": "page%5Bnumber%5D", "value": "1" }, { @@ -1130,7 +1130,7 @@ "content": "\n", "type": "text/plain" }, - "key": "page[size]", + "key": "page%5Bsize%5D", "value": "30" }, { @@ -1208,7 +1208,7 @@ } }, { - "id": "4e0c7dea-4917-4b10-84cd-5a1b59912d19", + "id": "ef53d9d6-9122-431e-8689-843b21ee66d6", "name": "Get a shipment", "request": { "name": "Get a shipment", @@ -1260,7 +1260,7 @@ }, "response": [ { - "id": "218ce425-dd0b-488a-9f7c-21dc597472d2", + "id": "9673cc00-f448-424c-865f-76eb018adc3c", "name": "OK", "originalRequest": { "url": { @@ -1309,12 +1309,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"past_arrival_window\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": null,\n \"equipment_length\": 20,\n \"equipment_height\": \"high_cube\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"reefer\",\n \"equipment_length\": 20,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"other\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n ]\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"cancelled_by_user\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"open top\",\n \"equipment_length\": 40,\n \"equipment_height\": \"high_cube\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"other\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"dry\",\n \"equipment_length\": 10,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"total\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n }\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "151775a8-efbf-4f78-b8e2-2e1340bf7004", + "id": "9602b368-a1b9-4102-b6de-ce86f7caa3ff", "name": "Not Found", "originalRequest": { "url": { @@ -1374,7 +1374,7 @@ } }, { - "id": "2946c575-22d8-435b-9b3c-6956fcc07b10", + "id": "325092d2-f852-4e1b-b238-38f038508a87", "name": "Edit a shipment", "request": { "name": "Edit a shipment", @@ -1429,7 +1429,7 @@ }, "response": [ { - "id": "b0a040b3-e3d9-41ce-99e6-9c21ff36eff2", + "id": "c83e45fc-c095-4c43-b77a-8c20dec75242", "name": "OK", "originalRequest": { "url": { @@ -1481,7 +1481,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"past_arrival_window\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"booking_cancelled\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -1492,7 +1492,7 @@ } }, { - "id": "ea3da58c-fc39-4a23-95cc-20b4ebac8851", + "id": "dce5f739-999f-4bfe-8a7f-c2866f2218fd", "name": "Stop tracking a shipment", "request": { "name": "Stop tracking a shipment", @@ -1535,7 +1535,7 @@ }, "response": [ { - "id": "d1657693-eeb1-4212-bfe6-36a040c67dd6", + "id": "9c688f38-f30e-4c7d-8b27-daba3375e91a", "name": "OK", "originalRequest": { "url": { @@ -1575,7 +1575,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"past_arrival_window\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"booking_cancelled\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -1586,7 +1586,7 @@ } }, { - "id": "55d0ac8c-8743-4410-a6bd-0b3b2440f870", + "id": "7b09a067-aa3c-41cb-99d9-5c1ebd265068", "name": "Resume tracking a shipment", "request": { "name": "Resume tracking a shipment", @@ -1629,7 +1629,7 @@ }, "response": [ { - "id": "e216f90c-6c33-48f0-96d0-6ed704bfb797", + "id": "e7b5cf6c-2f45-48a3-bd7a-5c1bb63ee289", "name": "OK", "originalRequest": { "url": { @@ -1669,7 +1669,184 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"past_arrival_window\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"booking_cancelled\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n}", + "cookie": [], + "_postman_previewlanguage": "json" + } + ], + "event": [], + "protocolProfileBehavior": { + "disableBodyPruning": true + } + } + ] + }, + { + "name": "Shipping Lines", + "description": "", + "item": [ + { + "id": "3a9d219d-66f0-440c-ac02-82e9fc58535a", + "name": "Shipping Lines", + "request": { + "name": "Shipping Lines", + "description": { + "content": "Return a list of shipping lines supported by Terminal49. \nN.B. There is no pagination for this endpoint.", + "type": "text/plain" + }, + "url": { + "path": [ + "shipping_lines" + ], + "host": [ + "{{baseUrl}}" + ], + "query": [], + "variable": [] + }, + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "method": "GET", + "body": {}, + "auth": null + }, + "response": [ + { + "id": "3982eafa-116e-459a-a006-2af866829594", + "name": "OK", + "originalRequest": { + "url": { + "path": [ + "shipping_lines" + ], + "host": [ + "{{baseUrl}}" + ], + "query": [], + "variable": [] + }, + "header": [ + { + "key": "Accept", + "value": "application/json" + }, + { + "description": { + "content": "Added as a part of security scheme: apikey", + "type": "text/plain" + }, + "key": "Authorization", + "value": "" + } + ], + "method": "GET", + "body": {} + }, + "status": "OK", + "code": 200, + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"attributes\": {\n \"scac\": \"\",\n \"name\": \"\",\n \"alternative_scacs\": [\n \"\",\n \"\"\n ],\n \"short_name\": \"\",\n \"bill_of_lading_tracking_support\": \"\",\n \"booking_number_tracking_support\": \"\",\n \"container_number_tracking_support\": \"\"\n },\n \"type\": \"shipping_line\"\n },\n {\n \"id\": \"\",\n \"attributes\": {\n \"scac\": \"\",\n \"name\": \"\",\n \"alternative_scacs\": [\n \"\",\n \"\"\n ],\n \"short_name\": \"\",\n \"bill_of_lading_tracking_support\": \"\",\n \"booking_number_tracking_support\": \"\",\n \"container_number_tracking_support\": \"\"\n },\n \"type\": \"shipping_line\"\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n }\n}", + "cookie": [], + "_postman_previewlanguage": "json" + } + ], + "event": [], + "protocolProfileBehavior": { + "disableBodyPruning": true + } + }, + { + "id": "088560b5-1144-45cc-b791-2487d6533a39", + "name": "Get a single shipping line", + "request": { + "name": "Get a single shipping line", + "description": { + "content": "Return the details of a single shipping line.", + "type": "text/plain" + }, + "url": { + "path": [ + "shipping_lines", + ":id" + ], + "host": [ + "{{baseUrl}}" + ], + "query": [], + "variable": [ + { + "type": "any", + "value": "", + "key": "id", + "disabled": false, + "description": { + "content": "(Required) ", + "type": "text/plain" + } + } + ] + }, + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "method": "GET", + "body": {}, + "auth": null + }, + "response": [ + { + "id": "f47c7913-0ab9-431c-a708-5ee9b51f81d8", + "name": "OK", + "originalRequest": { + "url": { + "path": [ + "shipping_lines", + ":id" + ], + "host": [ + "{{baseUrl}}" + ], + "query": [], + "variable": [] + }, + "header": [ + { + "key": "Accept", + "value": "application/json" + }, + { + "description": { + "content": "Added as a part of security scheme: apikey", + "type": "text/plain" + }, + "key": "Authorization", + "value": "" + } + ], + "method": "GET", + "body": {} + }, + "status": "OK", + "code": 200, + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": "{\n \"data\": {\n \"id\": \"\",\n \"attributes\": {\n \"scac\": \"\",\n \"name\": \"\",\n \"alternative_scacs\": [\n \"\",\n \"\"\n ],\n \"short_name\": \"\",\n \"bill_of_lading_tracking_support\": \"\",\n \"booking_number_tracking_support\": \"\",\n \"container_number_tracking_support\": \"\"\n },\n \"type\": \"shipping_line\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -1696,7 +1873,7 @@ "description": "", "item": [ { - "id": "642c186b-9b9a-4b7e-85a3-4445a8512e2f", + "id": "2fd9d3fe-a1e3-43ec-88b7-e117c90325b3", "name": "Create a tracking request", "request": { "name": "Create a tracking request", @@ -1727,7 +1904,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"bill_of_lading\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"container\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -1755,7 +1932,7 @@ }, "response": [ { - "id": "6490aa04-f8f8-4709-8e9a-08cdffc83fd1", + "id": "795ec5bb-b741-4107-bffa-e338b5249030", "name": "Tracking Request Created", "originalRequest": { "url": { @@ -1789,7 +1966,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"bill_of_lading\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"container\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -1806,12 +1983,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"pending\",\n \"request_type\": \"booking_number\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"internal_processing_error\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ]\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"created\",\n \"request_type\": \"booking_number\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"booking_cancelled\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "b79ecc84-8717-4469-bf26-837adee6a750", + "id": "c02ab7f5-52fe-4fa2-8cfc-d556809acdba", "name": "Unprocessable Entity", "originalRequest": { "url": { @@ -1845,7 +2022,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"bill_of_lading\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"container\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -1867,7 +2044,7 @@ "_postman_previewlanguage": "json" }, { - "id": "d7cae8d1-6db2-4e8b-a90d-54ae11850a21", + "id": "6ecdbcb4-7a52-4c5f-9081-362e33001357", "name": "Too Many Requests - You've hit the create tracking requests limit. Please try again in a minute.", "originalRequest": { "url": { @@ -1901,7 +2078,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"bill_of_lading\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"container\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -1938,7 +2115,7 @@ } }, { - "id": "7585808e-0e23-474b-8740-5963e66cad70", + "id": "888b0c2c-36f4-462c-9e2b-eb330c1d65d6", "name": "List tracking requests", "request": { "name": "List tracking requests", @@ -1970,7 +2147,7 @@ "type": "text/plain" }, "key": "filter[status]", - "value": "pending" + "value": "failed" }, { "disabled": false, @@ -2050,7 +2227,7 @@ }, "response": [ { - "id": "04cc4f4b-2b17-4f5b-ba02-5d23f47987b2", + "id": "7a4b2aa7-7673-4e3b-8e34-af406ea4cb54", "name": "OK", "originalRequest": { "url": { @@ -2077,7 +2254,7 @@ "type": "text/plain" }, "key": "filter[status]", - "value": "pending" + "value": "failed" }, { "disabled": false, @@ -2170,12 +2347,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"failed\",\n \"request_type\": \"booking_number\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"not_found\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"awaiting_manifest\",\n \"request_type\": \"bill_of_lading\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"duplicate\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ]\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"failed\",\n \"request_type\": \"bill_of_lading\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"not_found\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"failed\",\n \"request_type\": \"bill_of_lading\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"duplicate\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "adf1317d-b490-44cd-b474-3e26d808087b", + "id": "579da652-878f-41fc-84c7-0f62c84aa5d2", "name": "Not Found", "originalRequest": { "url": { @@ -2202,7 +2379,7 @@ "type": "text/plain" }, "key": "filter[status]", - "value": "pending" + "value": "failed" }, { "disabled": false, @@ -2306,7 +2483,7 @@ } }, { - "id": "ac0387ad-731b-4ea8-9003-3f990ae72d4b", + "id": "95b53447-37c0-4342-b480-f3e12e8e0f50", "name": "Get a single tracking request", "request": { "name": "Get a single tracking request", @@ -2358,7 +2535,7 @@ }, "response": [ { - "id": "caf38ead-d640-40e2-9eca-e9cece46a158", + "id": "27f40dd1-9081-430f-81c4-725d5e511ba7", "name": "OK", "originalRequest": { "url": { @@ -2407,12 +2584,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"pending\",\n \"request_type\": \"booking_number\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"internal_processing_error\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ]\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"created\",\n \"request_type\": \"booking_number\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"booking_cancelled\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"container\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "562e9533-b4ce-48d4-a05a-de1f4e381d2e", + "id": "8a891616-e0ca-4d7f-a910-11c3db06e881", "name": "Not Found", "originalRequest": { "url": { @@ -2472,7 +2649,7 @@ } }, { - "id": "0b83d173-df3f-4e59-a516-0f5ef5e10b06", + "id": "12b20432-1bce-4560-929e-e31a2ae48bcb", "name": "Edit a tracking request", "request": { "name": "Edit a tracking request", @@ -2515,7 +2692,7 @@ "method": "PATCH", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"attributes\": {\n \"ref_number\": \"\"\n },\n \"type\": 2751.0305178836256\n }\n}", + "raw": "{\n \"data\": {\n \"attributes\": {\n \"ref_number\": \"\"\n },\n \"type\": true\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -2527,7 +2704,7 @@ }, "response": [ { - "id": "f013cbce-aec1-4bfa-b088-eb9c9e21474b", + "id": "c9c2ee1a-8975-454c-9747-cfe6bc9e24f0", "name": "OK", "originalRequest": { "url": { @@ -2562,7 +2739,7 @@ "method": "PATCH", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"attributes\": {\n \"ref_number\": \"\"\n },\n \"type\": 2751.0305178836256\n }\n}", + "raw": "{\n \"data\": {\n \"attributes\": {\n \"ref_number\": \"\"\n },\n \"type\": true\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -2579,7 +2756,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"pending\",\n \"request_type\": \"bill_of_lading\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"internal_processing_error\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"pending\",\n \"request_type\": \"bill_of_lading\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"not_found\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -2596,7 +2773,7 @@ "description": "", "item": [ { - "id": "8d4016f5-2c50-425a-9357-99a286367b2a", + "id": "2eed621a-9824-4d3d-840e-a7ab6fd8a30d", "name": "Get single webhook", "request": { "name": "Get single webhook", @@ -2638,7 +2815,7 @@ }, "response": [ { - "id": "e6bb0ed4-bda6-4e28-b1da-61f291c1b603", + "id": "bfc219d9-9860-4d52-86c0-c24be35caccc", "name": "OK", "originalRequest": { "url": { @@ -2677,7 +2854,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.empty_in\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.transshipment_loaded\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -2688,7 +2865,7 @@ } }, { - "id": "581ccb43-9284-47f0-b43f-4ef91ff332e5", + "id": "62bef451-7b6b-46cc-a006-4d5da1953353", "name": "Edit a webhook", "request": { "name": "Edit a webhook", @@ -2731,7 +2908,7 @@ "method": "PATCH", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"events\": [\n \"container.updated\"\n ],\n \"active\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", + "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"events\": [\n \"container.transport.full_in\"\n ],\n \"active\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -2743,7 +2920,7 @@ }, "response": [ { - "id": "de39d009-d7a6-4de4-943f-de7a1552844b", + "id": "ed006004-8a87-47be-ad2f-71d3be221167", "name": "OK", "originalRequest": { "url": { @@ -2778,7 +2955,7 @@ "method": "PATCH", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"events\": [\n \"container.updated\"\n ],\n \"active\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", + "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"events\": [\n \"container.transport.full_in\"\n ],\n \"active\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -2795,7 +2972,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.empty_in\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.transshipment_loaded\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -2806,7 +2983,7 @@ } }, { - "id": "2471cfe3-4285-40d7-a298-a87da6ac57c8", + "id": "ae0984df-5491-4a29-beb6-31fb78adb82d", "name": "Delete a webhook", "request": { "name": "Delete a webhook", @@ -2842,7 +3019,7 @@ }, "response": [ { - "id": "8ee1fa0f-601c-40f4-a87e-f09b76f15fe5", + "id": "f9d5c165-5391-4e7c-8958-7aec23e16669", "name": "OK", "originalRequest": { "url": { @@ -2882,7 +3059,7 @@ } }, { - "id": "747636d0-0820-4bcf-b6f8-aa0952d189bb", + "id": "4b1162c7-8566-4863-ad48-12b104f3f4c8", "name": "List webhooks", "request": { "name": "List webhooks", @@ -2931,7 +3108,7 @@ }, "response": [ { - "id": "8743438f-ec97-4a71-a19c-761a489e11f4", + "id": "0b389fea-f822-4568-b128-ed0b23353b31", "name": "OK", "originalRequest": { "url": { @@ -2988,7 +3165,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.updated\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.vessel_discharged\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ],\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n }\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.vessel_departed\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.vessel_berthed\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ],\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -2999,7 +3176,7 @@ } }, { - "id": "5fcc80f4-4100-4606-8488-8d8297d3b848", + "id": "a608e8bf-9ca8-46e6-81ef-a1cb7e76b99d", "name": "Create a webhook", "request": { "name": "Create a webhook", @@ -3030,7 +3207,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"active\": \"\",\n \"events\": [\n \"container.transport.feeder_loaded\"\n ],\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", + "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"active\": \"\",\n \"events\": [\n \"container.transport.feeder_arrived\"\n ],\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -3042,7 +3219,7 @@ }, "response": [ { - "id": "0e52fb19-84a8-43ed-aaab-4bc6df9ab5a9", + "id": "bde749a3-00ee-46a5-bdb0-047a5ffd2544", "name": "Create a test webhook endpoint", "originalRequest": { "url": { @@ -3076,7 +3253,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"active\": \"\",\n \"events\": [\n \"container.transport.feeder_loaded\"\n ],\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", + "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"active\": \"\",\n \"events\": [\n \"container.transport.feeder_arrived\"\n ],\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -3093,7 +3270,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.empty_in\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.transshipment_loaded\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -3104,7 +3281,7 @@ } }, { - "id": "02ee5993-a88c-4d7d-a962-b2e21f5980ac", + "id": "4ec3df34-7b4e-4d80-87da-2e710824967a", "name": "List webhook IPs", "request": { "name": "List webhook IPs", @@ -3135,7 +3312,7 @@ }, "response": [ { - "id": "4e092934-a8b6-42b4-b6cb-e4b9939a07de", + "id": "7823de00-527f-49f4-8daf-7cd589c0170a", "name": "OK", "originalRequest": { "url": { @@ -3191,7 +3368,7 @@ "description": "", "item": [ { - "id": "f03b98d0-a83a-4d86-bf31-a9d6187b53f9", + "id": "4b5e01c7-8bab-47cc-b73a-09bd476114d1", "name": "Get a single webhook notification", "request": { "name": "Get a single webhook notification", @@ -3243,7 +3420,7 @@ }, "response": [ { - "id": "2def6d6a-b5a1-4fd8-848b-c52e14b848ab", + "id": "1215df3a-bc5d-4dbc-b01b-f7cb25d23181", "originalRequest": { "url": { "path": [ @@ -3291,7 +3468,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.estimated.arrived_at_inland_destination\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"estimated_event\"\n }\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.feeder_discharged\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.rail_unloaded\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ]\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.rail_unloaded\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"container_updated_event\"\n }\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.empty_in\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.full_in\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -3302,7 +3479,7 @@ } }, { - "id": "210f16ce-0b39-412f-80c7-903bae11de12", + "id": "96a88d0f-4de6-45bd-9d08-80b3fcb96dd4", "name": "List webhook notifications", "request": { "name": "List webhook notifications", @@ -3360,7 +3537,7 @@ }, "response": [ { - "id": "d9d1661b-7223-4312-9f5c-19bbaafad901", + "id": "c83617dc-d07b-448f-a2d5-656950a88609", "name": "OK", "originalRequest": { "url": { @@ -3426,7 +3603,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"tracking_request.awaiting_manifest\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.transshipment_loaded\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"tracking_request.failed\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.rail_departed\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ]\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.transshipment_discharged\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"container_updated_event\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.vessel_loaded\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.transshipment_loaded\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.vessel_arrived\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -3437,7 +3614,7 @@ } }, { - "id": "6c108013-790f-4b64-82d0-33637a4ab535", + "id": "0e1fbffd-7699-434b-b559-7da8b7deef62", "name": "Get webhook notification payload examples", "request": { "name": "Get webhook notification payload examples", @@ -3461,7 +3638,7 @@ "type": "text/plain" }, "key": "event", - "value": "container.transport.full_out" + "value": "container.transport.vessel_discharged" } ], "variable": [] @@ -3478,7 +3655,7 @@ }, "response": [ { - "id": "0b0243e7-fc87-4224-9f77-a4c856cca96f", + "id": "60be08f0-9a5e-4a8e-b4c2-aff91feadf4c", "name": "OK", "originalRequest": { "url": { @@ -3497,7 +3674,7 @@ "type": "text/plain" }, "key": "event", - "value": "container.transport.full_out" + "value": "container.transport.vessel_discharged" } ], "variable": [] @@ -3527,7 +3704,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"tracking_request.awaiting_manifest\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.transshipment_loaded\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"tracking_request.failed\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.rail_departed\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ]\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.transshipment_discharged\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"container_updated_event\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.vessel_loaded\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.transshipment_loaded\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.vessel_arrived\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -3544,7 +3721,7 @@ "description": "", "item": [ { - "id": "94ae31c1-e4c9-4ee3-bf2b-069e7b67022b", + "id": "fc8d6f8f-5b59-4115-894a-6e3c20be3d30", "name": "Get a port using the locode or the id", "request": { "name": "Get a port using the locode or the id", @@ -3586,7 +3763,7 @@ }, "response": [ { - "id": "8df6147f-be79-4900-ba50-528873323ed3", + "id": "feea18ac-c661-4af0-8be7-c237e9118ce5", "name": "OK", "originalRequest": { "url": { @@ -3642,7 +3819,7 @@ "description": "", "item": [ { - "id": "017222b2-d3f8-4f4d-a750-fee124510664", + "id": "4668809d-6ec8-41e2-b6c0-a8c46875fc09", "name": "Get a metro area using the un/locode or the id", "request": { "name": "Get a metro area using the un/locode or the id", @@ -3684,7 +3861,7 @@ }, "response": [ { - "id": "e5fff2f3-6cb1-4223-9121-93ba2c6c5ae6", + "id": "023599f1-6376-42af-be3b-fb6d6349bb13", "name": "OK", "originalRequest": { "url": { @@ -3740,7 +3917,7 @@ "description": "", "item": [ { - "id": "3d736892-801e-4133-b6bf-926d3cac9f53", + "id": "716a92c1-8441-4a4b-b6aa-34df3b81c68c", "name": "Get a terminal using the id", "request": { "name": "Get a terminal using the id", @@ -3782,7 +3959,7 @@ }, "response": [ { - "id": "9734ed23-5246-478a-bbcf-3e19d98f13d2", + "id": "bf4d7dd8-cf26-4e54-9dd0-f0f57d15e6f6", "name": "OK", "originalRequest": { "url": { @@ -3838,7 +4015,7 @@ "description": "", "item": [ { - "id": "95e1527d-daac-48a0-b9e8-cc09320b6f86", + "id": "55e3485b-7a94-484f-8f9e-37adc3697ec5", "name": "Get container route", "request": { "name": "Get container route", @@ -3881,7 +4058,7 @@ }, "response": [ { - "id": "2b401dab-a732-4e99-aeb6-7d1b9b62880c", + "id": "12920c78-c02d-4a05-a8a6-6ac79ec0a58c", "name": "OK", "originalRequest": { "url": { @@ -3926,7 +4103,7 @@ "_postman_previewlanguage": "json" }, { - "id": "869caab5-a296-4c85-9a85-05486833da9e", + "id": "5b1d125a-6f90-4aba-afcc-1a5b352cfa2e", "name": "Forbidden - Routing data feature is not enabled for this account", "originalRequest": { "url": { @@ -3977,7 +4154,7 @@ } }, { - "id": "90d5e49f-0e53-47fd-92ba-bc0d71e7587a", + "id": "9f56c1e4-f463-4103-89b3-d8aeacc46383", "name": "Get vessel future positions", "request": { "name": "Get vessel future positions", @@ -4039,7 +4216,7 @@ }, "response": [ { - "id": "d1ec28fd-917f-49e6-8f1c-4d4d84bd78e1", + "id": "fa6d85b4-b092-4f98-ac69-a0992d41286f", "name": "OK", "originalRequest": { "url": { @@ -4103,7 +4280,7 @@ "_postman_previewlanguage": "json" }, { - "id": "bb377147-25ec-416c-a2ba-b6abafeace4c", + "id": "bff94576-aeb0-4541-9d15-ddb0f28916c3", "name": "Forbidden - Routing data feature is not enabled for this account", "originalRequest": { "url": { @@ -4173,7 +4350,7 @@ } }, { - "id": "177cbb12-8ed2-4191-952c-9d6e8c0f178a", + "id": "cd4b9a6d-71a8-43de-b3a0-449f9e90f0f7", "name": "Get vessel future positions from coordinates", "request": { "name": "Get vessel future positions from coordinates", @@ -4253,7 +4430,7 @@ }, "response": [ { - "id": "16a78dcf-3abc-4792-8cf7-b626e273ca91", + "id": "b1de379b-d14d-4a47-b484-8ff9b461b499", "name": "OK", "originalRequest": { "url": { @@ -4335,7 +4512,7 @@ "_postman_previewlanguage": "json" }, { - "id": "e6dfc1fb-8d74-48d9-9fb3-6d20495d2c83", + "id": "891bec7e-1303-42f5-a221-38418c9ceb1e", "name": "Forbidden - Routing data feature is not enabled for this account", "originalRequest": { "url": { @@ -4425,27 +4602,58 @@ ] }, { - "name": "Shipping Lines", + "name": "Vessels", "description": "", "item": [ { - "id": "1c081f68-b3bd-4ea1-937b-966486b76053", - "name": "Shipping Lines", + "id": "52759279-76a3-4d5c-83d2-f7e4808ccf29", + "name": "Get a vessel using the id", "request": { - "name": "Shipping Lines", + "name": "Get a vessel using the id", "description": { - "content": "Return a list of shipping lines supported by Terminal49. \nN.B. There is no pagination for this endpoint.", + "content": "Returns a vessel by id. `show_positions` is a paid feature. Please contact sales@terminal49.com.", "type": "text/plain" }, "url": { "path": [ - "shipping_lines" + "vessels", + ":id" ], "host": [ "{{baseUrl}}" ], - "query": [], - "variable": [] + "query": [ + { + "disabled": false, + "description": { + "content": "ISO 8601 timestamp to filter positions from. 7 days by default.", + "type": "text/plain" + }, + "key": "show_positions[from_timestamp]", + "value": "" + }, + { + "disabled": false, + "description": { + "content": "ISO 8601 timestamp to filter positions up to. Current time by default.", + "type": "text/plain" + }, + "key": "show_positions[to_timestamp]", + "value": "" + } + ], + "variable": [ + { + "type": "any", + "value": "", + "key": "id", + "disabled": false, + "description": { + "content": "(Required) ", + "type": "text/plain" + } + } + ] }, "header": [ { @@ -4459,17 +4667,37 @@ }, "response": [ { - "id": "a1f91328-6841-45cc-991c-b291699c1a3f", + "id": "825d5b5b-9aa0-4d79-b454-715bb3697461", "name": "OK", "originalRequest": { "url": { "path": [ - "shipping_lines" + "vessels", + ":id" ], "host": [ "{{baseUrl}}" ], - "query": [], + "query": [ + { + "disabled": false, + "description": { + "content": "ISO 8601 timestamp to filter positions from. 7 days by default.", + "type": "text/plain" + }, + "key": "show_positions[from_timestamp]", + "value": "" + }, + { + "disabled": false, + "description": { + "content": "ISO 8601 timestamp to filter positions up to. Current time by default.", + "type": "text/plain" + }, + "key": "show_positions[to_timestamp]", + "value": "" + } + ], "variable": [] }, "header": [ @@ -4497,240 +4725,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"attributes\": {\n \"scac\": \"\",\n \"name\": \"\",\n \"alternative_scacs\": [\n \"\",\n \"\"\n ],\n \"short_name\": \"\",\n \"bill_of_lading_tracking_support\": \"\",\n \"booking_number_tracking_support\": \"\",\n \"container_number_tracking_support\": \"\"\n },\n \"type\": \"shipping_line\"\n },\n {\n \"id\": \"\",\n \"attributes\": {\n \"scac\": \"\",\n \"name\": \"\",\n \"alternative_scacs\": [\n \"\",\n \"\"\n ],\n \"short_name\": \"\",\n \"bill_of_lading_tracking_support\": \"\",\n \"booking_number_tracking_support\": \"\",\n \"container_number_tracking_support\": \"\"\n },\n \"type\": \"shipping_line\"\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"vessel\",\n \"attributes\": {\n \"name\": \"\",\n \"imo\": \"\",\n \"mmsi\": \"\",\n \"latitude\": \"\",\n \"longitude\": \"\",\n \"nautical_speed_knots\": \"\",\n \"navigational_heading_degrees\": \"\",\n \"position_timestamp\": \"\",\n \"positions\": [\n {\n \"latitude\": \"\",\n \"longitude\": \"\",\n \"heading\": \"\",\n \"timestamp\": \"\",\n \"estimated\": \"\"\n },\n {\n \"latitude\": \"\",\n \"longitude\": \"\",\n \"heading\": \"\",\n \"timestamp\": \"\",\n \"estimated\": \"\"\n }\n ]\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" - } - ], - "event": [], - "protocolProfileBehavior": { - "disableBodyPruning": true - } - }, - { - "id": "fd678831-5c50-40df-b9b0-3f68e9c6cbb0", - "name": "Get a single shipping line", - "request": { - "name": "Get a single shipping line", - "description": { - "content": "Return the details of a single shipping line.", - "type": "text/plain" }, - "url": { - "path": [ - "shipping_lines", - ":id" - ], - "host": [ - "{{baseUrl}}" - ], - "query": [], - "variable": [ - { - "type": "any", - "value": "", - "key": "id", - "disabled": false, - "description": { - "content": "(Required) ", - "type": "text/plain" - } - } - ] - }, - "header": [ - { - "key": "Accept", - "value": "application/json" - } - ], - "method": "GET", - "body": {}, - "auth": null - }, - "response": [ { - "id": "f0c78294-0dcd-416f-8472-85bc2ec732c8", - "name": "OK", - "originalRequest": { - "url": { - "path": [ - "shipping_lines", - ":id" - ], - "host": [ - "{{baseUrl}}" - ], - "query": [], - "variable": [] - }, - "header": [ - { - "key": "Accept", - "value": "application/json" - }, - { - "description": { - "content": "Added as a part of security scheme: apikey", - "type": "text/plain" - }, - "key": "Authorization", - "value": "" - } - ], - "method": "GET", - "body": {} - }, - "status": "OK", - "code": 200, - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"attributes\": {\n \"scac\": \"\",\n \"name\": \"\",\n \"alternative_scacs\": [\n \"\",\n \"\"\n ],\n \"short_name\": \"\",\n \"bill_of_lading_tracking_support\": \"\",\n \"booking_number_tracking_support\": \"\",\n \"container_number_tracking_support\": \"\"\n },\n \"type\": \"shipping_line\"\n }\n}", - "cookie": [], - "_postman_previewlanguage": "json" - } - ], - "event": [], - "protocolProfileBehavior": { - "disableBodyPruning": true - } - } - ] - }, - { - "name": "Vessels", - "description": "", - "item": [ - { - "id": "27e3537c-8e86-4d65-b40f-0f5e4163b11c", - "name": "Get a vessel using the id", - "request": { - "name": "Get a vessel using the id", - "description": { - "content": "Returns a vessel by id. `show_positions` is a paid feature. Please contact sales@terminal49.com.", - "type": "text/plain" - }, - "url": { - "path": [ - "vessels", - ":id" - ], - "host": [ - "{{baseUrl}}" - ], - "query": [ - { - "disabled": false, - "description": { - "content": "ISO 8601 timestamp to filter positions from. 7 days by default.", - "type": "text/plain" - }, - "key": "show_positions[from_timestamp]", - "value": "" - }, - { - "disabled": false, - "description": { - "content": "ISO 8601 timestamp to filter positions up to. Current time by default.", - "type": "text/plain" - }, - "key": "show_positions[to_timestamp]", - "value": "" - } - ], - "variable": [ - { - "type": "any", - "value": "", - "key": "id", - "disabled": false, - "description": { - "content": "(Required) ", - "type": "text/plain" - } - } - ] - }, - "header": [ - { - "key": "Accept", - "value": "application/json" - } - ], - "method": "GET", - "body": {}, - "auth": null - }, - "response": [ - { - "id": "433c7f40-2445-4c43-9891-78034996b9d4", - "name": "OK", - "originalRequest": { - "url": { - "path": [ - "vessels", - ":id" - ], - "host": [ - "{{baseUrl}}" - ], - "query": [ - { - "disabled": false, - "description": { - "content": "ISO 8601 timestamp to filter positions from. 7 days by default.", - "type": "text/plain" - }, - "key": "show_positions[from_timestamp]", - "value": "" - }, - { - "disabled": false, - "description": { - "content": "ISO 8601 timestamp to filter positions up to. Current time by default.", - "type": "text/plain" - }, - "key": "show_positions[to_timestamp]", - "value": "" - } - ], - "variable": [] - }, - "header": [ - { - "key": "Accept", - "value": "application/json" - }, - { - "description": { - "content": "Added as a part of security scheme: apikey", - "type": "text/plain" - }, - "key": "Authorization", - "value": "" - } - ], - "method": "GET", - "body": {} - }, - "status": "OK", - "code": 200, - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"vessel\",\n \"attributes\": {\n \"name\": \"\",\n \"imo\": \"\",\n \"mmsi\": \"\",\n \"latitude\": \"\",\n \"longitude\": \"\",\n \"nautical_speed_knots\": \"\",\n \"navigational_heading_degrees\": \"\",\n \"position_timestamp\": \"\",\n \"positions\": [\n {\n \"latitude\": \"\",\n \"longitude\": \"\",\n \"heading\": \"\",\n \"timestamp\": \"\",\n \"estimated\": \"\"\n },\n {\n \"latitude\": \"\",\n \"longitude\": \"\",\n \"heading\": \"\",\n \"timestamp\": \"\",\n \"estimated\": \"\"\n }\n ]\n }\n }\n}", - "cookie": [], - "_postman_previewlanguage": "json" - }, - { - "id": "31b26aca-b0fe-4896-abbe-6c52a2bb011b", + "id": "31544e6f-61c1-42bb-9709-3a809bf6c35d", "name": "Forbidden - Feature not enabled", "originalRequest": { "url": { @@ -4799,200 +4799,7 @@ } }, { - "id": "350a7314-0950-403a-bf23-c9bbb6304ce7", - "name": "Get a vessel using the imo", - "request": { - "name": "Get a vessel using the imo", - "description": { - "content": "Returns a vessel by the given IMO number. `show_positions` is a paid feature. Please contact sales@terminal49.com.", - "type": "text/plain" - }, - "url": { - "path": [ - "vessels", - ":imo" - ], - "host": [ - "{{baseUrl}}" - ], - "query": [ - { - "disabled": false, - "description": { - "content": "ISO 8601 timestamp to filter positions from. 7 days by default.", - "type": "text/plain" - }, - "key": "show_positions[from_timestamp]", - "value": "" - }, - { - "disabled": false, - "description": { - "content": "ISO 8601 timestamp to filter positions up to. Current time by default.", - "type": "text/plain" - }, - "key": "show_positions[to_timestamp]", - "value": "" - } - ], - "variable": [ - { - "type": "any", - "value": "", - "key": "imo", - "disabled": false, - "description": { - "content": "(Required) ", - "type": "text/plain" - } - } - ] - }, - "header": [ - { - "key": "Accept", - "value": "application/json" - } - ], - "method": "GET", - "body": {}, - "auth": null - }, - "response": [ - { - "id": "a32220a4-b92e-4e88-ad60-0560c87874e9", - "name": "OK", - "originalRequest": { - "url": { - "path": [ - "vessels", - ":imo" - ], - "host": [ - "{{baseUrl}}" - ], - "query": [ - { - "disabled": false, - "description": { - "content": "ISO 8601 timestamp to filter positions from. 7 days by default.", - "type": "text/plain" - }, - "key": "show_positions[from_timestamp]", - "value": "" - }, - { - "disabled": false, - "description": { - "content": "ISO 8601 timestamp to filter positions up to. Current time by default.", - "type": "text/plain" - }, - "key": "show_positions[to_timestamp]", - "value": "" - } - ], - "variable": [] - }, - "header": [ - { - "key": "Accept", - "value": "application/json" - }, - { - "description": { - "content": "Added as a part of security scheme: apikey", - "type": "text/plain" - }, - "key": "Authorization", - "value": "" - } - ], - "method": "GET", - "body": {} - }, - "status": "OK", - "code": 200, - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"vessel\",\n \"attributes\": {\n \"name\": \"\",\n \"imo\": \"\",\n \"mmsi\": \"\",\n \"latitude\": \"\",\n \"longitude\": \"\",\n \"nautical_speed_knots\": \"\",\n \"navigational_heading_degrees\": \"\",\n \"position_timestamp\": \"\",\n \"positions\": [\n {\n \"latitude\": \"\",\n \"longitude\": \"\",\n \"heading\": \"\",\n \"timestamp\": \"\",\n \"estimated\": \"\"\n },\n {\n \"latitude\": \"\",\n \"longitude\": \"\",\n \"heading\": \"\",\n \"timestamp\": \"\",\n \"estimated\": \"\"\n }\n ]\n }\n }\n}", - "cookie": [], - "_postman_previewlanguage": "json" - }, - { - "id": "efe9ac23-387e-4877-b883-69e777f3fa21", - "name": "Forbidden - Feature not enabled", - "originalRequest": { - "url": { - "path": [ - "vessels", - ":imo" - ], - "host": [ - "{{baseUrl}}" - ], - "query": [ - { - "disabled": false, - "description": { - "content": "ISO 8601 timestamp to filter positions from. 7 days by default.", - "type": "text/plain" - }, - "key": "show_positions[from_timestamp]", - "value": "" - }, - { - "disabled": false, - "description": { - "content": "ISO 8601 timestamp to filter positions up to. Current time by default.", - "type": "text/plain" - }, - "key": "show_positions[to_timestamp]", - "value": "" - } - ], - "variable": [] - }, - "header": [ - { - "key": "Accept", - "value": "application/json" - }, - { - "description": { - "content": "Added as a part of security scheme: apikey", - "type": "text/plain" - }, - "key": "Authorization", - "value": "" - } - ], - "method": "GET", - "body": {} - }, - "status": "Forbidden", - "code": 403, - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": "{\n \"errors\": [\n {\n \"status\": \"\",\n \"source\": {},\n \"title\": \"\",\n \"detail\": \"\"\n },\n {\n \"status\": \"\",\n \"source\": {},\n \"title\": \"\",\n \"detail\": \"\"\n }\n ]\n}", - "cookie": [], - "_postman_previewlanguage": "json" - } - ], - "event": [], - "protocolProfileBehavior": { - "disableBodyPruning": true - } - }, - { - "id": "c6dd4d77-3fca-411e-8765-ac8c88196d20", + "id": "a354ffa8-27eb-4865-ac73-32361dddd593", "name": "Get vessel future positions", "request": { "name": "Get vessel future positions", @@ -5054,7 +4861,7 @@ }, "response": [ { - "id": "42ea7e37-ce1a-48d0-9904-b0671ca2c394", + "id": "7d55e340-f144-413d-83c7-100b52df9f4f", "name": "OK", "originalRequest": { "url": { @@ -5118,7 +4925,7 @@ "_postman_previewlanguage": "json" }, { - "id": "180c67b4-8833-4423-8109-738e09243f08", + "id": "b7f02ae1-a5fa-4213-8da7-0c28c5cff8f1", "name": "Forbidden - Routing data feature is not enabled for this account", "originalRequest": { "url": { @@ -5188,7 +4995,7 @@ } }, { - "id": "44a5427c-7498-49f0-8a56-7978dd69f2b8", + "id": "c885d6de-314f-4555-987d-c1c922332080", "name": "Get vessel future positions from coordinates", "request": { "name": "Get vessel future positions from coordinates", @@ -5268,7 +5075,7 @@ }, "response": [ { - "id": "c27f1c92-c2b0-4f78-a043-911cd6dedfd6", + "id": "4ffb6ba6-6fe5-4a41-a747-f25497612253", "name": "OK", "originalRequest": { "url": { @@ -5350,7 +5157,7 @@ "_postman_previewlanguage": "json" }, { - "id": "d0eb8cc0-271c-4944-8d71-d8946db7dd13", + "id": "ea47d773-e731-439e-9a40-92a9056c8e97", "name": "Forbidden - Routing data feature is not enabled for this account", "originalRequest": { "url": { @@ -5444,7 +5251,7 @@ "description": "", "item": [ { - "id": "c3827aaf-0c46-4935-af15-1f8e293ff663", + "id": "817bf242-5f38-404d-aea4-d49e22670dd8", "name": "list-parties", "request": { "name": "list-parties", @@ -5493,7 +5300,7 @@ }, "response": [ { - "id": "c066e13b-fa84-45fb-a612-2640c9d820ce", + "id": "89f037ea-095d-4a05-adff-5d1fd14b54aa", "name": "OK", "originalRequest": { "url": { @@ -5561,7 +5368,7 @@ } }, { - "id": "49c74097-9876-4d13-9670-00c8c37bcf44", + "id": "a814d5dc-7a3b-4186-8b5c-1debefdb5b50", "name": "post-party", "request": { "name": "post-party", @@ -5604,7 +5411,7 @@ }, "response": [ { - "id": "fea55bdf-e4f6-435f-9749-f7ffeb3d49e7", + "id": "eef49e36-ffff-4794-8031-3020feb9ca56", "name": "Party Created", "originalRequest": { "url": { @@ -5660,7 +5467,7 @@ "_postman_previewlanguage": "json" }, { - "id": "e9554f43-13f4-4b57-b503-de0dac40b3cb", + "id": "70b3d04e-219f-46ba-afc8-e63776f86e95", "name": "Unprocessable Entity", "originalRequest": { "url": { @@ -5722,7 +5529,7 @@ } }, { - "id": "074b1445-e3ef-4816-a754-116c3983abb3", + "id": "149c9836-2bbb-43a2-af13-8b40c9bd5d0c", "name": "get-parties-id", "request": { "name": "get-parties-id", @@ -5764,7 +5571,7 @@ }, "response": [ { - "id": "2e85a06f-0f69-4a3a-adf7-df1cce3c9d5d", + "id": "d07d0c56-2123-4762-b809-ae1306eb62f9", "name": "OK", "originalRequest": { "url": { @@ -5814,7 +5621,7 @@ } }, { - "id": "d752579b-0329-406d-98f1-089ed2070eab", + "id": "e7a42c6a-2ea3-4d9f-9410-12b97f1b8aed", "name": "edit-party", "request": { "name": "edit-party", @@ -5869,7 +5676,7 @@ }, "response": [ { - "id": "d9a3fc40-0ffd-4eb8-88bb-e51db88746ee", + "id": "96e02e26-61ff-4013-86c4-78563c47c846", "name": "OK", "originalRequest": { "url": { @@ -5926,7 +5733,7 @@ "_postman_previewlanguage": "json" }, { - "id": "4833278a-cac2-444c-9a36-a30f6f5c4869", + "id": "4246dab6-9e14-451a-bf62-7ed67df486d7", "name": "Unprocessable Entity", "originalRequest": { "url": { @@ -6019,7 +5826,7 @@ } ], "info": { - "_postman_id": "98f7ee2d-e01a-46ef-bde7-ae10d3591440", + "_postman_id": "ab64a03c-9b05-4e1d-a924-adefb1b32cbf", "name": "Terminal49 API Reference", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", "description": { From 277f7fb40a3a8f8b2154cef69aa6a7784485f778 Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Thu, 23 Oct 2025 08:39:23 -0700 Subject: [PATCH 6/7] chore: add .vercel/ and .claude/ to .gitignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ignore Vercel deployment artifacts and Claude Code configuration files. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .gitignore | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitignore b/.gitignore index 0e10c03b..2484b0f2 100644 --- a/.gitignore +++ b/.gitignore @@ -69,3 +69,9 @@ htmlcov/ # Watchman .watchman-cookie-* + +# Vercel +.vercel/ + +# Claude Code configuration +.claude/ From a18070176386c6ca726418f15a7fa7788cbceb4d Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Thu, 23 Oct 2025 10:24:01 -0700 Subject: [PATCH 7/7] chore: switch OpenAPI linting to Mintlify CLI --- .github/workflows/openapi-validation.yml | 25 +- .redocly.yaml | 49 - .spectral.mjs.bak | 57 - .spectral.yaml | 2 - .tool-versions | 3 + CLAUDE.md | 839 +++++++------- bun.lockb | Bin 0 -> 362994 bytes docs/openapi/DEVELOPER_GUIDE.md | 1296 +++++++++++----------- docs/openapi/README.md | 91 +- justfile | 454 ++++---- package.json | 30 +- requirements-dev.txt | 1 + scripts/pre-commit.sh | 52 +- tools/openapi_bundle.py | 6 +- 14 files changed, 1352 insertions(+), 1553 deletions(-) delete mode 100644 .redocly.yaml delete mode 100644 .spectral.mjs.bak delete mode 100644 .spectral.yaml create mode 100644 .tool-versions create mode 100755 bun.lockb create mode 100644 requirements-dev.txt diff --git a/.github/workflows/openapi-validation.yml b/.github/workflows/openapi-validation.yml index f32a9948..a559d370 100644 --- a/.github/workflows/openapi-validation.yml +++ b/.github/workflows/openapi-validation.yml @@ -7,7 +7,6 @@ on: - 'docs/openapi.json' - 'tools/openapi_*.py' - 'tests/test_openapi_bundle.py' - - '.spectral.mjs' - '.github/workflows/openapi-validation.yml' push: branches: @@ -17,7 +16,6 @@ on: - 'docs/openapi.json' - 'tools/openapi_*.py' - 'tests/test_openapi_bundle.py' - - '.spectral.mjs' - '.github/workflows/openapi-validation.yml' jobs: @@ -28,21 +26,24 @@ jobs: - name: Check out repository uses: actions/checkout@v4 - - name: Set up Node.js - uses: actions/setup-node@v4 + - name: Set up Python + uses: actions/setup-python@v5 with: - node-version: '18' + python-version: '3.11' - - name: Install Spectral CLI - run: npm install --global @stoplight/spectral-cli + - name: Install Python dependencies + run: python -m pip install --upgrade pip && python -m pip install --quiet -r requirements-dev.txt - - name: Lint OpenAPI specification - run: spectral lint docs/openapi/index.yaml + - name: Bundle OpenAPI (validation enabled) + run: python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json - - name: Set up Python - uses: actions/setup-python@v5 + - name: Set up Node.js + uses: actions/setup-node@v4 with: - python-version: '3.11' + node-version: '20' + + - name: Lint OpenAPI specification + run: npx -y mintlify openapi-check docs/openapi.json - name: Run OpenAPI regression test run: python -m unittest tests.test_openapi_bundle diff --git a/.redocly.yaml b/.redocly.yaml deleted file mode 100644 index a48f509f..00000000 --- a/.redocly.yaml +++ /dev/null @@ -1,49 +0,0 @@ -# Redocly configuration for Terminal49 API -# See https://redocly.com/docs/cli/rules/ for all available rules - -extends: - - recommended - -# Customize rules to match our API style -rules: - # Turn off overly strict rules - operation-operationId: off # We don't require operationId on every operation - operation-summary: warn # Warn instead of error for missing summaries - operation-description: off # Don't require descriptions on every operation - - # Info section rules - info-contact: warn - info-license: off # We have terms of service instead - - # Tag rules - tag-description: off # Tags don't need descriptions - operation-tag-defined: warn # Warn if tag not defined in global tags - - # Security rules - operation-security-defined: warn # Warn if security scheme not defined - - # Parameter rules - parameter-description: warn # Warn instead of error for missing parameter descriptions - - # Response rules - response-contains-header: off # Don't require specific headers - - # Schema rules - no-invalid-media-type-examples: error # Keep this as error - no-enum-type-mismatch: error - - # Structural rules - no-identical-paths: error - no-ambiguous-paths: error - no-path-trailing-slash: error - - # Best practices (as warnings) - operation-2xx-response: warn # Warn if no 2xx response defined - operation-4xx-response: warn # Warn if no 4xx response defined - - # Deprecated fields - no-deprecated: off # We use deprecated fields intentionally for backwards compatibility - -# Ignore patterns (if needed) -# ignore: -# - 'docs/openapi/paths/legacy-*.yaml' diff --git a/.spectral.mjs.bak b/.spectral.mjs.bak deleted file mode 100644 index c528a9eb..00000000 --- a/.spectral.mjs.bak +++ /dev/null @@ -1,57 +0,0 @@ -// Spectral configuration for Terminal49 API -// Uses the recommended OpenAPI ruleset with custom rules - -import { oas } from "@stoplight/spectral-rulesets"; - -export default { - extends: [oas], - - rules: { - // Customize rules to match our API style - - // Info section - relax some requirements - "info-contact": "warn", - "info-description": "warn", - "info-license": "off", // We use terms of service instead - - // Operation rules - be practical - "operation-description": "warn", // Warn instead of error - "operation-operationId": "off", // Don't require operationId everywhere - "operation-operationId-unique": "error", - "operation-summary": "warn", - "operation-tags": "warn", - "operation-tag-defined": "warn", - - // Parameter rules - "operation-parameters": "warn", - "path-params": "error", - - // Response rules - "operation-success-response": "warn", // Warn if no 2xx response - - // Schema rules - keep strict - "oas3-schema": "error", - "oas3-valid-media-example": "error", - "oas3-valid-schema-example": "error", - - // Path rules - "no-$ref-siblings": "error", - "path-declarations-must-exist": "error", - "path-keys-no-trailing-slash": "error", - "path-not-include-query": "error", - - // Security - "operation-security-defined": "warn", - - // Misc - "no-eval-in-markdown": "error", - "no-script-tags-in-markdown": "error", - "openapi-tags-alphabetical": "off", - "openapi-tags": "warn", - - // Turn off overly strict rules - "contact-properties": "off", - "license-url": "off", - "tag-description": "off" - } -}; \ No newline at end of file diff --git a/.spectral.yaml b/.spectral.yaml deleted file mode 100644 index 6c32026c..00000000 --- a/.spectral.yaml +++ /dev/null @@ -1,2 +0,0 @@ -# Spectral configuration for Terminal49 API -extends: spectral:oas diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 00000000..ef28cade --- /dev/null +++ b/.tool-versions @@ -0,0 +1,3 @@ +bun 1.1.29 +nodejs 20.17.0 +python 3.11.9 diff --git a/CLAUDE.md b/CLAUDE.md index d62868c3..5706a902 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,419 +1,420 @@ -# CLAUDE.md - -This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. - -## Overview - -This is the Terminal49 API documentation repository. It contains modular OpenAPI specifications, MDX documentation files, and automated workflows for generating and deploying documentation to Postman and Mintlify (docs.terminal49.com). - -**Important:** This repository contains documentation only - no actual API implementation code. The production API runs at `https://api.terminal49.com/v2`. - -## Core Concepts - -Terminal49 provides container and shipment tracking via two methods: - -1. **API** - Direct REST API access with webhooks for real-time updates -2. **DataSync** - Automated data synchronization to customer databases/data warehouses - -The API follows JSONAPI specifications and supports tracking shipments, containers, webhooks, tracking requests, and related entities (ports, terminals, vessels, shipping lines, parties). - -## Repository Structure - -``` -docs/ -├── openapi/ # Modular OpenAPI YAML sources (SOURCE OF TRUTH) -│ ├── index.yaml # Root OpenAPI document -│ ├── paths/ # One file per REST endpoint -│ └── components/ -│ ├── schemas/ # Reusable schema definitions -│ └── securitySchemes/ # Authentication descriptions -├── openapi.json # Auto-generated bundle (DO NOT EDIT DIRECTLY) -├── mint.json # Mintlify docs configuration -├── home.mdx # Documentation homepage -├── api-docs/ # API documentation (MDX files) -│ ├── getting-started/ -│ ├── in-depth-guides/ -│ ├── useful-info/ -│ └── api-reference/ # Organized by resource type -└── datasync/ # DataSync documentation (MDX files) - └── table-properties/ - -tools/ -├── openapi_bundle.py # Python bundler (production, used in CI) -└── openapi_yaml.py # Minimal YAML parser - -scripts/ -├── split_openapi.py # Convert monolithic JSON to modular YAML -└── pre-commit.sh # Pre-commit hook for auto-bundling - -tests/ -└── test_openapi_bundle.py # Regression test for bundle consistency - -justfile # Task runner (like Make, but better) -package.json # Bun/Node.js dependencies (optional dev tools) -.watchmanconfig # File watching configuration - -Terminal49-API.postman_collection.json # Auto-generated from openapi.json -.github/workflows/ -├── generate_postman.yml # Auto-generates Postman collection on openapi.json changes -├── deploy_postman.yml # Deploys collection to Postman API on main branch -└── openapi-validation.yml # Validates OpenAPI YAML on PRs -``` - -## **Critical: Modular OpenAPI Workflow** - -### Source of Truth - -**⚠️ The YAML files in `docs/openapi/` are the ONLY source of truth!** - -- ✅ **Edit:** `docs/openapi/**/*.yaml` files -- ❌ **Never edit:** `docs/openapi.json` (it's auto-generated) - -The `docs/openapi.json` file is bundled from modular YAML sources. If you edit it directly, your changes will be overwritten! - -### Hybrid Bundling Approach - -We support **two bundling methods** – developers choose their preference: - -1. **Python Bundler** (Production, CI/CD) - - - Zero dependencies, fast, proven - - Used in GitHub Actions - - Command: `just bundle` or `python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json` - -2. **Redocly CLI** (Optional, Development) - - Industry standard, better error messages, more features - - Requires Bun/Node.js - - Command: `just bundle-redocly` or `bun redocly bundle docs/openapi/index.yaml -o docs/openapi.json` - -Both produce **identical output**. Use whichever you prefer during development. - -### Task Runner: Justfile - -We use `just` (modern alternative to Make) for task running: - -```bash -just --list # Show all commands -just setup # First-time setup -just bundle # Bundle with Python -just bundle-redocly # Bundle with Redocly CLI -just lint # Lint with Spectral -just validate # Bundle + lint + test -just watch # Auto-bundle on file changes -just preview # Preview OpenAPI with Redocly -just preview-mintlify # Preview full docs with Mintlify -just dev # Bundle + lint + preview (recommended workflow) -``` - -For full command list, see `justfile`. - -**Recommended Development Workflow:** - -```bash -just dev -# This bundles OpenAPI, runs linting, then starts Mintlify preview -# Opens http://localhost:3000 with full documentation -# Perfect for active development -``` - -### Pre-commit Hook - -Install once to auto-bundle on commit: - -```bash -just install-hooks -``` - -The hook automatically: - -- Detects OpenAPI YAML changes -- Regenerates `docs/openapi.json` -- Validates the bundle -- Stages the updated JSON - -## Common Workflows - -### Updating API Documentation - -1. **Edit OpenAPI specs:** - - ```bash - # Edit modular YAML sources - vim docs/openapi/paths/shipments.yaml - vim docs/openapi/components/schemas/shipment.yaml - ``` - -2. **Bundle and validate:** - - ```bash - just validate # or: just bundle && just lint && just test - ``` - -3. **Commit:** - - ```bash - git add docs/openapi/ - git commit -m "feat: update shipment schema" - # Pre-commit hook auto-bundles if installed - ``` - -4. **Auto-generation triggers:** - - When you push changes to `docs/openapi.json`, GitHub Actions generates `Terminal49-API.postman_collection.json` - - When merged to `main`, the Postman collection deploys to the Postman API - -### Adding a New Endpoint - -1. Create `docs/openapi/paths/your-endpoint.yaml` -2. Add path reference in `docs/openapi/index.yaml`: - ```yaml - paths: - /your_endpoint: - $ref: "./paths/your-endpoint.yaml" - ``` -3. Bundle and validate: `just validate` -4. Commit both YAML and bundled JSON - -### Adding a New Schema - -1. Create `docs/openapi/components/schemas/your-model.yaml` -2. Add schema reference in `docs/openapi/index.yaml`: - ```yaml - components: - schemas: - your_model: - $ref: "./components/schemas/your-model.yaml" - ``` -3. Bundle and validate: `just validate` -4. Commit both YAML and bundled JSON - -### Editing Documentation Content - -MDX files in `docs/api-docs/` and `docs/datasync/` are manually edited: - -- Follow the existing structure in `mint.json` -- Include proper frontmatter (title, og:title, og:description) -- Reference API endpoints using absolute paths like `/api-docs/api-reference/shipments/list-shipments` - -### Working with Postman Collections - -The Postman collection is **auto-generated** - never edit `Terminal49-API.postman_collection.json` directly! - -To manually regenerate (if needed): - -```bash -just postman -# or: openapi2postmanv2 -s docs/openapi.json -o Terminal49-API.postman_collection.json -p -O folderStrategy=Tags -``` - -## Important Files - -- **docs/openapi/index.yaml** - Root OpenAPI spec (references all modular files) -- **docs/openapi/paths/** - Individual endpoint definitions -- **docs/openapi/components/schemas/** - Reusable data models -- **docs/openapi.json** - Bundled output (auto-generated, don't edit) -- **justfile** - All available commands -- **tools/openapi_bundle.py** - Python bundler with validation -- **package.json** - Optional Bun/Node.js tools (Redocly, etc.) -- **scripts/pre-commit.sh** - Auto-bundling hook -- **docs/mint.json** - Navigation structure, tabs, branding -- **.spectral.mjs** - Stoplight linting configuration - -## Development Setup - -**First-time setup:** - -```bash -just setup -``` - -This installs: - -- Bun dependencies (Redocly CLI, Spectral, chokidar) -- Pre-commit hook for auto-bundling - -**Manual setup:** - -```bash -# Install Bun dependencies (optional) -bun install - -# Install pre-commit hook -just install-hooks -``` - -## Validation & Testing - -### Linting - -Two linters available: - -```bash -just lint # Spectral (default, fast) -just lint-redocly # Redocly CLI (better errors, requires Bun) -just lint-all # Run both -``` - -### Schema Validation - -The Python bundler includes automatic validation: - -- Checks schema structure (type, properties, etc.) -- Validates `$ref` resolution -- Detects circular references -- Provides helpful error messages with context - -To skip validation (faster): - -```bash -just bundle-fast -``` - -### Testing - -```bash -just test # Run regression test -just validate # Bundle + lint + test -``` - -## Authentication - -API uses Token-based auth with header format: - -``` -Authorization: Token YOUR_API_KEY -``` - -API keys are obtained from https://app.terminal49.com/developers/api-keys - -## Rate Limiting - -The API has a **100 requests/minute** rate limit for tracking requests. This is documented in the OpenAPI spec and should be mentioned when adding documentation about tracking requests. - -## Deployment - -Documentation is deployed via: - -1. **Mintlify** - Hosts docs.terminal49.com (configured via `mint.json`) -2. **Render** - Legacy Redoc deployment (see `render.yaml` and `Dockerfile`) -3. **Postman** - Collection synced via GitHub Actions to Postman API - -## Key API Resources - -Primary entities tracked in the system: - -- **Shipments** - Bill of lading (BOL) tracking -- **Containers** - Individual container tracking with transport events -- **Tracking Requests** - Requests to track new shipments -- **Webhooks** - Event subscriptions for real-time updates -- **Transport Events** - Container movement events (empty out, vessel loaded, etc.) -- **Ports, Terminals, Vessels** - Reference data -- **Parties** - Business entities (customers, consignees, etc.) - -## Commit Conventions - -Follow conventional commits style: - -- `feat:` - New features or endpoints -- `fix:` - Bug fixes in documentation -- `chore:` - Maintenance, auto-generated files -- Use `[skip ci]` to prevent workflow triggers on auto-generated commits - -## GitHub Actions - -Workflows require secrets: - -- `POSTMAN_API_KEY` - For deploying to Postman -- `POSTMAN_COLLECTION_UID` - Collection identifier: `5900de09-f05a-4528-8b12-9ad1d0477023` - -Workflows use `[skip ci]` in auto-generated commits to prevent infinite loops. - -## Performance Notes - -**Bundling speed** (9700+ line spec): - -- Python bundler: ~100-200ms -- Redocly CLI: ~150-300ms - -**Linting speed:** - -- Spectral: ~1-2s for 1MB spec -- Redocly CLI: <1s for 1MB spec - -Both are fast enough for local development. Python is used in CI for zero Node.js dependency. - -## Troubleshooting - -### "Referenced file not found" - -- Check path is correct relative to current file -- Verify filename/extension match exactly (case-sensitive) -- See enhanced error message for tips - -### "Circular $ref detected" - -- A file references itself through a $ref chain -- Check the reference chain in the error message -- Restructure schemas to break the cycle - -### Bundle out of sync - -- Run `just bundle` to regenerate -- Install pre-commit hook to automate: `just install-hooks` -- Check CI will fail if bundle doesn't match - -### Watchman not working - -- Ensure `.watchmanconfig` exists -- Check Watchman daemon: `watchman watch-list` -- Try: `watchman shutdown-server && just watch` - -## Data Files - -CSV files contain supported shipping lines and terminals: - -- `Terminal49 Shiping Line Support.csv` [sic - typo in filename] -- `Terminal49 Terminal Support.csv` - -These are reference data used in documentation or validation. - -## Getting Help - -- **Justfile commands:** `just --list` or `just help` -- **OpenAPI workflow:** `docs/openapi/README.md` -- **Detailed guide:** `docs/openapi/DEVELOPER_GUIDE.md` -- **Python bundler:** `python -m tools.openapi_bundle --help` -- **Redocly docs:** https://redocly.com/docs/cli - -## When Claude Code Works on This Repo - -### Adding/Editing Endpoints - -1. Always edit YAML files in `docs/openapi/` -2. Never edit `docs/openapi.json` directly -3. After editing, run `just validate` -4. Commit both YAML sources and bundled JSON - -### Reviewing Code - -- Check that `docs/openapi.json` is in sync with YAML sources -- Verify CI passes (lint + bundle test) -- Suggest running `just validate` if changes seem incomplete - -### Troubleshooting Build Failures - -- Check if `just bundle` succeeds locally -- Look for helpful error messages (enhanced in Python bundler) -- Verify all `$ref` paths are correct - -### Documentation Changes - -- OpenAPI changes go in `docs/openapi/**/*.yaml` -- Human-readable guides go in `docs/api-docs/**/*.mdx` -- Keep `mint.json` structure aligned with file organization - -**When to suggest these tools to developers**: - -- Suggest `rg` over `grep` for code searches -- Suggest `fd` over `find` for file discovery -- Suggest `ast-grep` for refactoring that needs to understand code structure -- Suggest `jq`/`yq` when parsing JSON/YAML in scripts +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Overview + +This is the Terminal49 API documentation repository. It contains modular OpenAPI specifications, MDX documentation files, and automated workflows for generating and deploying documentation to Postman and Mintlify (docs.terminal49.com). + +**Important:** This repository contains documentation only - no actual API implementation code. The production API runs at `https://api.terminal49.com/v2`. + +## Core Concepts + +Terminal49 provides container and shipment tracking via two methods: + +1. **API** - Direct REST API access with webhooks for real-time updates +2. **DataSync** - Automated data synchronization to customer databases/data warehouses + +The API follows JSONAPI specifications and supports tracking shipments, containers, webhooks, tracking requests, and related entities (ports, terminals, vessels, shipping lines, parties). + +## Repository Structure + +``` +docs/ +├── openapi/ # Modular OpenAPI YAML sources (SOURCE OF TRUTH) +│ ├── index.yaml # Root OpenAPI document +│ ├── paths/ # One file per REST endpoint +│ └── components/ +│ ├── schemas/ # Reusable schema definitions +│ └── securitySchemes/ # Authentication descriptions +├── openapi.json # Auto-generated bundle (DO NOT EDIT DIRECTLY) +├── mint.json # Mintlify docs configuration +├── home.mdx # Documentation homepage +├── api-docs/ # API documentation (MDX files) +│ ├── getting-started/ +│ ├── in-depth-guides/ +│ ├── useful-info/ +│ └── api-reference/ # Organized by resource type +└── datasync/ # DataSync documentation (MDX files) + └── table-properties/ + +tools/ +├── openapi_bundle.py # Python bundler (production, used in CI) +└── openapi_yaml.py # Minimal YAML parser + +scripts/ +├── split_openapi.py # Convert monolithic JSON to modular YAML +└── pre-commit.sh # Pre-commit hook for auto-bundling + +tests/ +└── test_openapi_bundle.py # Regression test for bundle consistency + +justfile # Task runner (like Make, but better) +package.json # Bun/Node.js dependencies (optional dev tools) +.watchmanconfig # File watching configuration + +Terminal49-API.postman_collection.json # Auto-generated from openapi.json +.github/workflows/ +├── generate_postman.yml # Auto-generates Postman collection on openapi.json changes +├── deploy_postman.yml # Deploys collection to Postman API on main branch +└── openapi-validation.yml # Validates OpenAPI YAML on PRs +``` + +## **Critical: Modular OpenAPI Workflow** + +### Source of Truth + +**⚠️ The YAML files in `docs/openapi/` are the ONLY source of truth!** + +- ✅ **Edit:** `docs/openapi/**/*.yaml` files +- ❌ **Never edit:** `docs/openapi.json` (it's auto-generated) + +The `docs/openapi.json` file is bundled from modular YAML sources. If you edit it directly, your changes will be overwritten! + +### Bundling Approach + +The repository uses a single, battle-tested bundling flow: + +- **Python Bundler** (production + local) + - Zero external dependencies beyond Python + - Validates schema structure while bundling + - Command: `just bundle` or `python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json` + +For a faster iteration loop you can skip validation with `just bundle-fast`, but always run the full bundle before committing. + +### Task Runner: Justfile + +We use `just` (modern alternative to Make) for task running: + +```bash +just --list # Show all commands +just setup # First-time setup +just bundle # Bundle with Python +just bundle-fast # Bundle with Python (skip validation) +just lint # Lint with Mintlify CLI +just validate # Bundle + lint + test +just watch # Auto-bundle on file changes +just preview-mintlify # Preview full docs with Mintlify +just dev # Bundle + lint + preview (recommended workflow) +just dev-full # Full validation then Mintlify preview +``` + +For full command list, see `justfile`. + +**Recommended Development Workflow:** + +```bash +just dev +# This bundles OpenAPI, runs linting, then starts Mintlify preview +# Opens http://localhost:3000 with full documentation +# Perfect for active development +``` + +### Pre-commit Hook + +Install once to auto-bundle on commit: + +```bash +just install-hooks +``` + +The hook automatically: + +- Detects OpenAPI YAML changes +- Regenerates `docs/openapi.json` +- Validates the bundle +- Stages the updated JSON + +## Common Workflows + +### Updating API Documentation + +1. **Edit OpenAPI specs:** + + ```bash + # Edit modular YAML sources + vim docs/openapi/paths/shipments.yaml + vim docs/openapi/components/schemas/shipment.yaml + ``` + +2. **Bundle and validate:** + + ```bash + just validate # or: just bundle && just lint && just test + ``` + +3. **Commit:** + + ```bash + git add docs/openapi/ + git commit -m "feat: update shipment schema" + # Pre-commit hook auto-bundles if installed + ``` + +4. **Auto-generation triggers:** + - When you push changes to `docs/openapi.json`, GitHub Actions generates `Terminal49-API.postman_collection.json` + - When merged to `main`, the Postman collection deploys to the Postman API + +### Adding a New Endpoint + +1. Create `docs/openapi/paths/your-endpoint.yaml` +2. Add path reference in `docs/openapi/index.yaml`: + ```yaml + paths: + /your_endpoint: + $ref: "./paths/your-endpoint.yaml" + ``` +3. Bundle and validate: `just validate` +4. Commit both YAML and bundled JSON + +### Adding a New Schema + +1. Create `docs/openapi/components/schemas/your-model.yaml` +2. Add schema reference in `docs/openapi/index.yaml`: + ```yaml + components: + schemas: + your_model: + $ref: "./components/schemas/your-model.yaml" + ``` +3. Bundle and validate: `just validate` +4. Commit both YAML and bundled JSON + +### Editing Documentation Content + +MDX files in `docs/api-docs/` and `docs/datasync/` are manually edited: + +- Follow the existing structure in `mint.json` +- Include proper frontmatter (title, og:title, og:description) +- Reference API endpoints using absolute paths like `/api-docs/api-reference/shipments/list-shipments` + +### Working with Postman Collections + +The Postman collection is **auto-generated** - never edit `Terminal49-API.postman_collection.json` directly! + +To manually regenerate (if needed): + +```bash +just postman +# or: openapi2postmanv2 -s docs/openapi.json -o Terminal49-API.postman_collection.json -p -O folderStrategy=Tags +``` + +## Important Files + +- **docs/openapi/index.yaml** - Root OpenAPI spec (references all modular files) +- **docs/openapi/paths/** - Individual endpoint definitions +- **docs/openapi/components/schemas/** - Reusable data models +- **docs/openapi.json** - Bundled output (auto-generated, don't edit) +- **justfile** - All available commands +- **tools/openapi_bundle.py** - Python bundler with validation +- **package.json** - CLI scripts (Mintlify CLI, chokidar) +- **.tool-versions** - `mise` runtime pins (Node.js, Bun, Python) +- **requirements-dev.txt** - Python dependencies for the bundler (`PyYAML`) +- **scripts/pre-commit.sh** - Auto-bundling hook +- **docs/mint.json** - Navigation structure, tabs, branding + +## Development Setup + +**First-time setup:** + +```bash +just setup +``` + +This installs: + +- Toolchain pinned in `.tool-versions` via `mise install` (Node.js, Bun, Python) +- Python dependencies from `requirements-dev.txt` (uses `uv` when available, falls back to `pip`) +- Bun dependencies (Mintlify CLI for linting, chokidar for watch mode) +- Pre-commit hook for auto-bundling + +**Manual setup:** + +```bash +# Install toolchain +mise install + +# Install Python deps +# (preferred) uv pip install -r requirements-dev.txt +# (fallback) python -m pip install -r requirements-dev.txt + +# Install Bun dependencies (optional when using bun workloads) +bun install + +# Install pre-commit hook +just install-hooks +``` + +## Validation & Testing + +### Linting + +We rely on the Mintlify CLI to validate the modular OpenAPI spec: + +```bash +just lint # Mintlify openapi-check (requires Node >= 18) +``` + +The recipe bundles (skipping validation) before invoking `mintlify openapi-check`, so the CLI verifies the generated `docs/openapi.json` that Mintlify consumes. +### Schema Validation + +The Python bundler includes automatic validation: + +- Checks schema structure (type, properties, etc.) +- Validates `$ref` resolution +- Detects circular references +- Provides helpful error messages with context + +To skip validation (faster): + +```bash +just bundle-fast +``` + +### Testing + +```bash +just test # Run regression test +just validate # Bundle + lint + test +``` + +## Authentication + +API uses Token-based auth with header format: + +``` +Authorization: Token YOUR_API_KEY +``` + +API keys are obtained from https://app.terminal49.com/developers/api-keys + +## Rate Limiting + +The API has a **100 requests/minute** rate limit for tracking requests. This is documented in the OpenAPI spec and should be mentioned when adding documentation about tracking requests. + +## Deployment + +Documentation is deployed via: + +1. **Mintlify** - Hosts docs.terminal49.com (configured via `mint.json`) +2. **Render** - Legacy Redoc deployment (see `render.yaml` and `Dockerfile`) +3. **Postman** - Collection synced via GitHub Actions to Postman API + +## Key API Resources + +Primary entities tracked in the system: + +- **Shipments** - Bill of lading (BOL) tracking +- **Containers** - Individual container tracking with transport events +- **Tracking Requests** - Requests to track new shipments +- **Webhooks** - Event subscriptions for real-time updates +- **Transport Events** - Container movement events (empty out, vessel loaded, etc.) +- **Ports, Terminals, Vessels** - Reference data +- **Parties** - Business entities (customers, consignees, etc.) + +## Commit Conventions + +Follow conventional commits style: + +- `feat:` - New features or endpoints +- `fix:` - Bug fixes in documentation +- `chore:` - Maintenance, auto-generated files +- Use `[skip ci]` to prevent workflow triggers on auto-generated commits + +## GitHub Actions + +Workflows require secrets: + +- `POSTMAN_API_KEY` - For deploying to Postman +- `POSTMAN_COLLECTION_UID` - Collection identifier: `5900de09-f05a-4528-8b12-9ad1d0477023` + +Workflows use `[skip ci]` in auto-generated commits to prevent infinite loops. + +## Performance Notes + +**Bundling speed** (9700+ line spec): + +- Python bundler: ~100-200ms + +**Linting speed:** + +- Mintlify CLI (`openapi-check`): ~1s for 1MB spec (depends on Node runtime) + +Both are fast enough for local development. Python is used in CI for zero Node.js dependency, and Mintlify CLI provides OpenAPI validation aligned with our hosted docs. + +## Troubleshooting + +### "Referenced file not found" + +- Check path is correct relative to current file +- Verify filename/extension match exactly (case-sensitive) +- See enhanced error message for tips + +### "Circular $ref detected" + +- A file references itself through a $ref chain +- Check the reference chain in the error message +- Restructure schemas to break the cycle + +### Bundle out of sync + +- Run `just bundle` to regenerate +- Install pre-commit hook to automate: `just install-hooks` +- Check CI will fail if bundle doesn't match + +### Watchman not working + +- Ensure `.watchmanconfig` exists +- Check Watchman daemon: `watchman watch-list` +- Try: `watchman shutdown-server && just watch` + +## Data Files + +CSV files contain supported shipping lines and terminals: + +- `Terminal49 Shiping Line Support.csv` [sic - typo in filename] +- `Terminal49 Terminal Support.csv` + +These are reference data used in documentation or validation. + +## Getting Help + +- **Justfile commands:** `just --list` or `just help` +- **OpenAPI workflow:** `docs/openapi/README.md` +- **Detailed guide:** `docs/openapi/DEVELOPER_GUIDE.md` +- **Python bundler:** `python -m tools.openapi_bundle --help` +- **Mintlify CLI:** `npx mintlify --help` + +## When Claude Code Works on This Repo + +### Adding/Editing Endpoints + +1. Always edit YAML files in `docs/openapi/` +2. Never edit `docs/openapi.json` directly +3. After editing, run `just validate` +4. Commit both YAML sources and bundled JSON + +### Reviewing Code + +- Check that `docs/openapi.json` is in sync with YAML sources +- Verify CI passes (lint + bundle test) +- Suggest running `just validate` if changes seem incomplete + +### Troubleshooting Build Failures + +- Check if `just bundle` succeeds locally +- Look for helpful error messages (enhanced in Python bundler) +- Verify all `$ref` paths are correct + +### Documentation Changes + +- OpenAPI changes go in `docs/openapi/**/*.yaml` +- Human-readable guides go in `docs/api-docs/**/*.mdx` +- Keep `mint.json` structure aligned with file organization + +**When to suggest these tools to developers**: + +- Suggest `rg` over `grep` for code searches +- Suggest `fd` over `find` for file discovery +- Suggest `ast-grep` for refactoring that needs to understand code structure +- Suggest `jq`/`yq` when parsing JSON/YAML in scripts diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..f1a30fcf66e5d44d6cc21000d4689a4f774eee4f GIT binary patch literal 362994 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 literal 0 HcmV?d00001 diff --git a/docs/openapi/DEVELOPER_GUIDE.md b/docs/openapi/DEVELOPER_GUIDE.md index 5fa44e43..85b34fc8 100644 --- a/docs/openapi/DEVELOPER_GUIDE.md +++ b/docs/openapi/DEVELOPER_GUIDE.md @@ -1,665 +1,631 @@ -# OpenAPI Developer Guide - -This guide provides detailed workflows for working with Terminal49's modular OpenAPI specification. - -## Table of Contents - -- [Quick Reference](#quick-reference) -- [Understanding the Architecture](#understanding-the-architecture) -- [Development Workflows](#development-workflows) -- [Best Practices](#best-practices) -- [Advanced Topics](#advanced-topics) -- [Troubleshooting](#troubleshooting) - -## Quick Reference - -### Most Common Commands - -```bash -# Setup (first time only) -just setup - -# Bundle OpenAPI -just bundle # Python (production method) -just bundle-redocly # Redocly CLI (optional) - -# Validate everything -just validate # Bundle + lint + test - -# Development -just watch # Auto-bundle on file changes -just preview # Preview docs locally - -# Maintenance -just lint # Lint with Spectral -just test # Run regression test -``` - -### File Locations Cheat Sheet - -| What | Where | -|------|-------| -| Endpoint definitions | `docs/openapi/paths/*.yaml` | -| Data models (schemas) | `docs/openapi/components/schemas/*.yaml` | -| Root OpenAPI document | `docs/openapi/index.yaml` | -| Bundled output | `docs/openapi.json` (auto-generated) | -| Task commands | `justfile` (root directory) | -| Bundler implementation | `tools/openapi_bundle.py` | -| Pre-commit hook | `scripts/pre-commit.sh` | - -## Understanding the Architecture - -### Why Modular OpenAPI? - -**Problem:** A 9700+ line `openapi.json` file is: -- Hard to navigate and edit -- Prone to merge conflicts -- Difficult to review in PRs -- Easy to introduce errors - -**Solution:** Split into small, focused YAML files: -- One file per endpoint (`paths/shipments.yaml`) -- One file per schema (`components/schemas/shipment.yaml`) -- Easy to find, edit, and review -- Git diffs are meaningful - -### How References Work - -OpenAPI uses `$ref` to reference other parts of the specification. - -**Internal references** (same file): -```yaml -# Points to #/components/schemas/shipment in bundled output -$ref: "#/components/schemas/shipment" -``` - -**External references** (different file): -```yaml -# Points to another YAML file -$ref: "./shipment.yaml" -$ref: "../schemas/container.yaml" -``` - -**Fragment references** (specific property): -```yaml -# Points to a nested property -$ref: "./shipment.yaml#/properties/id" -``` - -The bundler resolves all external `$ref`s into a single `openapi.json` file. - -### The Two Bundlers - -| Feature | Python Bundler | Redocly CLI | -|---------|---------------|-------------| -| **Production use** | ✅ Yes (CI/CD) | ❌ No (dev only) | -| **Dependencies** | None (stdlib only) | Requires Bun/Node.js | -| **Speed** | ~100-200ms | ~150-300ms | -| **Error messages** | Good (enhanced) | Excellent | -| **Extra features** | Schema validation | Lint, preview, stats | -| **Command** | `just bundle` | `just bundle-redocly` | - -**Recommendation:** Use either during development, but Python is required for CI/CD. - -## Development Workflows - -### Workflow 1: Quick Edit (With Pre-commit Hook) - -**Best for:** Small changes, fixing typos, updating examples - -1. **Setup** (once): - ```bash - just install-hooks - ``` - -2. **Edit** any YAML file: - ```bash - vim docs/openapi/paths/shipments.yaml - ``` - -3. **Commit**: - ```bash - git add docs/openapi/ - git commit -m "fix: update shipment example" - # Hook auto-bundles and stages openapi.json - ``` - -4. **Push**: - ```bash - git push - ``` - -### Workflow 2: Active Development (With Watch Mode) - -**Best for:** Adding new endpoints, refactoring schemas, bulk edits - -1. **Start watch mode**: - ```bash - just watch - # Watches docs/openapi/**/*.yaml, auto-bundles on save - ``` - -2. **Edit** files in your editor – bundle updates automatically - -3. **Check** the diff: - ```bash - git diff docs/openapi.json - ``` - -4. **Validate** when done: - ```bash - just validate - ``` - -5. **Commit**: - ```bash - git add docs/openapi/ - git commit -m "feat: add tracking status endpoint" - git push - ``` - -### Workflow 3: Large Refactoring (Manual Control) - -**Best for:** Structural changes, testing different approaches - -1. **Create a branch**: - ```bash - git checkout -b refactor/shipment-schema - ``` - -2. **Make changes** to YAML files - -3. **Bundle and check**: - ```bash - just bundle - git diff docs/openapi.json - ``` - -4. **Validate**: - ```bash - just validate - # or run each step: - just lint - just test - ``` - -5. **Iterate** until satisfied - -6. **Commit and push**: - ```bash - git add docs/openapi/ - git commit -m "refactor: simplify shipment relationships" - git push origin refactor/shipment-schema - ``` - -7. **Create PR** for review - -### Workflow 4: Preview Docs Locally - -**Best for:** Seeing how changes look before deploying - -#### Option A: Redocly Preview (OpenAPI Only) - -1. **Start preview server**: - ```bash - just preview - # Opens http://localhost:8080 - # Shows interactive API docs from openapi.json - ``` - -2. **Make changes** to YAML files - -3. **Rebuild** (in another terminal): - ```bash - just bundle - ``` - -4. **Refresh** browser to see changes - -#### Option B: Mintlify Preview (Full Documentation) - -**Recommended for comprehensive preview** - -1. **Quick start**: - ```bash - just dev - # Bundles + lints + starts Mintlify preview - # Opens http://localhost:3000 - ``` - - This runs: - - Bundle OpenAPI with Python - - Lint with Spectral - - Start Mintlify dev server - -2. **Or with full validation**: - ```bash - just dev-full - # Bundles + validates + tests + starts Mintlify - # Use this before creating a PR - ``` - -3. **Make changes** and Mintlify auto-reloads - -4. **Commit** when satisfied - -**Why Mintlify Preview?** -- ✅ Shows the full docs (OpenAPI + MDX content) -- ✅ Exact replica of docs.terminal49.com -- ✅ Auto-reloads on changes -- ✅ Tests navigation and layout - -## Best Practices - -### File Organization - -**DO:** -- ✅ One endpoint per file: `paths/shipments.yaml`, `paths/shipments-id.yaml` -- ✅ One schema per file: `components/schemas/shipment.yaml` -- ✅ Use descriptive filenames that match the resource -- ✅ Group related paths in subdirectories if needed - -**DON'T:** -- ❌ Put multiple endpoints in one file -- ❌ Put all schemas in `components/schemas.yaml` -- ❌ Use generic names like `endpoint1.yaml` - -### Naming Conventions - -**Paths:** -- Use kebab-case: `shipments-id-stop-tracking.yaml` -- Match the URL path: `/shipments/{id}/stop_tracking` → `shipments-id-stop-tracking.yaml` - -**Schemas:** -- Use kebab-case: `shipping-line.yaml` -- Match the schema name: `shipping_line` → `shipping-line.yaml` - -**Components:** -- Use kebab-case for files -- Use snake_case for OpenAPI identifiers - -### Schema Design - -**Keep schemas focused:** -```yaml -# Good: Focused schema -title: "Shipment model" -type: "object" -properties: - id: - type: "string" - format: "uuid" - bill_of_lading_number: - type: "string" -``` - -**Use $ref for reusability:** -```yaml -# Good: Reuse common patterns -properties: - port_of_lading: - $ref: "#/components/schemas/port" -``` - -**Avoid deep nesting:** -```yaml -# Bad: Too deeply nested -properties: - data: - properties: - attributes: - properties: - relationships: - properties: - # ... too deep! -``` - -Instead, extract to separate schemas and use `$ref`. - -### Documentation - -**Add descriptions:** -```yaml -# Good: Helpful description -pol_timezone: - type: "string" - description: "IANA tz database timezone (e.g., America/New_York)" - nullable: true -``` - -**Include examples:** -```yaml -# Good: Real-world example -examples: - En-route to NY: - value: - id: "62738624-7032-4a50-892e-c55826228c25" - type: "shipment" - # ... full example -``` - -**Mark deprecated fields:** -```yaml -# Good: Clear deprecation -q: - schema: - type: "string" - in: "query" - name: "q" - description: "Search shipments (deprecated: use filter[] params instead)" - deprecated: true -``` - -### Validation - -**Always validate before committing:** -```bash -just validate -``` - -This runs: -1. Bundle with schema validation -2. Spectral lint -3. Regression test (ensures bundle matches) - -**Check lint errors seriously:** -```bash -just lint -# Fix all errors and warnings -``` - -**Test CI locally:** -```bash -just ci -# Simulates GitHub Actions workflow -``` - -## Advanced Topics - -### Custom Validation Rules - -The Python bundler includes schema validation. To add custom rules, edit `tools/openapi_bundle.py`: - -```python -def _validate_schema_file(path: Path, data: Any) -> None: - # Add custom validation logic here - if "deprecated" in data.get("attributes", {}): - # Warn about deprecated fields - pass -``` - -### Resolving Circular References - -If you get "Circular $ref detected": - -1. **Identify the chain** from error message: - ``` - Reference chain: - 1. docs/openapi/components/schemas/shipment.yaml - 2. docs/openapi/components/schemas/container.yaml - 3. docs/openapi/components/schemas/shipment.yaml - ``` - -2. **Break the cycle** by: - - Using `nullable` instead of `$ref` for one direction - - Extracting common properties to a base schema - - Using `allOf` composition - -3. **Example fix:** - ```yaml - # Before (circular): - # shipment.yaml references container - # container.yaml references shipment - - # After (break cycle): - # shipment.yaml references container - # container.yaml just includes shipment_id (string) - ``` - -### Working with Large Schemas - -For very large schemas (200+ lines): - -1. **Split into logical sections:** - ``` - components/schemas/ - ├── shipment/ - │ ├── base.yaml # Core properties - │ ├── relationships.yaml # Relationship properties - │ └── index.yaml # Combines base + relationships - ``` - -2. **Use composition:** - ```yaml - # shipment/index.yaml - allOf: - - $ref: "./base.yaml" - - $ref: "./relationships.yaml" - ``` - -### Programmatic Bundling - -Use the Python bundler in scripts: - -```python -from pathlib import Path -from tools.openapi_bundle import bundle_openapi, write_bundle - -# Bundle to dict -spec = bundle_openapi(Path("docs/openapi/index.yaml")) - -# Or write to file -write_bundle( - Path("docs/openapi/index.yaml"), - Path("docs/openapi.json"), - validate_schemas=True -) -``` - -Use Redocly in Node.js: - -```javascript -import { bundle, loadConfig } from '@redocly/openapi-core'; - -const config = await loadConfig(); -const result = await bundle({ - ref: 'docs/openapi/index.yaml', - config -}); -``` - -### Automation Ideas - -**Auto-format on save** (VS Code): -```json -// .vscode/settings.json -{ - "files.associations": { - "*.yaml": "yaml" - }, - "editor.formatOnSave": true -} -``` - -**Git pre-push hook** (extra safety): -```bash -# .git/hooks/pre-push -#!/bin/bash -just validate || { - echo "Validation failed! Fix errors before pushing." - exit 1 -} -``` - -## Troubleshooting - -### Problem: "Bundle is out of sync" - -**Symptom:** CI fails with "Bundle doesn't match YAML sources" - -**Solution:** -```bash -just bundle -git add docs/openapi.json -git commit --amend --no-edit -``` - -### Problem: "Referenced file not found" - -**Symptom:** -``` -Referenced file not found: ./schemas/shipment.yaml - Referenced from: docs/openapi/paths/shipments.yaml -``` - -**Solutions:** -1. Check path is relative to current file -2. Verify file exists: `ls docs/openapi/components/schemas/shipment.yaml` -3. Check spelling and case (case-sensitive!) - -### Problem: "Schema validation failed" - -**Symptom:** -``` -Schema file appears to be missing expected fields: container.yaml -Expected at least one of: type, properties, anyOf, oneOf, allOf, $ref, enum -``` - -**Solutions:** -1. Check schema has proper structure -2. Verify it's not missing `type: "object"` or `properties:` -3. Look at similar schemas for reference - -### Problem: Watch mode not working - -**Symptom:** Changes to YAML don't trigger rebuild - -**Solutions:** -```bash -# Restart Watchman daemon -watchman shutdown-server -just watch - -# Or use simple watch -bun run watch -``` - -### Problem: Merge conflicts in openapi.json - -**Symptom:** Git conflicts in the 9700-line bundle - -**Solution:** -```bash -# 1. Accept your YAML changes -git checkout --ours docs/openapi/ -git checkout --theirs docs/openapi/ - -# 2. Rebuild from YAML -just bundle - -# 3. Commit the regenerated bundle -git add docs/openapi.json -git commit -``` - -### Problem: Slow bundling - -**Symptom:** Bundle takes >1s - -**Solutions:** -```bash -# Skip validation (faster) -just bundle-fast - -# Or use Redocly (faster bundler) -just bundle-redocly -``` - -## Getting More Help - -- **README:** `docs/openapi/README.md` -- **Justfile commands:** `just --list` or `cat justfile` -- **Python bundler help:** `python -m tools.openapi_bundle --help` -- **Redocly docs:** https://redocly.com/docs/cli -- **OpenAPI spec:** https://spec.openapis.org/oas/v3.0.3 -- **JSONAPI spec:** https://jsonapi.org/format/ - -## Contributing - -When contributing OpenAPI changes: - -1. **Follow existing patterns** in similar files -2. **Add examples** for new endpoints -3. **Document** all fields with descriptions -4. **Validate** before committing: `just validate` -5. **Test** that docs render correctly: `just preview` -6. **Keep PRs focused** – one feature/fix per PR - -## Appendix: File Structure Example - -Complete example of a new endpoint: - -### 1. Create path file -```yaml -# docs/openapi/paths/tracking-status.yaml -get: - summary: "Get tracking status" - tags: - - "Tracking" - parameters: - - name: "shipment_id" - in: "query" - required: true - schema: - type: "string" - format: "uuid" - responses: - 200: - description: "OK" - content: - application/json: - schema: - $ref: "#/components/schemas/tracking_status" -``` - -### 2. Create schema file -```yaml -# docs/openapi/components/schemas/tracking-status.yaml -title: "Tracking Status" -type: "object" -properties: - status: - type: "string" - enum: ["pending", "in_transit", "delivered"] - updated_at: - type: "string" - format: "date-time" -required: - - "status" -``` - -### 3. Update index -```yaml -# docs/openapi/index.yaml (add to existing sections) -paths: - /tracking_status: - $ref: "./paths/tracking-status.yaml" - -components: - schemas: - tracking_status: - $ref: "./components/schemas/tracking-status.yaml" -``` - -### 4. Bundle and validate -```bash -just validate -``` - -### 5. Commit -```bash -git add docs/openapi/ -git commit -m "feat: add tracking status endpoint" -``` - -Done! 🎉 +# OpenAPI Developer Guide + +This guide provides detailed workflows for working with Terminal49's modular OpenAPI specification. + +## Table of Contents + +- [Quick Reference](#quick-reference) +- [Understanding the Architecture](#understanding-the-architecture) +- [Development Workflows](#development-workflows) +- [Best Practices](#best-practices) +- [Advanced Topics](#advanced-topics) +- [Troubleshooting](#troubleshooting) + +## Quick Reference + +### Most Common Commands + +```bash +# Setup (first time only) +just setup + +# Bundle OpenAPI +just bundle # Python (production method) +just bundle-fast # Python (skip validation, faster iteration) + +# Validate everything +just validate # Bundle + lint + test + +# Development +just watch # Auto-bundle on file changes +just preview-mintlify # Preview docs locally (Mintlify) + +# Maintenance +just lint # Lint with Mintlify CLI +just test # Run regression test +``` + +Run `mise install` (or simply `just setup`) to pull the Node.js/Bun/Python versions pinned in `.tool-versions`; `just setup` also installs the bundler dependencies from `requirements-dev.txt` (using `uv` when available) and fetches Bun packages. If your shell is outside mise, run `mise shell` or prefix commands with `mise exec --` (for example, `mise exec -- just validate`). + +### File Locations Cheat Sheet + +| What | Where | +|------|-------| +| Endpoint definitions | `docs/openapi/paths/*.yaml` | +| Data models (schemas) | `docs/openapi/components/schemas/*.yaml` | +| Root OpenAPI document | `docs/openapi/index.yaml` | +| Bundled output | `docs/openapi.json` (auto-generated) | +| Task commands | `justfile` (root directory) | +| Bundler implementation | `tools/openapi_bundle.py` | +| Toolchain pins | `.tool-versions` | +| Python bundler deps | `requirements-dev.txt` | +| Pre-commit hook | `scripts/pre-commit.sh` | + +## Understanding the Architecture + +### Why Modular OpenAPI? + +**Problem:** A 9700+ line `openapi.json` file is: +- Hard to navigate and edit +- Prone to merge conflicts +- Difficult to review in PRs +- Easy to introduce errors + +**Solution:** Split into small, focused YAML files: +- One file per endpoint (`paths/shipments.yaml`) +- One file per schema (`components/schemas/shipment.yaml`) +- Easy to find, edit, and review +- Git diffs are meaningful + +### How References Work + +OpenAPI uses `$ref` to reference other parts of the specification. + +**Internal references** (same file): +```yaml +# Points to #/components/schemas/shipment in bundled output +$ref: "#/components/schemas/shipment" +``` + +**External references** (different file): +```yaml +# Points to another YAML file +$ref: "./shipment.yaml" +$ref: "../schemas/container.yaml" +``` + +**Fragment references** (specific property): +```yaml +# Points to a nested property +$ref: "./shipment.yaml#/properties/id" +``` + +The bundler resolves all external `$ref`s into a single `openapi.json` file. + +### Bundling Strategy + +The Python bundler is the single path for generating `docs/openapi.json`. It validates schema structure as it assembles the modular YAML files. + +- Standard run: `just bundle` +- Skip validation when iterating: `just bundle-fast` +- The same code runs in CI, so matching it locally avoids surprises. + +## Development Workflows + +### Workflow 1: Quick Edit (With Pre-commit Hook) + +**Best for:** Small changes, fixing typos, updating examples + +1. **Setup** (once): + ```bash + just install-hooks + ``` + +2. **Edit** any YAML file: + ```bash + vim docs/openapi/paths/shipments.yaml + ``` + +3. **Commit**: + ```bash + git add docs/openapi/ + git commit -m "fix: update shipment example" + # Hook auto-bundles and stages openapi.json + ``` + +4. **Push**: + ```bash + git push + ``` + +### Workflow 2: Active Development (With Watch Mode) + +**Best for:** Adding new endpoints, refactoring schemas, bulk edits + +1. **Start watch mode**: + ```bash + just watch + # Watches docs/openapi/**/*.yaml, auto-bundles on save + ``` + +2. **Edit** files in your editor – bundle updates automatically + +3. **Check** the diff: + ```bash + git diff docs/openapi.json + ``` + +4. **Validate** when done: + ```bash + just validate + ``` + +5. **Commit**: + ```bash + git add docs/openapi/ + git commit -m "feat: add tracking status endpoint" + git push + ``` + +### Workflow 3: Large Refactoring (Manual Control) + +**Best for:** Structural changes, testing different approaches + +1. **Create a branch**: + ```bash + git checkout -b refactor/shipment-schema + ``` + +2. **Make changes** to YAML files + +3. **Bundle and check**: + ```bash + just bundle + git diff docs/openapi.json + ``` + +4. **Validate**: + ```bash + just validate + # or run each step: + just lint + just test + ``` + +5. **Iterate** until satisfied + +6. **Commit and push**: + ```bash + git add docs/openapi/ + git commit -m "refactor: simplify shipment relationships" + git push origin refactor/shipment-schema + ``` + +7. **Create PR** for review + +### Workflow 4: Preview Docs Locally + +**Best for:** Seeing how changes look before deploying + +#### Mintlify Preview (Full Documentation) + +**Recommended for comprehensive preview** + +1. **Quick start**: + ```bash + just dev + # Bundles + lints + starts Mintlify preview + # Opens http://localhost:3000 + ``` + + This runs: + - Bundle OpenAPI with Python + - Lint with Mintlify CLI + - Start Mintlify dev server + +2. **Or with full validation**: + ```bash + just dev-full + # Bundles + validates + tests + starts Mintlify + # Use this before creating a PR + ``` + +3. **Make changes** and Mintlify auto-reloads + +4. **Commit** when satisfied + +**Why Mintlify Preview?** +- ✅ Shows the full docs (OpenAPI + MDX content) +- ✅ Exact replica of docs.terminal49.com +- ✅ Auto-reloads on changes +- ✅ Tests navigation and layout + +## Best Practices + +### File Organization + +**DO:** +- ✅ One endpoint per file: `paths/shipments.yaml`, `paths/shipments-id.yaml` +- ✅ One schema per file: `components/schemas/shipment.yaml` +- ✅ Use descriptive filenames that match the resource +- ✅ Group related paths in subdirectories if needed + +**DON'T:** +- ❌ Put multiple endpoints in one file +- ❌ Put all schemas in `components/schemas.yaml` +- ❌ Use generic names like `endpoint1.yaml` + +### Naming Conventions + +**Paths:** +- Use kebab-case: `shipments-id-stop-tracking.yaml` +- Match the URL path: `/shipments/{id}/stop_tracking` → `shipments-id-stop-tracking.yaml` + +**Schemas:** +- Use kebab-case: `shipping-line.yaml` +- Match the schema name: `shipping_line` → `shipping-line.yaml` + +**Components:** +- Use kebab-case for files +- Use snake_case for OpenAPI identifiers + +### Schema Design + +**Keep schemas focused:** +```yaml +# Good: Focused schema +title: "Shipment model" +type: "object" +properties: + id: + type: "string" + format: "uuid" + bill_of_lading_number: + type: "string" +``` + +**Use $ref for reusability:** +```yaml +# Good: Reuse common patterns +properties: + port_of_lading: + $ref: "#/components/schemas/port" +``` + +**Avoid deep nesting:** +```yaml +# Bad: Too deeply nested +properties: + data: + properties: + attributes: + properties: + relationships: + properties: + # ... too deep! +``` + +Instead, extract to separate schemas and use `$ref`. + +### Documentation + +**Add descriptions:** +```yaml +# Good: Helpful description +pol_timezone: + type: "string" + description: "IANA tz database timezone (e.g., America/New_York)" + nullable: true +``` + +**Include examples:** +```yaml +# Good: Real-world example +examples: + En-route to NY: + value: + id: "62738624-7032-4a50-892e-c55826228c25" + type: "shipment" + # ... full example +``` + +**Mark deprecated fields:** +```yaml +# Good: Clear deprecation +q: + schema: + type: "string" + in: "query" + name: "q" + description: "Search shipments (deprecated: use filter[] params instead)" + deprecated: true +``` + +### Validation + +**Always validate before committing:** +```bash +just validate +``` + +This runs: +1. Bundle with schema validation +2. Mintlify OpenAPI check +3. Regression test (ensures bundle matches) + +**Check lint errors seriously:** +```bash +just lint +# Fix all errors and warnings (requires Node.js ≥ 18) +``` + +**Test CI locally:** +```bash +just ci +# Simulates GitHub Actions workflow +``` + +## Advanced Topics + +### Custom Validation Rules + +The Python bundler includes schema validation. To add custom rules, edit `tools/openapi_bundle.py`: + +```python +def _validate_schema_file(path: Path, data: Any) -> None: + # Add custom validation logic here + if "deprecated" in data.get("attributes", {}): + # Warn about deprecated fields + pass +``` + +### Resolving Circular References + +If you get "Circular $ref detected": + +1. **Identify the chain** from error message: + ``` + Reference chain: + 1. docs/openapi/components/schemas/shipment.yaml + 2. docs/openapi/components/schemas/container.yaml + 3. docs/openapi/components/schemas/shipment.yaml + ``` + +2. **Break the cycle** by: + - Using `nullable` instead of `$ref` for one direction + - Extracting common properties to a base schema + - Using `allOf` composition + +3. **Example fix:** + ```yaml + # Before (circular): + # shipment.yaml references container + # container.yaml references shipment + + # After (break cycle): + # shipment.yaml references container + # container.yaml just includes shipment_id (string) + ``` + +### Working with Large Schemas + +For very large schemas (200+ lines): + +1. **Split into logical sections:** + ``` + components/schemas/ + ├── shipment/ + │ ├── base.yaml # Core properties + │ ├── relationships.yaml # Relationship properties + │ └── index.yaml # Combines base + relationships + ``` + +2. **Use composition:** + ```yaml + # shipment/index.yaml + allOf: + - $ref: "./base.yaml" + - $ref: "./relationships.yaml" + ``` + +### Programmatic Bundling + +Use the Python bundler in scripts: + +```python +from pathlib import Path +from tools.openapi_bundle import bundle_openapi, write_bundle + +# Bundle to dict +spec = bundle_openapi(Path("docs/openapi/index.yaml")) + +# Or write to file +write_bundle( + Path("docs/openapi/index.yaml"), + Path("docs/openapi.json"), + validate_schemas=True +) +``` + +### Automation Ideas + +**Auto-format on save** (VS Code): +```json +// .vscode/settings.json +{ + "files.associations": { + "*.yaml": "yaml" + }, + "editor.formatOnSave": true +} +``` + +**Git pre-push hook** (extra safety): +```bash +# .git/hooks/pre-push +#!/bin/bash +just validate || { + echo "Validation failed! Fix errors before pushing." + exit 1 +} +``` + +## Troubleshooting + +### Problem: "Bundle is out of sync" + +**Symptom:** CI fails with "Bundle doesn't match YAML sources" + +**Solution:** +```bash +just bundle +git add docs/openapi.json +git commit --amend --no-edit +``` + +### Problem: "Referenced file not found" + +**Symptom:** +``` +Referenced file not found: ./schemas/shipment.yaml + Referenced from: docs/openapi/paths/shipments.yaml +``` + +**Solutions:** +1. Check path is relative to current file +2. Verify file exists: `ls docs/openapi/components/schemas/shipment.yaml` +3. Check spelling and case (case-sensitive!) + +### Problem: "Schema validation failed" + +**Symptom:** +``` +Schema file appears to be missing expected fields: container.yaml +Expected at least one of: type, properties, anyOf, oneOf, allOf, $ref, enum +``` + +**Solutions:** +1. Check schema has proper structure +2. Verify it's not missing `type: "object"` or `properties:` +3. Look at similar schemas for reference + +### Problem: Watch mode not working + +**Symptom:** Changes to YAML don't trigger rebuild + +**Solutions:** +```bash +# Restart Watchman daemon +watchman shutdown-server +just watch + +# Or use simple watch +bun run watch +``` + +### Problem: Merge conflicts in openapi.json + +**Symptom:** Git conflicts in the 9700-line bundle + +**Solution:** +```bash +# 1. Accept your YAML changes +git checkout --ours docs/openapi/ +git checkout --theirs docs/openapi/ + +# 2. Rebuild from YAML +just bundle + +# 3. Commit the regenerated bundle +git add docs/openapi.json +git commit +``` + +### Problem: Slow bundling + +**Symptom:** Bundle takes >1s + +**Solutions:** +```bash +# Skip validation (faster) +just bundle-fast +``` + +## Getting More Help + +- **README:** `docs/openapi/README.md` +- **Justfile commands:** `just --list` or `cat justfile` +- **Python bundler help:** `python -m tools.openapi_bundle --help` +- **Mintlify CLI help:** `mintlify --help` +- **OpenAPI spec:** https://spec.openapis.org/oas/v3.0.3 +- **JSONAPI spec:** https://jsonapi.org/format/ + +## Contributing + +When contributing OpenAPI changes: + +1. **Follow existing patterns** in similar files +2. **Add examples** for new endpoints +3. **Document** all fields with descriptions +4. **Validate** before committing: `just validate` +5. **Test** that docs render correctly: `just preview-mintlify` +6. **Keep PRs focused** – one feature/fix per PR + +## Appendix: File Structure Example + +Complete example of a new endpoint: + +### 1. Create path file +```yaml +# docs/openapi/paths/tracking-status.yaml +get: + summary: "Get tracking status" + tags: + - "Tracking" + parameters: + - name: "shipment_id" + in: "query" + required: true + schema: + type: "string" + format: "uuid" + responses: + 200: + description: "OK" + content: + application/json: + schema: + $ref: "#/components/schemas/tracking_status" +``` + +### 2. Create schema file +```yaml +# docs/openapi/components/schemas/tracking-status.yaml +title: "Tracking Status" +type: "object" +properties: + status: + type: "string" + enum: ["pending", "in_transit", "delivered"] + updated_at: + type: "string" + format: "date-time" +required: + - "status" +``` + +### 3. Update index +```yaml +# docs/openapi/index.yaml (add to existing sections) +paths: + /tracking_status: + $ref: "./paths/tracking-status.yaml" + +components: + schemas: + tracking_status: + $ref: "./components/schemas/tracking-status.yaml" +``` + +### 4. Bundle and validate +```bash +just validate +``` + +### 5. Commit +```bash +git add docs/openapi/ +git commit -m "feat: add tracking status endpoint" +``` + +Done! 🎉 diff --git a/docs/openapi/README.md b/docs/openapi/README.md index 30e1f7f7..0e94c184 100644 --- a/docs/openapi/README.md +++ b/docs/openapi/README.md @@ -36,6 +36,8 @@ just dev # Auto-reloads on changes ``` +The project pins its toolchain via `.tool-versions` (Node.js 20, Bun 1.1, Python 3.11). `just setup` runs `mise install`, installs the Python requirements from `requirements-dev.txt` (using `uv` when available), fetches Bun dependencies, and wires up the pre-commit hook. If your shell is not already managed by mise, run `mise shell` or prefix commands with `mise exec --` (e.g., `mise exec -- just lint`). + **Alternative commands:** ```bash # Bundle OpenAPI only @@ -46,9 +48,6 @@ just validate # Watch for changes and auto-bundle just watch - -# Preview with Redocly (OpenAPI only) -just preview ``` **Traditional commands (without justfile):** @@ -56,11 +55,11 @@ just preview # Bundle with Python (production method) python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json -# Or bundle with Redocly CLI (optional, requires Bun) -bun redocly bundle docs/openapi/index.yaml -o docs/openapi.json +# Validate OpenAPI with Mintlify CLI (expects bundled JSON) +npx -y mintlify openapi-check docs/openapi.json # Preview with Mintlify -bun mintlify dev +npx -y mintlify dev ``` ## Editing Workflow @@ -93,7 +92,8 @@ bun mintlify dev 3. Validate your changes: ```bash just validate - # or: spectral lint docs/openapi/index.yaml && python -m unittest tests.test_openapi_bundle + # or: python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json --no-validate + # && mintlify openapi-check docs/openapi.json ``` 4. Commit both the YAML sources and regenerated `docs/openapi.json` @@ -109,16 +109,13 @@ just watch This watches `docs/openapi/**/*.yaml` and auto-runs the bundler whenever you save changes. -## Bundling Methods: Python vs. Redocly - -We support **two bundling methods** – choose based on your workflow: +## Bundling -| Method | Command | Use Case | Pros | Cons | -|--------|---------|----------|------|------| -| **Python** | `just bundle` | Production, CI/CD | Zero dependencies, fast, proven | Fewer features | -| **Redocly** | `just bundle-redocly` | Local development | Industry standard, better errors, more features | Requires Node.js/Bun | +The Python bundler is used everywhere (local + CI) to generate `docs/openapi.json`. It performs schema validation while producing the bundle. -Both produce identical `docs/openapi.json` output. **CI/CD uses Python only** (no Node.js dependency). +- Standard run: `just bundle` +- Skip validation (faster iteration): `just bundle-fast` +- Direct command: `python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json` ## Adding New Endpoints or Schemas @@ -151,38 +148,19 @@ Both produce identical `docs/openapi.json` output. **CI/CD uses Python only** (n ## Linting and Validation -We support **two linters** with different philosophies: +Mintlify's CLI is the single source of truth for OpenAPI validation. Always bundle before linting so the CLI operates on `docs/openapi.json`: -### Spectral (Primary Linter) ```bash just lint -# or: bunx spectral lint docs/openapi/index.yaml +# or: python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json --no-validate \ +# && mintlify openapi-check docs/openapi.json ``` -- **Used in CI/CD** - must pass for PRs to merge -- Uses `.spectral.mjs` ruleset -- Focused on OpenAPI spec compliance -- Less strict, more practical +- Validates the bundled spec that Mintlify serves (ensures parity with production) +- Matches the validation Mintlify applies when rendering docs +- Requires Node.js ≥ 18 (use `nvm`, `asdf`, or Bun to provide a compatible runtime) -### Redocly CLI (Optional, Stricter) -```bash -just lint-redocly -# or: bunx redocly lint docs/openapi/index.yaml -``` - -- **Optional** - for extra validation during development -- Uses `.redocly.yaml` config (customized for our API) -- Stricter rules, catches more style issues -- May show warnings that Spectral doesn't flag -- Requires Bun/Node.js - -**Recommendation:** Run `just lint` (Spectral) before committing. Use `just lint-redocly` optionally for deeper validation. - -### Run Both -```bash -just lint-all -# Runs Spectral + Redocly -``` +Run the linter as part of your workflow before committing or opening a PR. ## Schema Validation @@ -257,7 +235,7 @@ just split A GitHub Actions workflow (`.github/workflows/openapi-validation.yml`) runs on every PR: -1. Lints with Spectral +1. Lints with Mintlify CLI 2. Bundles with Python 3. Validates bundle matches committed `openapi.json` @@ -270,8 +248,9 @@ If you forget to bundle or have lint errors, CI will fail. - `tools/openapi_yaml.py` – Minimal YAML parser - `tests/test_openapi_bundle.py` – Bundle regression test - `scripts/pre-commit.sh` – Pre-commit hook for auto-bundling -- `package.json` – Bun/Node.js dependencies (Redocly, etc.) -- `.spectral.mjs` – Spectral lint configuration +- `package.json` – CLI scripts (Mintlify CLI, chokidar) +- `.tool-versions` – `mise`-managed Node.js/Bun/Python versions +- `requirements-dev.txt` – Python dependencies for the bundler (PyYAML) - `.watchmanconfig` – Watchman file watching config ## Performance Comparison @@ -279,28 +258,17 @@ If you forget to bundle or have lint errors, CI will fail. **Bundling speed** (9700+ line OpenAPI spec): - Python bundler: ~100-200ms -- Redocly CLI: ~150-300ms Both are fast enough for development. Python is used in CI for zero dependencies. **Linting speed:** -- Spectral: ~1-2s for 1MB spec -- Redocly CLI: <1s for 1MB spec +- Mintlify CLI (`openapi-check`): ~1s for 1MB spec (depends on Node runtime) ## Additional Tools ### Preview Docs Locally -Two preview options available: - -**Redocly Preview** (OpenAPI only): -```bash -just preview -# Opens http://localhost:8080 with interactive API docs -# Only shows OpenAPI spec, no MDX content -``` - **Mintlify Preview** (Full documentation): ```bash just preview-mintlify @@ -320,12 +288,6 @@ just dev-full # Bundles + validates + tests + starts Mintlify ``` -### Show Spec Statistics -```bash -just stats -# Shows endpoints, schemas, operations count -``` - ### Format YAML Files ```bash just format @@ -336,9 +298,6 @@ just format - **Justfile commands:** `just --list` or `just help` - **Python bundler:** `python -m tools.openapi_bundle --help` -- **Redocly CLI:** `bun redocly --help` -- **Spectral docs:** https://docs.stoplight.io/docs/spectral -- **Redocly docs:** https://redocly.com/docs/cli +- **Mintlify CLI:** `mintlify --help` For detailed developer workflows, see `docs/openapi/DEVELOPER_GUIDE.md`. - diff --git a/justfile b/justfile index 0847c447..b8eca73f 100644 --- a/justfile +++ b/justfile @@ -1,244 +1,210 @@ -# Terminal49 API Documentation - Task Runner -# Usage: just -# List all commands: just --list - -# Default: show available commands -default: - @just --list - -# ======================================== -# OpenAPI Bundling (Python - Production) -# ======================================== - -# Bundle OpenAPI using Python (production method, used in CI) -bundle: - @echo "🔄 Bundling with Python..." - python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json - @echo "✅ Bundle complete" - -# Bundle without schema validation (faster, use with caution) -bundle-fast: - @echo "🔄 Bundling without validation..." - python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json --no-validate - @echo "✅ Bundle complete (validation skipped)" - -# ======================================== -# OpenAPI Bundling (Redocly - Optional) -# ======================================== - -# Bundle using Redocly CLI (requires Bun/Node.js) -bundle-redocly: - @echo "🔄 Bundling with Redocly CLI..." - bunx redocly bundle docs/openapi/index.yaml -o docs/openapi.json - @echo "✅ Bundle complete" - -# Bundle with full dereferencing (no $ref in output) -bundle-dereferenced: - @echo "🔄 Bundling with full dereferencing..." - bunx redocly bundle docs/openapi/index.yaml -o docs/openapi-dereferenced.json --dereferenced - @echo "✅ Dereferenced bundle created" - -# ======================================== -# Linting & Validation -# ======================================== - -# Lint with Spectral (default linter, used in CI) -# Note: Lints the bundled JSON file, not modular YAML -lint: - @echo "🔍 Linting bundled OpenAPI with Spectral..." - bunx spectral lint docs/openapi.json - -# Lint with Redocly CLI (optional, stricter rules) -# Note: May show more warnings than Spectral -# Configure rules in .redocly.yaml -lint-redocly: - @echo "🔍 Linting with Redocly (stricter rules)..." - bunx redocly lint docs/openapi/index.yaml - -# Run both linters -lint-all: - @echo "🔍 Running all linters..." - @just lint - @just lint-redocly - -# ======================================== -# Testing -# ======================================== - -# Run OpenAPI bundle regression test -test: - @echo "🧪 Running bundle regression test..." - python -m unittest tests.test_openapi_bundle - -# Validate everything (bundle + lint + test) -validate: bundle lint test - @echo "✅ All validations passed" - -# Full validation with both linters -validate-full: bundle lint-all test - @echo "✅ All validations passed (full)" - -# ======================================== -# Development Workflow -# ======================================== - -# Watch for changes and auto-bundle (requires Bun + chokidar) -watch: - @echo "👀 Watching docs/openapi/**/*.yaml for changes..." - @echo "Press Ctrl+C to stop" - bun run watch - -# Watch and use Redocly -watch-redocly: - @echo "👀 Watching with Redocly..." - bunx chokidar 'docs/openapi/**/*.yaml' -c 'bunx redocly bundle docs/openapi/index.yaml -o docs/openapi.json' --initial - -# Show OpenAPI spec statistics -stats: - @echo "📊 OpenAPI Statistics:" - bunx redocly stats docs/openapi/index.yaml - -# ======================================== -# Documentation Preview -# ======================================== - -# Preview OpenAPI with Redocly (interactive API docs) -preview: - @echo "🌐 Starting Redocly preview server..." - @echo "Opens at http://localhost:8080" - bunx redocly preview-docs docs/openapi/index.yaml - -# Preview full docs with Mintlify (includes MDX content) -preview-mintlify: - @echo "📦 Ensuring OpenAPI bundle is up to date..." - @just bundle-fast - @echo "📚 Starting Mintlify dev server..." - @echo "Opens at http://localhost:3000" - @echo "Mintlify will use docs/openapi.json" - cd docs && npx -y mintlify dev - -# Bundle, lint, then preview with Mintlify -dev: bundle lint preview-mintlify - -# Bundle, validate, then preview with Mintlify (thorough) -dev-full: validate preview-mintlify - -# ======================================== -# Git Hooks -# ======================================== - -# Install pre-commit hook -install-hooks: - @echo "🪝 Installing pre-commit hook..." - cp scripts/pre-commit.sh .git/hooks/pre-commit - chmod +x .git/hooks/pre-commit - @echo "✅ Pre-commit hook installed" - -# Uninstall pre-commit hook -uninstall-hooks: - @echo "🗑️ Removing pre-commit hook..." - rm -f .git/hooks/pre-commit - @echo "✅ Pre-commit hook removed" - -# ======================================== -# Setup & Dependencies -# ======================================== - -# Setup development environment (Python + Bun + hooks) -setup: - @echo "🚀 Setting up development environment..." - @echo "" - @echo "📦 Installing Bun dependencies..." - bun install - @echo "" - @echo "🪝 Installing pre-commit hook..." - @just install-hooks - @echo "" - @echo "✅ Setup complete!" - @echo "" - @echo "Try these commands:" - @echo " just bundle - Bundle with Python (production)" - @echo " just lint - Lint with Spectral" - @echo " just watch - Auto-bundle on file changes" - @echo " just preview - Preview docs locally" - -# Install Bun dependencies -install: - @echo "📦 Installing Bun dependencies..." - bun install - -# Update dependencies -update: - @echo "⬆️ Updating dependencies..." - bun update - -# ======================================== -# Utilities -# ======================================== - -# Split a monolithic openapi.json back into modular files (destructive!) -split: - @echo "⚠️ This will overwrite existing YAML files!" - @echo "Press Ctrl+C to cancel, or Enter to continue..." - @read - python scripts/split_openapi.py - @echo "✅ Split complete" - -# Clean generated files -clean: - @echo "🧹 Cleaning generated files..." - rm -f docs/openapi-dereferenced.json - @echo "✅ Clean complete" - -# Format YAML files (requires prettier) -format: - @echo "💅 Formatting YAML files..." - bunx prettier --write "docs/openapi/**/*.yaml" - -# Check YAML formatting -format-check: - @echo "🔍 Checking YAML formatting..." - bunx prettier --check "docs/openapi/**/*.yaml" - -# ======================================== -# CI/CD Simulation -# ======================================== - -# Simulate CI workflow -ci: bundle lint test - @echo "✅ CI workflow passed" - -# Generate Postman collection (used in GitHub Actions) -postman: - @echo "📮 Generating Postman collection..." - openapi2postmanv2 -s docs/openapi.json -o Terminal49-API.postman_collection.json -p -O folderStrategy=Tags - @echo "✅ Postman collection generated" - -# ======================================== -# Help & Documentation -# ======================================== - -# Show detailed help -help: - @echo "Terminal49 API Documentation - Task Runner" - @echo "" - @echo "🚀 Quick Start:" - @echo " just dev - Bundle + lint + preview with Mintlify" - @echo " just setup - First-time setup (install deps + hooks)" - @echo "" - @echo "📦 Building:" - @echo " just bundle - Bundle OpenAPI with Python (production)" - @echo " just bundle-redocly - Bundle OpenAPI with Redocly CLI (optional)" - @echo " just validate - Bundle + lint + test" - @echo "" - @echo "👀 Development:" - @echo " just watch - Auto-bundle on file changes" - @echo " just preview - Preview OpenAPI with Redocly" - @echo " just preview-mintlify - Preview full docs with Mintlify" - @echo "" - @echo "🔍 Quality:" - @echo " just lint - Lint with Spectral" - @echo " just test - Run regression tests" - @echo "" - @echo "For full command list: just --list" - @echo "For justfile documentation: cat justfile" +# Terminal49 API Documentation - Task Runner +# Usage: just +# List all commands: just --list + +# Default: show available commands +default: + @just --list + +# ======================================== +# OpenAPI Bundling (Python - Production) +# ======================================== + +# Bundle OpenAPI using Python (production method, used in CI) +bundle: + @echo "🔄 Bundling with Python..." + python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json + @echo "✅ Bundle complete" + +# Bundle without schema validation (faster, use with caution) +bundle-fast: + @echo "🔄 Bundling without validation..." + python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json --no-validate + @echo "✅ Bundle complete (validation skipped)" + +# ======================================== +# Linting & Validation +# ======================================== + +# Lint OpenAPI with Mintlify CLI +lint: + @echo "🔄 Ensuring OpenAPI bundle is up to date..." + @just bundle-fast + @echo "🔍 Linting OpenAPI with Mintlify CLI..." + npx -y mintlify openapi-check docs/openapi.json + +# ======================================== +# Testing +# ======================================== + +# Run OpenAPI bundle regression test +test: + @echo "🧪 Running bundle regression test..." + python -m unittest tests.test_openapi_bundle + +# Validate everything (bundle + lint + test) +validate: bundle lint test + @echo "✅ All validations passed" + +# Full validation (kept for backwards compatibility) +validate-full: + @just validate + @echo "✅ All validations passed (full)" + +# ======================================== +# Development Workflow +# ======================================== + +# Watch for changes and auto-bundle (requires Bun + chokidar) +watch: + @echo "👀 Watching docs/openapi/**/*.yaml for changes..." + @echo "Press Ctrl+C to stop" + bun run watch + +# ======================================== +# Documentation Preview +# ======================================== + +# Preview full docs with Mintlify (includes MDX content) +preview-mintlify: + @echo "📦 Ensuring OpenAPI bundle is up to date..." + @just bundle-fast + @echo "📚 Starting Mintlify dev server..." + @echo "Opens at http://localhost:3000" + @echo "Mintlify will use docs/openapi.json" + cd docs && npx -y mintlify dev + +# Bundle, lint, then preview with Mintlify +dev: bundle lint preview-mintlify + +# Bundle, validate, then preview with Mintlify (thorough) +dev-full: validate preview-mintlify + +# ======================================== +# Git Hooks +# ======================================== + +# Install pre-commit hook +install-hooks: + @echo "🪝 Installing pre-commit hook..." + cp scripts/pre-commit.sh .git/hooks/pre-commit + chmod +x .git/hooks/pre-commit + @echo "✅ Pre-commit hook installed" + +# Uninstall pre-commit hook +uninstall-hooks: + @echo "🗑️ Removing pre-commit hook..." + rm -f .git/hooks/pre-commit + @echo "✅ Pre-commit hook removed" + +# ======================================== +# Setup & Dependencies +# ======================================== + +# Setup development environment (Python + Bun + hooks) +setup: + @echo "🚀 Setting up development environment..." + @echo "" + @echo "🛠️ Installing toolchain with mise..." + mise install + @echo "" + @if command -v uv >/dev/null 2>&1; then \ + echo "🐍 Installing Python deps with uv..."; \ + uv pip install --upgrade --quiet -r requirements-dev.txt; \ + else \ + echo "🐍 Installing Python deps with pip..."; \ + python -m pip install --upgrade --quiet -r requirements-dev.txt; \ + fi + @echo "" + @echo "📦 Installing Bun dependencies..." + bun install + @echo "" + @echo "🪝 Installing pre-commit hook..." + @just install-hooks + @echo "" + @echo "✅ Setup complete!" + @echo "" + @echo "Try these commands:" + @echo " just bundle - Bundle with Python (production)" + @echo " just lint - Lint with Mintlify CLI" + @echo " just watch - Auto-bundle on file changes" + @echo " just preview-mintlify - Preview docs locally" + +# Install Bun dependencies +install: + @echo "📦 Installing Bun dependencies..." + bun install + +# Update dependencies +update: + @echo "⬆️ Updating dependencies..." + bun update + +# ======================================== +# Utilities +# ======================================== + +# Split a monolithic openapi.json back into modular files (destructive!) +split: + @echo "⚠️ This will overwrite existing YAML files!" + @echo "Press Ctrl+C to cancel, or Enter to continue..." + @read + python scripts/split_openapi.py + @echo "✅ Split complete" + +# Clean generated files +clean: + @echo "🧹 Cleaning generated files..." + rm -f docs/openapi-dereferenced.json + @echo "✅ Clean complete" + +# Format YAML files (requires prettier) +format: + @echo "💅 Formatting YAML files..." + bunx prettier --write "docs/openapi/**/*.yaml" + +# Check YAML formatting +format-check: + @echo "🔍 Checking YAML formatting..." + bunx prettier --check "docs/openapi/**/*.yaml" + +# ======================================== +# CI/CD Simulation +# ======================================== + +# Simulate CI workflow +ci: bundle lint test + @echo "✅ CI workflow passed" + +# Generate Postman collection (used in GitHub Actions) +postman: + @echo "📮 Generating Postman collection..." + openapi2postmanv2 -s docs/openapi.json -o Terminal49-API.postman_collection.json -p -O folderStrategy=Tags + @echo "✅ Postman collection generated" + +# ======================================== +# Help & Documentation +# ======================================== + +# Show detailed help +help: + @echo "Terminal49 API Documentation - Task Runner" + @echo "" + @echo "🚀 Quick Start:" + @echo " just dev - Bundle + lint + preview with Mintlify" + @echo " just setup - First-time setup (install deps + hooks)" + @echo "" + @echo "📦 Building:" + @echo " just bundle - Bundle OpenAPI with Python (production)" + @echo " just validate - Bundle + lint + test" + @echo "" + @echo "👀 Development:" + @echo " just watch - Auto-bundle on file changes" + @echo " just preview-mintlify - Preview full docs with Mintlify" + @echo "" + @echo "🔍 Quality:" + @echo " just lint - Lint with Mintlify CLI" + @echo " just test - Run regression tests" + @echo "" + @echo "For full command list: just --list" + @echo "For justfile documentation: cat justfile" diff --git a/package.json b/package.json index 56310d6d..0257c019 100644 --- a/package.json +++ b/package.json @@ -3,25 +3,17 @@ "version": "1.0.0", "private": true, "description": "Terminal49 API documentation with modular OpenAPI specifications", - "scripts": { - "bundle": "python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json", - "bundle:redocly": "redocly bundle docs/openapi/index.yaml -o docs/openapi.json", - "bundle:dereferenced": "redocly bundle docs/openapi/index.yaml -o docs/openapi.json --dereferenced", - "lint": "redocly lint docs/openapi/index.yaml", - "lint:spectral": "spectral lint docs/openapi/index.yaml", - "validate": "bun run bundle && bun run lint && python -m unittest tests.test_openapi_bundle", - "watch": "chokidar 'docs/openapi/**/*.yaml' -c 'python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json --no-validate' --initial", - "preview": "redocly preview-docs docs/openapi/index.yaml", - "preview:mintlify": "mintlify dev", - "stats": "redocly stats docs/openapi/index.yaml" - }, - "devDependencies": { - "@redocly/cli": "^1.25.14", - "@stoplight/spectral-cli": "^6.13.1", - "@stoplight/spectral-rulesets": "^1.20.2", - "chokidar-cli": "^3.0.0", - "mintlify": "^4.0.0" - }, + "scripts": { + "bundle": "python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json", + "lint": "python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json --no-validate && mintlify openapi-check docs/openapi.json", + "validate": "bun run bundle && bun run lint && python -m unittest tests.test_openapi_bundle", + "watch": "chokidar 'docs/openapi/**/*.yaml' -c 'python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json --no-validate' --initial", + "preview:mintlify": "mintlify dev" + }, + "devDependencies": { + "chokidar-cli": "^3.0.0", + "mintlify": "^4.0.0" + }, "engines": { "node": ">=18.0.0", "bun": ">=1.0.0" diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 00000000..90348139 --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1 @@ +PyYAML>=6.0,<7.0 diff --git a/scripts/pre-commit.sh b/scripts/pre-commit.sh index 218daf4e..9aa88d89 100644 --- a/scripts/pre-commit.sh +++ b/scripts/pre-commit.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Pre-commit hook for OpenAPI bundling # This ensures the bundled openapi.json is always in sync with the modular YAML sources @@ -10,15 +10,29 @@ GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color -# Check if any OpenAPI YAML files were modified -if git diff --cached --name-only | grep -q "^docs/openapi/.*\.yaml$"; then - echo -e "${YELLOW}🔄 OpenAPI YAML files changed, regenerating bundle...${NC}" - - # Run the bundler - if python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json; then - echo -e "${GREEN}✅ Bundle regenerated successfully${NC}" - - # Check if the bundle changed +# Resolve a Python runtime (python, python3, or mise-managed) +run_python() { + if command -v python >/dev/null 2>&1; then + python "$@" + elif command -v python3 >/dev/null 2>&1; then + python3 "$@" + elif command -v mise >/dev/null 2>&1; then + mise exec -- python "$@" + else + echo -e "${RED}❌ No Python interpreter found. Install one via mise (just setup) or add python to PATH.${NC}" + exit 1 + fi +} + +# Check if any OpenAPI YAML files were modified +if git diff --cached --name-only | grep -q "^docs/openapi/.*\.yaml$"; then + echo -e "${YELLOW}🔄 OpenAPI YAML files changed, regenerating bundle...${NC}" + + # Run the bundler + if run_python -m tools.openapi_bundle docs/openapi/index.yaml docs/openapi.json; then + echo -e "${GREEN}✅ Bundle regenerated successfully${NC}" + + # Check if the bundle changed if git diff --name-only docs/openapi.json | grep -q "openapi.json"; then echo -e "${YELLOW}📝 Staging updated openapi.json${NC}" git add docs/openapi.json @@ -36,15 +50,15 @@ fi # Check that openapi.json is in sync (extra safety check) if git diff --cached --name-only | grep -q "^docs/openapi.json$"; then # If openapi.json is being committed, verify it matches the bundle - echo -e "${YELLOW}🔍 Verifying openapi.json is in sync...${NC}" - - # Create a temp file with the freshly bundled version - TEMP_BUNDLE=$(mktemp) - python -m tools.openapi_bundle docs/openapi/index.yaml "$TEMP_BUNDLE" 2>/dev/null || { - echo -e "${RED}❌ Failed to create verification bundle${NC}" - rm -f "$TEMP_BUNDLE" - exit 1 - } + echo -e "${YELLOW}🔍 Verifying openapi.json is in sync...${NC}" + + # Create a temp file with the freshly bundled version + TEMP_BUNDLE=$(mktemp) + run_python -m tools.openapi_bundle docs/openapi/index.yaml "$TEMP_BUNDLE" 2>/dev/null || { + echo -e "${RED}❌ Failed to create verification bundle${NC}" + rm -f "$TEMP_BUNDLE" + exit 1 + } # Compare the staged version with the freshly bundled version if ! diff -q docs/openapi.json "$TEMP_BUNDLE" > /dev/null 2>&1; then diff --git a/tools/openapi_bundle.py b/tools/openapi_bundle.py index 20580e46..44d2a2c9 100644 --- a/tools/openapi_bundle.py +++ b/tools/openapi_bundle.py @@ -89,7 +89,11 @@ def _resolve(value: Any, current_file: Path, stack: set[Tuple[Path, str | None]] error_msg.append(f" ... and {len(resolved.keys()) - 10} more") raise BundleError("\n".join(error_msg)) return _resolve(resolved, target_file, stack | {key}) - return {k: _resolve(v, current_file, stack) for k, v in value.items()} + normalized: Dict[str, Any] = {} + for k, v in value.items(): + key = k if isinstance(k, str) else str(k) + normalized[key] = _resolve(v, current_file, stack) + return normalized if isinstance(value, list): return [_resolve(item, current_file, stack) for item in value] return value