@osdk/widget.vite-plugin 3.4.0-beta.9 → 3.4.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 CHANGED
@@ -1,5 +1,74 @@
1
1
  # @osdk/widget.vite-plugin
2
2
 
3
+ ## 3.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - ebca6e6: Support interfaces in object set parameters
8
+
9
+ ### Patch Changes
10
+
11
+ - 7901ae0: Simulated release
12
+ - 211cb0d: Add internalDoNotUseMetadata.rid to interfaces
13
+ - 9ac627c: Declare requested widget permissions in config/manifest
14
+ - 239a2a8: Show hint for WidgetIdNotFound errors
15
+ - 8e5fdb8: Handle HMR for widget config files
16
+ - 31cd835: Revert beta changes
17
+ - 18a6c93: Link to docs on WidgetIdNotFound error
18
+ - Updated dependencies [322c5bc]
19
+ - Updated dependencies [7901ae0]
20
+ - Updated dependencies [31909c1]
21
+ - Updated dependencies [9ac627c]
22
+ - Updated dependencies [ebca6e6]
23
+ - Updated dependencies [31cd835]
24
+ - @osdk/foundry-config-json@1.6.0
25
+ - @osdk/widget.api@3.4.0
26
+
27
+ ## 3.4.0-rc.15
28
+
29
+ ### Patch Changes
30
+
31
+ - 9ac627c: Declare requested widget permissions in config/manifest
32
+ - 31cd835: Revert beta changes
33
+ - Updated dependencies [9ac627c]
34
+ - Updated dependencies [31cd835]
35
+ - @osdk/widget.api@3.4.0-rc.15
36
+ - @osdk/foundry-config-json@1.6.0-rc.2
37
+
38
+ ## 3.4.0-beta.14
39
+
40
+ ### Patch Changes
41
+
42
+ - @osdk/widget.api@3.4.0-beta.14
43
+
44
+ ## 3.4.0-beta.13
45
+
46
+ ### Patch Changes
47
+
48
+ - @osdk/widget.api@3.4.0-beta.13
49
+
50
+ ## 3.4.0-beta.12
51
+
52
+ ### Patch Changes
53
+
54
+ - @osdk/widget.api@3.4.0-beta.12
55
+
56
+ ## 3.4.0-beta.11
57
+
58
+ ### Minor Changes
59
+
60
+ - 211cb0d: Add internalDoNotUseMetadata.rid to interfaces
61
+
62
+ ### Patch Changes
63
+
64
+ - @osdk/widget.api@3.4.0-beta.11
65
+
66
+ ## 3.4.0-beta.10
67
+
68
+ ### Patch Changes
69
+
70
+ - @osdk/widget.api@3.4.0-beta.10
71
+
3
72
  ## 3.4.0-beta.9
4
73
 
5
74
  ### Minor Changes
@@ -57,6 +126,47 @@
57
126
  - Updated dependencies [31909c1]
58
127
  - @osdk/widget.api@3.4.0-beta.2
59
128
 
129
+ ## 3.3.0
130
+
131
+ ### Patch Changes
132
+
133
+ - 7901ae0: Simulated release
134
+
135
+ - 1940934: Support extension-less widget config import and improve reporting when config files not found
136
+
137
+ - e6a96c0: Validate widget sets before building their manifest
138
+
139
+ - cc33fec: improve dev mode error surfacing
140
+
141
+ - 5bd88fc: Fix InvalidDevModeFilePath errors
142
+
143
+ - 27f2122: warn when using wrong dev command
144
+
145
+ - 54e674e: Fix widget dev mode with tailwind causing project imports
146
+
147
+ - edb062f: Propagate validation error cause in message for widget config validation
148
+
149
+ - e95637e: Fix Windows dev mode
150
+
151
+ - 953c649: Use Vite logger instead of console.warn in validateDevEnvironment
152
+
153
+ - af4f3bf: Remove the following features for RC:
154
+ - Property formatting
155
+ - Branching
156
+ - Constant RDPs
157
+
158
+ - Updated dependencies [322c5bc]
159
+
160
+ - Updated dependencies [7901ae0]
161
+
162
+ - Updated dependencies [baf1e30]
163
+
164
+ - Updated dependencies [4d37e98]
165
+
166
+ - Updated dependencies [af4f3bf]
167
+ - @osdk/foundry-config-json@1.5.0
168
+ - @osdk/widget.api@3.3.0
169
+
60
170
  ## 3.3.0-beta.11
61
171
 
62
172
  ### Minor Changes
@@ -30,7 +30,7 @@ describe("buildWidgetSetManifest", () => {
30
30
  }
31
31
  };
32
32
  const manifest = buildWidgetSetManifest(WIDGET_SET_RID, WIDGET_SET_VERSION, widgetBuilds, widgetSetInputSpec);
