@osdk/widget.vite-plugin 3.2.0-beta.3 → 3.2.0-beta.5

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 (27) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/build/esm/build-plugin/__tests__/buildWidgetSetManifest.test.js +159 -0
  3. package/build/esm/build-plugin/__tests__/buildWidgetSetManifest.test.js.map +1 -0
  4. package/build/esm/build-plugin/buildWidgetSetManifest.js +18 -1
  5. package/build/esm/build-plugin/buildWidgetSetManifest.js.map +1 -1
  6. package/build/esm/common/__tests__/validateWidgetConfig.test.js +27 -0
  7. package/build/esm/common/__tests__/validateWidgetConfig.test.js.map +1 -1
  8. package/build/esm/common/validateWidgetConfig.js +6 -1
  9. package/build/esm/common/validateWidgetConfig.js.map +1 -1
  10. package/build/esm/dev-plugin/FoundryWidgetDevPlugin.js +7 -3
  11. package/build/esm/dev-plugin/FoundryWidgetDevPlugin.js.map +1 -1
  12. package/build/site/assets/{allPaths-DcyFnTvZ.js → allPaths-C9RDB26n.js} +1 -1
  13. package/build/site/assets/{allPathsLoader-DHYhi3rh.js → allPathsLoader-DXy-gD-r.js} +2 -2
  14. package/build/site/assets/index-B-fsa5Ru.js +1 -0
  15. package/build/site/assets/index-CxjWve_y.css +1 -0
  16. package/build/site/assets/index-D9t4xczX.js +44 -0
  17. package/build/site/assets/index-DLOviMB1.js +1 -0
  18. package/build/site/assets/{splitPathsBySizeLoader-CtOeozdm.js → splitPathsBySizeLoader-CEcIKoAH.js} +1 -1
  19. package/build/site/index.html +2 -2
  20. package/build/types/build-plugin/__tests__/buildWidgetSetManifest.test.d.ts +1 -0
  21. package/build/types/build-plugin/__tests__/buildWidgetSetManifest.test.d.ts.map +1 -0
  22. package/build/types/build-plugin/buildWidgetSetManifest.d.ts.map +1 -1
  23. package/package.json +15 -15
  24. package/build/site/assets/index-62l0mIXD.css +0 -1
  25. package/build/site/assets/index-BrAe7gTM.js +0 -1
  26. package/build/site/assets/index-Dm4x3YrF.js +0 -44
  27. package/build/site/assets/index-Zx5rUdU4.js +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @osdk/widget.vite-plugin
2
2
 
3
+ ## 3.2.0-beta.5
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [faffea0]
8
+ - @osdk/widget.api@3.2.0-beta.5
9
+
10
+ ## 3.2.0-beta.4
11
+
12
+ ### Minor Changes
13
+
14
+ - 34df269: Fix widgets dev mode on Windows
15
+
16
+ ### Patch Changes
17
+
18
+ - @osdk/widget.api@3.2.0-beta.4
19
+
3
20
  ## 3.2.0-beta.3
4
21
 
5
22
  ### Minor Changes
