@burdenoff/microfe-devportal 2026.1108.2 → 2026.1109.2

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.
Files changed (29) hide show
  1. package/dist/devportal/DevportalRoot.js +68 -61
  2. package/dist/devportal/DevportalRoot.js.map +1 -1
  3. package/dist/devportal/DevportalRoutes.js +137 -133
  4. package/dist/devportal/DevportalRoutes.js.map +1 -1
  5. package/dist/devportal/components/SectionNav.js.map +1 -1
  6. package/dist/devportal/pages/ApplicationVersionsPage.js +229 -217
  7. package/dist/devportal/pages/ApplicationVersionsPage.js.map +1 -1
  8. package/dist/devportal/pages/NodeLifecyclePage.js +2 -0
  9. package/dist/devportal/pages/NodeLifecyclePage.js.map +1 -1
  10. package/dist/devportal/pages/TimeCampusAppletsPage.d.ts +2 -0
  11. package/dist/devportal/pages/TimeCampusAppletsPage.js +490 -0
  12. package/dist/devportal/pages/TimeCampusAppletsPage.js.map +1 -0
  13. package/dist/devportal/utils/constants.js +5 -1
  14. package/dist/devportal/utils/constants.js.map +1 -1
  15. package/dist/devportal/utils/timecampusApplets.d.ts +98 -0
  16. package/dist/devportal/utils/timecampusApplets.js +130 -0
  17. package/dist/devportal/utils/timecampusApplets.js.map +1 -0
  18. package/dist/generated/global-operations.d.ts +46 -5
  19. package/dist/generated/global-operations.js.map +1 -1
  20. package/dist/generated/global-types.d.ts +3901 -638
  21. package/dist/generated/global-types.js.map +1 -1
  22. package/dist/generated/wspace-operations.d.ts +678 -2
  23. package/dist/generated/wspace-operations.js +203 -4
  24. package/dist/generated/wspace-operations.js.map +1 -1
  25. package/dist/generated/wspace-types.d.ts +166197 -34713
  26. package/dist/translations/en.d.ts +46 -0
  27. package/dist/translations/en.js +47 -1
  28. package/dist/translations/en.js.map +1 -1
  29. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":["APP_STATUS_COLORS","WEBHOOK_STATUS_COLORS","DELIVERY_STATUS_COLORS","INVITATION_STATUS_COLORS","ORG_TIER_COLORS","PARTNER_TIER_COLORS","APP_TYPE_LABELS","ORG_ROLE_LABELS"],"sources":["../../../src/devportal/utils/constants.ts"],"sourcesContent":["/**\n * Developer Portal Constants\n */\n\n// API Endpoints\nexport const API_ENDPOINTS = {\n GRAPHQL: \"/graphql\",\n} as const;\n\n// App Status Colors\nexport const APP_STATUS_COLORS: Record<string, string> = {\n DRAFT: \"bg-bg-sunken text-text-primary\",\n SUBMITTED: \"bg-status-info-bg-subtle text-status-info-text\",\n IN_REVIEW: \"bg-status-warning-bg-subtle text-status-warning-text\",\n APPROVED: \"bg-status-success-bg-subtle text-status-success-text\",\n PUBLISHED: \"bg-status-success-bg-subtle text-status-success-text\",\n REJECTED: \"bg-status-error-bg-subtle text-status-error-text\",\n SUSPENDED: \"bg-accent-orange-subtle text-accent-orange\",\n DEPRECATED: \"bg-bg-sunken text-text-secondary\",\n ACTIVE: \"bg-status-success-bg-subtle text-status-success-text\",\n INACTIVE: \"bg-bg-sunken text-text-secondary\",\n REVOKED: \"bg-status-error-bg-subtle text-status-error-text\",\n};\n\n// Webhook Status Colors\nexport const WEBHOOK_STATUS_COLORS: Record<string, string> = {\n ACTIVE: \"bg-status-success-bg-subtle text-status-success-text\",\n PAUSED: \"bg-status-warning-bg-subtle text-status-warning-text\",\n FAILED: \"bg-status-error-bg-subtle text-status-error-text\",\n DISABLED: \"bg-bg-sunken text-text-secondary\",\n};\n\n// Delivery Status Colors\nexport const DELIVERY_STATUS_COLORS: Record<string, string> = {\n PENDING: \"bg-bg-sunken text-text-primary\",\n DELIVERING: \"bg-status-info-bg-subtle text-status-info-text\",\n DELIVERED: \"bg-status-success-bg-subtle text-status-success-text\",\n FAILED: \"bg-status-error-bg-subtle text-status-error-text\",\n RETRYING: \"bg-status-warning-bg-subtle text-status-warning-text\",\n};\n\n// Invitation Status Colors\nexport const INVITATION_STATUS_COLORS: Record<string, string> = {\n PENDING: \"bg-status-warning-bg-subtle text-status-warning-text\",\n ACCEPTED: \"bg-status-success-bg-subtle text-status-success-text\",\n REJECTED: \"bg-status-error-bg-subtle text-status-error-text\",\n EXPIRED: \"bg-bg-sunken text-text-secondary\",\n CANCELLED: \"bg-bg-sunken text-text-secondary\",\n};\n\n// Organization Tier Colors\nexport const ORG_TIER_COLORS: Record<string, string> = {\n FREE: \"bg-bg-sunken text-text-primary\",\n DEVELOPER: \"bg-status-info-bg-subtle text-status-info-text\",\n PROFESSIONAL: \"bg-accent-purple-subtle text-accent-purple\",\n ENTERPRISE: \"bg-status-warning-bg-subtle text-status-warning-text\",\n};\n\n// Partner Tier Colors\nexport const PARTNER_TIER_COLORS: Record<string, string> = {\n REGISTERED: \"bg-bg-sunken text-text-primary\",\n SELECT: \"bg-status-info-bg-subtle text-status-info-text\",\n PREMIER: \"bg-status-warning-bg-subtle text-status-warning-text\",\n};\n\n// App Type Labels\nexport const APP_TYPE_LABELS: Record<string, string> = {\n WEB_APP: \"Web Application\",\n MOBILE_APP: \"Mobile App\",\n DESKTOP_APP: \"Desktop App\",\n CLI_TOOL: \"CLI Tool\",\n API_INTEGRATION: \"API Integration\",\n WORKFLOW: \"Workflow\",\n WIDGET: \"Widget\",\n BOT: \"Bot\",\n SERVICE: \"Service\",\n INTEGRATION: \"Integration\",\n ANALYST: \"Analyst\",\n ASSISTANT: \"Assistant\",\n AUTOMATION: \"Automation\",\n SPECIALIST: \"Specialist\",\n PARSER: \"Parser\",\n DASHBOARD: \"Dashboard Template\",\n};\n\n// OAuth Grant Type Labels\nexport const GRANT_TYPE_LABELS: Record<string, string> = {\n AUTHORIZATION_CODE: \"Authorization Code\",\n REFRESH_TOKEN: \"Refresh Token\",\n CLIENT_CREDENTIALS: \"Client Credentials\",\n IMPLICIT: \"Implicit (Legacy)\",\n PASSWORD: \"Password (Legacy)\",\n};\n\n// API Key Type Labels\nexport const API_KEY_TYPE_LABELS: Record<string, string> = {\n PUBLISHABLE: \"Publishable Key\",\n SECRET: \"Secret Key\",\n RESTRICTED: \"Restricted Key\",\n};\n\n// Organization Role Labels\nexport const ORG_ROLE_LABELS: Record<string, string> = {\n OWNER: \"Owner\",\n ADMIN: \"Admin\",\n DEVELOPER: \"Developer\",\n VIEWER: \"Viewer\",\n};\n\n// Pagination defaults\nexport const DEFAULT_PAGE_SIZE = 10;\nexport const PAGE_SIZE_OPTIONS = [10, 25, 50, 100];\n\n// Date format\nexport const DATE_FORMAT = \"MMM d, yyyy\";\nexport const DATETIME_FORMAT = \"MMM d, yyyy HH:mm\";\n\n// Documentation links\nexport const DOCS_LINKS = {\n GETTING_STARTED:\n \"https://docs.burdenoff.com/developer-portal/getting-started\",\n API_REFERENCE: \"https://docs.burdenoff.com/api-reference\",\n OAUTH2: \"https://docs.burdenoff.com/developer-portal/oauth2\",\n WEBHOOKS: \"https://docs.burdenoff.com/developer-portal/webhooks\",\n SDK_NODE: \"https://docs.burdenoff.com/sdks/nodejs\",\n SDK_PYTHON: \"https://docs.burdenoff.com/sdks/python\",\n BEST_PRACTICES: \"https://docs.burdenoff.com/developer-portal/best-practices\",\n CHANGELOG: \"https://docs.burdenoff.com/changelog\",\n};\n\n// Feature flags (for progressive rollout)\nexport const FEATURE_FLAGS = {\n SHOW_ANALYTICS: true,\n SHOW_REVENUE: true,\n SHOW_STORE_INTEGRATION: true,\n SHOW_AUDIT_LOGS: true,\n ENABLE_DARK_MODE: true,\n};\n\n// Available OAuth/API scopes\nexport const AVAILABLE_SCOPES = [\n // User scopes\n {\n scope: \"user:read\",\n description: \"Read user profile information\",\n category: \"User\",\n },\n {\n scope: \"user:write\",\n description: \"Modify user profile information\",\n category: \"User\",\n },\n {\n scope: \"user:email\",\n description: \"Access user email address\",\n category: \"User\",\n },\n // Workspace scopes\n {\n scope: \"workspace:read\",\n description: \"Read workspace information\",\n category: \"Workspace\",\n },\n {\n scope: \"workspace:write\",\n description: \"Create and modify workspaces\",\n category: \"Workspace\",\n },\n {\n scope: \"workspace:delete\",\n description: \"Delete workspaces\",\n category: \"Workspace\",\n },\n {\n scope: \"workspace:members\",\n description: \"Manage workspace members\",\n category: \"Workspace\",\n },\n // Project scopes\n {\n scope: \"project:read\",\n description: \"Read project information\",\n category: \"Project\",\n },\n {\n scope: \"project:write\",\n description: \"Create and modify projects\",\n category: \"Project\",\n },\n {\n scope: \"project:delete\",\n description: \"Delete projects\",\n category: \"Project\",\n },\n // Task scopes\n { scope: \"task:read\", description: \"Read tasks\", category: \"Task\" },\n {\n scope: \"task:write\",\n description: \"Create and modify tasks\",\n category: \"Task\",\n },\n { scope: \"task:delete\", description: \"Delete tasks\", category: \"Task\" },\n // File scopes\n { scope: \"file:read\", description: \"Read files\", category: \"File\" },\n {\n scope: \"file:write\",\n description: \"Upload and modify files\",\n category: \"File\",\n },\n { scope: \"file:delete\", description: \"Delete files\", category: \"File\" },\n // Offline access\n {\n scope: \"offline_access\",\n description: \"Access data while user is offline\",\n category: \"Access\",\n },\n] as const;\n"],"mappings":";AAUA,IAAaA,IAA4C;CACvD,OAAO;CACP,WAAW;CACX,WAAW;CACX,UAAU;CACV,WAAW;CACX,UAAU;CACV,WAAW;CACX,YAAY;CACZ,QAAQ;CACR,UAAU;CACV,SAAS;AACX,GAGaC,IAAgD;CAC3D,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,UAAU;AACZ,GAGaC,IAAiD;CAC5D,SAAS;CACT,YAAY;CACZ,WAAW;CACX,QAAQ;CACR,UAAU;AACZ,GAGaC,IAAmD;CAC9D,SAAS;CACT,UAAU;CACV,UAAU;CACV,SAAS;CACT,WAAW;AACb,GAGaC,IAA0C;CACrD,MAAM;CACN,WAAW;CACX,cAAc;CACd,YAAY;AACd,GAGaC,IAA8C;CACzD,YAAY;CACZ,QAAQ;CACR,SAAS;AACX,GAGaC,IAA0C;CACrD,SAAS;CACT,YAAY;CACZ,aAAa;CACb,UAAU;CACV,iBAAiB;CACjB,UAAU;CACV,QAAQ;CACR,KAAK;CACL,SAAS;CACT,aAAa;CACb,SAAS;CACT,WAAW;CACX,YAAY;CACZ,YAAY;CACZ,QAAQ;CACR,WAAW;AACb,GAmBaC,IAA0C;CACrD,OAAO;CACP,OAAO;CACP,WAAW;CACX,QAAQ;AACV"}
