monday-cli 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +439 -0
- package/LICENSE +21 -0
- package/README.md +431 -0
- package/dist/api/board-child-finder.d.ts +95 -0
- package/dist/api/board-child-finder.d.ts.map +1 -0
- package/dist/api/board-child-finder.js +89 -0
- package/dist/api/board-child-finder.js.map +1 -0
- package/dist/api/board-metadata.d.ts +162 -0
- package/dist/api/board-metadata.d.ts.map +1 -0
- package/dist/api/board-metadata.js +238 -0
- package/dist/api/board-metadata.js.map +1 -0
- package/dist/api/board-mutation-invalidation.d.ts +153 -0
- package/dist/api/board-mutation-invalidation.d.ts.map +1 -0
- package/dist/api/board-mutation-invalidation.js +136 -0
- package/dist/api/board-mutation-invalidation.js.map +1 -0
- package/dist/api/board-mutation-result.d.ts +97 -0
- package/dist/api/board-mutation-result.d.ts.map +1 -0
- package/dist/api/board-mutation-result.js +99 -0
- package/dist/api/board-mutation-result.js.map +1 -0
- package/dist/api/board-projection.d.ts +68 -0
- package/dist/api/board-projection.d.ts.map +1 -0
- package/dist/api/board-projection.js +79 -0
- package/dist/api/board-projection.js.map +1 -0
- package/dist/api/cache.d.ts +150 -0
- package/dist/api/cache.d.ts.map +1 -0
- package/dist/api/cache.js +418 -0
- package/dist/api/cache.js.map +1 -0
- package/dist/api/client.d.ts +162 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +205 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/column-mapping.d.ts +68 -0
- package/dist/api/column-mapping.d.ts.map +1 -0
- package/dist/api/column-mapping.js +117 -0
- package/dist/api/column-mapping.js.map +1 -0
- package/dist/api/column-mutation-result.d.ts +136 -0
- package/dist/api/column-mutation-result.d.ts.map +1 -0
- package/dist/api/column-mutation-result.js +130 -0
- package/dist/api/column-mutation-result.js.map +1 -0
- package/dist/api/column-types.d.ts +215 -0
- package/dist/api/column-types.d.ts.map +1 -0
- package/dist/api/column-types.js +195 -0
- package/dist/api/column-types.js.map +1 -0
- package/dist/api/column-values.d.ts +446 -0
- package/dist/api/column-values.d.ts.map +1 -0
- package/dist/api/column-values.js +795 -0
- package/dist/api/column-values.js.map +1 -0
- package/dist/api/columns.d.ts +205 -0
- package/dist/api/columns.d.ts.map +1 -0
- package/dist/api/columns.js +343 -0
- package/dist/api/columns.js.map +1 -0
- package/dist/api/complexity.d.ts +90 -0
- package/dist/api/complexity.d.ts.map +1 -0
- package/dist/api/complexity.js +194 -0
- package/dist/api/complexity.js.map +1 -0
- package/dist/api/dates.d.ts +150 -0
- package/dist/api/dates.d.ts.map +1 -0
- package/dist/api/dates.js +490 -0
- package/dist/api/dates.js.map +1 -0
- package/dist/api/destructive-gate.d.ts +107 -0
- package/dist/api/destructive-gate.d.ts.map +1 -0
- package/dist/api/destructive-gate.js +19 -0
- package/dist/api/destructive-gate.js.map +1 -0
- package/dist/api/dry-run.d.ts +338 -0
- package/dist/api/dry-run.d.ts.map +1 -0
- package/dist/api/dry-run.js +607 -0
- package/dist/api/dry-run.js.map +1 -0
- package/dist/api/emails.d.ts +60 -0
- package/dist/api/emails.d.ts.map +1 -0
- package/dist/api/emails.js +113 -0
- package/dist/api/emails.js.map +1 -0
- package/dist/api/errors.d.ts +82 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +434 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/filters.d.ts +198 -0
- package/dist/api/filters.d.ts.map +1 -0
- package/dist/api/filters.js +328 -0
- package/dist/api/filters.js.map +1 -0
- package/dist/api/group-color.d.ts +33 -0
- package/dist/api/group-color.d.ts.map +1 -0
- package/dist/api/group-color.js +80 -0
- package/dist/api/group-color.js.map +1 -0
- package/dist/api/group-mutation-result.d.ts +150 -0
- package/dist/api/group-mutation-result.d.ts.map +1 -0
- package/dist/api/group-mutation-result.js +141 -0
- package/dist/api/group-mutation-result.js.map +1 -0
- package/dist/api/iso-country-codes.d.ts +45 -0
- package/dist/api/iso-country-codes.d.ts.map +1 -0
- package/dist/api/iso-country-codes.js +71 -0
- package/dist/api/iso-country-codes.js.map +1 -0
- package/dist/api/item-board-lookup.d.ts +86 -0
- package/dist/api/item-board-lookup.d.ts.map +1 -0
- package/dist/api/item-board-lookup.js +140 -0
- package/dist/api/item-board-lookup.js.map +1 -0
- package/dist/api/item-helpers.d.ts +133 -0
- package/dist/api/item-helpers.d.ts.map +1 -0
- package/dist/api/item-helpers.js +139 -0
- package/dist/api/item-helpers.js.map +1 -0
- package/dist/api/item-mutation-result.d.ts +60 -0
- package/dist/api/item-mutation-result.d.ts.map +1 -0
- package/dist/api/item-mutation-result.js +63 -0
- package/dist/api/item-mutation-result.js.map +1 -0
- package/dist/api/item-projection.d.ts +165 -0
- package/dist/api/item-projection.d.ts.map +1 -0
- package/dist/api/item-projection.js +235 -0
- package/dist/api/item-projection.js.map +1 -0
- package/dist/api/item-source-read.d.ts +45 -0
- package/dist/api/item-source-read.d.ts.map +1 -0
- package/dist/api/item-source-read.js +57 -0
- package/dist/api/item-source-read.js.map +1 -0
- package/dist/api/items-page-walker.d.ts +126 -0
- package/dist/api/items-page-walker.d.ts.map +1 -0
- package/dist/api/items-page-walker.js +256 -0
- package/dist/api/items-page-walker.js.map +1 -0
- package/dist/api/links.d.ts +70 -0
- package/dist/api/links.d.ts.map +1 -0
- package/dist/api/links.js +128 -0
- package/dist/api/links.js.map +1 -0
- package/dist/api/me-token.d.ts +52 -0
- package/dist/api/me-token.d.ts.map +1 -0
- package/dist/api/me-token.js +55 -0
- package/dist/api/me-token.js.map +1 -0
- package/dist/api/pagination.d.ts +201 -0
- package/dist/api/pagination.d.ts.map +1 -0
- package/dist/api/pagination.js +223 -0
- package/dist/api/pagination.js.map +1 -0
- package/dist/api/partial-success-mutation.d.ts +28 -0
- package/dist/api/partial-success-mutation.d.ts.map +1 -0
- package/dist/api/partial-success-mutation.js +68 -0
- package/dist/api/partial-success-mutation.js.map +1 -0
- package/dist/api/people.d.ts +182 -0
- package/dist/api/people.d.ts.map +1 -0
- package/dist/api/people.js +260 -0
- package/dist/api/people.js.map +1 -0
- package/dist/api/phones.d.ts +74 -0
- package/dist/api/phones.d.ts.map +1 -0
- package/dist/api/phones.js +167 -0
- package/dist/api/phones.js.map +1 -0
- package/dist/api/raw-document.d.ts +53 -0
- package/dist/api/raw-document.d.ts.map +1 -0
- package/dist/api/raw-document.js +177 -0
- package/dist/api/raw-document.js.map +1 -0
- package/dist/api/raw-write.d.ts +127 -0
- package/dist/api/raw-write.d.ts.map +1 -0
- package/dist/api/raw-write.js +233 -0
- package/dist/api/raw-write.js.map +1 -0
- package/dist/api/resolution-context.d.ts +32 -0
- package/dist/api/resolution-context.d.ts.map +1 -0
- package/dist/api/resolution-context.js +42 -0
- package/dist/api/resolution-context.js.map +1 -0
- package/dist/api/resolution-pass.d.ts +163 -0
- package/dist/api/resolution-pass.d.ts.map +1 -0
- package/dist/api/resolution-pass.js +254 -0
- package/dist/api/resolution-pass.js.map +1 -0
- package/dist/api/resolve-client.d.ts +69 -0
- package/dist/api/resolve-client.d.ts.map +1 -0
- package/dist/api/resolve-client.js +70 -0
- package/dist/api/resolve-client.js.map +1 -0
- package/dist/api/resolver-error-fold.d.ts +176 -0
- package/dist/api/resolver-error-fold.d.ts.map +1 -0
- package/dist/api/resolver-error-fold.js +230 -0
- package/dist/api/resolver-error-fold.js.map +1 -0
- package/dist/api/resolvers.d.ts +131 -0
- package/dist/api/resolvers.d.ts.map +1 -0
- package/dist/api/resolvers.js +262 -0
- package/dist/api/resolvers.js.map +1 -0
- package/dist/api/response-root.d.ts +65 -0
- package/dist/api/response-root.d.ts.map +1 -0
- package/dist/api/response-root.js +61 -0
- package/dist/api/response-root.js.map +1 -0
- package/dist/api/retry.d.ts +112 -0
- package/dist/api/retry.d.ts.map +1 -0
- package/dist/api/retry.js +181 -0
- package/dist/api/retry.js.map +1 -0
- package/dist/api/set-expression.d.ts +23 -0
- package/dist/api/set-expression.d.ts.map +1 -0
- package/dist/api/set-expression.js +31 -0
- package/dist/api/set-expression.js.map +1 -0
- package/dist/api/sort.d.ts +59 -0
- package/dist/api/sort.d.ts.map +1 -0
- package/dist/api/sort.js +73 -0
- package/dist/api/sort.js.map +1 -0
- package/dist/api/source-aggregator.d.ts +94 -0
- package/dist/api/source-aggregator.d.ts.map +1 -0
- package/dist/api/source-aggregator.js +111 -0
- package/dist/api/source-aggregator.js.map +1 -0
- package/dist/api/transport.d.ts +58 -0
- package/dist/api/transport.d.ts.map +1 -0
- package/dist/api/transport.js +190 -0
- package/dist/api/transport.js.map +1 -0
- package/dist/api/update-mutation-result.d.ts +133 -0
- package/dist/api/update-mutation-result.d.ts.map +1 -0
- package/dist/api/update-mutation-result.js +145 -0
- package/dist/api/update-mutation-result.js.map +1 -0
- package/dist/api/users-fan-out-mutation.d.ts +124 -0
- package/dist/api/users-fan-out-mutation.d.ts.map +1 -0
- package/dist/api/users-fan-out-mutation.js +331 -0
- package/dist/api/users-fan-out-mutation.js.map +1 -0
- package/dist/api/walk-pages.d.ts +91 -0
- package/dist/api/walk-pages.d.ts.map +1 -0
- package/dist/api/walk-pages.js +84 -0
- package/dist/api/walk-pages.js.map +1 -0
- package/dist/api/workspace-projection.d.ts +64 -0
- package/dist/api/workspace-projection.d.ts.map +1 -0
- package/dist/api/workspace-projection.js +83 -0
- package/dist/api/workspace-projection.js.map +1 -0
- package/dist/cli/envelope-out.d.ts +128 -0
- package/dist/cli/envelope-out.d.ts.map +1 -0
- package/dist/cli/envelope-out.js +146 -0
- package/dist/cli/envelope-out.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +27 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/program.d.ts +29 -0
- package/dist/cli/program.d.ts.map +1 -0
- package/dist/cli/program.js +109 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/run.d.ts +108 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +105 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/commands/account/client-helper.d.ts +37 -0
- package/dist/commands/account/client-helper.d.ts.map +1 -0
- package/dist/commands/account/client-helper.js +55 -0
- package/dist/commands/account/client-helper.js.map +1 -0
- package/dist/commands/account/complexity.d.ts +29 -0
- package/dist/commands/account/complexity.d.ts.map +1 -0
- package/dist/commands/account/complexity.js +70 -0
- package/dist/commands/account/complexity.js.map +1 -0
- package/dist/commands/account/info.d.ts +36 -0
- package/dist/commands/account/info.d.ts.map +1 -0
- package/dist/commands/account/info.js +74 -0
- package/dist/commands/account/info.js.map +1 -0
- package/dist/commands/account/version.d.ts +44 -0
- package/dist/commands/account/version.d.ts.map +1 -0
- package/dist/commands/account/version.js +98 -0
- package/dist/commands/account/version.js.map +1 -0
- package/dist/commands/account/whoami.d.ts +34 -0
- package/dist/commands/account/whoami.d.ts.map +1 -0
- package/dist/commands/account/whoami.js +77 -0
- package/dist/commands/account/whoami.js.map +1 -0
- package/dist/commands/board/add-users.d.ts +60 -0
- package/dist/commands/board/add-users.d.ts.map +1 -0
- package/dist/commands/board/add-users.js +133 -0
- package/dist/commands/board/add-users.js.map +1 -0
- package/dist/commands/board/archive.d.ts +64 -0
- package/dist/commands/board/archive.d.ts.map +1 -0
- package/dist/commands/board/archive.js +226 -0
- package/dist/commands/board/archive.js.map +1 -0
- package/dist/commands/board/column-create.d.ts +146 -0
- package/dist/commands/board/column-create.d.ts.map +1 -0
- package/dist/commands/board/column-create.js +564 -0
- package/dist/commands/board/column-create.js.map +1 -0
- package/dist/commands/board/column-delete.d.ts +76 -0
- package/dist/commands/board/column-delete.d.ts.map +1 -0
- package/dist/commands/board/column-delete.js +224 -0
- package/dist/commands/board/column-delete.js.map +1 -0
- package/dist/commands/board/column-update.d.ts +92 -0
- package/dist/commands/board/column-update.d.ts.map +1 -0
- package/dist/commands/board/column-update.js +364 -0
- package/dist/commands/board/column-update.js.map +1 -0
- package/dist/commands/board/columns.d.ts +30 -0
- package/dist/commands/board/columns.d.ts.map +1 -0
- package/dist/commands/board/columns.js +102 -0
- package/dist/commands/board/columns.js.map +1 -0
- package/dist/commands/board/create.d.ts +67 -0
- package/dist/commands/board/create.d.ts.map +1 -0
- package/dist/commands/board/create.js +226 -0
- package/dist/commands/board/create.js.map +1 -0
- package/dist/commands/board/delete.d.ts +60 -0
- package/dist/commands/board/delete.d.ts.map +1 -0
- package/dist/commands/board/delete.js +192 -0
- package/dist/commands/board/delete.js.map +1 -0
- package/dist/commands/board/describe.d.ts +68 -0
- package/dist/commands/board/describe.d.ts.map +1 -0
- package/dist/commands/board/describe.js +241 -0
- package/dist/commands/board/describe.js.map +1 -0
- package/dist/commands/board/doctor.d.ts +108 -0
- package/dist/commands/board/doctor.d.ts.map +1 -0
- package/dist/commands/board/doctor.js +417 -0
- package/dist/commands/board/doctor.js.map +1 -0
- package/dist/commands/board/duplicate.d.ts +85 -0
- package/dist/commands/board/duplicate.d.ts.map +1 -0
- package/dist/commands/board/duplicate.js +281 -0
- package/dist/commands/board/duplicate.js.map +1 -0
- package/dist/commands/board/find.d.ts +47 -0
- package/dist/commands/board/find.d.ts.map +1 -0
- package/dist/commands/board/find.js +153 -0
- package/dist/commands/board/find.js.map +1 -0
- package/dist/commands/board/get.d.ts +41 -0
- package/dist/commands/board/get.d.ts.map +1 -0
- package/dist/commands/board/get.js +66 -0
- package/dist/commands/board/get.js.map +1 -0
- package/dist/commands/board/group-archive.d.ts +83 -0
- package/dist/commands/board/group-archive.d.ts.map +1 -0
- package/dist/commands/board/group-archive.js +264 -0
- package/dist/commands/board/group-archive.js.map +1 -0
- package/dist/commands/board/group-create.d.ts +118 -0
- package/dist/commands/board/group-create.d.ts.map +1 -0
- package/dist/commands/board/group-create.js +239 -0
- package/dist/commands/board/group-create.js.map +1 -0
- package/dist/commands/board/group-delete.d.ts +79 -0
- package/dist/commands/board/group-delete.d.ts.map +1 -0
- package/dist/commands/board/group-delete.js +222 -0
- package/dist/commands/board/group-delete.js.map +1 -0
- package/dist/commands/board/group-duplicate.d.ts +70 -0
- package/dist/commands/board/group-duplicate.d.ts.map +1 -0
- package/dist/commands/board/group-duplicate.js +219 -0
- package/dist/commands/board/group-duplicate.js.map +1 -0
- package/dist/commands/board/group-update.d.ts +145 -0
- package/dist/commands/board/group-update.d.ts.map +1 -0
- package/dist/commands/board/group-update.js +341 -0
- package/dist/commands/board/group-update.js.map +1 -0
- package/dist/commands/board/groups.d.ts +28 -0
- package/dist/commands/board/groups.d.ts.map +1 -0
- package/dist/commands/board/groups.js +85 -0
- package/dist/commands/board/groups.js.map +1 -0
- package/dist/commands/board/list.d.ts +39 -0
- package/dist/commands/board/list.d.ts.map +1 -0
- package/dist/commands/board/list.js +135 -0
- package/dist/commands/board/list.js.map +1 -0
- package/dist/commands/board/subscribers.d.ts +24 -0
- package/dist/commands/board/subscribers.d.ts.map +1 -0
- package/dist/commands/board/subscribers.js +89 -0
- package/dist/commands/board/subscribers.js.map +1 -0
- package/dist/commands/board/update.d.ts +82 -0
- package/dist/commands/board/update.d.ts.map +1 -0
- package/dist/commands/board/update.js +328 -0
- package/dist/commands/board/update.js.map +1 -0
- package/dist/commands/cache/clear.d.ts +34 -0
- package/dist/commands/cache/clear.d.ts.map +1 -0
- package/dist/commands/cache/clear.js +113 -0
- package/dist/commands/cache/clear.js.map +1 -0
- package/dist/commands/cache/list.d.ts +50 -0
- package/dist/commands/cache/list.d.ts.map +1 -0
- package/dist/commands/cache/list.js +77 -0
- package/dist/commands/cache/list.js.map +1 -0
- package/dist/commands/cache/stats.d.ts +22 -0
- package/dist/commands/cache/stats.d.ts.map +1 -0
- package/dist/commands/cache/stats.js +56 -0
- package/dist/commands/cache/stats.js.map +1 -0
- package/dist/commands/config/path.d.ts +22 -0
- package/dist/commands/config/path.d.ts.map +1 -0
- package/dist/commands/config/path.js +74 -0
- package/dist/commands/config/path.js.map +1 -0
- package/dist/commands/config/show.d.ts +61 -0
- package/dist/commands/config/show.d.ts.map +1 -0
- package/dist/commands/config/show.js +137 -0
- package/dist/commands/config/show.js.map +1 -0
- package/dist/commands/emit.d.ts +156 -0
- package/dist/commands/emit.d.ts.map +1 -0
- package/dist/commands/emit.js +212 -0
- package/dist/commands/emit.js.map +1 -0
- package/dist/commands/index.d.ts +5 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +195 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/item/archive.d.ts +81 -0
- package/dist/commands/item/archive.d.ts.map +1 -0
- package/dist/commands/item/archive.js +187 -0
- package/dist/commands/item/archive.js.map +1 -0
- package/dist/commands/item/clear.d.ts +140 -0
- package/dist/commands/item/clear.d.ts.map +1 -0
- package/dist/commands/item/clear.js +748 -0
- package/dist/commands/item/clear.js.map +1 -0
- package/dist/commands/item/create.d.ts +77 -0
- package/dist/commands/item/create.d.ts.map +1 -0
- package/dist/commands/item/create.js +802 -0
- package/dist/commands/item/create.js.map +1 -0
- package/dist/commands/item/delete.d.ts +82 -0
- package/dist/commands/item/delete.d.ts.map +1 -0
- package/dist/commands/item/delete.js +179 -0
- package/dist/commands/item/delete.js.map +1 -0
- package/dist/commands/item/duplicate.d.ts +117 -0
- package/dist/commands/item/duplicate.d.ts.map +1 -0
- package/dist/commands/item/duplicate.js +238 -0
- package/dist/commands/item/duplicate.js.map +1 -0
- package/dist/commands/item/find.d.ts +55 -0
- package/dist/commands/item/find.d.ts.map +1 -0
- package/dist/commands/item/find.js +231 -0
- package/dist/commands/item/find.js.map +1 -0
- package/dist/commands/item/get.d.ts +47 -0
- package/dist/commands/item/get.d.ts.map +1 -0
- package/dist/commands/item/get.js +66 -0
- package/dist/commands/item/get.js.map +1 -0
- package/dist/commands/item/list.d.ts +73 -0
- package/dist/commands/item/list.d.ts.map +1 -0
- package/dist/commands/item/list.js +284 -0
- package/dist/commands/item/list.js.map +1 -0
- package/dist/commands/item/move.d.ts +181 -0
- package/dist/commands/item/move.d.ts.map +1 -0
- package/dist/commands/item/move.js +560 -0
- package/dist/commands/item/move.js.map +1 -0
- package/dist/commands/item/search.d.ts +67 -0
- package/dist/commands/item/search.d.ts.map +1 -0
- package/dist/commands/item/search.js +322 -0
- package/dist/commands/item/search.js.map +1 -0
- package/dist/commands/item/set.d.ts +88 -0
- package/dist/commands/item/set.d.ts.map +1 -0
- package/dist/commands/item/set.js +387 -0
- package/dist/commands/item/set.js.map +1 -0
- package/dist/commands/item/subitems.d.ts +50 -0
- package/dist/commands/item/subitems.d.ts.map +1 -0
- package/dist/commands/item/subitems.js +86 -0
- package/dist/commands/item/subitems.js.map +1 -0
- package/dist/commands/item/update.d.ts +99 -0
- package/dist/commands/item/update.d.ts.map +1 -0
- package/dist/commands/item/update.js +884 -0
- package/dist/commands/item/update.js.map +1 -0
- package/dist/commands/item/upsert.d.ts +105 -0
- package/dist/commands/item/upsert.d.ts.map +1 -0
- package/dist/commands/item/upsert.js +998 -0
- package/dist/commands/item/upsert.js.map +1 -0
- package/dist/commands/parse-argv.d.ts +20 -0
- package/dist/commands/parse-argv.d.ts.map +1 -0
- package/dist/commands/parse-argv.js +40 -0
- package/dist/commands/parse-argv.js.map +1 -0
- package/dist/commands/raw/index.d.ts +23 -0
- package/dist/commands/raw/index.d.ts.map +1 -0
- package/dist/commands/raw/index.js +416 -0
- package/dist/commands/raw/index.js.map +1 -0
- package/dist/commands/run-by-id-lookup.d.ts +72 -0
- package/dist/commands/run-by-id-lookup.d.ts.map +1 -0
- package/dist/commands/run-by-id-lookup.js +58 -0
- package/dist/commands/run-by-id-lookup.js.map +1 -0
- package/dist/commands/schema/index.d.ts +104 -0
- package/dist/commands/schema/index.d.ts.map +1 -0
- package/dist/commands/schema/index.js +183 -0
- package/dist/commands/schema/index.js.map +1 -0
- package/dist/commands/types.d.ts +66 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +15 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/commands/update/body-source.d.ts +38 -0
- package/dist/commands/update/body-source.d.ts.map +1 -0
- package/dist/commands/update/body-source.js +80 -0
- package/dist/commands/update/body-source.js.map +1 -0
- package/dist/commands/update/clear-all.d.ts +67 -0
- package/dist/commands/update/clear-all.d.ts.map +1 -0
- package/dist/commands/update/clear-all.js +281 -0
- package/dist/commands/update/clear-all.js.map +1 -0
- package/dist/commands/update/create.d.ts +51 -0
- package/dist/commands/update/create.d.ts.map +1 -0
- package/dist/commands/update/create.js +167 -0
- package/dist/commands/update/create.js.map +1 -0
- package/dist/commands/update/delete.d.ts +53 -0
- package/dist/commands/update/delete.d.ts.map +1 -0
- package/dist/commands/update/delete.js +148 -0
- package/dist/commands/update/delete.js.map +1 -0
- package/dist/commands/update/edit.d.ts +37 -0
- package/dist/commands/update/edit.d.ts.map +1 -0
- package/dist/commands/update/edit.js +129 -0
- package/dist/commands/update/edit.js.map +1 -0
- package/dist/commands/update/get.d.ts +37 -0
- package/dist/commands/update/get.d.ts.map +1 -0
- package/dist/commands/update/get.js +92 -0
- package/dist/commands/update/get.js.map +1 -0
- package/dist/commands/update/like.d.ts +17 -0
- package/dist/commands/update/like.d.ts.map +1 -0
- package/dist/commands/update/like.js +23 -0
- package/dist/commands/update/like.js.map +1 -0
- package/dist/commands/update/list.d.ts +58 -0
- package/dist/commands/update/list.d.ts.map +1 -0
- package/dist/commands/update/list.js +322 -0
- package/dist/commands/update/list.js.map +1 -0
- package/dist/commands/update/pin.d.ts +17 -0
- package/dist/commands/update/pin.d.ts.map +1 -0
- package/dist/commands/update/pin.js +23 -0
- package/dist/commands/update/pin.js.map +1 -0
- package/dist/commands/update/reply.d.ts +47 -0
- package/dist/commands/update/reply.d.ts.map +1 -0
- package/dist/commands/update/reply.js +149 -0
- package/dist/commands/update/reply.js.map +1 -0
- package/dist/commands/update/toggle.d.ts +70 -0
- package/dist/commands/update/toggle.d.ts.map +1 -0
- package/dist/commands/update/toggle.js +118 -0
- package/dist/commands/update/toggle.js.map +1 -0
- package/dist/commands/update/unlike.d.ts +17 -0
- package/dist/commands/update/unlike.d.ts.map +1 -0
- package/dist/commands/update/unlike.js +22 -0
- package/dist/commands/update/unlike.js.map +1 -0
- package/dist/commands/update/unpin.d.ts +17 -0
- package/dist/commands/update/unpin.d.ts.map +1 -0
- package/dist/commands/update/unpin.js +21 -0
- package/dist/commands/update/unpin.js.map +1 -0
- package/dist/commands/user/get.d.ts +31 -0
- package/dist/commands/user/get.d.ts.map +1 -0
- package/dist/commands/user/get.js +81 -0
- package/dist/commands/user/get.js.map +1 -0
- package/dist/commands/user/list.d.ts +61 -0
- package/dist/commands/user/list.d.ts.map +1 -0
- package/dist/commands/user/list.js +148 -0
- package/dist/commands/user/list.js.map +1 -0
- package/dist/commands/user/me.d.ts +17 -0
- package/dist/commands/user/me.d.ts.map +1 -0
- package/dist/commands/user/me.js +49 -0
- package/dist/commands/user/me.js.map +1 -0
- package/dist/commands/workspace/add-users.d.ts +76 -0
- package/dist/commands/workspace/add-users.d.ts.map +1 -0
- package/dist/commands/workspace/add-users.js +154 -0
- package/dist/commands/workspace/add-users.js.map +1 -0
- package/dist/commands/workspace/create.d.ts +59 -0
- package/dist/commands/workspace/create.d.ts.map +1 -0
- package/dist/commands/workspace/create.js +163 -0
- package/dist/commands/workspace/create.js.map +1 -0
- package/dist/commands/workspace/delete.d.ts +67 -0
- package/dist/commands/workspace/delete.d.ts.map +1 -0
- package/dist/commands/workspace/delete.js +182 -0
- package/dist/commands/workspace/delete.js.map +1 -0
- package/dist/commands/workspace/folders.d.ts +40 -0
- package/dist/commands/workspace/folders.d.ts.map +1 -0
- package/dist/commands/workspace/folders.js +124 -0
- package/dist/commands/workspace/folders.js.map +1 -0
- package/dist/commands/workspace/get.d.ts +35 -0
- package/dist/commands/workspace/get.d.ts.map +1 -0
- package/dist/commands/workspace/get.js +62 -0
- package/dist/commands/workspace/get.js.map +1 -0
- package/dist/commands/workspace/list.d.ts +57 -0
- package/dist/commands/workspace/list.d.ts.map +1 -0
- package/dist/commands/workspace/list.js +125 -0
- package/dist/commands/workspace/list.js.map +1 -0
- package/dist/commands/workspace/remove-users.d.ts +47 -0
- package/dist/commands/workspace/remove-users.d.ts.map +1 -0
- package/dist/commands/workspace/remove-users.js +122 -0
- package/dist/commands/workspace/remove-users.js.map +1 -0
- package/dist/commands/workspace/update.d.ts +68 -0
- package/dist/commands/workspace/update.d.ts.map +1 -0
- package/dist/commands/workspace/update.js +237 -0
- package/dist/commands/workspace/update.js.map +1 -0
- package/dist/config/load.d.ts +33 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +81 -0
- package/dist/config/load.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/types/global-flags.d.ts +69 -0
- package/dist/types/global-flags.d.ts.map +1 -0
- package/dist/types/global-flags.js +170 -0
- package/dist/types/global-flags.js.map +1 -0
- package/dist/types/ids.d.ts +38 -0
- package/dist/types/ids.d.ts.map +1 -0
- package/dist/types/ids.js +51 -0
- package/dist/types/ids.js.map +1 -0
- package/dist/types/json.d.ts +60 -0
- package/dist/types/json.d.ts.map +1 -0
- package/dist/types/json.js +33 -0
- package/dist/types/json.js.map +1 -0
- package/dist/utils/errors.d.ts +121 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +264 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +39 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +49 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/output/envelope.d.ts +140 -0
- package/dist/utils/output/envelope.d.ts.map +1 -0
- package/dist/utils/output/envelope.js +120 -0
- package/dist/utils/output/envelope.js.map +1 -0
- package/dist/utils/output/json.d.ts +10 -0
- package/dist/utils/output/json.d.ts.map +1 -0
- package/dist/utils/output/json.js +12 -0
- package/dist/utils/output/json.js.map +1 -0
- package/dist/utils/output/ndjson.d.ts +92 -0
- package/dist/utils/output/ndjson.d.ts.map +1 -0
- package/dist/utils/output/ndjson.js +33 -0
- package/dist/utils/output/ndjson.js.map +1 -0
- package/dist/utils/output/select.d.ts +22 -0
- package/dist/utils/output/select.d.ts.map +1 -0
- package/dist/utils/output/select.js +47 -0
- package/dist/utils/output/select.js.map +1 -0
- package/dist/utils/output/table.d.ts +32 -0
- package/dist/utils/output/table.d.ts.map +1 -0
- package/dist/utils/output/table.js +133 -0
- package/dist/utils/output/table.js.map +1 -0
- package/dist/utils/output/text.d.ts +5 -0
- package/dist/utils/output/text.d.ts.map +1 -0
- package/dist/utils/output/text.js +32 -0
- package/dist/utils/output/text.js.map +1 -0
- package/dist/utils/parse-boundary.d.ts +53 -0
- package/dist/utils/parse-boundary.d.ts.map +1 -0
- package/dist/utils/parse-boundary.js +62 -0
- package/dist/utils/parse-boundary.js.map +1 -0
- package/dist/utils/redact.d.ts +54 -0
- package/dist/utils/redact.d.ts.map +1 -0
- package/dist/utils/redact.js +154 -0
- package/dist/utils/redact.js.map +1 -0
- package/dist/utils/request-id.d.ts +17 -0
- package/dist/utils/request-id.d.ts.map +1 -0
- package/dist/utils/request-id.js +26 -0
- package/dist/utils/request-id.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,795 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Column-value writer (`cli-design.md` §5.3, `v0.1-plan.md` §3 M5a).
|
|
3
|
+
*
|
|
4
|
+
* The write half of the column-value abstraction: takes a resolved
|
|
5
|
+
* column + a raw user-supplied string and produces the Monday wire
|
|
6
|
+
* payload Monday's `change_simple_column_value` /
|
|
7
|
+
* `change_column_value` / `change_multiple_column_values` mutations
|
|
8
|
+
* accept.
|
|
9
|
+
*
|
|
10
|
+
* **Two entry points.** Nine of the ten allowlisted types translate
|
|
11
|
+
* purely locally — no network, no clock dependency beyond the date
|
|
12
|
+
* module's injectable clock — and live behind the sync
|
|
13
|
+
* `translateColumnValue`. `people` is the exception: email→ID
|
|
14
|
+
* resolution can hit the network. Rather than forcing a
|
|
15
|
+
* `Promise<TranslatedColumnValue>` on every call site for the nine
|
|
16
|
+
* sync types, `translateColumnValueAsync` is the unified async entry
|
|
17
|
+
* point the command layer always calls. It delegates to the sync
|
|
18
|
+
* version for non-people types and dispatches to `parsePeopleInput`
|
|
19
|
+
* for `people`. M5b's write surface goes through async exclusively
|
|
20
|
+
* (people may appear in any `--set` bundle).
|
|
21
|
+
*
|
|
22
|
+
* **Scope.** All ten allowlisted types translate:
|
|
23
|
+
* `text` / `long_text` / `numbers` (simple-string payloads, M5a
|
|
24
|
+
* skeleton); `status` / `dropdown` (rich-object payloads); `date`
|
|
25
|
+
* (rich, with relative-token resolution against the profile
|
|
26
|
+
* timezone); `people` (rich, with `me`-token + email resolution via
|
|
27
|
+
* the M3 `userByEmail` directory cache); and the M8 firm additions
|
|
28
|
+
* `link` / `email` / `phone` (pipe-form parsers in `links.ts` /
|
|
29
|
+
* `emails.ts` / `phones.ts`; same `change_column_value` wire path
|
|
30
|
+
* as the v0.1 rich types).
|
|
31
|
+
*
|
|
32
|
+
* **Date resolution context** (cli-design §5.3 step 3 + the
|
|
33
|
+
* "Relative dates and timezone" subsection). Relative tokens
|
|
34
|
+
* (`today`, `+3d`, `+2h`) need a clock + a timezone; both come
|
|
35
|
+
* from `TranslateColumnValueInputs.dateResolution`. Defaults to
|
|
36
|
+
* the system clock + system tz when omitted — M5b's command
|
|
37
|
+
* layer plumbs `MONDAY_TIMEZONE` env override through this slot.
|
|
38
|
+
* Tests inject a deterministic clock for DST-boundary coverage.
|
|
39
|
+
* The actual resolution machinery lives in `dates.ts`; this
|
|
40
|
+
* module just delegates and packages the result alongside the
|
|
41
|
+
* other column types.
|
|
42
|
+
*
|
|
43
|
+
* **People resolution context** (cli-design §5.3 step 3 line
|
|
44
|
+
* 728-734 + the `me` token rule line 704-707). Email lookups +
|
|
45
|
+
* `me` resolution come through
|
|
46
|
+
* `TranslateColumnValueAsyncInputs.peopleResolution`, which
|
|
47
|
+
* carries `resolveMe` (mirroring `filters.ts`'s slot, so the
|
|
48
|
+
* same M5b wiring resolves `me` for both filter reads and
|
|
49
|
+
* `--set` writes) and `resolveEmail` (M5b wires this to
|
|
50
|
+
* `resolvers.userByEmail`). Required for people columns; ignored
|
|
51
|
+
* for everything else. The actual parsing machinery lives in
|
|
52
|
+
* `people.ts`.
|
|
53
|
+
*
|
|
54
|
+
* **Mutation selection** (`cli-design.md` §5.3 step 5) lives in
|
|
55
|
+
* `selectMutation` below — single simple → `change_simple_column_value`;
|
|
56
|
+
* single rich → `change_column_value`; N (any combo) →
|
|
57
|
+
* `change_multiple_column_values` (atomic on Monday's side). The
|
|
58
|
+
* multi form re-wraps `long_text`'s simple bare string as
|
|
59
|
+
* `{ text: <value> }` because Monday's per-column blob inside
|
|
60
|
+
* `change_multiple_column_values` requires the object form for
|
|
61
|
+
* `long_text` (a wire-shape divergence from
|
|
62
|
+
* `change_simple_column_value`'s bare-string acceptance — pinned
|
|
63
|
+
* via fixture in the unit suite, logged as a spec gap in
|
|
64
|
+
* `v0.1-plan.md` §3 M5a for cli-design backfill).
|
|
65
|
+
*
|
|
66
|
+
* **No CLI-side label-to-index lookup.** Per `cli-design.md` §5.3
|
|
67
|
+
* step 3: the CLI emits `{ "label": ... }` for label input and
|
|
68
|
+
* `{ "index": N }` for numeric input on `status`; it does *not*
|
|
69
|
+
* traverse `column.settings_str` to resolve labels to their stable
|
|
70
|
+
* indexes. Same shape for `dropdown` — `{ "labels": [...] }` for
|
|
71
|
+
* label input, `{ "ids": [...] }` for all-numeric input. Monday is
|
|
72
|
+
* the validator of last resort; the translator's contract is
|
|
73
|
+
* "produce the documented wire shape, let Monday reject typos as
|
|
74
|
+
* `validation_failed`".
|
|
75
|
+
*
|
|
76
|
+
* **Monday `JSON` scalar discipline** (`cli-design.md` §5.3 step 4).
|
|
77
|
+
* Every payload is a plain JS value (string for the simple form,
|
|
78
|
+
* plain object for the rich form). The SDK / fetch layer is
|
|
79
|
+
* responsible for stringifying at the wire boundary — this module
|
|
80
|
+
* never `JSON.stringify`s. The unit tests in
|
|
81
|
+
* `tests/unit/api/column-values.test.ts` pin the exact wire shape
|
|
82
|
+
* per type as a fixture so M5b and v0.2's bulk surface inherit the
|
|
83
|
+
* rule unchanged.
|
|
84
|
+
*
|
|
85
|
+
* **`--set-raw` escape hatch (M8).** v0.1 had no escape hatch;
|
|
86
|
+
* v0.2's M8 milestone added `--set-raw <col>=<json>` (see
|
|
87
|
+
* `src/api/raw-write.ts`) for column types that don't have a
|
|
88
|
+
* friendly translator yet. Non-allowlisted column types still
|
|
89
|
+
* surface `unsupported_column_type` keyed by roadmap category per
|
|
90
|
+
* `column-types.ts getColumnRoadmapCategory`: tentative writer-
|
|
91
|
+
* expansion types (`tags` / `board_relation` / `dependency`) slipped
|
|
92
|
+
* to v0.3 at M18 close — they get `deferred_to: "v0.3"` plus a
|
|
93
|
+
* `--set-raw` hint, read-only-forever types get
|
|
94
|
+
* `read_only: true`, anything else gets `deferred_to: "future"`
|
|
95
|
+
* with a `--set-raw` hint when the underlying mutation is shaped
|
|
96
|
+
* like `change_column_value`. The M8 contract is "we translate the
|
|
97
|
+
* ten allowlisted types and reject everything else with
|
|
98
|
+
* category-accurate guidance, pointing tentative + future-shaped
|
|
99
|
+
* targets at `--set-raw`."
|
|
100
|
+
*/
|
|
101
|
+
import { ApiError, UsageError } from '../utils/errors.js';
|
|
102
|
+
import { getColumnRoadmapCategory, isFilesShapedType, isWritableColumnType, } from './column-types.js';
|
|
103
|
+
import { parseDateInput, } from './dates.js';
|
|
104
|
+
import { parsePeopleInput, } from './people.js';
|
|
105
|
+
import { parseLinkInput } from './links.js';
|
|
106
|
+
import { parseEmailInput } from './emails.js';
|
|
107
|
+
import { parsePhoneInput } from './phones.js';
|
|
108
|
+
/**
|
|
109
|
+
* Translates a single `<column>=<value>` pair into the Monday wire
|
|
110
|
+
* payload. **Sync entry point — handles the nine types whose
|
|
111
|
+
* translation is purely local computation** (`text` / `long_text` /
|
|
112
|
+
* `numbers` / `status` / `dropdown` / `date` / `link` / `email` /
|
|
113
|
+
* `phone`). For `people` columns, use `translateColumnValueAsync`:
|
|
114
|
+
* people resolution can hit the network (email→ID lookup) and is
|
|
115
|
+
* therefore async-only.
|
|
116
|
+
*
|
|
117
|
+
* **Throws** `ApiError`:
|
|
118
|
+
* - `unsupported_column_type` — type not in the friendly
|
|
119
|
+
* allowlist. Carries `column_id` + `type` plus per-category
|
|
120
|
+
* details: `deferred_to: "v0.3"` for the tentative writer-
|
|
121
|
+
* expansion row that slipped from v0.2 (`tags` /
|
|
122
|
+
* `board_relation` / `dependency`), `read_only: true` for
|
|
123
|
+
* read-only-forever types (mirror / formula / auto_number /
|
|
124
|
+
* creation_log / last_updated / item_id), `deferred_to:
|
|
125
|
+
* "future"` for anything else. The `--set-raw` escape hatch
|
|
126
|
+
* (M8) accepts most non-allowlisted types.
|
|
127
|
+
* - `internal_error` — sync entry was called on a `people`
|
|
128
|
+
* column. Programmer error: the write surface always uses
|
|
129
|
+
* `translateColumnValueAsync`. The check exists so a future
|
|
130
|
+
* contributor doesn't accidentally regress to a sync code
|
|
131
|
+
* path that silently mis-translates people input.
|
|
132
|
+
*
|
|
133
|
+
* **Throws** `UsageError`:
|
|
134
|
+
* - `usage_error` — for status / dropdown numeric input that
|
|
135
|
+
* exceeds `Number.MAX_SAFE_INTEGER`, dropdown input that
|
|
136
|
+
* contains no labels and no IDs after trim + filter, `date`
|
|
137
|
+
* input that does not match any supported form (ISO date,
|
|
138
|
+
* ISO date+time, or relative token), invalid URL / email /
|
|
139
|
+
* phone in the link / email / phone translators, or
|
|
140
|
+
* pipe-form input with empty leader/trailer in those types.
|
|
141
|
+
* See `unsafeIntegerError`, the dropdown empty-input branch,
|
|
142
|
+
* `dates.parseDateInput`, `links.parseLinkInput`,
|
|
143
|
+
* `emails.parseEmailInput`, and `phones.parsePhoneInput` for
|
|
144
|
+
* the documented messages.
|
|
145
|
+
*/
|
|
146
|
+
export const translateColumnValue = (inputs) => {
|
|
147
|
+
const { column, value, dateResolution } = inputs;
|
|
148
|
+
if (!isWritableColumnType(column.type)) {
|
|
149
|
+
throw unsupportedColumnTypeError(column.id, column.type);
|
|
150
|
+
}
|
|
151
|
+
switch (column.type) {
|
|
152
|
+
case 'text':
|
|
153
|
+
return simple(column.id, 'text', value);
|
|
154
|
+
case 'long_text':
|
|
155
|
+
return simple(column.id, 'long_text', value);
|
|
156
|
+
case 'numbers':
|
|
157
|
+
return simple(column.id, 'numbers', value);
|
|
158
|
+
case 'status':
|
|
159
|
+
return rich(column.id, 'status', value, translateStatus(value, column.id));
|
|
160
|
+
case 'dropdown':
|
|
161
|
+
return rich(column.id, 'dropdown', value, translateDropdown(column.id, value));
|
|
162
|
+
case 'date': {
|
|
163
|
+
const parsed = parseDateInput(value, column.id, dateResolution);
|
|
164
|
+
return {
|
|
165
|
+
columnId: column.id,
|
|
166
|
+
columnType: 'date',
|
|
167
|
+
rawInput: value,
|
|
168
|
+
payload: { format: 'rich', value: parsed.payload },
|
|
169
|
+
resolvedFrom: parsed.resolvedFrom,
|
|
170
|
+
peopleResolution: null,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
case 'link': {
|
|
174
|
+
// LinkPayload's `{url, text}` literal type is structurally a
|
|
175
|
+
// JsonObject (both fields are JsonValues) but TypeScript treats
|
|
176
|
+
// closed object types as not implicitly satisfying the open
|
|
177
|
+
// index signature. Same cast pattern the people translator
|
|
178
|
+
// uses; see src/types/json.ts for the documented trade.
|
|
179
|
+
const parsed = parseLinkInput(value, column.id);
|
|
180
|
+
return {
|
|
181
|
+
columnId: column.id,
|
|
182
|
+
columnType: 'link',
|
|
183
|
+
rawInput: value,
|
|
184
|
+
payload: { format: 'rich', value: parsed },
|
|
185
|
+
resolvedFrom: null,
|
|
186
|
+
peopleResolution: null,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
case 'email': {
|
|
190
|
+
const parsed = parseEmailInput(value, column.id);
|
|
191
|
+
return {
|
|
192
|
+
columnId: column.id,
|
|
193
|
+
columnType: 'email',
|
|
194
|
+
rawInput: value,
|
|
195
|
+
payload: { format: 'rich', value: parsed },
|
|
196
|
+
resolvedFrom: null,
|
|
197
|
+
peopleResolution: null,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
case 'phone': {
|
|
201
|
+
const parsed = parsePhoneInput(value, column.id);
|
|
202
|
+
return {
|
|
203
|
+
columnId: column.id,
|
|
204
|
+
columnType: 'phone',
|
|
205
|
+
rawInput: value,
|
|
206
|
+
payload: { format: 'rich', value: parsed },
|
|
207
|
+
resolvedFrom: null,
|
|
208
|
+
peopleResolution: null,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
case 'people':
|
|
212
|
+
// People translation is async (email→ID lookup hits the
|
|
213
|
+
// directory cache or the `users(emails:)` GraphQL endpoint).
|
|
214
|
+
// Surface as `internal_error` so a future contributor who
|
|
215
|
+
// accidentally routes a people column through the sync entry
|
|
216
|
+
// point sees a loud programmer-error message rather than a
|
|
217
|
+
// silent payload corruption. M5b's command layer always uses
|
|
218
|
+
// `translateColumnValueAsync` for write paths.
|
|
219
|
+
throw new ApiError('internal_error', `translateColumnValue (sync) called on people column "${column.id}". ` +
|
|
220
|
+
`People resolution is async — use translateColumnValueAsync.`, {
|
|
221
|
+
details: {
|
|
222
|
+
column_id: column.id,
|
|
223
|
+
column_type: column.type,
|
|
224
|
+
hint: 'use translateColumnValueAsync from src/api/column-values.ts',
|
|
225
|
+
},
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
/**
|
|
230
|
+
* Async entry point — handles every type in `WRITABLE_COLUMN_TYPES`.
|
|
231
|
+
* Delegates to `translateColumnValue` (sync) for non-people columns;
|
|
232
|
+
* dispatches to `parsePeopleInput` for `people`.
|
|
233
|
+
*
|
|
234
|
+
* The `peopleResolution` slot is required when `column.type ===
|
|
235
|
+
* 'people'`. Omitting it for a people column raises `internal_error`
|
|
236
|
+
* (programmer wiring bug) — agents see this as a loud failure
|
|
237
|
+
* rather than a silent fallback to the unsupported-type path.
|
|
238
|
+
*
|
|
239
|
+
* **Throws** every error `translateColumnValue` throws (delegated
|
|
240
|
+
* unchanged for non-people types), plus:
|
|
241
|
+
* - `ApiError(user_not_found)` — bubbled from `peopleResolution.
|
|
242
|
+
* resolveEmail` for unknown emails. cli-design.md §5.3 step 3
|
|
243
|
+
* line 733 pins the contract.
|
|
244
|
+
* - `UsageError(usage_error)` — empty / numeric people input.
|
|
245
|
+
* See `parsePeopleInput` for the per-branch messages.
|
|
246
|
+
* - `ApiError(internal_error)` — `peopleResolution` was omitted
|
|
247
|
+
* for a people column.
|
|
248
|
+
*/
|
|
249
|
+
/**
|
|
250
|
+
* Builds the per-type "clear" payload for `monday item clear`. The
|
|
251
|
+
* dedicated verb keeps `--set <col>=<value>` and the clear path
|
|
252
|
+
* non-overlapping (cli-design §5.3 step 3 explicitly notes that
|
|
253
|
+
* empty-string input on `status` is `{label: ""}`, NOT a clear; the
|
|
254
|
+
* translator is value-shaping, not intent-disambiguating).
|
|
255
|
+
*
|
|
256
|
+
* Per-type clear shapes:
|
|
257
|
+
* - `text` / `long_text` / `numbers` → simple bare empty string
|
|
258
|
+
* (`change_simple_column_value(value: "")` clears the cell).
|
|
259
|
+
* - `status` / `dropdown` / `date` / `people` → empty JSON object
|
|
260
|
+
* `{}` via `change_column_value(value: JSON!)`. Monday's
|
|
261
|
+
* official "clear all column values" pattern.
|
|
262
|
+
*
|
|
263
|
+
* **Throws** `unsupported_column_type` for types outside the v0.1
|
|
264
|
+
* writable allowlist — same code path the value translator uses,
|
|
265
|
+
* keyed by roadmap category (`deferred_to: "v0.3"` /
|
|
266
|
+
* `read_only: true` / `deferred_to: "future"`). Agents see the
|
|
267
|
+
* same per-category surface across `item set` / `item update` /
|
|
268
|
+
* `item clear`, so a wrapper that triages on the error details
|
|
269
|
+
* doesn't need a per-verb branch.
|
|
270
|
+
*
|
|
271
|
+
* Sync entry — `people` clear doesn't need email resolution (the
|
|
272
|
+
* payload is `{}` regardless of who's currently assigned). Reused
|
|
273
|
+
* by the `item clear` dry-run + live paths.
|
|
274
|
+
*/
|
|
275
|
+
export const translateColumnClear = (column) => {
|
|
276
|
+
if (!isWritableColumnType(column.type)) {
|
|
277
|
+
throw unsupportedColumnTypeError(column.id, column.type);
|
|
278
|
+
}
|
|
279
|
+
switch (column.type) {
|
|
280
|
+
case 'text':
|
|
281
|
+
case 'long_text':
|
|
282
|
+
case 'numbers':
|
|
283
|
+
return {
|
|
284
|
+
columnId: column.id,
|
|
285
|
+
columnType: column.type,
|
|
286
|
+
rawInput: '',
|
|
287
|
+
payload: { format: 'simple', value: '' },
|
|
288
|
+
resolvedFrom: null,
|
|
289
|
+
peopleResolution: null,
|
|
290
|
+
};
|
|
291
|
+
case 'status':
|
|
292
|
+
case 'dropdown':
|
|
293
|
+
case 'date':
|
|
294
|
+
case 'people':
|
|
295
|
+
case 'link':
|
|
296
|
+
case 'email':
|
|
297
|
+
case 'phone':
|
|
298
|
+
// Rich types clear to `{}` via change_column_value per
|
|
299
|
+
// cli-design §5.3 "Clearing column values" table. M8 firm row
|
|
300
|
+
// (link / email / phone) extends the table verbatim — same
|
|
301
|
+
// payload, same mutation, same dispatch.
|
|
302
|
+
return {
|
|
303
|
+
columnId: column.id,
|
|
304
|
+
columnType: column.type,
|
|
305
|
+
rawInput: '',
|
|
306
|
+
payload: { format: 'rich', value: {} },
|
|
307
|
+
resolvedFrom: null,
|
|
308
|
+
peopleResolution: null,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
export const translateColumnValueAsync = async (inputs) => {
|
|
313
|
+
if (inputs.column.type !== 'people') {
|
|
314
|
+
return translateColumnValue(inputs);
|
|
315
|
+
}
|
|
316
|
+
const { peopleResolution } = inputs;
|
|
317
|
+
if (peopleResolution === undefined) {
|
|
318
|
+
throw new ApiError('internal_error', `translateColumnValueAsync requires a peopleResolution context for ` +
|
|
319
|
+
`people column "${inputs.column.id}". M5b's command layer wires ` +
|
|
320
|
+
`resolveMe + resolveEmail through this slot.`, {
|
|
321
|
+
details: {
|
|
322
|
+
column_id: inputs.column.id,
|
|
323
|
+
column_type: 'people',
|
|
324
|
+
hint: 'pass { peopleResolution: { resolveMe, resolveEmail } } when ' +
|
|
325
|
+
'calling translateColumnValueAsync.',
|
|
326
|
+
},
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
const parsed = await parsePeopleInput(inputs.value, inputs.column.id, peopleResolution);
|
|
330
|
+
return {
|
|
331
|
+
columnId: inputs.column.id,
|
|
332
|
+
columnType: 'people',
|
|
333
|
+
rawInput: inputs.value,
|
|
334
|
+
// PeoplePayload is structurally a JsonObject — it has one
|
|
335
|
+
// declared key (`personsAndTeams`) whose value is a readonly
|
|
336
|
+
// array of plain objects with `id: number` and `kind:
|
|
337
|
+
// 'person'` (both JsonValues). TypeScript treats closed
|
|
338
|
+
// object types as not implicitly satisfying open index
|
|
339
|
+
// signatures even when their values all line up, so the cast
|
|
340
|
+
// is structural-typing-only. Runtime shape is unchanged; the
|
|
341
|
+
// wire-shape fixture in the unit suite is the load-bearing
|
|
342
|
+
// pin. See `src/types/json.ts` for the JsonObject definition
|
|
343
|
+
// and the closed-type-literal note that documents this trade.
|
|
344
|
+
payload: {
|
|
345
|
+
format: 'rich',
|
|
346
|
+
value: parsed.payload,
|
|
347
|
+
},
|
|
348
|
+
resolvedFrom: null,
|
|
349
|
+
peopleResolution: parsed.resolution,
|
|
350
|
+
};
|
|
351
|
+
};
|
|
352
|
+
const simple = (columnId, columnType, rawInput) => ({
|
|
353
|
+
columnId,
|
|
354
|
+
columnType,
|
|
355
|
+
payload: { format: 'simple', value: rawInput },
|
|
356
|
+
rawInput,
|
|
357
|
+
// Only the date / people translators populate resolution echoes;
|
|
358
|
+
// every other type emits null so the dry-run engine has one shape
|
|
359
|
+
// to read per slot.
|
|
360
|
+
resolvedFrom: null,
|
|
361
|
+
peopleResolution: null,
|
|
362
|
+
});
|
|
363
|
+
const rich = (columnId, columnType, rawInput, value) => ({
|
|
364
|
+
columnId,
|
|
365
|
+
columnType,
|
|
366
|
+
payload: { format: 'rich', value },
|
|
367
|
+
rawInput,
|
|
368
|
+
resolvedFrom: null,
|
|
369
|
+
peopleResolution: null,
|
|
370
|
+
});
|
|
371
|
+
/**
|
|
372
|
+
* Status payload per `cli-design.md` §5.3 step 3:
|
|
373
|
+
* - Non-negative integer input → `{ index: N }` (number, not
|
|
374
|
+
* string — Monday's status indexes are integers and the
|
|
375
|
+
* `change_*_column_value` JSON scalar serialises a number as
|
|
376
|
+
* a number).
|
|
377
|
+
* - Anything else → `{ label: <verbatim> }`. No NFC / case-fold
|
|
378
|
+
* here: the resolver upstream normalised the *column* token,
|
|
379
|
+
* not the *value* — Monday matches the label against the
|
|
380
|
+
* board's settings server-side, and a label like " Done "
|
|
381
|
+
* with surrounding whitespace would be agent-side noise we
|
|
382
|
+
* should preserve so Monday's `validation_failed` points at
|
|
383
|
+
* the right input.
|
|
384
|
+
*
|
|
385
|
+
* Empty string emits `{ label: "" }` and is *not* treated as a
|
|
386
|
+
* "clear" intent — `monday item clear` is the dedicated verb for
|
|
387
|
+
* that. Pinned in tests so future contributors don't add silent
|
|
388
|
+
* fall-through-to-clear behaviour.
|
|
389
|
+
*
|
|
390
|
+
* **Safe-integer bound.** Numeric input larger than
|
|
391
|
+
* `Number.MAX_SAFE_INTEGER` (2^53 - 1) silently rounds via
|
|
392
|
+
* `Number(raw)`; very long digit strings yield `Infinity`,
|
|
393
|
+
* which `JSON.stringify` serialises as `null`. Either case
|
|
394
|
+
* would corrupt the wire shape. We throw `usage_error` rather
|
|
395
|
+
* than silently routing to the label path because the input
|
|
396
|
+
* was unambiguously the index path (all digits, no signs / no
|
|
397
|
+
* decimals) — sending `{label: "999999999999999999999"}` to
|
|
398
|
+
* Monday would be a worse surprise than a local error.
|
|
399
|
+
*/
|
|
400
|
+
const translateStatus = (raw, columnId) => {
|
|
401
|
+
if (NON_NEGATIVE_INTEGER.test(raw)) {
|
|
402
|
+
const parsed = Number(raw);
|
|
403
|
+
if (!Number.isSafeInteger(parsed)) {
|
|
404
|
+
throw unsafeIntegerError(columnId, 'status', raw);
|
|
405
|
+
}
|
|
406
|
+
return { index: parsed };
|
|
407
|
+
}
|
|
408
|
+
return { label: raw };
|
|
409
|
+
};
|
|
410
|
+
/**
|
|
411
|
+
* Dropdown payload per `cli-design.md` §5.3 step 3:
|
|
412
|
+
* - Comma-split, per-segment trimmed, empty segments dropped.
|
|
413
|
+
* - All remaining segments numeric → `{ ids: [N1, N2, ...] }`
|
|
414
|
+
* (numbers, not strings — dropdown IDs from Monday's
|
|
415
|
+
* `settings_str.labels[].id` are integers).
|
|
416
|
+
* - Any non-numeric segment → `{ labels: [s1, s2, ...] }`
|
|
417
|
+
* (strings, verbatim post-trim).
|
|
418
|
+
*
|
|
419
|
+
* **Disambiguation rule, pinned.** A label literally named `"1"`
|
|
420
|
+
* cannot be set via `--set tags=1` — that input parses as the
|
|
421
|
+
* `id` path. The M8 `--set-raw tags='{"labels":["1"]}'` escape
|
|
422
|
+
* hatch is the workaround. Surfaced in the module header as a
|
|
423
|
+
* known limitation; documented via unit test rather than runtime
|
|
424
|
+
* warning because it's a corner case (Monday-generated dropdown
|
|
425
|
+
* labels are strings the user typed; integer-only labels are
|
|
426
|
+
* vanishingly rare).
|
|
427
|
+
*
|
|
428
|
+
* **Empty-after-filter throws `usage_error`.** Inputs like
|
|
429
|
+
* `--set tags=""` or `--set tags=" , "` carry no labels and no
|
|
430
|
+
* IDs — there's nothing to translate. Throwing `usage_error`
|
|
431
|
+
* (rather than emitting `{ labels: [] }`) keeps `--set` and
|
|
432
|
+
* `monday item clear` non-overlapping: the only way to clear
|
|
433
|
+
* a dropdown is the dedicated verb. Pinned via test.
|
|
434
|
+
*/
|
|
435
|
+
const translateDropdown = (columnId, raw) => {
|
|
436
|
+
const parts = raw
|
|
437
|
+
.split(',')
|
|
438
|
+
.map((segment) => segment.trim())
|
|
439
|
+
.filter((segment) => segment.length > 0);
|
|
440
|
+
if (parts.length === 0) {
|
|
441
|
+
throw new UsageError(`Dropdown column "${columnId}" needs at least one label or numeric ID. ` +
|
|
442
|
+
`Got "${raw}". To clear a dropdown column, use ` +
|
|
443
|
+
`\`monday item clear <iid> ${columnId} [--board <bid>]\` instead.`, {
|
|
444
|
+
details: {
|
|
445
|
+
column_id: columnId,
|
|
446
|
+
column_type: 'dropdown',
|
|
447
|
+
raw_input: raw,
|
|
448
|
+
hint: 'pass a comma-separated list of labels (e.g. --set ' +
|
|
449
|
+
`${columnId}='Backend,Frontend') or numeric IDs (--set ` +
|
|
450
|
+
`${columnId}=1,2). The --set-raw escape hatch accepts the ` +
|
|
451
|
+
`literal Monday wire shape if neither form fits.`,
|
|
452
|
+
},
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
if (parts.every((part) => NON_NEGATIVE_INTEGER.test(part))) {
|
|
456
|
+
const ids = parts.map((part) => {
|
|
457
|
+
const parsed = Number(part);
|
|
458
|
+
if (!Number.isSafeInteger(parsed)) {
|
|
459
|
+
throw unsafeIntegerError(columnId, 'dropdown', part);
|
|
460
|
+
}
|
|
461
|
+
return parsed;
|
|
462
|
+
});
|
|
463
|
+
return { ids };
|
|
464
|
+
}
|
|
465
|
+
return { labels: parts };
|
|
466
|
+
};
|
|
467
|
+
/**
|
|
468
|
+
* Builds the `usage_error` for numeric input that exceeds
|
|
469
|
+
* `Number.MAX_SAFE_INTEGER` (2^53 - 1). Shared by status (index)
|
|
470
|
+
* and dropdown (id) because the failure mode is identical: the
|
|
471
|
+
* input parsed as an integer-shaped number but `Number(raw)`
|
|
472
|
+
* lost precision (or yielded `Infinity` for digit strings ~310+
|
|
473
|
+
* chars long). Either case would land at Monday as the wrong
|
|
474
|
+
* integer or as `null` after `JSON.stringify`. The error carries
|
|
475
|
+
* the raw input so an agent's debug log shows exactly what they
|
|
476
|
+
* sent, and a hint nudging them toward the label path. The M8
|
|
477
|
+
* `--set-raw` escape hatch is the paste-ready alternative when
|
|
478
|
+
* the friendly translator can't accept the input.
|
|
479
|
+
*/
|
|
480
|
+
const unsafeIntegerError = (columnId, columnType, raw) => {
|
|
481
|
+
const titled = columnType === 'status' ? 'Status' : 'Dropdown';
|
|
482
|
+
// status uses indexes ("first label is index 0"); dropdown uses
|
|
483
|
+
// numeric IDs from settings_str.labels[].id. Different word in
|
|
484
|
+
// the message so an agent doesn't see "smaller ID" on a status
|
|
485
|
+
// column where the concept is "index", not "ID".
|
|
486
|
+
const noun = columnType === 'status' ? 'indexes' : 'IDs';
|
|
487
|
+
const smaller = columnType === 'status' ? 'a smaller index' : 'a smaller ID';
|
|
488
|
+
// Hints interpolate the actual `columnId` so an agent can
|
|
489
|
+
// paste-and-edit. Status hint uses the literal word "label"
|
|
490
|
+
// because the label-vs-index split lives in cli-design.md §5.3
|
|
491
|
+
// step 3; dropdown hint shows both the labels and IDs forms.
|
|
492
|
+
const hint = columnType === 'status'
|
|
493
|
+
? `use a status label (e.g. --set ${columnId}=Done) or an index < 2^53`
|
|
494
|
+
: `use dropdown labels (e.g. --set ${columnId}=Backend,Frontend) ` +
|
|
495
|
+
`or IDs < 2^53`;
|
|
496
|
+
return new UsageError(`${titled} column "${columnId}" got numeric input "${raw}" that ` +
|
|
497
|
+
`exceeds JavaScript's safe-integer range (2^53 - 1, i.e. ` +
|
|
498
|
+
`9007199254740991). Number(raw) would lose precision or yield ` +
|
|
499
|
+
`Infinity, corrupting the wire shape. Monday's ${columnType} ` +
|
|
500
|
+
`${noun} are small non-negative integers — pass a label or ` +
|
|
501
|
+
`${smaller}, or use --set-raw <col>=<json> with the literal ` +
|
|
502
|
+
`Monday wire shape.`, {
|
|
503
|
+
details: {
|
|
504
|
+
column_id: columnId,
|
|
505
|
+
column_type: columnType,
|
|
506
|
+
raw_input: raw,
|
|
507
|
+
hint,
|
|
508
|
+
},
|
|
509
|
+
});
|
|
510
|
+
};
|
|
511
|
+
/**
|
|
512
|
+
* Non-negative integer: matches `0`, `42`, `1234567` but not `-1`,
|
|
513
|
+
* `0.5`, `1e3`, or `42 ` (with trailing whitespace). Used to gate
|
|
514
|
+
* `status` index input and `dropdown` ID input. Negatives go to
|
|
515
|
+
* the label / labels path because Monday status indexes are >= 0
|
|
516
|
+
* and dropdown IDs are auto-incremented positive integers.
|
|
517
|
+
*/
|
|
518
|
+
const NON_NEGATIVE_INTEGER = /^\d+$/u;
|
|
519
|
+
/**
|
|
520
|
+
* Picks the right Monday mutation for a list of translated column
|
|
521
|
+
* values per `cli-design.md` §5.3 step 5.
|
|
522
|
+
*
|
|
523
|
+
* Dispatch:
|
|
524
|
+
* - 1 translated value, simple → `change_simple_column_value`
|
|
525
|
+
* (bare-string `value`).
|
|
526
|
+
* - 1 translated value, rich → `change_column_value` (object
|
|
527
|
+
* `value`).
|
|
528
|
+
* - N translated values (any combo of simple / rich) →
|
|
529
|
+
* `change_multiple_column_values`. Atomic on Monday's side —
|
|
530
|
+
* either every column update lands or none do.
|
|
531
|
+
*
|
|
532
|
+
* **Duplicate column IDs throw `usage_error`.** Bundling two
|
|
533
|
+
* `--set status=Done --set status=Doing` would have last-write-wins
|
|
534
|
+
* semantics inside `change_multiple_column_values`'s map and the
|
|
535
|
+
* agent has no way to know which one won. Surfacing as a typed
|
|
536
|
+
* error at the bundling boundary keeps mutations deterministic;
|
|
537
|
+
* the command layer (M5b) can catch + reframe with the literal
|
|
538
|
+
* `--set` flags it received.
|
|
539
|
+
*
|
|
540
|
+
* **Empty input throws `usage_error`.** Defensive — the command
|
|
541
|
+
* layer is supposed to validate `--set` was supplied, but the
|
|
542
|
+
* helper shouldn't return a malformed `change_multiple_column_values`
|
|
543
|
+
* with an empty map.
|
|
544
|
+
*
|
|
545
|
+
* **`long_text` re-wrap, spec gap.** Monday's
|
|
546
|
+
* `change_multiple_column_values(column_values: JSON!)` accepts a
|
|
547
|
+
* map where each value is either a string or a per-type object.
|
|
548
|
+
* For `long_text` specifically, the per-type object is `{text:
|
|
549
|
+
* <value>}` — so the bare string that `change_simple_column_value`
|
|
550
|
+
* accepts is *not* the right shape inside the multi mutation.
|
|
551
|
+
* `text` / `numbers` stay as bare strings. This wire-shape
|
|
552
|
+
* divergence isn't called out in cli-design.md §5.3 step 5; logged
|
|
553
|
+
* as a spec gap in v0.1-plan.md §3 M5a for backfill. Pinned via
|
|
554
|
+
* fixture in the unit suite.
|
|
555
|
+
*/
|
|
556
|
+
export const selectMutation = (translated) => {
|
|
557
|
+
if (translated.length === 0) {
|
|
558
|
+
throw new UsageError('selectMutation requires at least one translated column value. ' +
|
|
559
|
+
'The command layer should reject the no-`--set` case before ' +
|
|
560
|
+
'reaching this helper.', { details: { translated_count: 0 } });
|
|
561
|
+
}
|
|
562
|
+
if (translated.length === 1) {
|
|
563
|
+
const only = translated[0];
|
|
564
|
+
/* c8 ignore next 4 — defensive: length === 1 was just checked,
|
|
565
|
+
so `only` cannot be undefined. The guard exists for
|
|
566
|
+
`noUncheckedIndexedAccess` narrowing. */
|
|
567
|
+
if (only === undefined) {
|
|
568
|
+
throw new UsageError('selectMutation: unreachable indexing guard');
|
|
569
|
+
}
|
|
570
|
+
if (only.payload.format === 'simple') {
|
|
571
|
+
return {
|
|
572
|
+
kind: 'change_simple_column_value',
|
|
573
|
+
columnId: only.columnId,
|
|
574
|
+
value: only.payload.value,
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
return {
|
|
578
|
+
kind: 'change_column_value',
|
|
579
|
+
columnId: only.columnId,
|
|
580
|
+
value: only.payload.value,
|
|
581
|
+
};
|
|
582
|
+
}
|
|
583
|
+
// Multi: bundle every translated value into the column_values map.
|
|
584
|
+
// Delegates to `bundleColumnValues` so the long_text re-wrap rule
|
|
585
|
+
// and the duplicate-id gate stay shared with M9's create_item /
|
|
586
|
+
// create_subitem bundling — one source of truth for the
|
|
587
|
+
// `column_values: JSON!` wire shape across every Monday mutation
|
|
588
|
+
// that accepts it.
|
|
589
|
+
const columnValues = bundleColumnValues(translated);
|
|
590
|
+
return { kind: 'change_multiple_column_values', columnValues };
|
|
591
|
+
};
|
|
592
|
+
/**
|
|
593
|
+
* Projects one translated column value into the per-column blob
|
|
594
|
+
* `change_multiple_column_values` accepts. Three cases:
|
|
595
|
+
*
|
|
596
|
+
* - rich payload → pass the object through unchanged.
|
|
597
|
+
* - simple payload, type `long_text` → wrap as `{ text: <value> }`.
|
|
598
|
+
* Monday's multi-mutation blob for `long_text` requires the
|
|
599
|
+
* object form (spec gap; see `selectMutation` JSDoc).
|
|
600
|
+
* - simple payload, any other type → bare string.
|
|
601
|
+
*/
|
|
602
|
+
const projectForMulti = (t) => {
|
|
603
|
+
if (t.payload.format === 'rich') {
|
|
604
|
+
return t.payload.value;
|
|
605
|
+
}
|
|
606
|
+
if (t.columnType === 'long_text') {
|
|
607
|
+
return { text: t.payload.value };
|
|
608
|
+
}
|
|
609
|
+
return t.payload.value;
|
|
610
|
+
};
|
|
611
|
+
/**
|
|
612
|
+
* Bundles a list of translated column values into Monday's
|
|
613
|
+
* `column_values: JSON!` map shape — the input parameter
|
|
614
|
+
* `change_multiple_column_values`, `create_item`, and `create_subitem`
|
|
615
|
+
* all accept. Per-column projection routes through `projectForMulti`,
|
|
616
|
+
* so the `long_text` re-wrap (`{ text: <value> }` inside the map)
|
|
617
|
+
* applies uniformly across every wire surface that takes a
|
|
618
|
+
* `column_values` map.
|
|
619
|
+
*
|
|
620
|
+
* **Why a shared helper.** `selectMutation` builds this map for the
|
|
621
|
+
* multi-update case (M5b); M9's `item create` needs the same shape
|
|
622
|
+
* to bundle `--set` values into `create_item.column_values` /
|
|
623
|
+
* `create_subitem.column_values`. The single-round-trip exit gate
|
|
624
|
+
* (cli-design §5.8) requires the create payload bundles every
|
|
625
|
+
* translated value into one map — and the shape rule should not
|
|
626
|
+
* drift between update and create. The fixture pin in
|
|
627
|
+
* `tests/unit/api/column-values.test.ts` covers both consumers.
|
|
628
|
+
*
|
|
629
|
+
* **Duplicate-column-ID throws `usage_error`.** Same rule as
|
|
630
|
+
* `selectMutation`'s multi case — bundling two values for the same
|
|
631
|
+
* column would silently keep one. The cli-design §5.3 step 2
|
|
632
|
+
* mutual-exclusion contract enforces this resolution-time; the
|
|
633
|
+
* helper duplicates the gate so misuse from a non-command caller
|
|
634
|
+
* still surfaces a typed error.
|
|
635
|
+
*/
|
|
636
|
+
export const bundleColumnValues = (translated) => {
|
|
637
|
+
const out = {};
|
|
638
|
+
const seen = new Set();
|
|
639
|
+
for (const t of translated) {
|
|
640
|
+
if (seen.has(t.columnId)) {
|
|
641
|
+
// Wording matches the historical `selectMutation` message
|
|
642
|
+
// because existing tests assert on the `Multiple --set values
|
|
643
|
+
// target column` regex; keeping it stable preserves those
|
|
644
|
+
// assertions across both consumers (multi-update + create).
|
|
645
|
+
throw new UsageError(`Multiple --set values target column "${t.columnId}". ` +
|
|
646
|
+
`change_multiple_column_values is a map keyed by column ID; ` +
|
|
647
|
+
`bundling two values for the same column would silently keep ` +
|
|
648
|
+
`only one. Pass at most one --set per column.`, {
|
|
649
|
+
details: {
|
|
650
|
+
column_id: t.columnId,
|
|
651
|
+
duplicate_count: translated.filter((other) => other.columnId === t.columnId).length,
|
|
652
|
+
},
|
|
653
|
+
});
|
|
654
|
+
}
|
|
655
|
+
seen.add(t.columnId);
|
|
656
|
+
out[t.columnId] = projectForMulti(t);
|
|
657
|
+
}
|
|
658
|
+
return out;
|
|
659
|
+
};
|
|
660
|
+
/**
|
|
661
|
+
* Builds the canonical `unsupported_column_type` error (`cli-design.md`
|
|
662
|
+
* §5.3 step 4 + §6.5). Branches on the type's roadmap category so
|
|
663
|
+
* agents get accurate guidance instead of a blanket "wait for the
|
|
664
|
+
* next version" hint.
|
|
665
|
+
*
|
|
666
|
+
* Three categories per `column-types.ts getColumnRoadmapCategory`:
|
|
667
|
+
*
|
|
668
|
+
* - **v0.3 writer-expansion candidates** (`tags` / `board_relation`
|
|
669
|
+
* / `dependency` — slipped from v0.2 tentative at M18 close)
|
|
670
|
+
* get `deferred_to: "v0.3"`. The M8 firm row (`link` / `email`
|
|
671
|
+
* / `phone`) shipped friendly translators in v0.2 and goes
|
|
672
|
+
* through the writable-allowlist branch, not this error path.
|
|
673
|
+
* - **read-only forever** (`mirror` / `formula` / `auto_number` /
|
|
674
|
+
* `creation_log` / `last_updated` / `item_id`) — Monday-computed
|
|
675
|
+
* columns that are not writable via the API regardless of CLI
|
|
676
|
+
* version. `read_only: true`, hint points at the underlying
|
|
677
|
+
* source column. cli-design.md §5.3 writer-expansion roadmap
|
|
678
|
+
* "read-only forever" row says this explicitly.
|
|
679
|
+
* - **future** (anything else) — `deferred_to: "future"`, generic
|
|
680
|
+
* message. Examples include `battery`, `item_assignees`,
|
|
681
|
+
* `time_tracking`, `files`, `rating`. The roadmap doesn't
|
|
682
|
+
* promise these for v0.2 or v0.3, so over-promising would be
|
|
683
|
+
* the same drift Codex M5b cleanup re-review caught.
|
|
684
|
+
*
|
|
685
|
+
* Exported for unit coverage.
|
|
686
|
+
*/
|
|
687
|
+
export const unsupportedColumnTypeError = (columnId, type) => {
|
|
688
|
+
const category = getColumnRoadmapCategory(type);
|
|
689
|
+
if (category === 'read_only_forever') {
|
|
690
|
+
return new ApiError('unsupported_column_type', `Column "${columnId}" has type "${type}", which Monday computes ` +
|
|
691
|
+
`server-side and does not make writable via the API. This is ` +
|
|
692
|
+
`not a v0.1 limitation — Monday's API rejects write attempts ` +
|
|
693
|
+
`against this type regardless of CLI version, so no future ` +
|
|
694
|
+
`release will lift the restriction. Set the underlying source ` +
|
|
695
|
+
`column instead (e.g. for a mirror column, write to the column ` +
|
|
696
|
+
`the mirror reflects on the linked board).`, {
|
|
697
|
+
details: {
|
|
698
|
+
column_id: columnId,
|
|
699
|
+
type,
|
|
700
|
+
read_only: true,
|
|
701
|
+
hint: 'this column type is computed by Monday and is permanently ' +
|
|
702
|
+
'read-only via the API. Do not attempt --set / --set-raw — ' +
|
|
703
|
+
'identify the underlying source column (the column the ' +
|
|
704
|
+
'mirror / formula / auto_number / etc. reflects) and write ' +
|
|
705
|
+
'to that instead. See cli-design.md §5.3 writer-expansion ' +
|
|
706
|
+
'roadmap (read-only-forever row) for the full type list.',
|
|
707
|
+
},
|
|
708
|
+
});
|
|
709
|
+
}
|
|
710
|
+
if (category === 'v0_2_writer_expansion') {
|
|
711
|
+
return new ApiError('unsupported_column_type', `Column "${columnId}" has type "${type}", which is not yet in the ` +
|
|
712
|
+
`friendly --set translator allowlist. The v0.2 writer-expansion ` +
|
|
713
|
+
`tentative row (tags / board_relation / dependency) slipped to ` +
|
|
714
|
+
`v0.3 at M18 close — friendly translators land then once the ` +
|
|
715
|
+
`per-account directory + linked-board enumeration design clears. ` +
|
|
716
|
+
`Use --set-raw <col>=<json> with the documented Monday wire shape ` +
|
|
717
|
+
`in the meantime.`, {
|
|
718
|
+
details: {
|
|
719
|
+
column_id: columnId,
|
|
720
|
+
type,
|
|
721
|
+
deferred_to: 'v0.3',
|
|
722
|
+
hint: `use --set-raw <col>=<json> with the Monday wire shape (e.g. ` +
|
|
723
|
+
`--set-raw ${columnId}='{"tag_ids":[1,2]}' for tags). ` +
|
|
724
|
+
`See https://developer.monday.com/api-reference/reference/` +
|
|
725
|
+
`column-types-reference for per-type wire shapes.`,
|
|
726
|
+
},
|
|
727
|
+
});
|
|
728
|
+
}
|
|
729
|
+
// category === 'future'
|
|
730
|
+
// Files-shaped types are pinned to `deferred_to: "v0.4"` per
|
|
731
|
+
// cli-design.md §5.3 writer-expansion roadmap (the "files" row).
|
|
732
|
+
// Monday writes these via `add_file_to_column` (multipart upload)
|
|
733
|
+
// rather than `change_column_value`, so the friendly translator
|
|
734
|
+
// can't translate them at all and `--set-raw` also rejects them
|
|
735
|
+
// (different code path; raw-write.ts emits the same v0.4
|
|
736
|
+
// deferral). Without this branch, files-shaped types would fall
|
|
737
|
+
// through to the generic `future` branch and contradict the
|
|
738
|
+
// contract — Codex M18 round-2 P2.
|
|
739
|
+
if (isFilesShapedType(type)) {
|
|
740
|
+
return new ApiError('unsupported_column_type', `Column "${columnId}" has type "${type}", which Monday writes ` +
|
|
741
|
+
`via add_file_to_column (multipart upload) rather than ` +
|
|
742
|
+
`change_column_value. The friendly --set translator can't ` +
|
|
743
|
+
`reach this surface; --set-raw <col>=<json> can't either. ` +
|
|
744
|
+
`Asset upload is pinned to v0.4 per cli-design.md §13.`, {
|
|
745
|
+
details: {
|
|
746
|
+
column_id: columnId,
|
|
747
|
+
type,
|
|
748
|
+
deferred_to: 'v0.4',
|
|
749
|
+
hint: 'asset upload is a v0.4 deferral; the underlying mutation ' +
|
|
750
|
+
'(add_file_to_column) requires multipart wire shape that ' +
|
|
751
|
+
'the column-value path does not model.',
|
|
752
|
+
},
|
|
753
|
+
});
|
|
754
|
+
}
|
|
755
|
+
// `time_tracking` is pinned to `deferred_to: "v0.3"` per
|
|
756
|
+
// cli-design.md §5.3 writer-expansion roadmap row. It's a v0.3
|
|
757
|
+
// deferral because the semantics are start/stop verbs (not value
|
|
758
|
+
// writes), so the friendly translator can't represent it without
|
|
759
|
+
// a verb-shaped extension. `--set-raw` rejects similarly.
|
|
760
|
+
if (type === 'time_tracking') {
|
|
761
|
+
return new ApiError('unsupported_column_type', `Column "${columnId}" has type "time_tracking", which Monday ` +
|
|
762
|
+
`mutates via start/stop verbs rather than column-value writes. ` +
|
|
763
|
+
`The friendly --set translator and --set-raw both target ` +
|
|
764
|
+
`change_column_value-shaped types; time_tracking needs a ` +
|
|
765
|
+
`verb-shaped extension pinned for v0.3.`, {
|
|
766
|
+
details: {
|
|
767
|
+
column_id: columnId,
|
|
768
|
+
type,
|
|
769
|
+
deferred_to: 'v0.3',
|
|
770
|
+
hint: 'time_tracking uses start/stop verbs, not column-value ' +
|
|
771
|
+
'writes. v0.3 plans a dedicated surface; until then there ' +
|
|
772
|
+
'is no friendly or raw write path.',
|
|
773
|
+
},
|
|
774
|
+
});
|
|
775
|
+
}
|
|
776
|
+
return new ApiError('unsupported_column_type', `Column "${columnId}" has type "${type}", which is not in the ` +
|
|
777
|
+
`friendly --set translator allowlist (text, long_text, numbers, ` +
|
|
778
|
+
`status, dropdown, date, people, link, email, phone) and is not ` +
|
|
779
|
+
`pinned to a specific roadmap version. Try --set-raw <col>=<json> ` +
|
|
780
|
+
`with the documented Monday wire shape — that path accepts any ` +
|
|
781
|
+
`type Monday writes via change_column_value. Files-shaped types ` +
|
|
782
|
+
`(file) and read-only-forever types (mirror / formula / etc.) are ` +
|
|
783
|
+
`the exception; --set-raw rejects those at column-resolution time.`, {
|
|
784
|
+
details: {
|
|
785
|
+
column_id: columnId,
|
|
786
|
+
type,
|
|
787
|
+
deferred_to: 'future',
|
|
788
|
+
hint: 'use --set-raw <col>=<json> with the Monday wire shape if the ' +
|
|
789
|
+
'type accepts change_column_value. Examples in this bucket ' +
|
|
790
|
+
'(battery, rating) are not yet scoped on the writer-expansion ' +
|
|
791
|
+
'roadmap. See cli-design.md §5.3.',
|
|
792
|
+
},
|
|
793
|
+
});
|
|
794
|
+
};
|
|
795
|
+
//# sourceMappingURL=column-values.js.map
|