33
- expect(manifest).toMatchObject({
33
+ expect(manifest).toEqual({
34
34
  manifestVersion: "1.0.0",
35
35
  widgetSet: {
36
36
  rid: WIDGET_SET_RID,
@@ -42,7 +42,8 @@ describe("buildWidgetSetManifest", () => {
42
42
  description: "Widget widgetOne Description",
43
43
  type: "workshopWidgetV1",
44
44
  entrypointJs: [{
45
- path: "scripts/widgetOne.js"
45
+ path: "scripts/widgetOne.js",
46
+ type: "module"
46
47
  }],
47
48
  entrypointCss: [{
48
49
  path: "styles/widgetOne.css"
@@ -58,7 +59,8 @@ describe("buildWidgetSetManifest", () => {
58
59
  displayName: "Update Parameters",
59
60
  parameterUpdateIds: ["stringParam"]
60
61
  }
61
- }
62
+ },
63
+ permissions: ["camera"]
62
64
  },
63
65
  widgetTwo: {
64
66
  id: "widgetTwo",
@@ -83,7 +85,8 @@ describe("buildWidgetSetManifest", () => {
83
85
  displayName: "Update Parameters",
84
86
  parameterUpdateIds: ["stringParam"]
85
87
  }
86
- }
88
+ },
89
+ permissions: ["camera"]
87
90
  }
88
91
  },
89
92
  inputSpec: widgetSetInputSpec
@@ -95,7 +98,7 @@ describe("buildWidgetSetManifest", () => {
95
98
  objectSetParam: {
96
99
  type: "objectSet",
97
100
  displayName: "Object Set Parameter",
98
- objectType: {
101
+ allowedType: {
99
102
  type: "object",
100
103
  apiName: "employee",
101
104
  internalDoNotUseMetadata: {
@@ -108,7 +111,30 @@ describe("buildWidgetSetManifest", () => {
108
111
  expect(manifest.widgetSet.widgets.widget.parameters.objectSetParam).toEqual({
109
112
  type: "objectSet",
110
113
  displayName: "Object Set Parameter",
111
- objectTypeRids: ["ri.ontology.main.object-type.employee"]
114
+ objectTypeRids: ["ri.ontology.main.object-type.employee"],
115
+ allowedType: "ri.ontology.main.object-type.employee"
116
+ });
117
+ });
118
+ test("converts interface set parameters correctly", () => {
119
+ const widgetBuild = createMockWidgetBuild("widget", {
120
+ interfaceSetParam: {
121
+ type: "objectSet",
122
+ displayName: "Interface Set Parameter",
123
+ allowedType: {
124
+ type: "interface",
125
+ apiName: "MyInterface",
126
+ internalDoNotUseMetadata: {
127
+ rid: "ri.ontology.main.interface.my-interface"
128
+ }
129
+ }
130
+ }
131
+ });
132
+ const manifest = buildWidgetSetManifest(WIDGET_SET_RID, WIDGET_SET_VERSION, [widgetBuild], {});
133
+ expect(manifest.widgetSet.widgets.widget.parameters.interfaceSetParam).toEqual({
134
+ type: "objectSet",
135
+ displayName: "Interface Set Parameter",
136
+ objectTypeRids: [],
137
+ allowedType: "ri.ontology.main.interface.my-interface"
112
138
  });
113
139
  });
114
140
  test("trims leading slashes from paths", () => {
@@ -152,7 +178,8 @@ function createMockWidgetBuild(id, parameters = {
152
178
  displayName: "Update Parameters",
153
179
  parameterUpdateIds: ["stringParam"]
154
180
  }
155
- }
181
+ },
182
+ permissions: ["camera"]
156
183
  }
157
184
  };
158
185
  }
@@ -1 +1 @@
1
- {"version":3,"file":"buildWidgetSetManifest.test.js","names":["describe","expect","test","buildWidgetSetManifest","WIDGET_SET_RID","WIDGET_SET_VERSION","widgetBuilds","createMockWidgetBuild","widgetSetInputSpec","discovered","sdks","rid","version","manifest","toMatchObject","manifestVersion","widgetSet","widgets","widgetOne","id","name","description","type","entrypointJs","path","entrypointCss","parameters","stringParam","displayName","events","updateParameters","parameterUpdateIds","widgetTwo","inputSpec","widgetBuild","objectSetParam","objectType","apiName","internalDoNotUseMetadata","widget","toEqual","objectTypeRids","undefined","toBe","scripts","stylesheets","map","src","scriptType","widgetConfig"],"sources":["buildWidgetSetManifest.test.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ParameterDefinition, WidgetSetInputSpec } from \"@osdk/widget.api\";\nimport { describe, expect, test } from \"vitest\";\nimport { buildWidgetSetManifest } from \"../buildWidgetSetManifest.js\";\nimport type { WidgetBuildOutputs } from \"../getWidgetBuildOutputs.js\";\n\ndescribe(\"buildWidgetSetManifest\", () => {\n const WIDGET_SET_RID = \"ri.widgetregistry..widget-set.test-widget-set\";\n const WIDGET_SET_VERSION = \"1.0.0\";\n\n test(\"builds a valid manifest with multiple widgets\", () => {\n const widgetBuilds: WidgetBuildOutputs[] = [\n createMockWidgetBuild(\"widgetOne\"),\n createMockWidgetBuild(\"widgetTwo\"),\n ];\n\n const widgetSetInputSpec: WidgetSetInputSpec = {\n discovered: {\n sdks: [\n {\n rid: \"ri.foundry.main.sdk.test-sdk\",\n version: \"2.0.0\",\n },\n ],\n },\n };\n\n const manifest = buildWidgetSetManifest(\n WIDGET_SET_RID,\n WIDGET_SET_VERSION,\n widgetBuilds,\n widgetSetInputSpec,\n );\n\n expect(manifest).toMatchObject({\n manifestVersion: \"1.0.0\",\n widgetSet: {\n rid: WIDGET_SET_RID,\n version: WIDGET_SET_VERSION,\n widgets: {\n widgetOne: {\n id: \"widgetOne\",\n name: \"Widget widgetOne\",\n description: \"Widget widgetOne Description\",\n type: \"workshopWidgetV1\",\n entrypointJs: [\n { path: \"scripts/widgetOne.js\" },\n ],\n entrypointCss: [\n { path: \"styles/widgetOne.css\" },\n ],\n parameters: {\n stringParam: {\n type: \"string\",\n displayName: \"String Parameter\",\n },\n },\n events: {\n updateParameters: {\n displayName: \"Update Parameters\",\n parameterUpdateIds: [\"stringParam\"],\n },\n },\n },\n widgetTwo: {\n id: \"widgetTwo\",\n name: \"Widget widgetTwo\",\n description: \"Widget widgetTwo Description\",\n type: \"workshopWidgetV1\",\n entrypointJs: [\n { path: \"scripts/widgetTwo.js\", type: \"module\" },\n ],\n entrypointCss: [\n { path: \"styles/widgetTwo.css\" },\n ],\n parameters: {\n stringParam: {\n type: \"string\",\n displayName: \"String Parameter\",\n },\n },\n events: {\n updateParameters: {\n displayName: \"Update Parameters\",\n parameterUpdateIds: [\"stringParam\"],\n },\n },\n },\n },\n inputSpec: widgetSetInputSpec,\n },\n });\n });\n\n test(\"converts object set parameters correctly\", () => {\n const widgetBuild = createMockWidgetBuild(\"widget\", {\n objectSetParam: {\n type: \"objectSet\",\n displayName: \"Object Set Parameter\",\n objectType: {\n type: \"object\",\n apiName: \"employee\",\n internalDoNotUseMetadata: {\n rid: \"ri.ontology.main.object-type.employee\",\n },\n },\n },\n });\n\n const widgetBuilds: WidgetBuildOutputs[] = [widgetBuild];\n const widgetSetInputSpec: WidgetSetInputSpec = {};\n\n const manifest = buildWidgetSetManifest(\n WIDGET_SET_RID,\n WIDGET_SET_VERSION,\n widgetBuilds,\n widgetSetInputSpec,\n );\n\n expect(manifest.widgetSet.widgets.widget.parameters.objectSetParam).toEqual(\n {\n type: \"objectSet\",\n displayName: \"Object Set Parameter\",\n objectTypeRids: [\"ri.ontology.main.object-type.employee\"],\n },\n );\n });\n\n test(\"trims leading slashes from paths\", () => {\n const widgetBuild = createMockWidgetBuild(\n \"widget\",\n undefined,\n [\"/scripts/widget.js\"],\n [\"/styles/widget.css\"],\n );\n\n const widgetBuilds: WidgetBuildOutputs[] = [widgetBuild];\n const widgetSetInputSpec: WidgetSetInputSpec = {};\n\n const manifest = buildWidgetSetManifest(\n WIDGET_SET_RID,\n WIDGET_SET_VERSION,\n widgetBuilds,\n widgetSetInputSpec,\n );\n\n expect(manifest.widgetSet.widgets.widget.entrypointJs[0].path).toBe(\n \"scripts/widget.js\",\n );\n expect(manifest.widgetSet.widgets.widget.entrypointCss![0].path).toBe(\n \"styles/widget.css\",\n );\n });\n\n test(\"handles paths without leading slashes\", () => {\n const widgetBuild = createMockWidgetBuild(\n \"widget\",\n undefined,\n [\"scripts/widget.js\"],\n [\"styles/widget.css\"],\n );\n\n const widgetBuilds: WidgetBuildOutputs[] = [widgetBuild];\n const widgetSetInputSpec: WidgetSetInputSpec = {};\n\n const manifest = buildWidgetSetManifest(\n WIDGET_SET_RID,\n WIDGET_SET_VERSION,\n widgetBuilds,\n widgetSetInputSpec,\n );\n\n expect(manifest.widgetSet.widgets.widget.entrypointJs[0].path).toBe(\n \"scripts/widget.js\",\n );\n expect(manifest.widgetSet.widgets.widget.entrypointCss![0].path).toBe(\n \"styles/widget.css\",\n );\n });\n});\n\nfunction createMockWidgetBuild(\n id: string,\n parameters: Record<string, ParameterDefinition> = {\n stringParam: {\n type: \"string\",\n displayName: \"String Parameter\",\n },\n },\n scripts?: string[],\n stylesheets?: string[],\n): WidgetBuildOutputs {\n return {\n scripts: scripts?.map(src => ({\n type: \"script\" as const,\n scriptType: \"module\" as const,\n src,\n }))\n ?? [\n {\n type: \"script\",\n scriptType: \"module\",\n src: `/scripts/${id}.js`,\n },\n ],\n stylesheets: stylesheets ?? [`/styles/${id}.css`],\n widgetConfig: {\n id,\n name: `Widget ${id}`,\n description: `Widget ${id} Description`,\n type: \"workshop\",\n parameters,\n events: {\n updateParameters: {\n displayName: \"Update Parameters\",\n parameterUpdateIds: [\"stringParam\"],\n },\n },\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"buildWidgetSetManifest.test.js","names":["describe","expect","test","buildWidgetSetManifest","WIDGET_SET_RID","WIDGET_SET_VERSION","widgetBuilds","createMockWidgetBuild","widgetSetInputSpec","discovered","sdks","rid","version","manifest","toEqual","manifestVersion","widgetSet","widgets","widgetOne","id","name","description","type","entrypointJs","path","entrypointCss","parameters","stringParam","displayName","events","updateParameters","parameterUpdateIds","permissions","widgetTwo","inputSpec","widgetBuild","objectSetParam","allowedType","apiName","internalDoNotUseMetadata","widget","objectTypeRids","interfaceSetParam","undefined","toBe","scripts","stylesheets","map","src","scriptType","widgetConfig"],"sources":["buildWidgetSetManifest.test.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ParameterDefinition, WidgetSetInputSpec } from \"@osdk/widget.api\";\nimport { describe, expect, test } from \"vitest\";\nimport { buildWidgetSetManifest } from \"../buildWidgetSetManifest.js\";\nimport type { WidgetBuildOutputs } from \"../getWidgetBuildOutputs.js\";\n\ndescribe(\"buildWidgetSetManifest\", () => {\n const WIDGET_SET_RID = \"ri.widgetregistry..widget-set.test-widget-set\";\n const WIDGET_SET_VERSION = \"1.0.0\";\n\n test(\"builds a valid manifest with multiple widgets\", () => {\n const widgetBuilds: WidgetBuildOutputs[] = [\n createMockWidgetBuild(\"widgetOne\"),\n createMockWidgetBuild(\"widgetTwo\"),\n ];\n\n const widgetSetInputSpec: WidgetSetInputSpec = {\n discovered: {\n sdks: [\n {\n rid: \"ri.foundry.main.sdk.test-sdk\",\n version: \"2.0.0\",\n },\n ],\n },\n };\n\n const manifest = buildWidgetSetManifest(\n WIDGET_SET_RID,\n WIDGET_SET_VERSION,\n widgetBuilds,\n widgetSetInputSpec,\n );\n\n expect(manifest).toEqual({\n manifestVersion: \"1.0.0\",\n widgetSet: {\n rid: WIDGET_SET_RID,\n version: WIDGET_SET_VERSION,\n widgets: {\n widgetOne: {\n id: \"widgetOne\",\n name: \"Widget widgetOne\",\n description: \"Widget widgetOne Description\",\n type: \"workshopWidgetV1\",\n entrypointJs: [\n { path: \"scripts/widgetOne.js\", type: \"module\" },\n ],\n entrypointCss: [\n { path: \"styles/widgetOne.css\" },\n ],\n parameters: {\n stringParam: {\n type: \"string\",\n displayName: \"String Parameter\",\n },\n },\n events: {\n updateParameters: {\n displayName: \"Update Parameters\",\n parameterUpdateIds: [\"stringParam\"],\n },\n },\n permissions: [\"camera\"],\n },\n widgetTwo: {\n id: \"widgetTwo\",\n name: \"Widget widgetTwo\",\n description: \"Widget widgetTwo Description\",\n type: \"workshopWidgetV1\",\n entrypointJs: [\n { path: \"scripts/widgetTwo.js\", type: \"module\" },\n ],\n entrypointCss: [\n { path: \"styles/widgetTwo.css\" },\n ],\n parameters: {\n stringParam: {\n type: \"string\",\n displayName: \"String Parameter\",\n },\n },\n events: {\n updateParameters: {\n displayName: \"Update Parameters\",\n parameterUpdateIds: [\"stringParam\"],\n },\n },\n permissions: [\"camera\"],\n },\n },\n inputSpec: widgetSetInputSpec,\n },\n });\n });\n\n test(\"converts object set parameters correctly\", () => {\n const widgetBuild = createMockWidgetBuild(\"widget\", {\n objectSetParam: {\n type: \"objectSet\",\n displayName: \"Object Set Parameter\",\n allowedType: {\n type: \"object\",\n apiName: \"employee\",\n internalDoNotUseMetadata: {\n rid: \"ri.ontology.main.object-type.employee\",\n },\n },\n },\n });\n\n const widgetBuilds: WidgetBuildOutputs[] = [widgetBuild];\n const widgetSetInputSpec: WidgetSetInputSpec = {};\n\n const manifest = buildWidgetSetManifest(\n WIDGET_SET_RID,\n WIDGET_SET_VERSION,\n widgetBuilds,\n widgetSetInputSpec,\n );\n\n expect(manifest.widgetSet.widgets.widget.parameters.objectSetParam).toEqual(\n {\n type: \"objectSet\",\n displayName: \"Object Set Parameter\",\n objectTypeRids: [\"ri.ontology.main.object-type.employee\"],\n allowedType: \"ri.ontology.main.object-type.employee\",\n },\n );\n });\n\n test(\"converts interface set parameters correctly\", () => {\n const widgetBuild = createMockWidgetBuild(\"widget\", {\n interfaceSetParam: {\n type: \"objectSet\",\n displayName: \"Interface Set Parameter\",\n allowedType: {\n type: \"interface\",\n apiName: \"MyInterface\",\n internalDoNotUseMetadata: {\n rid: \"ri.ontology.main.interface.my-interface\",\n },\n },\n },\n });\n\n const widgetBuilds: WidgetBuildOutputs[] = [widgetBuild];\n const widgetSetInputSpec: WidgetSetInputSpec = {};\n\n const manifest = buildWidgetSetManifest(\n WIDGET_SET_RID,\n WIDGET_SET_VERSION,\n widgetBuilds,\n widgetSetInputSpec,\n );\n\n expect(\n manifest.widgetSet.widgets.widget.parameters.interfaceSetParam,\n ).toEqual({\n type: \"objectSet\",\n displayName: \"Interface Set Parameter\",\n objectTypeRids: [],\n allowedType: \"ri.ontology.main.interface.my-interface\",\n });\n });\n\n test(\"trims leading slashes from paths\", () => {\n const widgetBuild = createMockWidgetBuild(\n \"widget\",\n undefined,\n [\"/scripts/widget.js\"],\n [\"/styles/widget.css\"],\n );\n\n const widgetBuilds: WidgetBuildOutputs[] = [widgetBuild];\n const widgetSetInputSpec: WidgetSetInputSpec = {};\n\n const manifest = buildWidgetSetManifest(\n WIDGET_SET_RID,\n WIDGET_SET_VERSION,\n widgetBuilds,\n widgetSetInputSpec,\n );\n\n expect(manifest.widgetSet.widgets.widget.entrypointJs[0].path).toBe(\n \"scripts/widget.js\",\n );\n expect(manifest.widgetSet.widgets.widget.entrypointCss![0].path).toBe(\n \"styles/widget.css\",\n );\n });\n\n test(\"handles paths without leading slashes\", () => {\n const widgetBuild = createMockWidgetBuild(\n \"widget\",\n undefined,\n [\"scripts/widget.js\"],\n [\"styles/widget.css\"],\n );\n\n const widgetBuilds: WidgetBuildOutputs[] = [widgetBuild];\n const widgetSetInputSpec: WidgetSetInputSpec = {};\n\n const manifest = buildWidgetSetManifest(\n WIDGET_SET_RID,\n WIDGET_SET_VERSION,\n widgetBuilds,\n widgetSetInputSpec,\n );\n\n expect(manifest.widgetSet.widgets.widget.entrypointJs[0].path).toBe(\n \"scripts/widget.js\",\n );\n expect(manifest.widgetSet.widgets.widget.entrypointCss![0].path).toBe(\n \"styles/widget.css\",\n );\n });\n});\n\nfunction createMockWidgetBuild(\n id: string,\n parameters: Record<string, ParameterDefinition> = {\n stringParam: {\n type: \"string\",\n displayName: \"String Parameter\",\n },\n },\n scripts?: string[],\n stylesheets?: string[],\n): WidgetBuildOutputs {\n return {\n scripts: scripts?.map(src => ({\n type: \"script\" as const,\n scriptType: \"module\" as const,\n src,\n }))\n ?? [\n {\n type: \"script\",\n scriptType: \"module\",\n src: `/scripts/${id}.js`,\n },\n ],\n stylesheets: stylesheets ?? [`/styles/${id}.css`],\n widgetConfig: {\n id,\n name: `Widget ${id}`,\n description: `Widget ${id} Description`,\n type: \"workshop\",\n parameters,\n events: {\n updateParameters: {\n displayName: \"Update Parameters\",\n parameterUpdateIds: [\"stringParam\"],\n },\n },\n permissions: [\"camera\"],\n },\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,IAAI,QAAQ,QAAQ;AAC/C,SAASC,sBAAsB,QAAQ,8BAA8B;AAGrEH,QAAQ,CAAC,wBAAwB,EAAE,MAAM;EACvC,MAAMI,cAAc,GAAG,+CAA+C;EACtE,MAAMC,kBAAkB,GAAG,OAAO;EAElCH,IAAI,CAAC,+CAA+C,EAAE,MAAM;IAC1D,MAAMI,YAAkC,GAAG,CACzCC,qBAAqB,CAAC,WAAW,CAAC,EAClCA,qBAAqB,CAAC,WAAW,CAAC,CACnC;IAED,MAAMC,kBAAsC,GAAG;MAC7CC,UAAU,EAAE;QACVC,IAAI,EAAE,CACJ;UACEC,GAAG,EAAE,8BAA8B;UACnCC,OAAO,EAAE;QACX,CAAC;MAEL;IACF,CAAC;IAED,MAAMC,QAAQ,GAAGV,sBAAsB,CACrCC,cAAc,EACdC,kBAAkB,EAClBC,YAAY,EACZE,kBACF,CAAC;IAEDP,MAAM,CAACY,QAAQ,CAAC,CAACC,OAAO,CAAC;MACvBC,eAAe,EAAE,OAAO;MACxBC,SAAS,EAAE;QACTL,GAAG,EAAEP,cAAc;QACnBQ,OAAO,EAAEP,kBAAkB;QAC3BY,OAAO,EAAE;UACPC,SAAS,EAAE;YACTC,EAAE,EAAE,WAAW;YACfC,IAAI,EAAE,kBAAkB;YACxBC,WAAW,EAAE,8BAA8B;YAC3CC,IAAI,EAAE,kBAAkB;YACxBC,YAAY,EAAE,CACZ;cAAEC,IAAI,EAAE,sBAAsB;cAAEF,IAAI,EAAE;YAAS,CAAC,CACjD;YACDG,aAAa,EAAE,CACb;cAAED,IAAI,EAAE;YAAuB,CAAC,CACjC;YACDE,UAAU,EAAE;cACVC,WAAW,EAAE;gBACXL,IAAI,EAAE,QAAQ;gBACdM,WAAW,EAAE;cACf;YACF,CAAC;YACDC,MAAM,EAAE;cACNC,gBAAgB,EAAE;gBAChBF,WAAW,EAAE,mBAAmB;gBAChCG,kBAAkB,EAAE,CAAC,aAAa;cACpC;YACF,CAAC;YACDC,WAAW,EAAE,CAAC,QAAQ;UACxB,CAAC;UACDC,SAAS,EAAE;YACTd,EAAE,EAAE,WAAW;YACfC,IAAI,EAAE,kBAAkB;YACxBC,WAAW,EAAE,8BAA8B;YAC3CC,IAAI,EAAE,kBAAkB;YACxBC,YAAY,EAAE,CACZ;cAAEC,IAAI,EAAE,sBAAsB;cAAEF,IAAI,EAAE;YAAS,CAAC,CACjD;YACDG,aAAa,EAAE,CACb;cAAED,IAAI,EAAE;YAAuB,CAAC,CACjC;YACDE,UAAU,EAAE;cACVC,WAAW,EAAE;gBACXL,IAAI,EAAE,QAAQ;gBACdM,WAAW,EAAE;cACf;YACF,CAAC;YACDC,MAAM,EAAE;cACNC,gBAAgB,EAAE;gBAChBF,WAAW,EAAE,mBAAmB;gBAChCG,kBAAkB,EAAE,CAAC,aAAa;cACpC;YACF,CAAC;YACDC,WAAW,EAAE,CAAC,QAAQ;UACxB;QACF,CAAC;QACDE,SAAS,EAAE1B;MACb;IACF,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFN,IAAI,CAAC,0CAA0C,EAAE,MAAM;IACrD,MAAMiC,WAAW,GAAG5B,qBAAqB,CAAC,QAAQ,EAAE;MAClD6B,cAAc,EAAE;QACdd,IAAI,EAAE,WAAW;QACjBM,WAAW,EAAE,sBAAsB;QACnCS,WAAW,EAAE;UACXf,IAAI,EAAE,QAAQ;UACdgB,OAAO,EAAE,UAAU;UACnBC,wBAAwB,EAAE;YACxB5B,GAAG,EAAE;UACP;QACF;MACF;IACF,CAAC,CAAC;IAKF,MAAME,QAAQ,GAAGV,sBAAsB,CACrCC,cAAc,EACdC,kBAAkB,EALuB,CAAC8B,WAAW,CAAC,EACT,CAAC,CAOhD,CAAC;IAEDlC,MAAM,CAACY,QAAQ,CAACG,SAAS,CAACC,OAAO,CAACuB,MAAM,CAACd,UAAU,CAACU,cAAc,CAAC,CAACtB,OAAO,CACzE;MACEQ,IAAI,EAAE,WAAW;MACjBM,WAAW,EAAE,sBAAsB;MACnCa,cAAc,EAAE,CAAC,uCAAuC,CAAC;MACzDJ,WAAW,EAAE;IACf,CACF,CAAC;EACH,CAAC,CAAC;EAEFnC,IAAI,CAAC,6CAA6C,EAAE,MAAM;IACxD,MAAMiC,WAAW,GAAG5B,qBAAqB,CAAC,QAAQ,EAAE;MAClDmC,iBAAiB,EAAE;QACjBpB,IAAI,EAAE,WAAW;QACjBM,WAAW,EAAE,yBAAyB;QACtCS,WAAW,EAAE;UACXf,IAAI,EAAE,WAAW;UACjBgB,OAAO,EAAE,aAAa;UACtBC,wBAAwB,EAAE;YACxB5B,GAAG,EAAE;UACP;QACF;MACF;IACF,CAAC,CAAC;IAKF,MAAME,QAAQ,GAAGV,sBAAsB,CACrCC,cAAc,EACdC,kBAAkB,EALuB,CAAC8B,WAAW,CAAC,EACT,CAAC,CAOhD,CAAC;IAEDlC,MAAM,CACJY,QAAQ,CAACG,SAAS,CAACC,OAAO,CAACuB,MAAM,CAACd,UAAU,CAACgB,iBAC/C,CAAC,CAAC5B,OAAO,CAAC;MACRQ,IAAI,EAAE,WAAW;MACjBM,WAAW,EAAE,yBAAyB;MACtCa,cAAc,EAAE,EAAE;MAClBJ,WAAW,EAAE;IACf,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFnC,IAAI,CAAC,kCAAkC,EAAE,MAAM;IAC7C,MAAMiC,WAAW,GAAG5B,qBAAqB,CACvC,QAAQ,EACRoC,SAAS,EACT,CAAC,oBAAoB,CAAC,EACtB,CAAC,oBAAoB,CACvB,CAAC;IAKD,MAAM9B,QAAQ,GAAGV,sBAAsB,CACrCC,cAAc,EACdC,kBAAkB,EALuB,CAAC8B,WAAW,CAAC,EACT,CAAC,CAOhD,CAAC;IAEDlC,MAAM,CAACY,QAAQ,CAACG,SAAS,CAACC,OAAO,CAACuB,MAAM,CAACjB,YAAY,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,CAACoB,IAAI,CACjE,mBACF,CAAC;IACD3C,MAAM,CAACY,QAAQ,CAACG,SAAS,CAACC,OAAO,CAACuB,MAAM,CAACf,aAAa,CAAE,CAAC,CAAC,CAACD,IAAI,CAAC,CAACoB,IAAI,CACnE,mBACF,CAAC;EACH,CAAC,CAAC;EAEF1C,IAAI,CAAC,uCAAuC,EAAE,MAAM;IAClD,MAAMiC,WAAW,GAAG5B,qBAAqB,CACvC,QAAQ,EACRoC,SAAS,EACT,CAAC,mBAAmB,CAAC,EACrB,CAAC,mBAAmB,CACtB,CAAC;IAKD,MAAM9B,QAAQ,GAAGV,sBAAsB,CACrCC,cAAc,EACdC,kBAAkB,EALuB,CAAC8B,WAAW,CAAC,EACT,CAAC,CAOhD,CAAC;IAEDlC,MAAM,CAACY,QAAQ,CAACG,SAAS,CAACC,OAAO,CAACuB,MAAM,CAACjB,YAAY,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,CAACoB,IAAI,CACjE,mBACF,CAAC;IACD3C,MAAM,CAACY,QAAQ,CAACG,SAAS,CAACC,OAAO,CAACuB,MAAM,CAACf,aAAa,CAAE,CAAC,CAAC,CAACD,IAAI,CAAC,CAACoB,IAAI,CACnE,mBACF,CAAC;EACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,SAASrC,qBAAqBA,CAC5BY,EAAU,EACVO,UAA+C,GAAG;EAChDC,WAAW,EAAE;IACXL,IAAI,EAAE,QAAQ;IACdM,WAAW,EAAE;EACf;AACF,CAAC,EACDiB,OAAkB,EAClBC,WAAsB,EACF;EACpB,OAAO;IACLD,OAAO,EAAEA,OAAO,EAAEE,GAAG,CAACC,GAAG,KAAK;MAC5B1B,IAAI,EAAE,QAAiB;MACvB2B,UAAU,EAAE,QAAiB;MAC7BD;IACF,CAAC,CAAC,CAAC,IACE,CACD;MACE1B,IAAI,EAAE,QAAQ;MACd2B,UAAU,EAAE,QAAQ;MACpBD,GAAG,EAAE,YAAY7B,EAAE;IACrB,CAAC,CACF;IACH2B,WAAW,EAAEA,WAAW,IAAI,CAAC,WAAW3B,EAAE,MAAM,CAAC;IACjD+B,YAAY,EAAE;MACZ/B,EAAE;MACFC,IAAI,EAAE,UAAUD,EAAE,EAAE;MACpBE,WAAW,EAAE,UAAUF,EAAE,cAAc;MACvCG,IAAI,EAAE,UAAU;MAChBI,UAAU;MACVG,MAAM,EAAE;QACNC,gBAAgB,EAAE;UAChBF,WAAW,EAAE,mBAAmB;UAChCG,kBAAkB,EAAE,CAAC,aAAa;QACpC;MACF,CAAC;MACDC,WAAW,EAAE,CAAC,QAAQ;IACxB;EACF,CAAC;AACH","ignoreList":[]}
@@ -42,7 +42,8 @@ function buildWidgetManifest(widgetBuild) {
42
42
  path: trimLeadingSlash(path)
43
43
  })),
44
44
  parameters: convertParameters(widgetConfig.parameters),
45
- events: widgetConfig.events
45
+ events: widgetConfig.events,
46
+ permissions: widgetConfig.permissions
46
47
  };
47
48
  }
48
49
  function convertParameters(parameters) {
@@ -51,13 +52,14 @@ function convertParameters(parameters) {
51
52
  function convertParameter(parameter) {
52
53
  if (parameter.type === "objectSet") {
53
54
  // Config has already been validated so rid must be present
54
- if (parameter.objectType.internalDoNotUseMetadata == null) {
55
+ if (parameter.allowedType.internalDoNotUseMetadata == null) {
55
56
  throw new Error("Expected internal metadata to be present");
56
57
  }
57
58
  return {
58
59
  type: "objectSet",
59
60
  displayName: parameter.displayName,
60
- objectTypeRids: [parameter.objectType.internalDoNotUseMetadata.rid]
61
+ objectTypeRids: parameter.allowedType.type === "object" ? [parameter.allowedType.internalDoNotUseMetadata.rid] : [],
62
+ allowedType: parameter.allowedType.internalDoNotUseMetadata.rid
61
63
  };
62
64
  }
63
65
  return parameter;
@@ -1 +1 @@
1
- {"version":3,"file":"buildWidgetSetManifest.js","names":["validateWidgetSet","buildWidgetSetManifest","widgetSetRid","widgetSetVersion","widgetBuilds","widgetSetInputSpec","manifestVersion","widgetSet","rid","version","widgets","Object","fromEntries","map","buildWidgetManifest","widgetManifest","id","inputSpec","widgetBuild","widgetConfig","name","description","type","entrypointJs","scripts","script","path","trimLeadingSlash","src","scriptType","entrypointCss","stylesheets","parameters","convertParameters","events","entries","key","param","convertParameter","parameter","objectType","internalDoNotUseMetadata","Error","displayName","objectTypeRids","startsWith","slice"],"sources":["buildWidgetSetManifest.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ManifestParameterDefinition,\n ParameterDefinition,\n WidgetManifestConfig,\n WidgetSetInputSpec,\n WidgetSetManifest,\n} from \"@osdk/widget.api\";\nimport type { WidgetBuildOutputs } from \"./getWidgetBuildOutputs.js\";\nimport { validateWidgetSet } from \"./validateWidgetSet.js\";\n\nexport function buildWidgetSetManifest(\n widgetSetRid: string,\n widgetSetVersion: string,\n widgetBuilds: WidgetBuildOutputs[],\n widgetSetInputSpec: WidgetSetInputSpec,\n): WidgetSetManifest {\n validateWidgetSet(widgetBuilds);\n return {\n manifestVersion: \"1.0.0\",\n widgetSet: {\n rid: widgetSetRid,\n version: widgetSetVersion,\n widgets: Object.fromEntries(\n widgetBuilds\n .map(buildWidgetManifest)\n .map((widgetManifest) => [widgetManifest.id, widgetManifest]),\n ),\n inputSpec: widgetSetInputSpec,\n },\n };\n}\n\nfunction buildWidgetManifest(\n widgetBuild: WidgetBuildOutputs,\n): WidgetManifestConfig {\n const widgetConfig = widgetBuild.widgetConfig;\n return {\n id: widgetConfig.id,\n name: widgetConfig.name,\n description: widgetConfig.description,\n type: \"workshopWidgetV1\",\n entrypointJs: widgetBuild.scripts.map((script) => ({\n path: trimLeadingSlash(script.src),\n type: script.scriptType,\n })),\n entrypointCss: widgetBuild.stylesheets.map((path) => ({\n path: trimLeadingSlash(path),\n })),\n parameters: convertParameters(widgetConfig.parameters),\n events: widgetConfig.events,\n };\n}\n\nfunction convertParameters(\n parameters: Record<string, ParameterDefinition>,\n): Record<string, ManifestParameterDefinition> {\n return Object.fromEntries(\n Object.entries(parameters).map(([key, param]) => [\n key,\n convertParameter(param),\n ]),\n );\n}\n\nfunction convertParameter(\n parameter: ParameterDefinition,\n): ManifestParameterDefinition {\n if (parameter.type === \"objectSet\") {\n // Config has already been validated so rid must be present\n if (parameter.objectType.internalDoNotUseMetadata == null) {\n throw new Error(\"Expected internal metadata to be present\");\n }\n return {\n type: \"objectSet\",\n displayName: parameter.displayName,\n objectTypeRids: [parameter.objectType.internalDoNotUseMetadata.rid],\n };\n }\n return parameter;\n}\n\nfunction trimLeadingSlash(path: string): string {\n return path.startsWith(\"/\") ? path.slice(1) : path;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA,SAASA,iBAAiB,QAAQ,wBAAwB;AAE1D,OAAO,SAASC,sBAAsBA,CACpCC,YAAoB,EACpBC,gBAAwB,EACxBC,YAAkC,EAClCC,kBAAsC,EACnB;EACnBL,iBAAiB,CAACI,YAAY,CAAC;EAC/B,OAAO;IACLE,eAAe,EAAE,OAAO;IACxBC,SAAS,EAAE;MACTC,GAAG,EAAEN,YAAY;MACjBO,OAAO,EAAEN,gBAAgB;MACzBO,OAAO,EAAEC,MAAM,CAACC,WAAW,CACzBR,YAAY,CACTS,GAAG,CAACC,mBAAmB,CAAC,CACxBD,GAAG,CAAEE,cAAc,IAAK,CAACA,cAAc,CAACC,EAAE,EAAED,cAAc,CAAC,CAChE,CAAC;MACDE,SAAS,EAAEZ;IACb;EACF,CAAC;AACH;AAEA,SAASS,mBAAmBA,CAC1BI,WAA+B,EACT;EACtB,MAAMC,YAAY,GAAGD,WAAW,CAACC,YAAY;EAC7C,OAAO;IACLH,EAAE,EAAEG,YAAY,CAACH,EAAE;IACnBI,IAAI,EAAED,YAAY,CAACC,IAAI;IACvBC,WAAW,EAAEF,YAAY,CAACE,WAAW;IACrCC,IAAI,EAAE,kBAAkB;IACxBC,YAAY,EAAEL,WAAW,CAACM,OAAO,CAACX,GAAG,CAAEY,MAAM,KAAM;MACjDC,IAAI,EAAEC,gBAAgB,CAACF,MAAM,CAACG,GAAG,CAAC;MAClCN,IAAI,EAAEG,MAAM,CAACI;IACf,CAAC,CAAC,CAAC;IACHC,aAAa,EAAEZ,WAAW,CAACa,WAAW,CAAClB,GAAG,CAAEa,IAAI,KAAM;MACpDA,IAAI,EAAEC,gBAAgB,CAACD,IAAI;IAC7B,CAAC,CAAC,CAAC;IACHM,UAAU,EAAEC,iBAAiB,CAACd,YAAY,CAACa,UAAU,CAAC;IACtDE,MAAM,EAAEf,YAAY,CAACe;EACvB,CAAC;AACH;AAEA,SAASD,iBAAiBA,CACxBD,UAA+C,EACF;EAC7C,OAAOrB,MAAM,CAACC,WAAW,CACvBD,MAAM,CAACwB,OAAO,CAACH,UAAU,CAAC,CAACnB,GAAG,CAAC,CAAC,CAACuB,GAAG,EAAEC,KAAK,CAAC,KAAK,CAC/CD,GAAG,EACHE,gBAAgB,CAACD,KAAK,CAAC,CACxB,CACH,CAAC;AACH;AAEA,SAASC,gBAAgBA,CACvBC,SAA8B,EACD;EAC7B,IAAIA,SAAS,CAACjB,IAAI,KAAK,WAAW,EAAE;IAClC;IACA,IAAIiB,SAAS,CAACC,UAAU,CAACC,wBAAwB,IAAI,IAAI,EAAE;MACzD,MAAM,IAAIC,KAAK,CAAC,0CAA0C,CAAC;IAC7D;IACA,OAAO;MACLpB,IAAI,EAAE,WAAW;MACjBqB,WAAW,EAAEJ,SAAS,CAACI,WAAW;MAClCC,cAAc,EAAE,CAACL,SAAS,CAACC,UAAU,CAACC,wBAAwB,CAACjC,GAAG;IACpE,CAAC;EACH;EACA,OAAO+B,SAAS;AAClB;AAEA,SAASZ,gBAAgBA,CAACD,IAAY,EAAU;EAC9C,OAAOA,IAAI,CAACmB,UAAU,CAAC,GAAG,CAAC,GAAGnB,IAAI,CAACoB,KAAK,CAAC,CAAC,CAAC,GAAGpB,IAAI;AACpD","ignoreList":[]}
1
+ {"version":3,"file":"buildWidgetSetManifest.js","names":["validateWidgetSet","buildWidgetSetManifest","widgetSetRid","widgetSetVersion","widgetBuilds","widgetSetInputSpec","manifestVersion","widgetSet","rid","version","widgets","Object","fromEntries","map","buildWidgetManifest","widgetManifest","id","inputSpec","widgetBuild","widgetConfig","name","description","type","entrypointJs","scripts","script","path","trimLeadingSlash","src","scriptType","entrypointCss","stylesheets","parameters","convertParameters","events","permissions","entries","key","param","convertParameter","parameter","allowedType","internalDoNotUseMetadata","Error","displayName","objectTypeRids","startsWith","slice"],"sources":["buildWidgetSetManifest.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ManifestParameterDefinition,\n ParameterDefinition,\n WidgetManifestConfig,\n WidgetSetInputSpec,\n WidgetSetManifest,\n} from \"@osdk/widget.api\";\nimport type { WidgetBuildOutputs } from \"./getWidgetBuildOutputs.js\";\nimport { validateWidgetSet } from \"./validateWidgetSet.js\";\n\nexport function buildWidgetSetManifest(\n widgetSetRid: string,\n widgetSetVersion: string,\n widgetBuilds: WidgetBuildOutputs[],\n widgetSetInputSpec: WidgetSetInputSpec,\n): WidgetSetManifest {\n validateWidgetSet(widgetBuilds);\n return {\n manifestVersion: \"1.0.0\",\n widgetSet: {\n rid: widgetSetRid,\n version: widgetSetVersion,\n widgets: Object.fromEntries(\n widgetBuilds\n .map(buildWidgetManifest)\n .map((widgetManifest) => [widgetManifest.id, widgetManifest]),\n ),\n inputSpec: widgetSetInputSpec,\n },\n };\n}\n\nfunction buildWidgetManifest(\n widgetBuild: WidgetBuildOutputs,\n): WidgetManifestConfig {\n const widgetConfig = widgetBuild.widgetConfig;\n return {\n id: widgetConfig.id,\n name: widgetConfig.name,\n description: widgetConfig.description,\n type: \"workshopWidgetV1\",\n entrypointJs: widgetBuild.scripts.map((script) => ({\n path: trimLeadingSlash(script.src),\n type: script.scriptType,\n })),\n entrypointCss: widgetBuild.stylesheets.map((path) => ({\n path: trimLeadingSlash(path),\n })),\n parameters: convertParameters(widgetConfig.parameters),\n events: widgetConfig.events,\n permissions: widgetConfig.permissions,\n };\n}\n\nfunction convertParameters(\n parameters: Record<string, ParameterDefinition>,\n): Record<string, ManifestParameterDefinition> {\n return Object.fromEntries(\n Object.entries(parameters).map(([key, param]) => [\n key,\n convertParameter(param),\n ]),\n );\n}\n\nfunction convertParameter(\n parameter: ParameterDefinition,\n): ManifestParameterDefinition {\n if (parameter.type === \"objectSet\") {\n // Config has already been validated so rid must be present\n if (parameter.allowedType.internalDoNotUseMetadata == null) {\n throw new Error(\"Expected internal metadata to be present\");\n }\n return {\n type: \"objectSet\",\n displayName: parameter.displayName,\n objectTypeRids: parameter.allowedType.type === \"object\"\n ? [parameter.allowedType.internalDoNotUseMetadata.rid]\n : [],\n allowedType: parameter.allowedType.internalDoNotUseMetadata.rid,\n };\n }\n return parameter;\n}\n\nfunction trimLeadingSlash(path: string): string {\n return path.startsWith(\"/\") ? path.slice(1) : path;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA,SAASA,iBAAiB,QAAQ,wBAAwB;AAE1D,OAAO,SAASC,sBAAsBA,CACpCC,YAAoB,EACpBC,gBAAwB,EACxBC,YAAkC,EAClCC,kBAAsC,EACnB;EACnBL,iBAAiB,CAACI,YAAY,CAAC;EAC/B,OAAO;IACLE,eAAe,EAAE,OAAO;IACxBC,SAAS,EAAE;MACTC,GAAG,EAAEN,YAAY;MACjBO,OAAO,EAAEN,gBAAgB;MACzBO,OAAO,EAAEC,MAAM,CAACC,WAAW,CACzBR,YAAY,CACTS,GAAG,CAACC,mBAAmB,CAAC,CACxBD,GAAG,CAAEE,cAAc,IAAK,CAACA,cAAc,CAACC,EAAE,EAAED,cAAc,CAAC,CAChE,CAAC;MACDE,SAAS,EAAEZ;IACb;EACF,CAAC;AACH;AAEA,SAASS,mBAAmBA,CAC1BI,WAA+B,EACT;EACtB,MAAMC,YAAY,GAAGD,WAAW,CAACC,YAAY;EAC7C,OAAO;IACLH,EAAE,EAAEG,YAAY,CAACH,EAAE;IACnBI,IAAI,EAAED,YAAY,CAACC,IAAI;IACvBC,WAAW,EAAEF,YAAY,CAACE,WAAW;IACrCC,IAAI,EAAE,kBAAkB;IACxBC,YAAY,EAAEL,WAAW,CAACM,OAAO,CAACX,GAAG,CAAEY,MAAM,KAAM;MACjDC,IAAI,EAAEC,gBAAgB,CAACF,MAAM,CAACG,GAAG,CAAC;MAClCN,IAAI,EAAEG,MAAM,CAACI;IACf,CAAC,CAAC,CAAC;IACHC,aAAa,EAAEZ,WAAW,CAACa,WAAW,CAAClB,GAAG,CAAEa,IAAI,KAAM;MACpDA,IAAI,EAAEC,gBAAgB,CAACD,IAAI;IAC7B,CAAC,CAAC,CAAC;IACHM,UAAU,EAAEC,iBAAiB,CAACd,YAAY,CAACa,UAAU,CAAC;IACtDE,MAAM,EAAEf,YAAY,CAACe,MAAM;IAC3BC,WAAW,EAAEhB,YAAY,CAACgB;EAC5B,CAAC;AACH;AAEA,SAASF,iBAAiBA,CACxBD,UAA+C,EACF;EAC7C,OAAOrB,MAAM,CAACC,WAAW,CACvBD,MAAM,CAACyB,OAAO,CAACJ,UAAU,CAAC,CAACnB,GAAG,CAAC,CAAC,CAACwB,GAAG,EAAEC,KAAK,CAAC,KAAK,CAC/CD,GAAG,EACHE,gBAAgB,CAACD,KAAK,CAAC,CACxB,CACH,CAAC;AACH;AAEA,SAASC,gBAAgBA,CACvBC,SAA8B,EACD;EAC7B,IAAIA,SAAS,CAAClB,IAAI,KAAK,WAAW,EAAE;IAClC;IACA,IAAIkB,SAAS,CAACC,WAAW,CAACC,wBAAwB,IAAI,IAAI,EAAE;MAC1D,MAAM,IAAIC,KAAK,CAAC,0CAA0C,CAAC;IAC7D;IACA,OAAO;MACLrB,IAAI,EAAE,WAAW;MACjBsB,WAAW,EAAEJ,SAAS,CAACI,WAAW;MAClCC,cAAc,EAAEL,SAAS,CAACC,WAAW,CAACnB,IAAI,KAAK,QAAQ,GACnD,CAACkB,SAAS,CAACC,WAAW,CAACC,wBAAwB,CAAClC,GAAG,CAAC,GACpD,EAAE;MACNiC,WAAW,EAAED,SAAS,CAACC,WAAW,CAACC,wBAAwB,CAAClC;IAC9D,CAAC;EACH;EACA,OAAOgC,SAAS;AAClB;AAEA,SAASb,gBAAgBA,CAACD,IAAY,EAAU;EAC9C,OAAOA,IAAI,CAACoB,UAAU,CAAC,GAAG,CAAC,GAAGpB,IAAI,CAACqB,KAAK,CAAC,CAAC,CAAC,GAAGrB,IAAI;AACpD","ignoreList":[]}
@@ -0,0 +1,44 @@
1
+ .body {
2
+ align-items: center;
3
+ display: flex;
4
+ height: 100%;
5
+ }
6
+
7
+ body,
8
+ html {
9
+ height: 100%;
10
+ }
11
+
12
+ iframe {
13
+ display: none;
14
+ }
15
+
16
+ .description {
17
+ display: flex;
18
+ align-items: center;
19
+ gap: 5px;
20
+ }
21
+
22
+ .response-block {
23
+ text-align: left;
24
+ overflow-x: auto;
25
+ white-space: pre-wrap;
26
+ word-wrap: break-word;
27
+ }
28
+
29
+ .hint-block {
30
+ text-align: left;
31
+ overflow-x: auto;
32
+ white-space: pre-wrap;
33
+ word-wrap: normal;
34
+ background-color: #fef3cd;
35
+ border: 1px solid #ffc107;
36
+ border-radius: 4px;
37
+ padding: 12px;
38
+ margin-bottom: 16px;
39
+ color: #856404;
40
+ }
41
+
42
+ .bp5-non-ideal-state > * {
43
+ max-width: min(100%, 800px);
44
+ }
@@ -85,12 +85,12 @@ describe("validateWidgetConfig", () => {
85
85
  };
86
86
  expect(() => validateWidgetConfig(invalidConfig)).toThrow("Parameter id length can be at most 100 characters");
87
87
  });
88
- test("accepts valid object set parameter", () => {
88
+ test("accepts valid object set parameter using object types", () => {
89
89
  const validConfig = getValidConfig();
90
90
  validConfig.parameters.myObjectSet = {
91
91
  type: "objectSet",
92
92
  displayName: "My Object Set",
93
- objectType: {
93
+ allowedType: {
94
94
  type: "object",
95
95
  apiName: "employee",
96
96
  internalDoNotUseMetadata: {
@@ -100,17 +100,32 @@ describe("validateWidgetConfig", () => {
100
100
  };
101
101
  expect(() => validateWidgetConfig(validConfig)).not.toThrow();
102
102
  });
103
+ test("accepts valid object set parameter using interfaces", () => {
104
+ const validConfig = getValidConfig();
105
+ validConfig.parameters.myInterfaceSet = {
106
+ type: "objectSet",
107
+ displayName: "My Object Set",
108
+ allowedType: {
109
+ type: "interface",
110
+ apiName: "MyInterface",
111
+ internalDoNotUseMetadata: {
112
+ rid: "ri.ontology.main.interface.my-interface"
113
+ }
114
+ }
115
+ };
116
+ expect(() => validateWidgetConfig(validConfig)).not.toThrow();
117
+ });
103
118
  test("throws for invalid object set parameter", () => {
104
119
  const invalidConfig = getValidConfig();
105
120
  invalidConfig.parameters.myObjectSet = {
106
121
  type: "objectSet",
107
122
  displayName: "My Object Set",
108
- objectType: {
123
+ allowedType: {
109
124
  type: "object",
110
125
  apiName: "employee"
111
126
  }
112
127
  };
113
- expect(() => validateWidgetConfig(invalidConfig)).toThrow("ObjectSet parameter \"myObjectSet\" must have a valid rid in its metadata, make sure your OSDK was generated with a generator version >=2.5.0");
128
+ expect(() => validateWidgetConfig(invalidConfig)).toThrow("ObjectSet parameter \"myObjectSet\" must have a valid rid in its metadata, make sure your OSDK was generated with a generator version >=2.6.2");
114
129
  });
115
130
  });
116
131
  function getValidConfig() {
@@ -1 +1 @@
1
- {"version":3,"file":"validateWidgetConfig.test.js","names":["describe","expect","test","validateWidgetConfig","validConfig","getValidConfig","not","toThrow","invalidConfig","id","repeat","testCases","message","name","description","parameters","displayName","type","longParamId","myObjectSet","objectType","apiName","internalDoNotUseMetadata","rid","paramOne","events","updateParameters","parameterUpdateIds"],"sources":["validateWidgetConfig.test.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ParameterConfig, WidgetConfig } from \"@osdk/widget.api\";\nimport { describe, expect, test } from \"vitest\";\nimport { validateWidgetConfig } from \"../validateWidgetConfig.js\";\n\ndescribe(\"validateWidgetConfig\", () => {\n test(\"accepts valid widget configuration\", () => {\n const validConfig = getValidConfig();\n expect(() => validateWidgetConfig(validConfig)).not.toThrow();\n });\n\n test(\"throws for widget id that exceeds max length\", () => {\n const invalidConfig = getValidConfig();\n invalidConfig.id = \"a\".repeat(101);\n\n expect(() => validateWidgetConfig(invalidConfig)).toThrow(\n \"Widget id length can be at most 100 characters\",\n );\n });\n\n test(\"throws for widget id that is not camelCase\", () => {\n const testCases = [\n { id: \"TestWidget\", message: \"does not match allowed pattern\" },\n { id: \"test-widget\", message: \"does not match allowed pattern\" },\n { id: \"test_widget\", message: \"does not match allowed pattern\" },\n { id: \"1testWidget\", message: \"does not match allowed pattern\" },\n ];\n\n for (const { id, message } of testCases) {\n const invalidConfig = getValidConfig();\n invalidConfig.id = id;\n expect(() => validateWidgetConfig(invalidConfig)).toThrow(message);\n }\n });\n\n test(\"throws for widget name that exceeds max length\", () => {\n const invalidConfig = getValidConfig();\n invalidConfig.name = \"A\".repeat(101);\n\n expect(() => validateWidgetConfig(invalidConfig)).toThrow(\n \"Widget name length can be at most 100 characters\",\n );\n });\n\n test(\"throws for widget description that exceeds max length\", () => {\n const invalidConfig = getValidConfig();\n invalidConfig.description = \"A\".repeat(251);\n\n expect(() => validateWidgetConfig(invalidConfig)).toThrow(\n \"Widget description length can be at most 250 characters\",\n );\n });\n\n test(\"accepts undefined widget description\", () => {\n const validConfig = getValidConfig();\n delete validConfig.description;\n\n expect(() => validateWidgetConfig(validConfig)).not.toThrow();\n });\n\n test(\"throws for parameter id that is not camelCase\", () => {\n const invalidConfig = getValidConfig();\n invalidConfig.parameters = {\n \"Invalid-Param\": {\n displayName: \"Invalid Parameter\",\n type: \"string\",\n },\n };\n\n expect(() => validateWidgetConfig(invalidConfig)).toThrow(\n \"Parameter id \\\"Invalid-Param\\\" does not match allowed pattern (must be camelCase)\",\n );\n });\n\n test(\"throws for parameter id that exceeds max length\", () => {\n const invalidConfig = getValidConfig();\n const longParamId = \"param\" + \"a\".repeat(96); // 101 chars total\n invalidConfig.parameters = {\n [longParamId]: {\n displayName: \"Long Parameter\",\n type: \"string\",\n },\n };\n\n expect(() => validateWidgetConfig(invalidConfig)).toThrow(\n \"Parameter id length can be at most 100 characters\",\n );\n });\n\n test(\"accepts valid object set parameter\", () => {\n const validConfig = getValidConfig();\n validConfig.parameters.myObjectSet = {\n type: \"objectSet\",\n displayName: \"My Object Set\",\n objectType: {\n type: \"object\",\n apiName: \"employee\",\n internalDoNotUseMetadata: {\n rid: \"ri.object-type.employee\",\n },\n },\n };\n expect(() => validateWidgetConfig(validConfig)).not.toThrow();\n });\n\n test(\"throws for invalid object set parameter\", () => {\n const invalidConfig = getValidConfig();\n invalidConfig.parameters.myObjectSet = {\n type: \"objectSet\",\n displayName: \"My Object Set\",\n objectType: {\n type: \"object\",\n apiName: \"employee\",\n },\n };\n expect(() => validateWidgetConfig(invalidConfig)).toThrow(\n \"ObjectSet parameter \\\"myObjectSet\\\" must have a valid rid in its metadata, make sure your OSDK was generated with a generator version >=2.5.0\",\n );\n });\n});\n\nfunction getValidConfig(): WidgetConfig<ParameterConfig> {\n return {\n id: \"testWidget\",\n name: \"Test Widget\",\n description: \"A test widget\",\n type: \"workshop\",\n parameters: {\n paramOne: {\n displayName: \"Parameter One\",\n type: \"string\",\n },\n },\n events: {\n updateParameters: {\n displayName: \"Update Parameters\",\n parameterUpdateIds: [\"paramOne\"],\n },\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"validateWidgetConfig.test.js","names":["describe","expect","test","validateWidgetConfig","validConfig","getValidConfig","not","toThrow","invalidConfig","id","repeat","testCases","message","name","description","parameters","displayName","type","longParamId","myObjectSet","allowedType","apiName","internalDoNotUseMetadata","rid","myInterfaceSet","paramOne","events","updateParameters","parameterUpdateIds"],"sources":["validateWidgetConfig.test.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ParameterConfig, WidgetConfig } from \"@osdk/widget.api\";\nimport { describe, expect, test } from \"vitest\";\nimport { validateWidgetConfig } from \"../validateWidgetConfig.js\";\n\ndescribe(\"validateWidgetConfig\", () => {\n test(\"accepts valid widget configuration\", () => {\n const validConfig = getValidConfig();\n expect(() => validateWidgetConfig(validConfig)).not.toThrow();\n });\n\n test(\"throws for widget id that exceeds max length\", () => {\n const invalidConfig = getValidConfig();\n invalidConfig.id = \"a\".repeat(101);\n\n expect(() => validateWidgetConfig(invalidConfig)).toThrow(\n \"Widget id length can be at most 100 characters\",\n );\n });\n\n test(\"throws for widget id that is not camelCase\", () => {\n const testCases = [\n { id: \"TestWidget\", message: \"does not match allowed pattern\" },\n { id: \"test-widget\", message: \"does not match allowed pattern\" },\n { id: \"test_widget\", message: \"does not match allowed pattern\" },\n { id: \"1testWidget\", message: \"does not match allowed pattern\" },\n ];\n\n for (const { id, message } of testCases) {\n const invalidConfig = getValidConfig();\n invalidConfig.id = id;\n expect(() => validateWidgetConfig(invalidConfig)).toThrow(message);\n }\n });\n\n test(\"throws for widget name that exceeds max length\", () => {\n const invalidConfig = getValidConfig();\n invalidConfig.name = \"A\".repeat(101);\n\n expect(() => validateWidgetConfig(invalidConfig)).toThrow(\n \"Widget name length can be at most 100 characters\",\n );\n });\n\n test(\"throws for widget description that exceeds max length\", () => {\n const invalidConfig = getValidConfig();\n invalidConfig.description = \"A\".repeat(251);\n\n expect(() => validateWidgetConfig(invalidConfig)).toThrow(\n \"Widget description length can be at most 250 characters\",\n );\n });\n\n test(\"accepts undefined widget description\", () => {\n const validConfig = getValidConfig();\n delete validConfig.description;\n\n expect(() => validateWidgetConfig(validConfig)).not.toThrow();\n });\n\n test(\"throws for parameter id that is not camelCase\", () => {\n const invalidConfig = getValidConfig();\n invalidConfig.parameters = {\n \"Invalid-Param\": {\n displayName: \"Invalid Parameter\",\n type: \"string\",\n },\n };\n\n expect(() => validateWidgetConfig(invalidConfig)).toThrow(\n \"Parameter id \\\"Invalid-Param\\\" does not match allowed pattern (must be camelCase)\",\n );\n });\n\n test(\"throws for parameter id that exceeds max length\", () => {\n const invalidConfig = getValidConfig();\n const longParamId = \"param\" + \"a\".repeat(96); // 101 chars total\n invalidConfig.parameters = {\n [longParamId]: {\n displayName: \"Long Parameter\",\n type: \"string\",\n },\n };\n\n expect(() => validateWidgetConfig(invalidConfig)).toThrow(\n \"Parameter id length can be at most 100 characters\",\n );\n });\n\n test(\"accepts valid object set parameter using object types\", () => {\n const validConfig = getValidConfig();\n validConfig.parameters.myObjectSet = {\n type: \"objectSet\",\n displayName: \"My Object Set\",\n allowedType: {\n type: \"object\",\n apiName: \"employee\",\n internalDoNotUseMetadata: {\n rid: \"ri.object-type.employee\",\n },\n },\n };\n expect(() => validateWidgetConfig(validConfig)).not.toThrow();\n });\n\n test(\"accepts valid object set parameter using interfaces\", () => {\n const validConfig = getValidConfig();\n validConfig.parameters.myInterfaceSet = {\n type: \"objectSet\",\n displayName: \"My Object Set\",\n allowedType: {\n type: \"interface\",\n apiName: \"MyInterface\",\n internalDoNotUseMetadata: {\n rid: \"ri.ontology.main.interface.my-interface\",\n },\n },\n };\n expect(() => validateWidgetConfig(validConfig)).not.toThrow();\n });\n\n test(\"throws for invalid object set parameter\", () => {\n const invalidConfig = getValidConfig();\n invalidConfig.parameters.myObjectSet = {\n type: \"objectSet\",\n displayName: \"My Object Set\",\n allowedType: {\n type: \"object\",\n apiName: \"employee\",\n },\n };\n expect(() => validateWidgetConfig(invalidConfig)).toThrow(\n \"ObjectSet parameter \\\"myObjectSet\\\" must have a valid rid in its metadata, make sure your OSDK was generated with a generator version >=2.6.2\",\n );\n });\n});\n\nfunction getValidConfig(): WidgetConfig<ParameterConfig> {\n return {\n id: \"testWidget\",\n name: \"Test Widget\",\n description: \"A test widget\",\n type: \"workshop\",\n parameters: {\n paramOne: {\n displayName: \"Parameter One\",\n type: \"string\",\n },\n },\n events: {\n updateParameters: {\n displayName: \"Update Parameters\",\n parameterUpdateIds: [\"paramOne\"],\n },\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -56,8 +56,8 @@ function validateWidgetParameters(parameters) {
56
56
  throw new Error(`Parameter id "${parameterId}" does not match allowed pattern (must be camelCase)`);
57
57
  }
58
58
  if (parameterConfig.type === "objectSet") {
59
- if (typeof parameterConfig.objectType.internalDoNotUseMetadata?.rid !== "string") {
60
- throw new Error(`ObjectSet parameter "${parameterId}" must have a valid rid in its metadata, make sure your OSDK was generated with a generator version >=2.5.0. Provided type: '${JSON.stringify(parameterConfig.objectType)}'`);
59
+ if (typeof parameterConfig.allowedType.internalDoNotUseMetadata?.rid !== "string") {
60
+ throw new Error(`ObjectSet parameter "${parameterId}" must have a valid rid in its metadata, make sure your OSDK was generated with a generator version >=2.6.2. Provided type: '${JSON.stringify(parameterConfig.allowedType)}'`);
61
61
  }
62
62
  }
63
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"validateWidgetConfig.js","names":["ID_PATTERN","ID_MAX_LENGTH","NAME_MAX_LENGTH","DESCRIPTION_MAX_LENGTH","validateWidgetConfig","config","validateWidgetId","id","validateWidgetName","name","validateWidgetDescription","description","validateWidgetParameters","parameters","length","Error","test","parameterId","parameterConfig","Object","entries","type","objectType","internalDoNotUseMetadata","rid","JSON","stringify"],"sources":["validateWidgetConfig.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ParameterConfig, WidgetConfig } from \"@osdk/widget.api\";\n\nconst ID_PATTERN = /^([a-z][a-z0-9]*)([A-Z][a-z0-9]*)*$/;\nconst ID_MAX_LENGTH = 100;\nconst NAME_MAX_LENGTH = 100;\nconst DESCRIPTION_MAX_LENGTH = 250;\n\n/**\n * Validates the requirements that can't be expressed via TypeScript type-checking\n * for a widget config (e.g. that widget IDs and parameter IDs are camelCase.)\n */\nexport function validateWidgetConfig(\n config: WidgetConfig<ParameterConfig>,\n): void {\n validateWidgetId(config.id);\n validateWidgetName(config.name);\n validateWidgetDescription(config.description);\n validateWidgetParameters(config.parameters);\n}\n\nfunction validateWidgetId(id: string): void {\n if (id.length > ID_MAX_LENGTH) {\n throw new Error(\n `Widget id length can be at most ${ID_MAX_LENGTH} characters`,\n );\n }\n if (!ID_PATTERN.test(id)) {\n throw new Error(\n `Widget id \"${id}\" does not match allowed pattern (must be camelCase)`,\n );\n }\n}\n\nfunction validateWidgetName(name: string): void {\n if (name.length > NAME_MAX_LENGTH) {\n throw new Error(\n `Widget name length can be at most ${NAME_MAX_LENGTH} characters`,\n );\n }\n}\n\nfunction validateWidgetDescription(description?: string): void {\n if (description != null && description.length > DESCRIPTION_MAX_LENGTH) {\n throw new Error(\n `Widget description length can be at most ${DESCRIPTION_MAX_LENGTH} characters`,\n );\n }\n}\n\nfunction validateWidgetParameters(parameters: ParameterConfig): void {\n for (const [parameterId, parameterConfig] of Object.entries(parameters)) {\n if (parameterId.length > ID_MAX_LENGTH) {\n throw new Error(\n `Parameter id length can be at most ${ID_MAX_LENGTH} characters`,\n );\n }\n if (!ID_PATTERN.test(parameterId)) {\n throw new Error(\n `Parameter id \"${parameterId}\" does not match allowed pattern (must be camelCase)`,\n );\n }\n if (parameterConfig.type === \"objectSet\") {\n if (\n typeof parameterConfig.objectType.internalDoNotUseMetadata?.rid\n !== \"string\"\n ) {\n throw new Error(\n `ObjectSet parameter \"${parameterId}\" must have a valid rid in its metadata, make sure your OSDK was generated with a generator version >=2.5.0. Provided type: '${\n JSON.stringify(parameterConfig.objectType)\n }'`,\n );\n }\n }\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,MAAMA,UAAU,GAAG,qCAAqC;AACxD,MAAMC,aAAa,GAAG,GAAG;AACzB,MAAMC,eAAe,GAAG,GAAG;AAC3B,MAAMC,sBAAsB,GAAG,GAAG;;AAElC;AACA;AACA;AACA;AACA,OAAO,SAASC,oBAAoBA,CAClCC,MAAqC,EAC/B;EACNC,gBAAgB,CAACD,MAAM,CAACE,EAAE,CAAC;EAC3BC,kBAAkB,CAACH,MAAM,CAACI,IAAI,CAAC;EAC/BC,yBAAyB,CAACL,MAAM,CAACM,WAAW,CAAC;EAC7CC,wBAAwB,CAACP,MAAM,CAACQ,UAAU,CAAC;AAC7C;AAEA,SAASP,gBAAgBA,CAACC,EAAU,EAAQ;EAC1C,IAAIA,EAAE,CAACO,MAAM,GAAGb,aAAa,EAAE;IAC7B,MAAM,IAAIc,KAAK,CACb,mCAAmCd,aAAa,aAClD,CAAC;EACH;EACA,IAAI,CAACD,UAAU,CAACgB,IAAI,CAACT,EAAE,CAAC,EAAE;IACxB,MAAM,IAAIQ,KAAK,CACb,cAAcR,EAAE,sDAClB,CAAC;EACH;AACF;AAEA,SAASC,kBAAkBA,CAACC,IAAY,EAAQ;EAC9C,IAAIA,IAAI,CAACK,MAAM,GAAGZ,eAAe,EAAE;IACjC,MAAM,IAAIa,KAAK,CACb,qCAAqCb,eAAe,aACtD,CAAC;EACH;AACF;AAEA,SAASQ,yBAAyBA,CAACC,WAAoB,EAAQ;EAC7D,IAAIA,WAAW,IAAI,IAAI,IAAIA,WAAW,CAACG,MAAM,GAAGX,sBAAsB,EAAE;IACtE,MAAM,IAAIY,KAAK,CACb,4CAA4CZ,sBAAsB,aACpE,CAAC;EACH;AACF;AAEA,SAASS,wBAAwBA,CAACC,UAA2B,EAAQ;EACnE,KAAK,MAAM,CAACI,WAAW,EAAEC,eAAe,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACP,UAAU,CAAC,EAAE;IACvE,IAAII,WAAW,CAACH,MAAM,GAAGb,aAAa,EAAE;MACtC,MAAM,IAAIc,KAAK,CACb,sCAAsCd,aAAa,aACrD,CAAC;IACH;IACA,IAAI,CAACD,UAAU,CAACgB,IAAI,CAACC,WAAW,CAAC,EAAE;MACjC,MAAM,IAAIF,KAAK,CACb,iBAAiBE,WAAW,sDAC9B,CAAC;IACH;IACA,IAAIC,eAAe,CAACG,IAAI,KAAK,WAAW,EAAE;MACxC,IACE,OAAOH,eAAe,CAACI,UAAU,CAACC,wBAAwB,EAAEC,GAAG,KACzD,QAAQ,EACd;QACA,MAAM,IAAIT,KAAK,CACb,wBAAwBE,WAAW,gIACjCQ,IAAI,CAACC,SAAS,CAACR,eAAe,CAACI,UAAU,CAAC,GAE9C,CAAC;MACH;IACF;EACF;AACF","ignoreList":[]}
1
+ {"version":3,"file":"validateWidgetConfig.js","names":["ID_PATTERN","ID_MAX_LENGTH","NAME_MAX_LENGTH","DESCRIPTION_MAX_LENGTH","validateWidgetConfig","config","validateWidgetId","id","validateWidgetName","name","validateWidgetDescription","description","validateWidgetParameters","parameters","length","Error","test","parameterId","parameterConfig","Object","entries","type","allowedType","internalDoNotUseMetadata","rid","JSON","stringify"],"sources":["validateWidgetConfig.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ParameterConfig, WidgetConfig } from \"@osdk/widget.api\";\n\nconst ID_PATTERN = /^([a-z][a-z0-9]*)([A-Z][a-z0-9]*)*$/;\nconst ID_MAX_LENGTH = 100;\nconst NAME_MAX_LENGTH = 100;\nconst DESCRIPTION_MAX_LENGTH = 250;\n\n/**\n * Validates the requirements that can't be expressed via TypeScript type-checking\n * for a widget config (e.g. that widget IDs and parameter IDs are camelCase.)\n */\nexport function validateWidgetConfig(\n config: WidgetConfig<ParameterConfig>,\n): void {\n validateWidgetId(config.id);\n validateWidgetName(config.name);\n validateWidgetDescription(config.description);\n validateWidgetParameters(config.parameters);\n}\n\nfunction validateWidgetId(id: string): void {\n if (id.length > ID_MAX_LENGTH) {\n throw new Error(\n `Widget id length can be at most ${ID_MAX_LENGTH} characters`,\n );\n }\n if (!ID_PATTERN.test(id)) {\n throw new Error(\n `Widget id \"${id}\" does not match allowed pattern (must be camelCase)`,\n );\n }\n}\n\nfunction validateWidgetName(name: string): void {\n if (name.length > NAME_MAX_LENGTH) {\n throw new Error(\n `Widget name length can be at most ${NAME_MAX_LENGTH} characters`,\n );\n }\n}\n\nfunction validateWidgetDescription(description?: string): void {\n if (description != null && description.length > DESCRIPTION_MAX_LENGTH) {\n throw new Error(\n `Widget description length can be at most ${DESCRIPTION_MAX_LENGTH} characters`,\n );\n }\n}\n\nfunction validateWidgetParameters(parameters: ParameterConfig): void {\n for (const [parameterId, parameterConfig] of Object.entries(parameters)) {\n if (parameterId.length > ID_MAX_LENGTH) {\n throw new Error(\n `Parameter id length can be at most ${ID_MAX_LENGTH} characters`,\n );\n }\n if (!ID_PATTERN.test(parameterId)) {\n throw new Error(\n `Parameter id \"${parameterId}\" does not match allowed pattern (must be camelCase)`,\n );\n }\n if (parameterConfig.type === \"objectSet\") {\n if (\n typeof parameterConfig.allowedType.internalDoNotUseMetadata?.rid\n !== \"string\"\n ) {\n throw new Error(\n `ObjectSet parameter \"${parameterId}\" must have a valid rid in its metadata, make sure your OSDK was generated with a generator version >=2.6.2. Provided type: '${\n JSON.stringify(parameterConfig.allowedType)\n }'`,\n );\n }\n }\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,MAAMA,UAAU,GAAG,qCAAqC;AACxD,MAAMC,aAAa,GAAG,GAAG;AACzB,MAAMC,eAAe,GAAG,GAAG;AAC3B,MAAMC,sBAAsB,GAAG,GAAG;;AAElC;AACA;AACA;AACA;AACA,OAAO,SAASC,oBAAoBA,CAClCC,MAAqC,EAC/B;EACNC,gBAAgB,CAACD,MAAM,CAACE,EAAE,CAAC;EAC3BC,kBAAkB,CAACH,MAAM,CAACI,IAAI,CAAC;EAC/BC,yBAAyB,CAACL,MAAM,CAACM,WAAW,CAAC;EAC7CC,wBAAwB,CAACP,MAAM,CAACQ,UAAU,CAAC;AAC7C;AAEA,SAASP,gBAAgBA,CAACC,EAAU,EAAQ;EAC1C,IAAIA,EAAE,CAACO,MAAM,GAAGb,aAAa,EAAE;IAC7B,MAAM,IAAIc,KAAK,CACb,mCAAmCd,aAAa,aAClD,CAAC;EACH;EACA,IAAI,CAACD,UAAU,CAACgB,IAAI,CAACT,EAAE,CAAC,EAAE;IACxB,MAAM,IAAIQ,KAAK,CACb,cAAcR,EAAE,sDAClB,CAAC;EACH;AACF;AAEA,SAASC,kBAAkBA,CAACC,IAAY,EAAQ;EAC9C,IAAIA,IAAI,CAACK,MAAM,GAAGZ,eAAe,EAAE;IACjC,MAAM,IAAIa,KAAK,CACb,qCAAqCb,eAAe,aACtD,CAAC;EACH;AACF;AAEA,SAASQ,yBAAyBA,CAACC,WAAoB,EAAQ;EAC7D,IAAIA,WAAW,IAAI,IAAI,IAAIA,WAAW,CAACG,MAAM,GAAGX,sBAAsB,EAAE;IACtE,MAAM,IAAIY,KAAK,CACb,4CAA4CZ,sBAAsB,aACpE,CAAC;EACH;AACF;AAEA,SAASS,wBAAwBA,CAACC,UAA2B,EAAQ;EACnE,KAAK,MAAM,CAACI,WAAW,EAAEC,eAAe,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACP,UAAU,CAAC,EAAE;IACvE,IAAII,WAAW,CAACH,MAAM,GAAGb,aAAa,EAAE;MACtC,MAAM,IAAIc,KAAK,CACb,sCAAsCd,aAAa,aACrD,CAAC;IACH;IACA,IAAI,CAACD,UAAU,CAACgB,IAAI,CAACC,WAAW,CAAC,EAAE;MACjC,MAAM,IAAIF,KAAK,CACb,iBAAiBE,WAAW,sDAC9B,CAAC;IACH;IACA,IAAIC,eAAe,CAACG,IAAI,KAAK,WAAW,EAAE;MACxC,IACE,OAAOH,eAAe,CAACI,WAAW,CAACC,wBAAwB,EAAEC,GAAG,KAC1D,QAAQ,EACd;QACA,MAAM,IAAIT,KAAK,CACb,wBAAwBE,WAAW,gIACjCQ,IAAI,CAACC,SAAS,CAACR,eAAe,CAACI,WAAW,CAAC,GAE/C,CAAC;MACH;IACF;EACF;AACF","ignoreList":[]}
@@ -189,6 +189,16 @@ export function FoundryWidgetDevPlugin() {
189
189
  const fullSourcePath = standardizePathAndFileExtension(getFullSourcePath(source, standardizedImporter));
190
190
  configFileToEntrypoint[fullSourcePath] = standardizedImporter;
191
191
  }
192
+ },
193
+ handleHotUpdate({
194
+ file,
195
+ server
196
+ }) {
197
+ const standardizedFile = standardizePathAndFileExtension(file);
198
+ if (configFileToEntrypoint[standardizedFile] != null) {
199
+ server.config.logger.warn(color.yellow(`Detected a change to widget config file ${file}. Make sure to publish your changes in order to use the changes you've made.`));
200
+ return [];
201
+ }
192
202
  }
193
203
  };
194
204
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FoundryWidgetDevPlugin.js","names":["path","fileURLToPath","color","sirv","CONFIG_FILE_SUFFIX","DEV_PLUGIN_ID","ENTRYPOINTS_PATH","FINISH_PATH","MODULE_EVALUATION_MODE","SETUP_PATH","VITE_INJECTIONS_PATH","getInputHtmlEntrypoints","standardizePathAndFileExtension","isCodeWorkspacesMode","extractInjectedScripts","getBaseHref","getFoundryToken","getWidgetIdOverrideMap","publishDevModeSettings","warnIfWrongDevCommand","DIR_DIST","__dirname","dirname","import","meta","url","FoundryWidgetDevPlugin","htmlEntrypoints","codeEntrypoints","configFileToEntrypoint","name","enforce","apply","config","command","mode","process","env","VITEST","buildStart","options","configResolved","resolvedConfig","logger","configureServer","server","printUrls","printSetupPageUrl","middlewares","use","serverPath","req","res","next","originalUrl","endsWith","statusCode","setHeader","end","resolve","single","dev","_","JSON","stringify","map","entrypoint","Error","URL","headers","host","numAttempts","parseInt","searchParams","get","errorMessage","error","status","numEntrypoints","length","numConfigFiles","Object","keys","info","widgetIdToOverrides","injectedScripts","inlineScripts","join","resolveId","source","importer","standardizedSource","getFullSourcePath","startsWith","cwd","standardizedImporter","includes","extname","replace","fullSourcePath","subPath","posix","base","green","bold","setupRoute"],"sources":["FoundryWidgetDevPlugin.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport color from \"picocolors\";\nimport sirv from \"sirv\";\nimport type { Plugin, ViteDevServer } from \"vite\";\nimport {\n CONFIG_FILE_SUFFIX,\n DEV_PLUGIN_ID,\n ENTRYPOINTS_PATH,\n FINISH_PATH,\n MODULE_EVALUATION_MODE,\n SETUP_PATH,\n VITE_INJECTIONS_PATH,\n} from \"../common/constants.js\";\nimport { getInputHtmlEntrypoints } from \"../common/getInputHtmlEntrypoints.js\";\nimport { standardizePathAndFileExtension } from \"../common/standardizePathAndFileExtension.js\";\nimport { isCodeWorkspacesMode } from \"./codeWorkspacesMode.js\";\nimport { extractInjectedScripts } from \"./extractInjectedScripts.js\";\nimport { getBaseHref } from \"./getBaseHref.js\";\nimport { getFoundryToken } from \"./getFoundryToken.js\";\nimport { getWidgetIdOverrideMap } from \"./getWidgetIdOverrideMap.js\";\nimport { publishDevModeSettings } from \"./publishDevModeSettings.js\";\nimport { warnIfWrongDevCommand } from \"./validateDevEnvironment.js\";\n\n// Location of the setup page assets\nconst DIR_DIST: string = typeof __dirname !== \"undefined\"\n ? __dirname\n : path.dirname(fileURLToPath(import.meta.url));\n\nexport function FoundryWidgetDevPlugin(): Plugin {\n // The root HTML entrypoints of the build process\n let htmlEntrypoints: string[];\n // Fully resolved paths to the entrypoint files, mapped to relative paths\n const codeEntrypoints: Record<string, string> = {};\n // Store the map of fully resolved config file paths to entrypoint file paths\n const configFileToEntrypoint: Record<string, string> = {};\n\n return {\n name: DEV_PLUGIN_ID,\n enforce: \"pre\",\n // Only apply this plugin during development, skip during tests and build-mode module evaluation\n apply(config, { command }) {\n if (\n config.mode === MODULE_EVALUATION_MODE || process.env.VITEST != null\n ) {\n return false;\n }\n return command === \"serve\";\n },\n\n /**\n * Capture the entrypoints from the Vite config so that we can manually load them on our\n * setup page and trigger module parsing.\n */\n buildStart(options) {\n htmlEntrypoints = getInputHtmlEntrypoints(options);\n },\n\n /**\n * Check for the required token environment variable in dev mode.\n */\n configResolved(resolvedConfig) {\n warnIfWrongDevCommand(resolvedConfig.mode, resolvedConfig.logger);\n getFoundryToken(resolvedConfig.mode);\n },\n\n /**\n * Configure the Vite server to serve the setup page and handle the finish endpoint. This\n * endpoint will set the widget overrides in Foundry and enable dev mode.\n */\n configureServer(server) {\n // Override the printUrls function to print the setup page URL\n server.printUrls = () => printSetupPageUrl(server);\n\n /**\n * Redirect `./.palantir/setup` to `./.palantir/setup/` to ensure that relative paths work\n * correctly. Relative paths must be used so that the dev server UI can be accessed on\n * non-root paths.\n */\n server.middlewares.use(\n serverPath(server, SETUP_PATH),\n (req, res, next) => {\n if (req.originalUrl?.endsWith(serverPath(server, SETUP_PATH))) {\n res.statusCode = 301;\n res.setHeader(\"Location\", `${serverPath(server, SETUP_PATH)}/`);\n res.end();\n } else {\n next();\n }\n },\n );\n\n /**\n * Serve the setup page that will load the entrypoints in iframes and trigger the finish\n * endpoint once widgets have been loaded.\n */\n server.middlewares.use(\n serverPath(server, SETUP_PATH),\n sirv(path.resolve(DIR_DIST, \"../../site\"), {\n single: true,\n dev: true,\n }),\n );\n\n /**\n * Make the entrypoints available to the setup page so that it can load them in iframes in\n * order to trigger module parsing.\n */\n server.middlewares.use(\n serverPath(server, ENTRYPOINTS_PATH),\n (_, res) => {\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(\n JSON.stringify(\n htmlEntrypoints.map((entrypoint) =>\n serverPath(server, entrypoint)\n ),\n ),\n );\n },\n );\n\n /**\n * Finish the setup process by setting the widget overrides in Foundry and enabling dev mode.\n */\n server.middlewares.use(\n serverPath(server, FINISH_PATH),\n async (req, res) => {\n // Check for too many attempts\n if (req.url == null) {\n throw new Error(\"Request URL is undefined\");\n }\n const url = new URL(req.url, `http://${req.headers.host}`);\n const numAttempts = parseInt(url.searchParams.get(\"attempt\") ?? \"0\");\n if (numAttempts >= 10) {\n const errorMessage =\n \"Timed out waiting for widget config files to be parsed. Are you sure a widget config is imported?\";\n server.config.logger.error(errorMessage);\n res.setHeader(\"Content-Type\", \"application/json\");\n res.statusCode = 500;\n res.end(\n JSON.stringify({\n status: \"error\",\n error: errorMessage,\n }),\n );\n return;\n }\n\n // Wait for the setup page to trigger the parsing of the config files\n const numEntrypoints = htmlEntrypoints.length;\n const numConfigFiles = Object.keys(configFileToEntrypoint).length;\n if (numConfigFiles < numEntrypoints) {\n server.config.logger.info(\n `Waiting for widget config files to be parsed, found ${numConfigFiles} config files out of`\n + ` ${numEntrypoints} HTML entrypoints.`,\n );\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({ status: \"pending\" }));\n return;\n }\n\n // Prepare the widget overrides and finish the setup process\n const widgetIdToOverrides = await getWidgetIdOverrideMap(\n server,\n codeEntrypoints,\n configFileToEntrypoint,\n getBaseHref(server),\n );\n await publishDevModeSettings(\n server,\n widgetIdToOverrides,\n getBaseHref(server),\n res,\n );\n },\n );\n\n /**\n * Serve scripts that would usually be injected into the HTML if Vite had control over the\n * serving of index HTML pages. This is necessary to ensure that plugins like React refresh\n * work correctly.\n */\n server.middlewares.use(\n serverPath(server, VITE_INJECTIONS_PATH),\n async (_, res) => {\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Content-Type\", \"application/javascript\");\n const injectedScripts = await extractInjectedScripts(server);\n res.end(injectedScripts.inlineScripts.join(\"\\n\"));\n },\n );\n },\n\n /**\n * As module imports are resolved, we need to capture the entrypoint file paths and the config\n * file paths that are imported from them.\n */\n resolveId(source, importer) {\n if (importer == null) {\n return;\n }\n\n // Standardize the source file extension and get the full path\n const standardizedSource = standardizePathAndFileExtension(\n getFullSourcePath(\n // If the source path is absolute, resolve it against the current working directory\n source.startsWith(\"/\") ? path.join(process.cwd(), source) : source,\n importer,\n ),\n );\n // Importers are already full paths, so just standardize the extension\n const standardizedImporter = standardizePathAndFileExtension(importer);\n\n // In dev mode all entrypoints have a generic HTML importer value\n if (\n importer.endsWith(\"index.html\") && !standardizedSource.includes(\"@fs\")\n // In a cold start, Vite may try to resolve files (e.g. a widget.html) before the user even accesses the dev mode server.\n // These files are not valid code entrypoints, so we ignore them here.\n && path.extname(standardizedSource) !== \".html\"\n ) {\n // Store the fully resolved path and the relative path, as we need the former for mapping\n // config files to entrypoints and the latter as a dev mode override script\n codeEntrypoints[standardizedSource] = source;\n }\n\n // Look for config files that are imported from an entrypoint file\n // Also check the config file being imported is in src to avoid picking up imports for other\n // project files like foundry.config.json / eslint.config.mjs when tailwind is used.\n if (\n standardizedSource.replace(/\\.[^/.]+$/, \"\").endsWith(CONFIG_FILE_SUFFIX)\n && standardizedSource.includes(\"/src/\")\n && codeEntrypoints[standardizedImporter] != null\n ) {\n const fullSourcePath = standardizePathAndFileExtension(\n getFullSourcePath(source, standardizedImporter),\n );\n configFileToEntrypoint[fullSourcePath] = standardizedImporter;\n }\n },\n };\n}\n\n/**\n * During the resolution phase source are given as relative paths to the importer\n */\nfunction getFullSourcePath(source: string, importer: string): string {\n return path.resolve(path.dirname(importer), source);\n}\n\nfunction serverPath(server: ViteDevServer, subPath: string): string {\n // Don't use Windows-style paths when constructing URL paths for the HTTP server\n return path.posix.resolve(server.config.base, subPath);\n}\n\nfunction printSetupPageUrl(server: ViteDevServer) {\n if (isCodeWorkspacesMode(server.config.mode)) {\n server.config.logger.info(\n ` ${color.green(\"➜\")} ${\n color.bold(\n \"Select a widget from the preview panel to enter developer mode\",\n )\n }`,\n );\n } else {\n const setupRoute = `${getBaseHref(server)}${SETUP_PATH}/`;\n server.config.logger.info(\n ` ${color.green(\"➜\")} ${\n color.bold(\"Click to enter developer mode for your widget set\")\n }: ${color.green(setupRoute)}`,\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"FoundryWidgetDevPlugin.js","names":["path","fileURLToPath","color","sirv","CONFIG_FILE_SUFFIX","DEV_PLUGIN_ID","ENTRYPOINTS_PATH","FINISH_PATH","MODULE_EVALUATION_MODE","SETUP_PATH","VITE_INJECTIONS_PATH","getInputHtmlEntrypoints","standardizePathAndFileExtension","isCodeWorkspacesMode","extractInjectedScripts","getBaseHref","getFoundryToken","getWidgetIdOverrideMap","publishDevModeSettings","warnIfWrongDevCommand","DIR_DIST","__dirname","dirname","import","meta","url","FoundryWidgetDevPlugin","htmlEntrypoints","codeEntrypoints","configFileToEntrypoint","name","enforce","apply","config","command","mode","process","env","VITEST","buildStart","options","configResolved","resolvedConfig","logger","configureServer","server","printUrls","printSetupPageUrl","middlewares","use","serverPath","req","res","next","originalUrl","endsWith","statusCode","setHeader","end","resolve","single","dev","_","JSON","stringify","map","entrypoint","Error","URL","headers","host","numAttempts","parseInt","searchParams","get","errorMessage","error","status","numEntrypoints","length","numConfigFiles","Object","keys","info","widgetIdToOverrides","injectedScripts","inlineScripts","join","resolveId","source","importer","standardizedSource","getFullSourcePath","startsWith","cwd","standardizedImporter","includes","extname","replace","fullSourcePath","handleHotUpdate","file","standardizedFile","warn","yellow","subPath","posix","base","green","bold","setupRoute"],"sources":["FoundryWidgetDevPlugin.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport color from \"picocolors\";\nimport sirv from \"sirv\";\nimport type { Plugin, ViteDevServer } from \"vite\";\nimport {\n CONFIG_FILE_SUFFIX,\n DEV_PLUGIN_ID,\n ENTRYPOINTS_PATH,\n FINISH_PATH,\n MODULE_EVALUATION_MODE,\n SETUP_PATH,\n VITE_INJECTIONS_PATH,\n} from \"../common/constants.js\";\nimport { getInputHtmlEntrypoints } from \"../common/getInputHtmlEntrypoints.js\";\nimport { standardizePathAndFileExtension } from \"../common/standardizePathAndFileExtension.js\";\nimport { isCodeWorkspacesMode } from \"./codeWorkspacesMode.js\";\nimport { extractInjectedScripts } from \"./extractInjectedScripts.js\";\nimport { getBaseHref } from \"./getBaseHref.js\";\nimport { getFoundryToken } from \"./getFoundryToken.js\";\nimport { getWidgetIdOverrideMap } from \"./getWidgetIdOverrideMap.js\";\nimport { publishDevModeSettings } from \"./publishDevModeSettings.js\";\nimport { warnIfWrongDevCommand } from \"./validateDevEnvironment.js\";\n\n// Location of the setup page assets\nconst DIR_DIST: string = typeof __dirname !== \"undefined\"\n ? __dirname\n : path.dirname(fileURLToPath(import.meta.url));\n\nexport function FoundryWidgetDevPlugin(): Plugin {\n // The root HTML entrypoints of the build process\n let htmlEntrypoints: string[];\n // Fully resolved paths to the entrypoint files, mapped to relative paths\n const codeEntrypoints: Record<string, string> = {};\n // Store the map of fully resolved config file paths to entrypoint file paths\n const configFileToEntrypoint: Record<string, string> = {};\n\n return {\n name: DEV_PLUGIN_ID,\n enforce: \"pre\",\n // Only apply this plugin during development, skip during tests and build-mode module evaluation\n apply(config, { command }) {\n if (\n config.mode === MODULE_EVALUATION_MODE || process.env.VITEST != null\n ) {\n return false;\n }\n return command === \"serve\";\n },\n\n /**\n * Capture the entrypoints from the Vite config so that we can manually load them on our\n * setup page and trigger module parsing.\n */\n buildStart(options) {\n htmlEntrypoints = getInputHtmlEntrypoints(options);\n },\n\n /**\n * Check for the required token environment variable in dev mode.\n */\n configResolved(resolvedConfig) {\n warnIfWrongDevCommand(resolvedConfig.mode, resolvedConfig.logger);\n getFoundryToken(resolvedConfig.mode);\n },\n\n /**\n * Configure the Vite server to serve the setup page and handle the finish endpoint. This\n * endpoint will set the widget overrides in Foundry and enable dev mode.\n */\n configureServer(server) {\n // Override the printUrls function to print the setup page URL\n server.printUrls = () => printSetupPageUrl(server);\n\n /**\n * Redirect `./.palantir/setup` to `./.palantir/setup/` to ensure that relative paths work\n * correctly. Relative paths must be used so that the dev server UI can be accessed on\n * non-root paths.\n */\n server.middlewares.use(\n serverPath(server, SETUP_PATH),\n (req, res, next) => {\n if (req.originalUrl?.endsWith(serverPath(server, SETUP_PATH))) {\n res.statusCode = 301;\n res.setHeader(\"Location\", `${serverPath(server, SETUP_PATH)}/`);\n res.end();\n } else {\n next();\n }\n },\n );\n\n /**\n * Serve the setup page that will load the entrypoints in iframes and trigger the finish\n * endpoint once widgets have been loaded.\n */\n server.middlewares.use(\n serverPath(server, SETUP_PATH),\n sirv(path.resolve(DIR_DIST, \"../../site\"), {\n single: true,\n dev: true,\n }),\n );\n\n /**\n * Make the entrypoints available to the setup page so that it can load them in iframes in\n * order to trigger module parsing.\n */\n server.middlewares.use(\n serverPath(server, ENTRYPOINTS_PATH),\n (_, res) => {\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(\n JSON.stringify(\n htmlEntrypoints.map((entrypoint) =>\n serverPath(server, entrypoint)\n ),\n ),\n );\n },\n );\n\n /**\n * Finish the setup process by setting the widget overrides in Foundry and enabling dev mode.\n */\n server.middlewares.use(\n serverPath(server, FINISH_PATH),\n async (req, res) => {\n // Check for too many attempts\n if (req.url == null) {\n throw new Error(\"Request URL is undefined\");\n }\n const url = new URL(req.url, `http://${req.headers.host}`);\n const numAttempts = parseInt(url.searchParams.get(\"attempt\") ?? \"0\");\n if (numAttempts >= 10) {\n const errorMessage =\n \"Timed out waiting for widget config files to be parsed. Are you sure a widget config is imported?\";\n server.config.logger.error(errorMessage);\n res.setHeader(\"Content-Type\", \"application/json\");\n res.statusCode = 500;\n res.end(\n JSON.stringify({\n status: \"error\",\n error: errorMessage,\n }),\n );\n return;\n }\n\n // Wait for the setup page to trigger the parsing of the config files\n const numEntrypoints = htmlEntrypoints.length;\n const numConfigFiles = Object.keys(configFileToEntrypoint).length;\n if (numConfigFiles < numEntrypoints) {\n server.config.logger.info(\n `Waiting for widget config files to be parsed, found ${numConfigFiles} config files out of`\n + ` ${numEntrypoints} HTML entrypoints.`,\n );\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({ status: \"pending\" }));\n return;\n }\n\n // Prepare the widget overrides and finish the setup process\n const widgetIdToOverrides = await getWidgetIdOverrideMap(\n server,\n codeEntrypoints,\n configFileToEntrypoint,\n getBaseHref(server),\n );\n await publishDevModeSettings(\n server,\n widgetIdToOverrides,\n getBaseHref(server),\n res,\n );\n },\n );\n\n /**\n * Serve scripts that would usually be injected into the HTML if Vite had control over the\n * serving of index HTML pages. This is necessary to ensure that plugins like React refresh\n * work correctly.\n */\n server.middlewares.use(\n serverPath(server, VITE_INJECTIONS_PATH),\n async (_, res) => {\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Content-Type\", \"application/javascript\");\n const injectedScripts = await extractInjectedScripts(server);\n res.end(injectedScripts.inlineScripts.join(\"\\n\"));\n },\n );\n },\n\n /**\n * As module imports are resolved, we need to capture the entrypoint file paths and the config\n * file paths that are imported from them.\n */\n resolveId(source, importer) {\n if (importer == null) {\n return;\n }\n\n // Standardize the source file extension and get the full path\n const standardizedSource = standardizePathAndFileExtension(\n getFullSourcePath(\n // If the source path is absolute, resolve it against the current working directory\n source.startsWith(\"/\") ? path.join(process.cwd(), source) : source,\n importer,\n ),\n );\n // Importers are already full paths, so just standardize the extension\n const standardizedImporter = standardizePathAndFileExtension(importer);\n\n // In dev mode all entrypoints have a generic HTML importer value\n if (\n importer.endsWith(\"index.html\") && !standardizedSource.includes(\"@fs\")\n // In a cold start, Vite may try to resolve files (e.g. a widget.html) before the user even accesses the dev mode server.\n // These files are not valid code entrypoints, so we ignore them here.\n && path.extname(standardizedSource) !== \".html\"\n ) {\n // Store the fully resolved path and the relative path, as we need the former for mapping\n // config files to entrypoints and the latter as a dev mode override script\n codeEntrypoints[standardizedSource] = source;\n }\n\n // Look for config files that are imported from an entrypoint file\n // Also check the config file being imported is in src to avoid picking up imports for other\n // project files like foundry.config.json / eslint.config.mjs when tailwind is used.\n if (\n standardizedSource.replace(/\\.[^/.]+$/, \"\").endsWith(CONFIG_FILE_SUFFIX)\n && standardizedSource.includes(\"/src/\")\n && codeEntrypoints[standardizedImporter] != null\n ) {\n const fullSourcePath = standardizePathAndFileExtension(\n getFullSourcePath(source, standardizedImporter),\n );\n configFileToEntrypoint[fullSourcePath] = standardizedImporter;\n }\n },\n\n handleHotUpdate({ file, server }) {\n const standardizedFile = standardizePathAndFileExtension(file);\n if (configFileToEntrypoint[standardizedFile] != null) {\n server.config.logger.warn(\n color.yellow(\n `Detected a change to widget config file ${file}. Make sure to publish your changes in order to use the changes you've made.`,\n ),\n );\n return [];\n }\n },\n };\n}\n\n/**\n * During the resolution phase source are given as relative paths to the importer\n */\nfunction getFullSourcePath(source: string, importer: string): string {\n return path.resolve(path.dirname(importer), source);\n}\n\nfunction serverPath(server: ViteDevServer, subPath: string): string {\n // Don't use Windows-style paths when constructing URL paths for the HTTP server\n return path.posix.resolve(server.config.base, subPath);\n}\n\nfunction printSetupPageUrl(server: ViteDevServer) {\n if (isCodeWorkspacesMode(server.config.mode)) {\n server.config.logger.info(\n ` ${color.green(\"➜\")} ${\n color.bold(\n \"Select a widget from the preview panel to enter developer mode\",\n )\n }`,\n );\n } else {\n const setupRoute = `${getBaseHref(server)}${SETUP_PATH}/`;\n server.config.logger.info(\n ` ${color.green(\"➜\")} ${\n color.bold(\"Click to enter developer mode for your widget set\")\n }: ${color.green(setupRoute)}`,\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@osdk/widget.vite-plugin",
3
- "version": "3.4.0-beta.9",
3
+ "version": "3.4.0",
4
4
  "description": "A vite plugin that will extract parameter definitions from TS/JS files + entrypoint info into a manifest file to be uploaded to Foundry ",
5
5
  "access": "public",
6
6
  "license": "Apache-2.0",
@@ -30,8 +30,8 @@
30
30
  "picocolors": "^1.1.1",
31
31
  "resolve-package-path": "^4.0.3",
32
32
  "sirv": "^3.0.2",
33
- "@osdk/foundry-config-json": "~1.6.0-beta.1",
34
- "@osdk/widget.api": "~3.4.0-beta.9"
33
+ "@osdk/foundry-config-json": "~1.6.0",
34
+ "@osdk/widget.api": "~3.4.0"
35
35
  },
36
36
  "peerDependencies": {
37
37
  "vite": "^6.3.5"
@@ -49,8 +49,8 @@
49
49
  "typescript": "~5.5.4",
50
50
  "vite": "^6.3.6",
51
51
  "vitest": "^3.2.4",
52
- "@osdk/monorepo.api-extractor": "~0.6.0-beta.1",
53
- "@osdk/monorepo.tsconfig": "~0.6.0-beta.1"
52
+ "@osdk/monorepo.api-extractor": "~0.6.0",
53
+ "@osdk/monorepo.tsconfig": "~0.6.0"
54
54
  },
55
55
  "publishConfig": {
56
56
  "access": "public"