1
+ {"version":3,"file":"constants.js","names":["APP_STATUS_COLORS","WEBHOOK_STATUS_COLORS","DELIVERY_STATUS_COLORS","INVITATION_STATUS_COLORS","ORG_TIER_COLORS","PARTNER_TIER_COLORS","APP_TYPE_LABELS","ORG_ROLE_LABELS"],"sources":["../../../src/devportal/utils/constants.ts"],"sourcesContent":["/**\n * Developer Portal Constants\n */\n\n// API Endpoints\nexport const API_ENDPOINTS = {\n GRAPHQL: \"/graphql\",\n} as const;\n\n// App Status Colors\nexport const APP_STATUS_COLORS: Record<string, string> = {\n DRAFT: \"bg-bg-sunken text-text-primary\",\n SUBMITTED: \"bg-status-info-bg-subtle text-status-info-text\",\n IN_REVIEW: \"bg-status-warning-bg-subtle text-status-warning-text\",\n APPROVED: \"bg-status-success-bg-subtle text-status-success-text\",\n PUBLISHED: \"bg-status-success-bg-subtle text-status-success-text\",\n REJECTED: \"bg-status-error-bg-subtle text-status-error-text\",\n SUSPENDED: \"bg-accent-orange-subtle text-accent-orange\",\n DEPRECATED: \"bg-bg-sunken text-text-secondary\",\n ACTIVE: \"bg-status-success-bg-subtle text-status-success-text\",\n INACTIVE: \"bg-bg-sunken text-text-secondary\",\n REVOKED: \"bg-status-error-bg-subtle text-status-error-text\",\n // TimeCampus applet and marketplace states (BOFF-11005)\n CERTIFIED: \"bg-status-success-bg-subtle text-status-success-text\",\n WITHDRAWN: \"bg-bg-sunken text-text-secondary\",\n SUPERSEDED: \"bg-bg-sunken text-text-secondary\",\n NOT_LISTED: \"bg-bg-sunken text-text-secondary\",\n};\n\n// Webhook Status Colors\nexport const WEBHOOK_STATUS_COLORS: Record<string, string> = {\n ACTIVE: \"bg-status-success-bg-subtle text-status-success-text\",\n PAUSED: \"bg-status-warning-bg-subtle text-status-warning-text\",\n FAILED: \"bg-status-error-bg-subtle text-status-error-text\",\n DISABLED: \"bg-bg-sunken text-text-secondary\",\n};\n\n// Delivery Status Colors\nexport const DELIVERY_STATUS_COLORS: Record<string, string> = {\n PENDING: \"bg-bg-sunken text-text-primary\",\n DELIVERING: \"bg-status-info-bg-subtle text-status-info-text\",\n DELIVERED: \"bg-status-success-bg-subtle text-status-success-text\",\n FAILED: \"bg-status-error-bg-subtle text-status-error-text\",\n RETRYING: \"bg-status-warning-bg-subtle text-status-warning-text\",\n};\n\n// Invitation Status Colors\nexport const INVITATION_STATUS_COLORS: Record<string, string> = {\n PENDING: \"bg-status-warning-bg-subtle text-status-warning-text\",\n ACCEPTED: \"bg-status-success-bg-subtle text-status-success-text\",\n REJECTED: \"bg-status-error-bg-subtle text-status-error-text\",\n EXPIRED: \"bg-bg-sunken text-text-secondary\",\n CANCELLED: \"bg-bg-sunken text-text-secondary\",\n};\n\n// Organization Tier Colors\nexport const ORG_TIER_COLORS: Record<string, string> = {\n FREE: \"bg-bg-sunken text-text-primary\",\n DEVELOPER: \"bg-status-info-bg-subtle text-status-info-text\",\n PROFESSIONAL: \"bg-accent-purple-subtle text-accent-purple\",\n ENTERPRISE: \"bg-status-warning-bg-subtle text-status-warning-text\",\n};\n\n// Partner Tier Colors\nexport const PARTNER_TIER_COLORS: Record<string, string> = {\n REGISTERED: \"bg-bg-sunken text-text-primary\",\n SELECT: \"bg-status-info-bg-subtle text-status-info-text\",\n PREMIER: \"bg-status-warning-bg-subtle text-status-warning-text\",\n};\n\n// App Type Labels\nexport const APP_TYPE_LABELS: Record<string, string> = {\n WEB_APP: \"Web Application\",\n MOBILE_APP: \"Mobile App\",\n DESKTOP_APP: \"Desktop App\",\n CLI_TOOL: \"CLI Tool\",\n API_INTEGRATION: \"API Integration\",\n WORKFLOW: \"Workflow\",\n WIDGET: \"Widget\",\n BOT: \"Bot\",\n SERVICE: \"Service\",\n INTEGRATION: \"Integration\",\n ANALYST: \"Analyst\",\n ASSISTANT: \"Assistant\",\n AUTOMATION: \"Automation\",\n SPECIALIST: \"Specialist\",\n PARSER: \"Parser\",\n DASHBOARD: \"Dashboard Template\",\n};\n\n// OAuth Grant Type Labels\nexport const GRANT_TYPE_LABELS: Record<string, string> = {\n AUTHORIZATION_CODE: \"Authorization Code\",\n REFRESH_TOKEN: \"Refresh Token\",\n CLIENT_CREDENTIALS: \"Client Credentials\",\n IMPLICIT: \"Implicit (Legacy)\",\n PASSWORD: \"Password (Legacy)\",\n};\n\n// API Key Type Labels\nexport const API_KEY_TYPE_LABELS: Record<string, string> = {\n PUBLISHABLE: \"Publishable Key\",\n SECRET: \"Secret Key\",\n RESTRICTED: \"Restricted Key\",\n};\n\n// Organization Role Labels\nexport const ORG_ROLE_LABELS: Record<string, string> = {\n OWNER: \"Owner\",\n ADMIN: \"Admin\",\n DEVELOPER: \"Developer\",\n VIEWER: \"Viewer\",\n};\n\n// Pagination defaults\nexport const DEFAULT_PAGE_SIZE = 10;\nexport const PAGE_SIZE_OPTIONS = [10, 25, 50, 100];\n\n// Date format\nexport const DATE_FORMAT = \"MMM d, yyyy\";\nexport const DATETIME_FORMAT = \"MMM d, yyyy HH:mm\";\n\n// Documentation links\nexport const DOCS_LINKS = {\n GETTING_STARTED:\n \"https://docs.burdenoff.com/developer-portal/getting-started\",\n API_REFERENCE: \"https://docs.burdenoff.com/api-reference\",\n OAUTH2: \"https://docs.burdenoff.com/developer-portal/oauth2\",\n WEBHOOKS: \"https://docs.burdenoff.com/developer-portal/webhooks\",\n SDK_NODE: \"https://docs.burdenoff.com/sdks/nodejs\",\n SDK_PYTHON: \"https://docs.burdenoff.com/sdks/python\",\n BEST_PRACTICES: \"https://docs.burdenoff.com/developer-portal/best-practices\",\n CHANGELOG: \"https://docs.burdenoff.com/changelog\",\n};\n\n// Feature flags (for progressive rollout)\nexport const FEATURE_FLAGS = {\n SHOW_ANALYTICS: true,\n SHOW_REVENUE: true,\n SHOW_STORE_INTEGRATION: true,\n SHOW_AUDIT_LOGS: true,\n ENABLE_DARK_MODE: true,\n};\n\n// Available OAuth/API scopes\nexport const AVAILABLE_SCOPES = [\n // User scopes\n {\n scope: \"user:read\",\n description: \"Read user profile information\",\n category: \"User\",\n },\n {\n scope: \"user:write\",\n description: \"Modify user profile information\",\n category: \"User\",\n },\n {\n scope: \"user:email\",\n description: \"Access user email address\",\n category: \"User\",\n },\n // Workspace scopes\n {\n scope: \"workspace:read\",\n description: \"Read workspace information\",\n category: \"Workspace\",\n },\n {\n scope: \"workspace:write\",\n description: \"Create and modify workspaces\",\n category: \"Workspace\",\n },\n {\n scope: \"workspace:delete\",\n description: \"Delete workspaces\",\n category: \"Workspace\",\n },\n {\n scope: \"workspace:members\",\n description: \"Manage workspace members\",\n category: \"Workspace\",\n },\n // Project scopes\n {\n scope: \"project:read\",\n description: \"Read project information\",\n category: \"Project\",\n },\n {\n scope: \"project:write\",\n description: \"Create and modify projects\",\n category: \"Project\",\n },\n {\n scope: \"project:delete\",\n description: \"Delete projects\",\n category: \"Project\",\n },\n // Task scopes\n { scope: \"task:read\", description: \"Read tasks\", category: \"Task\" },\n {\n scope: \"task:write\",\n description: \"Create and modify tasks\",\n category: \"Task\",\n },\n { scope: \"task:delete\", description: \"Delete tasks\", category: \"Task\" },\n // File scopes\n { scope: \"file:read\", description: \"Read files\", category: \"File\" },\n {\n scope: \"file:write\",\n description: \"Upload and modify files\",\n category: \"File\",\n },\n { scope: \"file:delete\", description: \"Delete files\", category: \"File\" },\n // Offline access\n {\n scope: \"offline_access\",\n description: \"Access data while user is offline\",\n category: \"Access\",\n },\n] as const;\n"],"mappings":";AAUA,IAAaA,IAA4C;CACvD,OAAO;CACP,WAAW;CACX,WAAW;CACX,UAAU;CACV,WAAW;CACX,UAAU;CACV,WAAW;CACX,YAAY;CACZ,QAAQ;CACR,UAAU;CACV,SAAS;CAET,WAAW;CACX,WAAW;CACX,YAAY;CACZ,YAAY;AACd,GAGaC,IAAgD;CAC3D,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,UAAU;AACZ,GAGaC,IAAiD;CAC5D,SAAS;CACT,YAAY;CACZ,WAAW;CACX,QAAQ;CACR,UAAU;AACZ,GAGaC,IAAmD;CAC9D,SAAS;CACT,UAAU;CACV,UAAU;CACV,SAAS;CACT,WAAW;AACb,GAGaC,IAA0C;CACrD,MAAM;CACN,WAAW;CACX,cAAc;CACd,YAAY;AACd,GAGaC,IAA8C;CACzD,YAAY;CACZ,QAAQ;CACR,SAAS;AACX,GAGaC,IAA0C;CACrD,SAAS;CACT,YAAY;CACZ,aAAa;CACb,UAAU;CACV,iBAAiB;CACjB,UAAU;CACV,QAAQ;CACR,KAAK;CACL,SAAS;CACT,aAAa;CACb,SAAS;CACT,WAAW;CACX,YAAY;CACZ,YAAY;CACZ,QAAQ;CACR,WAAW;AACb,GAmBaC,IAA0C;CACrD,OAAO;CACP,OAAO;CACP,WAAW;CACX,QAAQ;AACV"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * TimeCampus applets in the developer portal (BOFF-11005).
3
+ *
4
+ * Pure helpers for the TimeCampus applets page: manifest text handling, the
5
+ * starter manifest, version bumps and the rules that decide which developer
6
+ * action is available for an applet. The rules mirror wspace-timecampus-svc
7
+ * (the service is still the authority; these only decide which buttons to
8
+ * offer and what to say when one is not available).
9
+ */
10
+ /** Public TimeCampus docs: the manifest reference and the extensibility overview. */
11
+ export declare const TIMECAMPUS_MANIFEST_DOCS_URL = "https://docs.timecampus.com/developers/applet-manifest";
12
+ export declare const TIMECAMPUS_APPLETS_DOCS_URL = "https://docs.timecampus.com/extensibility/applets";
13
+ /** The sample widget the TimeCampus app shell serves (copy it as a starting point). */
14
+ export declare const TIMECAMPUS_SAMPLE_WIDGET_URL = "https://app.timecampus.com/applet-samples/time-summary.html";
15
+ export type ManifestParse = {
16
+ ok: true;
17
+ manifest: Record<string, unknown>;
18
+ } | {
19
+ ok: false;
20
+ error: string;
21
+ };
22
+ /** Parse the manifest editor's text into a JSON object. */
23
+ export declare function parseManifestText(text: string): ManifestParse;
24
+ export declare function manifestText(manifest: unknown): string;
25
+ /** Next patch version of MAJOR.MINOR.PATCH (falls back to 1.0.0). */
26
+ export declare function nextPatchVersion(version: string): string;
27
+ /** The manifest for a new version: the given one with the next patch version. */
28
+ export declare function manifestForNextVersion(manifest: unknown): string;
29
+ /** A working starter manifest that points at the TimeCampus sample widget. */
30
+ export declare function starterManifest(): string;
31
+ /** The bits of an applet the page decides on. */
32
+ export interface AppletActionInput {
33
+ status: string;
34
+ latestVersion: {
35
+ id: string;
36
+ version: string;
37
+ status: string;
38
+ };
39
+ liveVersion?: {
40
+ version: string;
41
+ } | null;
42
+ marketplace?: {
43
+ status: string;
44
+ latestSubmission: {
45
+ version: string;
46
+ status: string;
47
+ };
48
+ liveSubmission?: {
49
+ version: string;
50
+ } | null;
51
+ } | null;
52
+ }
53
+ /** What the developer can do with the applet's latest version right now. */
54
+ export type VersionAction = {
55
+ kind: "submit";
56
+ versionId: string;
57
+ } | {
58
+ kind: "withdraw";
59
+ versionId: string;
60
+ } | {
61
+ kind: "none";
62
+ };
63
+ /**
64
+ * A draft latest version can be submitted for workspace review; one in
65
+ * review can be withdrawn back to a draft. Rejected, published, superseded
66
+ * and suspended versions take no action here: add a new version instead.
67
+ */
68
+ export declare function versionAction(applet: AppletActionInput): VersionAction;
69
+ /** Whether a new version can be added (only when no draft or review is open). */
70
+ export declare function canAddVersion(applet: AppletActionInput): boolean;
71
+ /**
72
+ * Whether the latest version's manifest can be replaced in place. The
73
+ * service accepts edits to a DRAFT or REJECTED version (a rejected one
74
+ * returns to DRAFT); versions in review, live or retired are immutable.
75
+ */
76
+ export declare function canEditVersion(applet: AppletActionInput): boolean;
77
+ /** Compare two MAJOR.MINOR.PATCH versions (non-numeric parts count as 0). */
78
+ export declare function compareVersions(a: string, b: string): number;
79
+ export type MarketplaceOffer = {
80
+ canOffer: true;
81
+ version: string;
82
+ } | {
83
+ canOffer: false;
84
+ reason: string;
85
+ };
86
+ /**
87
+ * Whether the developer can offer the applet's live workspace version to the
88
+ * public marketplace now, and why not otherwise. Mirrors the service rules:
89
+ * only a workspace-published version, one submission in certification at a
90
+ * time, and only a version higher than every certified one.
91
+ */
92
+ export declare function marketplaceOffer(applet: AppletActionInput): MarketplaceOffer;
93
+ /** Whether the latest marketplace submission is still in certification (and can be withdrawn). */
94
+ export declare function canWithdrawFromMarketplace(applet: AppletActionInput): boolean;
95
+ /** A readable date for an ISO timestamp, or the raw value when it cannot be parsed. */
96
+ export declare function formatDate(iso: string): string;
97
+ /** A short, user-facing message for a failed request. */
98
+ export declare function errorText(err: unknown): string;
@@ -0,0 +1,130 @@
1
+ // src/devportal/utils/timecampusApplets.ts
2
+ var e = "https://docs.timecampus.com/developers/applet-manifest", t = "https://docs.timecampus.com/extensibility/applets", n = "https://app.timecampus.com/applet-samples/time-summary.html";
3
+ function r(e) {
4
+ if (!e.trim()) return {
5
+ ok: !1,
6
+ error: "Paste or write a manifest."
7
+ };
8
+ let t;
9
+ try {
10
+ t = JSON.parse(e);
11
+ } catch (e) {
12
+ return {
13
+ ok: !1,
14
+ error: `Not valid JSON: ${e instanceof Error ? e.message : "parse error"}`
15
+ };
16
+ }
17
+ return typeof t != "object" || !t || Array.isArray(t) ? {
18
+ ok: !1,
19
+ error: "The manifest must be a JSON object."
20
+ } : {
21
+ ok: !0,
22
+ manifest: t
23
+ };
24
+ }
25
+ function i(e) {
26
+ return JSON.stringify(e, null, 2);
27
+ }
28
+ function a(e) {
29
+ let t = /^(\d+)\.(\d+)\.(\d+)$/.exec(e);
30
+ return t ? `${t[1]}.${t[2]}.${Number(t[3]) + 1}` : "1.0.0";
31
+ }
32
+ function o(e) {
33
+ if (typeof e != "object" || !e) return i(e);
34
+ let t = e, n = typeof t.version == "string" ? t.version : "";
35
+ return i({
36
+ ...t,
37
+ version: a(n)
38
+ });
39
+ }
40
+ function s() {
41
+ return i({
42
+ manifestVersion: 1,
43
+ key: "my-first-applet",
44
+ name: "My first applet",
45
+ version: "1.0.0",
46
+ description: "Shows your tracked time today in a sandboxed widget.",
47
+ icon: "Puzzle",
48
+ category: "ANALYTICS",
49
+ entryPoint: "https://app.timecampus.com/applet-samples/",
50
+ permissions: ["time-summary:read"],
51
+ widgets: [{
52
+ key: "today",
53
+ name: "Tracked today",
54
+ description: "Your tracked time today and this week",
55
+ path: "/applet-samples/time-summary.html",
56
+ height: 220
57
+ }],
58
+ developer: { name: "Your team" }
59
+ });
60
+ }
61
+ function c(e) {
62
+ let t = e.latestVersion;
63
+ return t.status === "DRAFT" ? {
64
+ kind: "submit",
65
+ versionId: t.id
66
+ } : t.status === "IN_REVIEW" ? {
67
+ kind: "withdraw",
68
+ versionId: t.id
69
+ } : { kind: "none" };
70
+ }
71
+ function l(e) {
72
+ let t = e.latestVersion.status;
73
+ return t !== "DRAFT" && t !== "IN_REVIEW";
74
+ }
75
+ function u(e) {
76
+ let t = e.latestVersion.status;
77
+ return t === "DRAFT" || t === "REJECTED";
78
+ }
79
+ function d(e, t) {
80
+ let n = e.split(".").map((e) => Number(e) || 0), r = t.split(".").map((e) => Number(e) || 0);
81
+ for (let e = 0; e < 3; e += 1) {
82
+ let t = (n[e] ?? 0) - (r[e] ?? 0);
83
+ if (t !== 0) return t;
84
+ }
85
+ return 0;
86
+ }
87
+ var f = /* @__PURE__ */ new Set(["CERTIFIED", "SUPERSEDED"]);
88
+ function p(e) {
89
+ if (!e) return null;
90
+ let t = [];
91
+ return e.liveSubmission && t.push(e.liveSubmission.version), f.has(e.latestSubmission.status) && t.push(e.latestSubmission.version), t.reduce((e, t) => e === null || d(t, e) > 0 ? t : e, null);
92
+ }
93
+ function m(e) {
94
+ let t = e.liveVersion;
95
+ if (e.status !== "PUBLISHED" || !t) return {
96
+ canOffer: !1,
97
+ reason: "Publish a version in your workspace first."
98
+ };
99
+ let n = e.marketplace;
100
+ if (n?.latestSubmission.status === "IN_REVIEW") return {
101
+ canOffer: !1,
102
+ reason: `v${n.latestSubmission.version} is waiting for platform certification.`
103
+ };
104
+ let r = p(n);
105
+ return r !== null && d(t.version, r) <= 0 ? {
106
+ canOffer: !1,
107
+ reason: `v${r} is already certified. Publish a newer version to offer it.`
108
+ } : {
109
+ canOffer: !0,
110
+ version: t.version
111
+ };
112
+ }
113
+ function h(e) {
114
+ return e.marketplace?.latestSubmission.status === "IN_REVIEW";
115
+ }
116
+ function g(e) {
117
+ let t = new Date(e);
118
+ return Number.isNaN(t.getTime()) ? e : t.toLocaleDateString(void 0, {
119
+ year: "numeric",
120
+ month: "short",
121
+ day: "numeric"
122
+ });
123
+ }
124
+ function _(e) {
125
+ let t = e instanceof Error ? e.message : "";
126
+ return /forbidden|permission|not authori[sz]ed/i.test(t) ? "You do not have permission to do that in this workspace." : t || "Something went wrong";
127
+ }
128
+ export { t as TIMECAMPUS_APPLETS_DOCS_URL, e as TIMECAMPUS_MANIFEST_DOCS_URL, n as TIMECAMPUS_SAMPLE_WIDGET_URL, l as canAddVersion, u as canEditVersion, h as canWithdrawFromMarketplace, d as compareVersions, _ as errorText, g as formatDate, o as manifestForNextVersion, i as manifestText, m as marketplaceOffer, a as nextPatchVersion, r as parseManifestText, s as starterManifest, c as versionAction };
129
+
130
+ //# sourceMappingURL=timecampusApplets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timecampusApplets.js","names":["TIMECAMPUS_MANIFEST_DOCS_URL","TIMECAMPUS_APPLETS_DOCS_URL","TIMECAMPUS_SAMPLE_WIDGET_URL","parseManifestText","text","value","err","manifestText","manifest","nextPatchVersion","match","version","manifestForNextVersion","current","starterManifest","versionAction","latest","applet","canAddVersion","status","canEditVersion","compareVersions","left","a","part","right","b","i","diff","CERTIFIED_STATUSES","highestCertifiedVersion","listing","versions","top","marketplaceOffer","live","certified","canWithdrawFromMarketplace","formatDate","date","iso","errorText","message"],"sources":["../../../src/devportal/utils/timecampusApplets.ts"],"sourcesContent":["/**\n * TimeCampus applets in the developer portal (BOFF-11005).\n *\n * Pure helpers for the TimeCampus applets page: manifest text handling, the\n * starter manifest, version bumps and the rules that decide which developer\n * action is available for an applet. The rules mirror wspace-timecampus-svc\n * (the service is still the authority; these only decide which buttons to\n * offer and what to say when one is not available).\n */\n\n/** Public TimeCampus docs: the manifest reference and the extensibility overview. */\nexport const TIMECAMPUS_MANIFEST_DOCS_URL =\n \"https://docs.timecampus.com/developers/applet-manifest\";\nexport const TIMECAMPUS_APPLETS_DOCS_URL =\n \"https://docs.timecampus.com/extensibility/applets\";\n/** The sample widget the TimeCampus app shell serves (copy it as a starting point). */\nexport const TIMECAMPUS_SAMPLE_WIDGET_URL =\n \"https://app.timecampus.com/applet-samples/time-summary.html\";\nconst SAMPLE_ENTRY_POINT = \"https://app.timecampus.com/applet-samples/\";\n\nexport type ManifestParse =\n | { ok: true; manifest: Record<string, unknown> }\n | { ok: false; error: string };\n\n/** Parse the manifest editor's text into a JSON object. */\nexport function parseManifestText(text: string): ManifestParse {\n if (!text.trim()) return { ok: false, error: \"Paste or write a manifest.\" };\n let value: unknown;\n try {\n value = JSON.parse(text);\n } catch (err) {\n return {\n ok: false,\n error: `Not valid JSON: ${err instanceof Error ? err.message : \"parse error\"}`,\n };\n }\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return { ok: false, error: \"The manifest must be a JSON object.\" };\n }\n return { ok: true, manifest: value as Record<string, unknown> };\n}\n\nexport function manifestText(manifest: unknown): string {\n return JSON.stringify(manifest, null, 2);\n}\n\n/** Next patch version of MAJOR.MINOR.PATCH (falls back to 1.0.0). */\nexport function nextPatchVersion(version: string): string {\n const match = /^(\\d+)\\.(\\d+)\\.(\\d+)$/.exec(version);\n if (!match) return \"1.0.0\";\n return `${match[1]}.${match[2]}.${Number(match[3]) + 1}`;\n}\n\n/** The manifest for a new version: the given one with the next patch version. */\nexport function manifestForNextVersion(manifest: unknown): string {\n if (typeof manifest !== \"object\" || manifest === null) {\n return manifestText(manifest);\n }\n const current = manifest as Record<string, unknown>;\n const version = typeof current.version === \"string\" ? current.version : \"\";\n return manifestText({ ...current, version: nextPatchVersion(version) });\n}\n\n/** A working starter manifest that points at the TimeCampus sample widget. */\nexport function starterManifest(): string {\n return manifestText({\n manifestVersion: 1,\n key: \"my-first-applet\",\n name: \"My first applet\",\n version: \"1.0.0\",\n description: \"Shows your tracked time today in a sandboxed widget.\",\n icon: \"Puzzle\",\n category: \"ANALYTICS\",\n entryPoint: SAMPLE_ENTRY_POINT,\n permissions: [\"time-summary:read\"],\n widgets: [\n {\n key: \"today\",\n name: \"Tracked today\",\n description: \"Your tracked time today and this week\",\n path: \"/applet-samples/time-summary.html\",\n height: 220,\n },\n ],\n developer: { name: \"Your team\" },\n });\n}\n\n/** The bits of an applet the page decides on. */\nexport interface AppletActionInput {\n status: string;\n latestVersion: { id: string; version: string; status: string };\n liveVersion?: { version: string } | null;\n marketplace?: {\n status: string;\n latestSubmission: { version: string; status: string };\n liveSubmission?: { version: string } | null;\n } | null;\n}\n\n/** What the developer can do with the applet's latest version right now. */\nexport type VersionAction =\n | { kind: \"submit\"; versionId: string }\n | { kind: \"withdraw\"; versionId: string }\n | { kind: \"none\" };\n\n/**\n * A draft latest version can be submitted for workspace review; one in\n * review can be withdrawn back to a draft. Rejected, published, superseded\n * and suspended versions take no action here: add a new version instead.\n */\nexport function versionAction(applet: AppletActionInput): VersionAction {\n const latest = applet.latestVersion;\n if (latest.status === \"DRAFT\") {\n return { kind: \"submit\", versionId: latest.id };\n }\n if (latest.status === \"IN_REVIEW\") {\n return { kind: \"withdraw\", versionId: latest.id };\n }\n return { kind: \"none\" };\n}\n\n/** Whether a new version can be added (only when no draft or review is open). */\nexport function canAddVersion(applet: AppletActionInput): boolean {\n const status = applet.latestVersion.status;\n return status !== \"DRAFT\" && status !== \"IN_REVIEW\";\n}\n\n/**\n * Whether the latest version's manifest can be replaced in place. The\n * service accepts edits to a DRAFT or REJECTED version (a rejected one\n * returns to DRAFT); versions in review, live or retired are immutable.\n */\nexport function canEditVersion(applet: AppletActionInput): boolean {\n const status = applet.latestVersion.status;\n return status === \"DRAFT\" || status === \"REJECTED\";\n}\n\n/** Compare two MAJOR.MINOR.PATCH versions (non-numeric parts count as 0). */\nexport function compareVersions(a: string, b: string): number {\n const left = a.split(\".\").map((part) => Number(part) || 0);\n const right = b.split(\".\").map((part) => Number(part) || 0);\n for (let i = 0; i < 3; i += 1) {\n const diff = (left[i] ?? 0) - (right[i] ?? 0);\n if (diff !== 0) return diff;\n }\n return 0;\n}\n\nconst CERTIFIED_STATUSES = new Set([\"CERTIFIED\", \"SUPERSEDED\"]);\n\n/** The highest certified version the page can see (the live and latest submissions). */\nfunction highestCertifiedVersion(\n listing: AppletActionInput[\"marketplace\"],\n): string | null {\n if (!listing) return null;\n const versions: string[] = [];\n if (listing.liveSubmission) versions.push(listing.liveSubmission.version);\n if (CERTIFIED_STATUSES.has(listing.latestSubmission.status)) {\n versions.push(listing.latestSubmission.version);\n }\n return versions.reduce<string | null>(\n (top, version) =>\n top === null || compareVersions(version, top) > 0 ? version : top,\n null,\n );\n}\n\nexport type MarketplaceOffer =\n { canOffer: true; version: string } | { canOffer: false; reason: string };\n\n/**\n * Whether the developer can offer the applet's live workspace version to the\n * public marketplace now, and why not otherwise. Mirrors the service rules:\n * only a workspace-published version, one submission in certification at a\n * time, and only a version higher than every certified one.\n */\nexport function marketplaceOffer(applet: AppletActionInput): MarketplaceOffer {\n const live = applet.liveVersion;\n if (applet.status !== \"PUBLISHED\" || !live) {\n return {\n canOffer: false,\n reason: \"Publish a version in your workspace first.\",\n };\n }\n const listing = applet.marketplace;\n if (listing?.latestSubmission.status === \"IN_REVIEW\") {\n return {\n canOffer: false,\n reason: `v${listing.latestSubmission.version} is waiting for platform certification.`,\n };\n }\n const certified = highestCertifiedVersion(listing);\n if (certified !== null && compareVersions(live.version, certified) <= 0) {\n return {\n canOffer: false,\n reason: `v${certified} is already certified. Publish a newer version to offer it.`,\n };\n }\n return { canOffer: true, version: live.version };\n}\n\n/** Whether the latest marketplace submission is still in certification (and can be withdrawn). */\nexport function canWithdrawFromMarketplace(applet: AppletActionInput): boolean {\n return applet.marketplace?.latestSubmission.status === \"IN_REVIEW\";\n}\n\n/** A readable date for an ISO timestamp, or the raw value when it cannot be parsed. */\nexport function formatDate(iso: string): string {\n const date = new Date(iso);\n if (Number.isNaN(date.getTime())) return iso;\n return date.toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n\n/** A short, user-facing message for a failed request. */\nexport function errorText(err: unknown): string {\n const message = err instanceof Error ? err.message : \"\";\n if (/forbidden|permission|not authori[sz]ed/i.test(message)) {\n return \"You do not have permission to do that in this workspace.\";\n }\n return message || \"Something went wrong\";\n}\n"],"mappings":"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"}
@@ -69,7 +69,10 @@ export type CreateApplicationInput = {
69
69
  appId?: string | number | null | undefined;
70
70
  appType: AppType;
71
71
  category?: string | null | undefined;
72
- /** Which products this item is compatible with (e.g. "fluidgrids", "workspaces"). Stored in manifest.compatibility.products and extracted to the store on publish. */
72
+ /**
73
+ * Which products this item is compatible with (e.g. "fluidgrids", "workspaces").
74
+ * Stored in manifest.compatibility.products and extracted to the store on publish.
75
+ */
73
76
  compatibleProducts?: Array<string> | null | undefined;
74
77
  description?: string | null | undefined;
75
78
  developerOrganizationId?: string | number | null | undefined;
@@ -97,9 +100,20 @@ export type CreateApplicationVersionInput = {
97
100
  manifest?: Record<string, unknown> | null | undefined;
98
101
  maxPlatformVersion?: string | null | undefined;
99
102
  minPlatformVersion?: string | null | undefined;
103
+ /**
104
+ * wspace-files-svc File id of the uploaded package, captured with packageUrl
105
+ * at upload time. Lets the service fetch fresh download URLs from the
106
+ * canonical file owner instead of re-signing S3 URLs itself (BOFF-5311).
107
+ */
108
+ packageFileId?: string | null | undefined;
100
109
  packageHash?: string | null | undefined;
101
110
  packageSize?: string | null | undefined;
102
111
  packageUrl?: string | null | undefined;
112
+ /**
113
+ * Workspace that owns the files-svc File referenced by packageFileId.
114
+ * Required together with packageFileId for the files-svc download-URL path.
115
+ */
116
+ packageWorkspaceId?: string | null | undefined;
103
117
  releaseNotes?: string | null | undefined;
104
118
  requiredScopes?: Array<string> | null | undefined;
105
119
  version: string;
@@ -133,7 +147,12 @@ export type CreateDeveloperOrganizationInput = {
133
147
  logoUrl?: string | null | undefined;
134
148
  metadata?: Record<string, unknown> | null | undefined;
135
149
  name: string;
136
- /** Optional at creation — dedicated pickup pincode for carrier rate quoting on physical-goods orders (Shiprocket, etc). Only meaningful for createSellerOrganization (PHYSICAL orgs); ignored for DIGITAL orgs. Can always be added or changed later from organization settings. */
150
+ /**
151
+ * Optional at creation — dedicated pickup pincode for carrier rate quoting
152
+ * on physical-goods orders (Shiprocket, etc). Only meaningful for
153
+ * createSellerOrganization (PHYSICAL orgs); ignored for DIGITAL orgs. Can
154
+ * always be added or changed later from organization settings.
155
+ */
137
156
  pickupPostalCode?: string | null | undefined;
138
157
  slug?: string | null | undefined;
139
158
  supportEmail?: string | null | undefined;
@@ -161,7 +180,11 @@ export type CreateWebhookInput = {
161
180
  export type DelegationStatus = 'ACTIVE' | 'EXPIRED' | 'REVOKED';
162
181
  export type DevPortalPaymentMethodType = 'BANK_ACCOUNT' | 'CHECK' | 'PAYPAL' | 'STRIPE_CONNECT' | 'WIRE';
163
182
  export type DevPortalPricingModel = 'ENTERPRISE' | 'FREE' | 'FREEMIUM' | 'ONE_TIME' | 'SUBSCRIPTION' | 'USAGE_BASED';
164
- /** DIGITAL orgs publish Applications to the store; PHYSICAL orgs list physical goods via the seller portal. Not user-selectable — fixed at creation by which flow provisioned the org. See BOFF-7285. */
183
+ /**
184
+ * DIGITAL orgs publish Applications to the store; PHYSICAL orgs list physical
185
+ * goods via the seller portal. Not user-selectable — fixed at creation by which
186
+ * flow provisioned the org. See BOFF-7285.
187
+ */
165
188
  export type DeveloperOrgKind = 'DIGITAL' | 'PHYSICAL';
166
189
  export type DeveloperOrgRole = 'ADMIN' | 'DEVELOPER' | 'OWNER' | 'VIEWER';
167
190
  export type DeveloperOrgTier = 'DEVELOPER' | 'ENTERPRISE' | 'FREE' | 'PROFESSIONAL';
@@ -247,7 +270,10 @@ export type UpdateApplicationInput = {
247
270
  appType?: AppType | null | undefined;
248
271
  bannerUrl?: string | null | undefined;
249
272
  category?: string | null | undefined;
250
- /** Which products this item is compatible with (e.g. "fluidgrids", "workspaces"). Stored in manifest.compatibility.products and extracted to the store on publish. */
273
+ /**
274
+ * Which products this item is compatible with (e.g. "fluidgrids", "workspaces").
275
+ * Stored in manifest.compatibility.products and extracted to the store on publish.
276
+ */
251
277
  compatibleProducts?: Array<string> | null | undefined;
252
278
  config?: Record<string, unknown> | null | undefined;
253
279
  description?: string | null | undefined;
@@ -281,12 +307,22 @@ export type UpdateApplicationVersionInput = {
281
307
  manifest?: Record<string, unknown> | null | undefined;
282
308
  maxPlatformVersion?: string | null | undefined;
283
309
  minPlatformVersion?: string | null | undefined;
310
+ /**
311
+ * Immutable once status is pending_review or published.
312
+ * Must match the packageUrl being replaced (same upload).
313
+ */
314
+ packageFileId?: string | null | undefined;
284
315
  /** Immutable once status is pending_review or published. */
285
316
  packageHash?: string | null | undefined;
286
317
  /** Immutable once status is pending_review or published. */
287
318
  packageSize?: string | null | undefined;
288
319
  /** Immutable once status is pending_review or published. */
289
320
  packageUrl?: string | null | undefined;
321
+ /**
322
+ * Immutable once status is pending_review or published.
323
+ * Must match the packageUrl being replaced (same upload).
324
+ */
325
+ packageWorkspaceId?: string | null | undefined;
290
326
  releaseNotes?: string | null | undefined;
291
327
  /** Immutable once status is pending_review or published. */
292
328
  requiredScopes?: Array<string> | null | undefined;
@@ -298,7 +334,12 @@ export type UpdateDeveloperOrganizationInput = {
298
334
  logoUrl?: string | null | undefined;
299
335
  metadata?: Record<string, unknown> | null | undefined;
300
336
  name?: string | null | undefined;
301
- /** Dedicated pickup pincode for carrier rate quoting on physical-goods orders (Shiprocket, etc) — separate from the org's billing address, since a seller's fulfillment/warehouse location isn't necessarily the same place as their billing address. */
337
+ /**
338
+ * Dedicated pickup pincode for carrier rate quoting on physical-goods orders
339
+ * (Shiprocket, etc) — separate from the org's billing address, since a
340
+ * seller's fulfillment/warehouse location isn't necessarily the same place
341
+ * as their billing address.
342
+ */
302
343
  pickupPostalCode?: string | null | undefined;
303
344
  settings?: Record<string, unknown> | null | undefined;
304
345
  supportEmail?: string | null | undefined;