@@ -0,0 +1,159 @@
1
+ /*
2
+ * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { describe, expect, test } from "vitest";
18
+ import { buildWidgetSetManifest } from "../buildWidgetSetManifest.js";
19
+ describe("buildWidgetSetManifest", () => {
20
+ const WIDGET_SET_RID = "ri.widgetregistry..widget-set.test-widget-set";
21
+ const WIDGET_SET_VERSION = "1.0.0";
22
+ test("builds a valid manifest with multiple widgets", () => {
23
+ const widgetBuilds = [createMockWidgetBuild("widgetOne"), createMockWidgetBuild("widgetTwo")];
24
+ const widgetSetInputSpec = {
25
+ discovered: {
26
+ sdks: [{
27
+ rid: "ri.foundry.main.sdk.test-sdk",
28
+ version: "2.0.0"
29
+ }]
30
+ }
31
+ };
32
+ const manifest = buildWidgetSetManifest(WIDGET_SET_RID, WIDGET_SET_VERSION, widgetBuilds, widgetSetInputSpec);
33
+ expect(manifest).toMatchObject({
34
+ manifestVersion: "1.0.0",
35
+ widgetSet: {
36
+ rid: WIDGET_SET_RID,
37
+ version: WIDGET_SET_VERSION,
38
+ widgets: {
39
+ widgetOne: {
40
+ id: "widgetOne",
41
+ name: "Widget widgetOne",
42
+ description: "Widget widgetOne Description",
43
+ type: "workshopWidgetV1",
44
+ entrypointJs: [{
45
+ path: "scripts/widgetOne.js"
46
+ }],
47
+ entrypointCss: [{
48
+ path: "styles/widgetOne.css"
49
+ }],
50
+ parameters: {
51
+ stringParam: {
52
+ type: "string",
53
+ displayName: "String Parameter"
54
+ }
55
+ },
56
+ events: {
57
+ updateParameters: {
58
+ displayName: "Update Parameters",
59
+ parameterUpdateIds: ["stringParam"]
60
+ }
61
+ }
62
+ },
63
+ widgetTwo: {
64
+ id: "widgetTwo",
65
+ name: "Widget widgetTwo",
66
+ description: "Widget widgetTwo Description",
67
+ type: "workshopWidgetV1",
68
+ entrypointJs: [{
69
+ path: "scripts/widgetTwo.js",
70
+ type: "module"
71
+ }],
72
+ entrypointCss: [{
73
+ path: "styles/widgetTwo.css"
74
+ }],
75
+ parameters: {
76
+ stringParam: {
77
+ type: "string",
78
+ displayName: "String Parameter"
79
+ }
80
+ },
81
+ events: {
82
+ updateParameters: {
83
+ displayName: "Update Parameters",
84
+ parameterUpdateIds: ["stringParam"]
85
+ }
86
+ }
87
+ }
88
+ },
89
+ inputSpec: widgetSetInputSpec
90
+ }
91
+ });
92
+ });
93
+ test("converts object set parameters correctly", () => {
94
+ const widgetBuild = createMockWidgetBuild("widget", {
95
+ objectSetParam: {
96
+ type: "objectSet",
97
+ displayName: "Object Set Parameter",
98
+ objectType: {
99
+ type: "object",
100
+ apiName: "employee",
101
+ internalDoNotUseMetadata: {
102
+ rid: "ri.ontology.main.object-type.employee"
103
+ }
104
+ }
105
+ }
106
+ });
107
+ const manifest = buildWidgetSetManifest(WIDGET_SET_RID, WIDGET_SET_VERSION, [widgetBuild], {});
108
+ expect(manifest.widgetSet.widgets.widget.parameters.objectSetParam).toEqual({
109
+ type: "objectSet",
110
+ displayName: "Object Set Parameter",
111
+ objectTypeRids: ["ri.ontology.main.object-type.employee"]
112
+ });
113
+ });
114
+ test("trims leading slashes from paths", () => {
115
+ const widgetBuild = createMockWidgetBuild("widget", undefined, ["/scripts/widget.js"], ["/styles/widget.css"]);
116
+ const manifest = buildWidgetSetManifest(WIDGET_SET_RID, WIDGET_SET_VERSION, [widgetBuild], {});
117
+ expect(manifest.widgetSet.widgets.widget.entrypointJs[0].path).toBe("scripts/widget.js");
118
+ expect(manifest.widgetSet.widgets.widget.entrypointCss[0].path).toBe("styles/widget.css");
119
+ });
120
+ test("handles paths without leading slashes", () => {
121
+ const widgetBuild = createMockWidgetBuild("widget", undefined, ["scripts/widget.js"], ["styles/widget.css"]);
122
+ const manifest = buildWidgetSetManifest(WIDGET_SET_RID, WIDGET_SET_VERSION, [widgetBuild], {});
123
+ expect(manifest.widgetSet.widgets.widget.entrypointJs[0].path).toBe("scripts/widget.js");
124
+ expect(manifest.widgetSet.widgets.widget.entrypointCss[0].path).toBe("styles/widget.css");
125
+ });
126
+ });
127
+ function createMockWidgetBuild(id, parameters = {
128
+ stringParam: {
129
+ type: "string",
130
+ displayName: "String Parameter"
131
+ }
132
+ }, scripts, stylesheets) {
133
+ return {
134
+ scripts: scripts?.map(src => ({
135
+ type: "script",
136
+ scriptType: "module",
137
+ src
138
+ })) ?? [{
139
+ type: "script",
140
+ scriptType: "module",
141
+ src: `/scripts/${id}.js`
142
+ }],
143
+ stylesheets: stylesheets ?? [`/styles/${id}.css`],
144
+ widgetConfig: {
145
+ id,
146
+ name: `Widget ${id}`,
147
+ description: `Widget ${id} Description`,
148
+ type: "workshop",
149
+ parameters,
150
+ events: {
151
+ updateParameters: {
152
+ displayName: "Update Parameters",
153
+ parameterUpdateIds: ["stringParam"]
154
+ }
155
+ }
156
+ }
157
+ };
158
+ }
159
+ //# sourceMappingURL=buildWidgetSetManifest.test.js.map
@@ -0,0 +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":"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,aAAa,CAAC;MAC7BC,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;YAAuB,CAAC,CACjC;YACDC,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;UACF,CAAC;UACDC,SAAS,EAAE;YACTb,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;UACF;QACF,CAAC;QACDE,SAAS,EAAEzB;MACb;IACF,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFN,IAAI,CAAC,0CAA0C,EAAE,MAAM;IACrD,MAAMgC,WAAW,GAAG3B,qBAAqB,CAAC,QAAQ,EAAE;MAClD4B,cAAc,EAAE;QACdb,IAAI,EAAE,WAAW;QACjBM,WAAW,EAAE,sBAAsB;QACnCQ,UAAU,EAAE;UACVd,IAAI,EAAE,QAAQ;UACde,OAAO,EAAE,UAAU;UACnBC,wBAAwB,EAAE;YACxB3B,GAAG,EAAE;UACP;QACF;MACF;IACF,CAAC,CAAC;IAKF,MAAME,QAAQ,GAAGV,sBAAsB,CACrCC,cAAc,EACdC,kBAAkB,EALuB,CAAC6B,WAAW,CAAC,EACT,CAAC,CAOhD,CAAC;IAEDjC,MAAM,CAACY,QAAQ,CAACG,SAAS,CAACC,OAAO,CAACsB,MAAM,CAACb,UAAU,CAACS,cAAc,CAAC,CAACK,OAAO,CACzE;MACElB,IAAI,EAAE,WAAW;MACjBM,WAAW,EAAE,sBAAsB;MACnCa,cAAc,EAAE,CAAC,uCAAuC;IAC1D,CACF,CAAC;EACH,CAAC,CAAC;EAEFvC,IAAI,CAAC,kCAAkC,EAAE,MAAM;IAC7C,MAAMgC,WAAW,GAAG3B,qBAAqB,CACvC,QAAQ,EACRmC,SAAS,EACT,CAAC,oBAAoB,CAAC,EACtB,CAAC,oBAAoB,CACvB,CAAC;IAKD,MAAM7B,QAAQ,GAAGV,sBAAsB,CACrCC,cAAc,EACdC,kBAAkB,EALuB,CAAC6B,WAAW,CAAC,EACT,CAAC,CAOhD,CAAC;IAEDjC,MAAM,CAACY,QAAQ,CAACG,SAAS,CAACC,OAAO,CAACsB,MAAM,CAAChB,YAAY,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,CAACmB,IAAI,CACjE,mBACF,CAAC;IACD1C,MAAM,CAACY,QAAQ,CAACG,SAAS,CAACC,OAAO,CAACsB,MAAM,CAACd,aAAa,CAAE,CAAC,CAAC,CAACD,IAAI,CAAC,CAACmB,IAAI,CACnE,mBACF,CAAC;EACH,CAAC,CAAC;EAEFzC,IAAI,CAAC,uCAAuC,EAAE,MAAM;IAClD,MAAMgC,WAAW,GAAG3B,qBAAqB,CACvC,QAAQ,EACRmC,SAAS,EACT,CAAC,mBAAmB,CAAC,EACrB,CAAC,mBAAmB,CACtB,CAAC;IAKD,MAAM7B,QAAQ,GAAGV,sBAAsB,CACrCC,cAAc,EACdC,kBAAkB,EALuB,CAAC6B,WAAW,CAAC,EACT,CAAC,CAOhD,CAAC;IAEDjC,MAAM,CAACY,QAAQ,CAACG,SAAS,CAACC,OAAO,CAACsB,MAAM,CAAChB,YAAY,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,CAACmB,IAAI,CACjE,mBACF,CAAC;IACD1C,MAAM,CAACY,QAAQ,CAACG,SAAS,CAACC,OAAO,CAACsB,MAAM,CAACd,aAAa,CAAE,CAAC,CAAC,CAACD,IAAI,CAAC,CAACmB,IAAI,CACnE,mBACF,CAAC;EACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,SAASpC,qBAAqBA,CAC5BY,EAAU,EACVO,UAA+C,GAAG;EAChDC,WAAW,EAAE;IACXL,IAAI,EAAE,QAAQ;IACdM,WAAW,EAAE;EACf;AACF,CAAC,EACDgB,OAAkB,EAClBC,WAAsB,EACF;EACpB,OAAO;IACLD,OAAO,EAAEA,OAAO,EAAEE,GAAG,CAACC,GAAG,KAAK;MAC5BzB,IAAI,EAAE,QAAiB;MACvB0B,UAAU,EAAE,QAAiB;MAC7BD;IACF,CAAC,CAAC,CAAC,IACE,CACD;MACEzB,IAAI,EAAE,QAAQ;MACd0B,UAAU,EAAE,QAAQ;MACpBD,GAAG,EAAE,YAAY5B,EAAE;IACrB,CAAC,CACF;IACH0B,WAAW,EAAEA,WAAW,IAAI,CAAC,WAAW1B,EAAE,MAAM,CAAC;IACjD8B,YAAY,EAAE;MACZ9B,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;IACF;EACF,CAAC;AACH","ignoreList":[]}
@@ -39,10 +39,27 @@ function buildWidgetManifest(widgetBuild) {
39
39
  entrypointCss: widgetBuild.stylesheets.map(path => ({
40
40
  path: trimLeadingSlash(path)
41
41
  })),
42
- parameters: widgetConfig.parameters,
42
+ parameters: convertParameters(widgetConfig.parameters),
43
43
  events: widgetConfig.events
44
44
  };
45
45
  }
46
+ function convertParameters(parameters) {
47
+ return Object.fromEntries(Object.entries(parameters).map(([key, param]) => [key, convertParameter(param)]));
48
+ }
49
+ function convertParameter(parameter) {
50
+ if (parameter.type === "objectSet") {
51
+ // Config has already been validated so rid must be present
52
+ if (parameter.objectType.internalDoNotUseMetadata == null) {
53
+ throw new Error("Expected internal metadata to be present");
54
+ }
55
+ return {
56
+ type: "objectSet",
57
+ displayName: parameter.displayName,
58
+ objectTypeRids: [parameter.objectType.internalDoNotUseMetadata.rid]
59
+ };
60
+ }
61
+ return parameter;
62
+ }
46
63
  function trimLeadingSlash(path) {
47
64
  return path.startsWith("/") ? path.slice(1) : path;
48
65
  }
@@ -1 +1 @@
1
- {"version":3,"file":"buildWidgetSetManifest.js","names":["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","events","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 WidgetManifestConfig,\n WidgetSetInputSpec,\n WidgetSetManifest,\n} from \"@osdk/widget.api\";\nimport type { WidgetBuildOutputs } from \"./getWidgetBuildOutputs.js\";\n\nexport function buildWidgetSetManifest(\n widgetSetRid: string,\n widgetSetVersion: string,\n widgetBuilds: WidgetBuildOutputs[],\n widgetSetInputSpec: WidgetSetInputSpec,\n): WidgetSetManifest {\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: widgetConfig.parameters,\n events: widgetConfig.events,\n };\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;;AASA,OAAO,SAASA,sBAAsBA,CACpCC,YAAoB,EACpBC,gBAAwB,EACxBC,YAAkC,EAClCC,kBAAsC,EACnB;EACnB,OAAO;IACLC,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,EAAEb,YAAY,CAACa,UAAU;IACnCC,MAAM,EAAEd,YAAY,CAACc;EACvB,CAAC;AACH;AAEA,SAASN,gBAAgBA,CAACD,IAAY,EAAU;EAC9C,OAAOA,IAAI,CAACQ,UAAU,CAAC,GAAG,CAAC,GAAGR,IAAI,CAACS,KAAK,CAAC,CAAC,CAAC,GAAGT,IAAI;AACpD","ignoreList":[]}
1
+ {"version":3,"file":"buildWidgetSetManifest.js","names":["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\";\n\nexport function buildWidgetSetManifest(\n widgetSetRid: string,\n widgetSetVersion: string,\n widgetBuilds: WidgetBuildOutputs[],\n widgetSetInputSpec: WidgetSetInputSpec,\n): WidgetSetManifest {\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;;AAWA,OAAO,SAASA,sBAAsBA,CACpCC,YAAoB,EACpBC,gBAAwB,EACxBC,YAAkC,EAClCC,kBAAsC,EACnB;EACnB,OAAO;IACLC,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":[]}
@@ -85,6 +85,33 @@ 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", () => {
89
+ const validConfig = getValidConfig();
90
+ validConfig.parameters.myObjectSet = {
91
+ type: "objectSet",
92
+ displayName: "My Object Set",
93
+ objectType: {
94
+ type: "object",
95
+ apiName: "employee",
96
+ internalDoNotUseMetadata: {
97
+ rid: "ri.object-type.employee"
98
+ }
99
+ }
100
+ };
101
+ expect(() => validateWidgetConfig(validConfig)).not.toThrow();
102
+ });
103
+ test("throws for invalid object set parameter", () => {
104
+ const invalidConfig = getValidConfig();
105
+ invalidConfig.parameters.myObjectSet = {
106
+ type: "objectSet",
107
+ displayName: "My Object Set",
108
+ objectType: {
109
+ type: "object",
110
+ apiName: "employee"
111
+ }
112
+ };
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");
114
+ });
88
115
  });
89
116
  function getValidConfig() {
90
117
  return {
@@ -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","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\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","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":[]}
@@ -48,13 +48,18 @@ function validateWidgetDescription(description) {
48
48
  }
49
49
  }
50
50
  function validateWidgetParameters(parameters) {
51
- for (const parameterId of Object.keys(parameters)) {
51
+ for (const [parameterId, parameterConfig] of Object.entries(parameters)) {
52
52
  if (parameterId.length > ID_MAX_LENGTH) {
53
53
  throw new Error(`Parameter id length can be at most ${ID_MAX_LENGTH} characters`);
54
54
  }
55
55
  if (!ID_PATTERN.test(parameterId)) {
56
56
  throw new Error(`Parameter id "${parameterId}" does not match allowed pattern (must be camelCase)`);
57
57
  }
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)}'`);
61
+ }
62
+ }
58
63
  }
59
64
  }
60
65
  //# sourceMappingURL=validateWidgetConfig.js.map
@@ -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","Object","keys"],"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 of Object.keys(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 }\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,MAAMI,WAAW,IAAIC,MAAM,CAACC,IAAI,CAACN,UAAU,CAAC,EAAE;IACjD,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;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","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":[]}
@@ -144,9 +144,12 @@ export function FoundryWidgetDevPlugin() {
144
144
  }
145
145
 
146
146
  // Standardize the source file extension and get the full path
147
- const standardizedSource = standardizeFileExtension(getFullSourcePath(source.slice(1), importer));
147
+ const standardizedSource = standardizeFileExtension(getFullSourcePath(
148
+ // If the source path is absolute, resolve it against the current working directory
149
+ source.startsWith("/") ? path.join(process.cwd(), source) : source, importer));
148
150
  // Importers are already full paths, so just standardize the extension
149
- const standardizedImporter = standardizeFileExtension(importer);
151
+ // Normalize to ensure consistent path separators on Windows
152
+ const standardizedImporter = standardizeFileExtension(path.normalize(importer));
150
153
 
151
154
  // In dev mode all entrypoints have a generic HTML importer value
152
155
  if (importer.endsWith("index.html") && !standardizedSource.includes("@fs")) {
@@ -171,7 +174,8 @@ function getFullSourcePath(source, importer) {
171
174
  return path.resolve(path.dirname(importer), source);
172
175
  }
173
176
  function serverPath(server, subPath) {
174
- return path.resolve(server.config.base, subPath);
177
+ // Don't use Windows-style paths when constructing URL paths for the HTTP server
178
+ return path.posix.resolve(server.config.base, subPath);
175
179
  }
176
180
  function printSetupPageUrl(server) {
177
181
  const setupRoute = `${getBaseHref(server)}${SETUP_PATH}/`;
@@ -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","standardizeFileExtension","extractInjectedScripts","getBaseHref","getFoundryToken","getWidgetIdOverrideMap","publishDevModeSettings","DIR_DIST","__dirname","dirname","import","meta","url","FoundryWidgetDevPlugin","htmlEntrypoints","codeEntrypoints","configFileToEntrypoint","name","enforce","apply","config","command","mode","process","env","VITEST","buildStart","options","resolvedConfig","configureServer","server","printUrls","printSetupPageUrl","middlewares","use","serverPath","req","res","next","originalUrl","endsWith","statusCode","setHeader","end","resolve","single","dev","_","JSON","stringify","map","entrypoint","numEntrypoints","length","numConfigFiles","Object","keys","status","widgetIdToOverrides","injectedScripts","inlineScripts","join","resolveId","source","importer","standardizedSource","getFullSourcePath","slice","standardizedImporter","includes","replace","fullSourcePath","subPath","base","setupRoute","logger","info","green","bold"],"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 { standardizeFileExtension } from \"../common/standardizeFileExtension.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\";\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 config(resolvedConfig) {\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 (_, res) => {\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 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 = standardizeFileExtension(\n getFullSourcePath(source.slice(1), importer),\n );\n // Importers are already full paths, so just standardize the extension\n const standardizedImporter = standardizeFileExtension(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 ) {\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 if (\n standardizedSource.replace(/\\.[^/.]+$/, \"\").endsWith(CONFIG_FILE_SUFFIX)\n && codeEntrypoints[standardizedImporter] != null\n ) {\n const fullSourcePath = standardizeFileExtension(\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 return path.resolve(server.config.base, subPath);\n}\n\nfunction printSetupPageUrl(server: ViteDevServer) {\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"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,IAAI,MAAM,WAAW;AAC5B,SAASC,aAAa,QAAQ,UAAU;AACxC,OAAOC,KAAK,MAAM,YAAY;AAC9B,OAAOC,IAAI,MAAM,MAAM;AAEvB,SACEC,kBAAkB,EAClBC,aAAa,EACbC,gBAAgB,EAChBC,WAAW,EACXC,sBAAsB,EACtBC,UAAU,EACVC,oBAAoB,QACf,wBAAwB;AAC/B,SAASC,uBAAuB,QAAQ,sCAAsC;AAC9E,SAASC,wBAAwB,QAAQ,uCAAuC;AAChF,SAASC,sBAAsB,QAAQ,6BAA6B;AACpE,SAASC,WAAW,QAAQ,kBAAkB;AAC9C,SAASC,eAAe,QAAQ,sBAAsB;AACtD,SAASC,sBAAsB,QAAQ,6BAA6B;AACpE,SAASC,sBAAsB,QAAQ,6BAA6B;;AAEpE;AACA,MAAMC,QAAgB,GAAG,OAAOC,SAAS,KAAK,WAAW,GACrDA,SAAS,GACTnB,IAAI,CAACoB,OAAO,CAACnB,aAAa,CAACoB,MAAM,CAACC,IAAI,CAACC,GAAG,CAAC,CAAC;AAEhD,OAAO,SAASC,sBAAsBA,CAAA,EAAW;EAC/C;EACA,IAAIC,eAAyB;EAC7B;EACA,MAAMC,eAAuC,GAAG,CAAC,CAAC;EAClD;EACA,MAAMC,sBAA8C,GAAG,CAAC,CAAC;EAEzD,OAAO;IACLC,IAAI,EAAEvB,aAAa;IACnBwB,OAAO,EAAE,KAAK;IACd;IACAC,KAAKA,CAACC,MAAM,EAAE;MAAEC;IAAQ,CAAC,EAAE;MACzB,IACED,MAAM,CAACE,IAAI,KAAKzB,sBAAsB,IAAI0B,OAAO,CAACC,GAAG,CAACC,MAAM,IAAI,IAAI,EACpE;QACA,OAAO,KAAK;MACd;MACA,OAAOJ,OAAO,KAAK,OAAO;IAC5B,CAAC;IAED;AACJ;AACA;AACA;IACIK,UAAUA,CAACC,OAAO,EAAE;MAClBb,eAAe,GAAGd,uBAAuB,CAAC2B,OAAO,CAAC;IACpD,CAAC;IAED;AACJ;AACA;IACIP,MAAMA,CAACQ,cAAc,EAAE;MACrBxB,eAAe,CAACwB,cAAc,CAACN,IAAI,CAAC;IACtC,CAAC;IAED;AACJ;AACA;AACA;IACIO,eAAeA,CAACC,MAAM,EAAE;MACtB;MACAA,MAAM,CAACC,SAAS,GAAG,MAAMC,iBAAiB,CAACF,MAAM,CAAC;;MAElD;AACN;AACA;AACA;AACA;MACMA,MAAM,CAACG,WAAW,CAACC,GAAG,CACpBC,UAAU,CAACL,MAAM,EAAEhC,UAAU,CAAC,EAC9B,CAACsC,GAAG,EAAEC,GAAG,EAAEC,IAAI,KAAK;QAClB,IAAIF,GAAG,CAACG,WAAW,EAAEC,QAAQ,CAACL,UAAU,CAACL,MAAM,EAAEhC,UAAU,CAAC,CAAC,EAAE;UAC7DuC,GAAG,CAACI,UAAU,GAAG,GAAG;UACpBJ,GAAG,CAACK,SAAS,CAAC,UAAU,EAAE,GAAGP,UAAU,CAACL,MAAM,EAAEhC,UAAU,CAAC,GAAG,CAAC;UAC/DuC,GAAG,CAACM,GAAG,CAAC,CAAC;QACX,CAAC,MAAM;UACLL,IAAI,CAAC,CAAC;QACR;MACF,CACF,CAAC;;MAED;AACN;AACA;AACA;MACMR,MAAM,CAACG,WAAW,CAACC,GAAG,CACpBC,UAAU,CAACL,MAAM,EAAEhC,UAAU,CAAC,EAC9BN,IAAI,CAACH,IAAI,CAACuD,OAAO,CAACrC,QAAQ,EAAE,YAAY,CAAC,EAAE;QACzCsC,MAAM,EAAE,IAAI;QACZC,GAAG,EAAE;MACP,CAAC,CACH,CAAC;;MAED;AACN;AACA;AACA;MACMhB,MAAM,CAACG,WAAW,CAACC,GAAG,CACpBC,UAAU,CAACL,MAAM,EAAEnC,gBAAgB,CAAC,EACpC,CAACoD,CAAC,EAAEV,GAAG,KAAK;QACVA,GAAG,CAACK,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC;QACjDL,GAAG,CAACM,GAAG,CACLK,IAAI,CAACC,SAAS,CACZnC,eAAe,CAACoC,GAAG,CAAEC,UAAU,IAC7BhB,UAAU,CAACL,MAAM,EAAEqB,UAAU,CAC/B,CACF,CACF,CAAC;MACH,CACF,CAAC;;MAED;AACN;AACA;MACMrB,MAAM,CAACG,WAAW,CAACC,GAAG,CACpBC,UAAU,CAACL,MAAM,EAAElC,WAAW,CAAC,EAC/B,OAAOmD,CAAC,EAAEV,GAAG,KAAK;QAChB;QACA,MAAMe,cAAc,GAAGtC,eAAe,CAACuC,MAAM;QAC7C,MAAMC,cAAc,GAAGC,MAAM,CAACC,IAAI,CAACxC,sBAAsB,CAAC,CAACqC,MAAM;QACjE,IAAIC,cAAc,GAAGF,cAAc,EAAE;UACnCf,GAAG,CAACK,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC;UACjDL,GAAG,CAACM,GAAG,CAACK,IAAI,CAACC,SAAS,CAAC;YAAEQ,MAAM,EAAE;UAAU,CAAC,CAAC,CAAC;UAC9C;QACF;;QAEA;QACA,MAAMC,mBAAmB,GAAG,MAAMrD,sBAAsB,CACtDyB,MAAM,EACNf,eAAe,EACfC,sBAAsB,EACtBb,WAAW,CAAC2B,MAAM,CACpB,CAAC;QACD,MAAMxB,sBAAsB,CAC1BwB,MAAM,EACN4B,mBAAmB,EACnBvD,WAAW,CAAC2B,MAAM,CAAC,EACnBO,GACF,CAAC;MACH,CACF,CAAC;;MAED;AACN;AACA;AACA;AACA;MACMP,MAAM,CAACG,WAAW,CAACC,GAAG,CACpBC,UAAU,CAACL,MAAM,EAAE/B,oBAAoB,CAAC,EACxC,OAAOgD,CAAC,EAAEV,GAAG,KAAK;QAChBA,GAAG,CAACK,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC;QACjDL,GAAG,CAACK,SAAS,CAAC,cAAc,EAAE,wBAAwB,CAAC;QACvD,MAAMiB,eAAe,GAAG,MAAMzD,sBAAsB,CAAC4B,MAAM,CAAC;QAC5DO,GAAG,CAACM,GAAG,CAACgB,eAAe,CAACC,aAAa,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;MACnD,CACF,CAAC;IACH,CAAC;IAED;AACJ;AACA;AACA;IACIC,SAASA,CAACC,MAAM,EAAEC,QAAQ,EAAE;MAC1B,IAAIA,QAAQ,IAAI,IAAI,EAAE;QACpB;MACF;;MAEA;MACA,MAAMC,kBAAkB,GAAGhE,wBAAwB,CACjDiE,iBAAiB,CAACH,MAAM,CAACI,KAAK,CAAC,CAAC,CAAC,EAAEH,QAAQ,CAC7C,CAAC;MACD;MACA,MAAMI,oBAAoB,GAAGnE,wBAAwB,CAAC+D,QAAQ,CAAC;;MAE/D;MACA,IACEA,QAAQ,CAACxB,QAAQ,CAAC,YAAY,CAAC,IAAI,CAACyB,kBAAkB,CAACI,QAAQ,CAAC,KAAK,CAAC,EACtE;QACA;QACA;QACAtD,eAAe,CAACkD,kBAAkB,CAAC,GAAGF,MAAM;MAC9C;;MAEA;MACA,IACEE,kBAAkB,CAACK,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC9B,QAAQ,CAAC/C,kBAAkB,CAAC,IACrEsB,eAAe,CAACqD,oBAAoB,CAAC,IAAI,IAAI,EAChD;QACA,MAAMG,cAAc,GAAGtE,wBAAwB,CAC7CiE,iBAAiB,CAACH,MAAM,EAAEK,oBAAoB,CAChD,CAAC;QACDpD,sBAAsB,CAACuD,cAAc,CAAC,GAAGH,oBAAoB;MAC/D;IACF;EACF,CAAC;AACH;;AAEA;AACA;AACA;AACA,SAASF,iBAAiBA,CAACH,MAAc,EAAEC,QAAgB,EAAU;EACnE,OAAO3E,IAAI,CAACuD,OAAO,CAACvD,IAAI,CAACoB,OAAO,CAACuD,QAAQ,CAAC,EAAED,MAAM,CAAC;AACrD;AAEA,SAAS5B,UAAUA,CAACL,MAAqB,EAAE0C,OAAe,EAAU;EAClE,OAAOnF,IAAI,CAACuD,OAAO,CAACd,MAAM,CAACV,MAAM,CAACqD,IAAI,EAAED,OAAO,CAAC;AAClD;AAEA,SAASxC,iBAAiBA,CAACF,MAAqB,EAAE;EAChD,MAAM4C,UAAU,GAAG,GAAGvE,WAAW,CAAC2B,MAAM,CAAC,GAAGhC,UAAU,GAAG;EACzDgC,MAAM,CAACV,MAAM,CAACuD,MAAM,CAACC,IAAI,CACvB,KAAKrF,KAAK,CAACsF,KAAK,CAAC,GAAG,CAAC,KACnBtF,KAAK,CAACuF,IAAI,CAAC,mDAAmD,CAAC,KAC5DvF,KAAK,CAACsF,KAAK,CAACH,UAAU,CAAC,EAC9B,CAAC;AACH","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","standardizeFileExtension","extractInjectedScripts","getBaseHref","getFoundryToken","getWidgetIdOverrideMap","publishDevModeSettings","DIR_DIST","__dirname","dirname","import","meta","url","FoundryWidgetDevPlugin","htmlEntrypoints","codeEntrypoints","configFileToEntrypoint","name","enforce","apply","config","command","mode","process","env","VITEST","buildStart","options","resolvedConfig","configureServer","server","printUrls","printSetupPageUrl","middlewares","use","serverPath","req","res","next","originalUrl","endsWith","statusCode","setHeader","end","resolve","single","dev","_","JSON","stringify","map","entrypoint","numEntrypoints","length","numConfigFiles","Object","keys","status","widgetIdToOverrides","injectedScripts","inlineScripts","join","resolveId","source","importer","standardizedSource","getFullSourcePath","startsWith","cwd","standardizedImporter","normalize","includes","replace","fullSourcePath","subPath","posix","base","setupRoute","logger","info","green","bold"],"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 { standardizeFileExtension } from \"../common/standardizeFileExtension.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\";\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 config(resolvedConfig) {\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 (_, res) => {\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 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 = standardizeFileExtension(\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 // Normalize to ensure consistent path separators on Windows\n const standardizedImporter = standardizeFileExtension(\n path.normalize(importer),\n );\n\n // In dev mode all entrypoints have a generic HTML importer value\n if (\n importer.endsWith(\"index.html\") && !standardizedSource.includes(\"@fs\")\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 if (\n standardizedSource.replace(/\\.[^/.]+$/, \"\").endsWith(CONFIG_FILE_SUFFIX)\n && codeEntrypoints[standardizedImporter] != null\n ) {\n const fullSourcePath = standardizeFileExtension(\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 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"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- import{I as n}from"./index-Zx5rUdU4.js";import{I as e}from"./index-BrAe7gTM.js";import{p as r,I as s}from"./index-Dm4x3YrF.js";function I(o,t){var a=r(o);return t===s.STANDARD?n[a]:e[a]}function p(o){return r(o)}export{n as IconSvgPaths16,e as IconSvgPaths20,I as getIconPaths,p as iconNameToPathsRecordKey};
1
+ import{I as n}from"./index-DLOviMB1.js";import{I as e}from"./index-B-fsa5Ru.js";import{p as r,I as s}from"./index-D9t4xczX.js";function I(o,t){var a=r(o);return t===s.STANDARD?n[a]:e[a]}function p(o){return r(o)}export{n as IconSvgPaths16,e as IconSvgPaths20,I as getIconPaths,p as iconNameToPathsRecordKey};
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./allPaths-DcyFnTvZ.js","./index-Zx5rUdU4.js","./index-BrAe7gTM.js","./index-Dm4x3YrF.js","./index-62l0mIXD.css"])))=>i.map(i=>d[i]);
2
- import{_ as o,a as i,b as n}from"./index-Dm4x3YrF.js";var _=function(e,a){return o(void 0,void 0,void 0,function(){var t;return i(this,function(r){switch(r.label){case 0:return[4,n(()=>import("./allPaths-DcyFnTvZ.js"),__vite__mapDeps([0,1,2,3,4]),import.meta.url)];case 1:return t=r.sent().getIconPaths,[2,t(e,a)]}})})};export{_ as allPathsLoader};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./allPaths-C9RDB26n.js","./index-DLOviMB1.js","./index-B-fsa5Ru.js","./index-D9t4xczX.js","./index-CxjWve_y.css"])))=>i.map(i=>d[i]);
2
+ import{_ as o,a as i,b as n}from"./index-D9t4xczX.js";var _=function(e,a){return o(void 0,void 0,void 0,function(){var t;return i(this,function(r){switch(r.label){case 0:return[4,n(()=>import("./allPaths-C9RDB26n.js"),__vite__mapDeps([0,1,2,3,4]),import.meta.url)];case 1:return t=r.sent().getIconPaths,[2,t(e,a)]}})})};export{_ as allPathsLoader};