@osdk/widget.vite-plugin 3.3.0-beta.9 → 3.3.0-rc.12
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 +89 -0
- package/build/esm/build-plugin/__tests__/validateWidgetSet.test.js +44 -0
- package/build/esm/build-plugin/__tests__/validateWidgetSet.test.js.map +1 -0
- package/build/esm/build-plugin/buildWidgetSetManifest.js +2 -0
- package/build/esm/build-plugin/buildWidgetSetManifest.js.map +1 -1
- package/build/esm/build-plugin/validateWidgetSet.js +30 -0
- package/build/esm/build-plugin/validateWidgetSet.js.map +1 -0
- package/build/esm/common/__tests__/standardizePathAndFileExtension.test.js +77 -0
- package/build/esm/common/__tests__/standardizePathAndFileExtension.test.js.map +1 -0
- package/build/esm/common/{standardizeFileExtension.js → standardizePathAndFileExtension.js} +8 -5
- package/build/esm/common/standardizePathAndFileExtension.js.map +1 -0
- package/build/esm/dev-plugin/FoundryWidgetDevPlugin.js +18 -9
- package/build/esm/dev-plugin/FoundryWidgetDevPlugin.js.map +1 -1
- package/build/esm/dev-plugin/__tests__/validateDevEnvironment.test.js +66 -0
- package/build/esm/dev-plugin/__tests__/validateDevEnvironment.test.js.map +1 -0
- package/build/esm/dev-plugin/validateDevEnvironment.js +33 -0
- package/build/esm/dev-plugin/validateDevEnvironment.js.map +1 -0
- package/build/types/build-plugin/__tests__/validateWidgetSet.test.d.ts +1 -0
- package/build/types/build-plugin/__tests__/validateWidgetSet.test.d.ts.map +1 -0
- package/build/types/build-plugin/buildWidgetSetManifest.d.ts.map +1 -1
- package/build/types/build-plugin/validateWidgetSet.d.ts +2 -0
- package/build/types/build-plugin/validateWidgetSet.d.ts.map +1 -0
- package/build/types/common/__tests__/standardizePathAndFileExtension.test.d.ts +1 -0
- package/build/types/common/__tests__/standardizePathAndFileExtension.test.d.ts.map +1 -0
- package/build/types/common/{standardizeFileExtension.d.ts → standardizePathAndFileExtension.d.ts} +3 -1
- package/build/types/common/standardizePathAndFileExtension.d.ts.map +1 -0
- package/build/types/dev-plugin/FoundryWidgetDevPlugin.d.ts.map +1 -1
- package/build/types/dev-plugin/__tests__/validateDevEnvironment.test.d.ts +1 -0
- package/build/types/dev-plugin/__tests__/validateDevEnvironment.test.d.ts.map +1 -0
- package/build/types/dev-plugin/validateDevEnvironment.d.ts +2 -0
- package/build/types/dev-plugin/validateDevEnvironment.d.ts.map +1 -0
- package/package.json +5 -5
- package/build/esm/common/standardizeFileExtension.js.map +0 -1
- package/build/types/common/standardizeFileExtension.d.ts.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,39 @@
|
|
|
1
1
|
# @osdk/widget.vite-plugin
|
|
2
2
|
|
|
3
|
+
## 3.3.0-rc.12
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- af4f3bf: Remove the following features for RC:
|
|
8
|
+
- Property formatting
|
|
9
|
+
- Branching
|
|
10
|
+
- Constant RDPs
|
|
11
|
+
|
|
12
|
+
- Updated dependencies [baf1e30]
|
|
13
|
+
- Updated dependencies [af4f3bf]
|
|
14
|
+
- @osdk/widget.api@3.3.0-rc.12
|
|
15
|
+
- @osdk/foundry-config-json@1.5.0-rc.2
|
|
16
|
+
|
|
17
|
+
## 3.3.0-beta.11
|
|
18
|
+
|
|
19
|
+
### Minor Changes
|
|
20
|
+
|
|
21
|
+
- e6a96c0: Validate widget sets before building their manifest
|
|
22
|
+
- 5bd88fc: Fix InvalidDevModeFilePath errors
|
|
23
|
+
- 27f2122: warn when using wrong dev command
|
|
24
|
+
- e95637e: Fix Windows dev mode
|
|
25
|
+
- 953c649: Use Vite logger instead of console.warn in validateDevEnvironment
|
|
26
|
+
|
|
27
|
+
### Patch Changes
|
|
28
|
+
|
|
29
|
+
- @osdk/widget.api@3.3.0-beta.11
|
|
30
|
+
|
|
31
|
+
## 3.3.0-beta.10
|
|
32
|
+
|
|
33
|
+
### Patch Changes
|
|
34
|
+
|
|
35
|
+
- @osdk/widget.api@3.3.0-beta.10
|
|
36
|
+
|
|
3
37
|
## 3.3.0-beta.9
|
|
4
38
|
|
|
5
39
|
### Patch Changes
|
|
@@ -56,6 +90,61 @@
|
|
|
56
90
|
- Updated dependencies [4d37e98]
|
|
57
91
|
- @osdk/widget.api@3.3.0-beta.2
|
|
58
92
|
|
|
93
|
+
## 3.2.5
|
|
94
|
+
|
|
95
|
+
### Patch Changes
|
|
96
|
+
|
|
97
|
+
- 71f33ca: Validate widget sets before building their manifest
|
|
98
|
+
- 71f33ca: Fix InvalidDevModeFilePath errors
|
|
99
|
+
- 71f33ca: warn when using wrong dev command
|
|
100
|
+
- 71f33ca: Fix Windows dev mode
|
|
101
|
+
- 71f33ca: Use Vite logger instead of console.warn in validateDevEnvironment
|
|
102
|
+
- Updated dependencies [a2df5ba]
|
|
103
|
+
- @osdk/widget.api@3.2.5
|
|
104
|
+
|
|
105
|
+
## 3.2.4
|
|
106
|
+
|
|
107
|
+
### Patch Changes
|
|
108
|
+
|
|
109
|
+
- 3b43586: Support extension-less widget config import and improve reporting when config files not found
|
|
110
|
+
- 66896c7: Fix widget dev mode with tailwind causing project imports
|
|
111
|
+
- 3d7cb29: Propagate validation error cause in message for widget config validation
|
|
112
|
+
- @osdk/widget.api@3.2.4
|
|
113
|
+
|
|
114
|
+
## 3.2.3
|
|
115
|
+
|
|
116
|
+
### Patch Changes
|
|
117
|
+
|
|
118
|
+
- @osdk/widget.api@3.2.3
|
|
119
|
+
|
|
120
|
+
## 3.2.2
|
|
121
|
+
|
|
122
|
+
### Patch Changes
|
|
123
|
+
|
|
124
|
+
- f372662: improve dev mode error surfacing
|
|
125
|
+
- @osdk/widget.api@3.2.2
|
|
126
|
+
|
|
127
|
+
## 3.2.1
|
|
128
|
+
|
|
129
|
+
### Patch Changes
|
|
130
|
+
|
|
131
|
+
- Updated dependencies [77475e6]
|
|
132
|
+
- @osdk/widget.api@3.2.1
|
|
133
|
+
|
|
134
|
+
## 3.2.0
|
|
135
|
+
|
|
136
|
+
### Patch Changes
|
|
137
|
+
|
|
138
|
+
- 7901ae0: Simulated release
|
|
139
|
+
- 2b73c3c: Fix @osdk/widget.vite-plugin dependency on resolve-package-path in devDependencies rather than dependencies
|
|
140
|
+
- 71fc408: Validate camelCase for widget/parameter IDs
|
|
141
|
+
- 34df269: Fix widgets dev mode on Windows
|
|
142
|
+
- Updated dependencies [322c5bc]
|
|
143
|
+
- Updated dependencies [7901ae0]
|
|
144
|
+
- Updated dependencies [a6f49e9]
|
|
145
|
+
- @osdk/foundry-config-json@1.4.0
|
|
146
|
+
- @osdk/widget.api@3.2.0
|
|
147
|
+
|
|
59
148
|
## 3.2.0-beta.5
|
|
60
149
|
|
|
61
150
|
### Patch Changes
|
|
@@ -0,0 +1,44 @@
|
|
|
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, it } from "vitest";
|
|
18
|
+
import { validateWidgetSet } from "../validateWidgetSet.js";
|
|
19
|
+
describe("validateWidgetSet", () => {
|
|
20
|
+
describe("validateWidgetIds", () => {
|
|
21
|
+
it("should not throw when all widget IDs are unique", () => {
|
|
22
|
+
const widgetBuilds = [createWidgetBuild("widget1"), createWidgetBuild("widget2"), createWidgetBuild("widget3")];
|
|
23
|
+
expect(() => validateWidgetSet(widgetBuilds)).not.toThrow();
|
|
24
|
+
});
|
|
25
|
+
it("should throw when duplicate widget IDs are found", () => {
|
|
26
|
+
const widgetBuilds = [createWidgetBuild("widget1"), createWidgetBuild("widget2"), createWidgetBuild("widget1")];
|
|
27
|
+
expect(() => validateWidgetSet(widgetBuilds)).toThrow("Duplicate widget ID: widget1. Each widget must have a unique ID.");
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
function createWidgetBuild(id) {
|
|
32
|
+
return {
|
|
33
|
+
widgetConfig: {
|
|
34
|
+
id,
|
|
35
|
+
name: `Widget ${id}`,
|
|
36
|
+
type: "workshop",
|
|
37
|
+
parameters: {},
|
|
38
|
+
events: {}
|
|
39
|
+
},
|
|
40
|
+
scripts: [],
|
|
41
|
+
stylesheets: []
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=validateWidgetSet.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateWidgetSet.test.js","names":["describe","expect","it","validateWidgetSet","widgetBuilds","createWidgetBuild","not","toThrow","id","widgetConfig","name","type","parameters","events","scripts","stylesheets"],"sources":["validateWidgetSet.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 { describe, expect, it } from \"vitest\";\nimport type { WidgetBuildOutputs } from \"../getWidgetBuildOutputs.js\";\nimport { validateWidgetSet } from \"../validateWidgetSet.js\";\n\ndescribe(\"validateWidgetSet\", () => {\n describe(\"validateWidgetIds\", () => {\n it(\"should not throw when all widget IDs are unique\", () => {\n const widgetBuilds: WidgetBuildOutputs[] = [\n createWidgetBuild(\"widget1\"),\n createWidgetBuild(\"widget2\"),\n createWidgetBuild(\"widget3\"),\n ];\n\n expect(() => validateWidgetSet(widgetBuilds)).not.toThrow();\n });\n\n it(\"should throw when duplicate widget IDs are found\", () => {\n const widgetBuilds: WidgetBuildOutputs[] = [\n createWidgetBuild(\"widget1\"),\n createWidgetBuild(\"widget2\"),\n createWidgetBuild(\"widget1\"),\n ];\n\n expect(() => validateWidgetSet(widgetBuilds)).toThrow(\n \"Duplicate widget ID: widget1. Each widget must have a unique ID.\",\n );\n });\n });\n});\n\nfunction createWidgetBuild(id: string): WidgetBuildOutputs {\n return {\n widgetConfig: {\n id,\n name: `Widget ${id}`,\n type: \"workshop\",\n parameters: {},\n events: {},\n },\n scripts: [],\n stylesheets: [],\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAE7C,SAASC,iBAAiB,QAAQ,yBAAyB;AAE3DH,QAAQ,CAAC,mBAAmB,EAAE,MAAM;EAClCA,QAAQ,CAAC,mBAAmB,EAAE,MAAM;IAClCE,EAAE,CAAC,iDAAiD,EAAE,MAAM;MAC1D,MAAME,YAAkC,GAAG,CACzCC,iBAAiB,CAAC,SAAS,CAAC,EAC5BA,iBAAiB,CAAC,SAAS,CAAC,EAC5BA,iBAAiB,CAAC,SAAS,CAAC,CAC7B;MAEDJ,MAAM,CAAC,MAAME,iBAAiB,CAACC,YAAY,CAAC,CAAC,CAACE,GAAG,CAACC,OAAO,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEFL,EAAE,CAAC,kDAAkD,EAAE,MAAM;MAC3D,MAAME,YAAkC,GAAG,CACzCC,iBAAiB,CAAC,SAAS,CAAC,EAC5BA,iBAAiB,CAAC,SAAS,CAAC,EAC5BA,iBAAiB,CAAC,SAAS,CAAC,CAC7B;MAEDJ,MAAM,CAAC,MAAME,iBAAiB,CAACC,YAAY,CAAC,CAAC,CAACG,OAAO,CACnD,kEACF,CAAC;IACH,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,SAASF,iBAAiBA,CAACG,EAAU,EAAsB;EACzD,OAAO;IACLC,YAAY,EAAE;MACZD,EAAE;MACFE,IAAI,EAAE,UAAUF,EAAE,EAAE;MACpBG,IAAI,EAAE,UAAU;MAChBC,UAAU,EAAE,CAAC,CAAC;MACdC,MAAM,EAAE,CAAC;IACX,CAAC;IACDC,OAAO,EAAE,EAAE;IACXC,WAAW,EAAE;EACf,CAAC;AACH","ignoreList":[]}
|
|
@@ -14,7 +14,9 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
import { validateWidgetSet } from "./validateWidgetSet.js";
|
|
17
18
|
export function buildWidgetSetManifest(widgetSetRid, widgetSetVersion, widgetBuilds, widgetSetInputSpec) {
|
|
19
|
+
validateWidgetSet(widgetBuilds);
|
|
18
20
|
return {
|
|
19
21
|
manifestVersion: "1.0.0",
|
|
20
22
|
widgetSet: {
|
|
@@ -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","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;;
|
|
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":[]}
|
|
@@ -0,0 +1,30 @@
|
|
|
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
|
+
export function validateWidgetSet(widgetBuilds) {
|
|
18
|
+
validateWidgetIds(widgetBuilds);
|
|
19
|
+
}
|
|
20
|
+
function validateWidgetIds(widgetBuilds) {
|
|
21
|
+
const widgetIds = new Set();
|
|
22
|
+
for (const widgetBuild of widgetBuilds) {
|
|
23
|
+
const widgetConfigId = widgetBuild.widgetConfig.id;
|
|
24
|
+
if (widgetIds.has(widgetConfigId)) {
|
|
25
|
+
throw new Error(`Duplicate widget ID: ${widgetConfigId}. Each widget must have a unique ID.`);
|
|
26
|
+
}
|
|
27
|
+
widgetIds.add(widgetConfigId);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=validateWidgetSet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateWidgetSet.js","names":["validateWidgetSet","widgetBuilds","validateWidgetIds","widgetIds","Set","widgetBuild","widgetConfigId","widgetConfig","id","has","Error","add"],"sources":["validateWidgetSet.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 { WidgetBuildOutputs } from \"./getWidgetBuildOutputs.js\";\n\nexport function validateWidgetSet(widgetBuilds: WidgetBuildOutputs[]): void {\n validateWidgetIds(widgetBuilds);\n}\n\nfunction validateWidgetIds(widgetBuilds: WidgetBuildOutputs[]): void {\n const widgetIds = new Set<string>();\n for (const widgetBuild of widgetBuilds) {\n const widgetConfigId = widgetBuild.widgetConfig.id;\n if (widgetIds.has(widgetConfigId)) {\n throw new Error(\n `Duplicate widget ID: ${widgetConfigId}. Each widget must have a unique ID.`,\n );\n }\n widgetIds.add(widgetConfigId);\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,OAAO,SAASA,iBAAiBA,CAACC,YAAkC,EAAQ;EAC1EC,iBAAiB,CAACD,YAAY,CAAC;AACjC;AAEA,SAASC,iBAAiBA,CAACD,YAAkC,EAAQ;EACnE,MAAME,SAAS,GAAG,IAAIC,GAAG,CAAS,CAAC;EACnC,KAAK,MAAMC,WAAW,IAAIJ,YAAY,EAAE;IACtC,MAAMK,cAAc,GAAGD,WAAW,CAACE,YAAY,CAACC,EAAE;IAClD,IAAIL,SAAS,CAACM,GAAG,CAACH,cAAc,CAAC,EAAE;MACjC,MAAM,IAAII,KAAK,CACb,wBAAwBJ,cAAc,sCACxC,CAAC;IACH;IACAH,SAAS,CAACQ,GAAG,CAACL,cAAc,CAAC;EAC/B;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,77 @@
|
|
|
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, it } from "vitest";
|
|
18
|
+
import { standardizePathAndFileExtension } from "../standardizePathAndFileExtension.js";
|
|
19
|
+
describe("standardizePathAndFileExtension", () => {
|
|
20
|
+
describe("file extension standardization", () => {
|
|
21
|
+
it("should replace .ts extension with .js", () => {
|
|
22
|
+
expect(standardizePathAndFileExtension("/path/to/file.ts")).toBe("/path/to/file.js");
|
|
23
|
+
});
|
|
24
|
+
it("should replace .tsx extension with .js", () => {
|
|
25
|
+
expect(standardizePathAndFileExtension("/path/to/component.tsx")).toBe("/path/to/component.js");
|
|
26
|
+
});
|
|
27
|
+
it("should replace .jsx extension with .js", () => {
|
|
28
|
+
expect(standardizePathAndFileExtension("/path/to/component.jsx")).toBe("/path/to/component.js");
|
|
29
|
+
});
|
|
30
|
+
it("should keep .js extension as is", () => {
|
|
31
|
+
expect(standardizePathAndFileExtension("/path/to/file.js")).toBe("/path/to/file.js");
|
|
32
|
+
});
|
|
33
|
+
it("should append .js to config files", () => {
|
|
34
|
+
expect(standardizePathAndFileExtension("/path/to/widget.config")).toBe("/path/to/widget.config.js");
|
|
35
|
+
});
|
|
36
|
+
it("should handle files without extensions", () => {
|
|
37
|
+
expect(standardizePathAndFileExtension("/path/to/file")).toBe("/path/to/file");
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe("path normalization", () => {
|
|
41
|
+
it("should normalize Windows paths with backslashes to forward slashes", () => {
|
|
42
|
+
expect(standardizePathAndFileExtension("C:\\Users\\project\\src\\file.ts")).toBe("C:/Users/project/src/file.js");
|
|
43
|
+
});
|
|
44
|
+
it("should normalize Windows paths with mixed separators", () => {
|
|
45
|
+
expect(standardizePathAndFileExtension("C:\\Users/project\\src/file.tsx")).toBe("C:/Users/project/src/file.js");
|
|
46
|
+
});
|
|
47
|
+
it("should preserve paths that already use forward slashes", () => {
|
|
48
|
+
expect(standardizePathAndFileExtension("/Users/project/src/file.ts")).toBe("/Users/project/src/file.js");
|
|
49
|
+
});
|
|
50
|
+
it("should handle Windows config file paths", () => {
|
|
51
|
+
expect(standardizePathAndFileExtension("D:\\workspace\\widgets\\my-widget.config")).toBe("D:/workspace/widgets/my-widget.config.js");
|
|
52
|
+
});
|
|
53
|
+
it("should handle Windows paths without file extensions", () => {
|
|
54
|
+
expect(standardizePathAndFileExtension("C:\\Users\\project\\README")).toBe("C:/Users/project/README");
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe("edge cases", () => {
|
|
58
|
+
it("should handle empty string", () => {
|
|
59
|
+
expect(standardizePathAndFileExtension("")).toBe("");
|
|
60
|
+
});
|
|
61
|
+
it("should handle paths with multiple dots", () => {
|
|
62
|
+
expect(standardizePathAndFileExtension("/path/to/file.test.ts")).toBe("/path/to/file.test.js");
|
|
63
|
+
});
|
|
64
|
+
it("should handle Windows paths with multiple dots", () => {
|
|
65
|
+
expect(standardizePathAndFileExtension("C:\\path\\to\\file.test.tsx")).toBe("C:/path/to/file.test.js");
|
|
66
|
+
});
|
|
67
|
+
it("should handle virtual paths with @fs prefix", () => {
|
|
68
|
+
expect(standardizePathAndFileExtension("/@fs/C:\\Users\\project\\src\\file.ts")).toBe("/@fs/C:/Users/project/src/file.js");
|
|
69
|
+
});
|
|
70
|
+
it("should handle paths with /src/ directory for Windows", () => {
|
|
71
|
+
const result = standardizePathAndFileExtension("C:\\projects\\my-app\\src\\components\\Widget.tsx");
|
|
72
|
+
expect(result).toBe("C:/projects/my-app/src/components/Widget.js");
|
|
73
|
+
expect(result.includes("/src/")).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=standardizePathAndFileExtension.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standardizePathAndFileExtension.test.js","names":["describe","expect","it","standardizePathAndFileExtension","toBe","result","includes"],"sources":["standardizePathAndFileExtension.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 { describe, expect, it } from \"vitest\";\nimport { standardizePathAndFileExtension } from \"../standardizePathAndFileExtension.js\";\n\ndescribe(\"standardizePathAndFileExtension\", () => {\n describe(\"file extension standardization\", () => {\n it(\"should replace .ts extension with .js\", () => {\n expect(standardizePathAndFileExtension(\"/path/to/file.ts\")).toBe(\n \"/path/to/file.js\",\n );\n });\n\n it(\"should replace .tsx extension with .js\", () => {\n expect(standardizePathAndFileExtension(\"/path/to/component.tsx\")).toBe(\n \"/path/to/component.js\",\n );\n });\n\n it(\"should replace .jsx extension with .js\", () => {\n expect(standardizePathAndFileExtension(\"/path/to/component.jsx\")).toBe(\n \"/path/to/component.js\",\n );\n });\n\n it(\"should keep .js extension as is\", () => {\n expect(standardizePathAndFileExtension(\"/path/to/file.js\")).toBe(\n \"/path/to/file.js\",\n );\n });\n\n it(\"should append .js to config files\", () => {\n expect(standardizePathAndFileExtension(\"/path/to/widget.config\")).toBe(\n \"/path/to/widget.config.js\",\n );\n });\n\n it(\"should handle files without extensions\", () => {\n expect(standardizePathAndFileExtension(\"/path/to/file\")).toBe(\n \"/path/to/file\",\n );\n });\n });\n\n describe(\"path normalization\", () => {\n it(\"should normalize Windows paths with backslashes to forward slashes\", () => {\n expect(\n standardizePathAndFileExtension(\"C:\\\\Users\\\\project\\\\src\\\\file.ts\"),\n ).toBe(\"C:/Users/project/src/file.js\");\n });\n\n it(\"should normalize Windows paths with mixed separators\", () => {\n expect(standardizePathAndFileExtension(\"C:\\\\Users/project\\\\src/file.tsx\"))\n .toBe(\"C:/Users/project/src/file.js\");\n });\n\n it(\"should preserve paths that already use forward slashes\", () => {\n expect(standardizePathAndFileExtension(\"/Users/project/src/file.ts\"))\n .toBe(\"/Users/project/src/file.js\");\n });\n\n it(\"should handle Windows config file paths\", () => {\n expect(\n standardizePathAndFileExtension(\n \"D:\\\\workspace\\\\widgets\\\\my-widget.config\",\n ),\n ).toBe(\"D:/workspace/widgets/my-widget.config.js\");\n });\n\n it(\"should handle Windows paths without file extensions\", () => {\n expect(standardizePathAndFileExtension(\"C:\\\\Users\\\\project\\\\README\"))\n .toBe(\"C:/Users/project/README\");\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle empty string\", () => {\n expect(standardizePathAndFileExtension(\"\")).toBe(\"\");\n });\n\n it(\"should handle paths with multiple dots\", () => {\n expect(standardizePathAndFileExtension(\"/path/to/file.test.ts\")).toBe(\n \"/path/to/file.test.js\",\n );\n });\n\n it(\"should handle Windows paths with multiple dots\", () => {\n expect(standardizePathAndFileExtension(\"C:\\\\path\\\\to\\\\file.test.tsx\"))\n .toBe(\"C:/path/to/file.test.js\");\n });\n\n it(\"should handle virtual paths with @fs prefix\", () => {\n expect(\n standardizePathAndFileExtension(\n \"/@fs/C:\\\\Users\\\\project\\\\src\\\\file.ts\",\n ),\n ).toBe(\"/@fs/C:/Users/project/src/file.js\");\n });\n\n it(\"should handle paths with /src/ directory for Windows\", () => {\n const windowsPath = \"C:\\\\projects\\\\my-app\\\\src\\\\components\\\\Widget.tsx\";\n const result = standardizePathAndFileExtension(windowsPath);\n expect(result).toBe(\"C:/projects/my-app/src/components/Widget.js\");\n expect(result.includes(\"/src/\")).toBe(true);\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -21,11 +21,14 @@ import { CONFIG_FILE_SUFFIX } from "./constants.js";
|
|
|
21
21
|
* `.jsx` file on disk. This standardizes these file extension to `.js` so that we can match imports
|
|
22
22
|
* to source files. Additionally, extension-less imports may be used depending on the module
|
|
23
23
|
* resolution setting so we append `.js` to config file imports to standardize those as well.
|
|
24
|
+
*
|
|
25
|
+
* Additionally, replaces Windows-style backslashes with forward slashes for path consistency.
|
|
24
26
|
*/
|
|
25
|
-
export function
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
export function standardizePathAndFileExtension(file) {
|
|
28
|
+
const normalizedPath = file.replace(/\\/g, "/");
|
|
29
|
+
if (normalizedPath.endsWith(CONFIG_FILE_SUFFIX)) {
|
|
30
|
+
return normalizedPath + ".js";
|
|
28
31
|
}
|
|
29
|
-
return
|
|
32
|
+
return normalizedPath.replace(/\.[jt]sx?$/, ".js");
|
|
30
33
|
}
|
|
31
|
-
//# sourceMappingURL=
|
|
34
|
+
//# sourceMappingURL=standardizePathAndFileExtension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standardizePathAndFileExtension.js","names":["CONFIG_FILE_SUFFIX","standardizePathAndFileExtension","file","normalizedPath","replace","endsWith"],"sources":["standardizePathAndFileExtension.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 { CONFIG_FILE_SUFFIX } from \"./constants.js\";\n\n/**\n * Users may import `.js` files in their code, where the source file is actually a `.ts`, `.tsx`, or\n * `.jsx` file on disk. This standardizes these file extension to `.js` so that we can match imports\n * to source files. Additionally, extension-less imports may be used depending on the module\n * resolution setting so we append `.js` to config file imports to standardize those as well.\n *\n * Additionally, replaces Windows-style backslashes with forward slashes for path consistency.\n */\nexport function standardizePathAndFileExtension(file: string): string {\n const normalizedPath = file.replace(/\\\\/g, \"/\");\n if (normalizedPath.endsWith(CONFIG_FILE_SUFFIX)) {\n return normalizedPath + \".js\";\n }\n return normalizedPath.replace(/\\.[jt]sx?$/, \".js\");\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,kBAAkB,QAAQ,gBAAgB;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,+BAA+BA,CAACC,IAAY,EAAU;EACpE,MAAMC,cAAc,GAAGD,IAAI,CAACE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;EAC/C,IAAID,cAAc,CAACE,QAAQ,CAACL,kBAAkB,CAAC,EAAE;IAC/C,OAAOG,cAAc,GAAG,KAAK;EAC/B;EACA,OAAOA,cAAc,CAACC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC;AACpD","ignoreList":[]}
|
|
@@ -20,12 +20,14 @@ import color from "picocolors";
|
|
|
20
20
|
import sirv from "sirv";
|
|
21
21
|
import { CONFIG_FILE_SUFFIX, DEV_PLUGIN_ID, ENTRYPOINTS_PATH, FINISH_PATH, MODULE_EVALUATION_MODE, SETUP_PATH, VITE_INJECTIONS_PATH } from "../common/constants.js";
|
|
22
22
|
import { getInputHtmlEntrypoints } from "../common/getInputHtmlEntrypoints.js";
|
|
23
|
-
import {
|
|
23
|
+
import { standardizePathAndFileExtension } from "../common/standardizePathAndFileExtension.js";
|
|
24
|
+
import { isCodeWorkspacesMode } from "./codeWorkspacesMode.js";
|
|
24
25
|
import { extractInjectedScripts } from "./extractInjectedScripts.js";
|
|
25
26
|
import { getBaseHref } from "./getBaseHref.js";
|
|
26
27
|
import { getFoundryToken } from "./getFoundryToken.js";
|
|
27
28
|
import { getWidgetIdOverrideMap } from "./getWidgetIdOverrideMap.js";
|
|
28
29
|
import { publishDevModeSettings } from "./publishDevModeSettings.js";
|
|
30
|
+
import { warnIfWrongDevCommand } from "./validateDevEnvironment.js";
|
|
29
31
|
|
|
30
32
|
// Location of the setup page assets
|
|
31
33
|
const DIR_DIST = typeof __dirname !== "undefined" ? __dirname : path.dirname(fileURLToPath(import.meta.url));
|
|
@@ -58,7 +60,8 @@ export function FoundryWidgetDevPlugin() {
|
|
|
58
60
|
/**
|
|
59
61
|
* Check for the required token environment variable in dev mode.
|
|
60
62
|
*/
|
|
61
|
-
|
|
63
|
+
configResolved(resolvedConfig) {
|
|
64
|
+
warnIfWrongDevCommand(resolvedConfig.mode, resolvedConfig.logger);
|
|
62
65
|
getFoundryToken(resolvedConfig.mode);
|
|
63
66
|
},
|
|
64
67
|
/**
|
|
@@ -163,15 +166,17 @@ export function FoundryWidgetDevPlugin() {
|
|
|
163
166
|
}
|
|
164
167
|
|
|
165
168
|
// Standardize the source file extension and get the full path
|
|
166
|
-
const standardizedSource =
|
|
169
|
+
const standardizedSource = standardizePathAndFileExtension(getFullSourcePath(
|
|
167
170
|
// If the source path is absolute, resolve it against the current working directory
|
|
168
171
|
source.startsWith("/") ? path.join(process.cwd(), source) : source, importer));
|
|
169
172
|
// Importers are already full paths, so just standardize the extension
|
|
170
|
-
|
|
171
|
-
const standardizedImporter = standardizeFileExtension(path.normalize(importer));
|
|
173
|
+
const standardizedImporter = standardizePathAndFileExtension(importer);
|
|
172
174
|
|
|
173
175
|
// In dev mode all entrypoints have a generic HTML importer value
|
|
174
|
-
if (importer.endsWith("index.html") && !standardizedSource.includes("@fs")
|
|
176
|
+
if (importer.endsWith("index.html") && !standardizedSource.includes("@fs")
|
|
177
|
+
// In a cold start, Vite may try to resolve files (e.g. a widget.html) before the user even accesses the dev mode server.
|
|
178
|
+
// These files are not valid code entrypoints, so we ignore them here.
|
|
179
|
+
&& path.extname(standardizedSource) !== ".html") {
|
|
175
180
|
// Store the fully resolved path and the relative path, as we need the former for mapping
|
|
176
181
|
// config files to entrypoints and the latter as a dev mode override script
|
|
177
182
|
codeEntrypoints[standardizedSource] = source;
|
|
@@ -181,7 +186,7 @@ export function FoundryWidgetDevPlugin() {
|
|
|
181
186
|
// Also check the config file being imported is in src to avoid picking up imports for other
|
|
182
187
|
// project files like foundry.config.json / eslint.config.mjs when tailwind is used.
|
|
183
188
|
if (standardizedSource.replace(/\.[^/.]+$/, "").endsWith(CONFIG_FILE_SUFFIX) && standardizedSource.includes("/src/") && codeEntrypoints[standardizedImporter] != null) {
|
|
184
|
-
const fullSourcePath =
|
|
189
|
+
const fullSourcePath = standardizePathAndFileExtension(getFullSourcePath(source, standardizedImporter));
|
|
185
190
|
configFileToEntrypoint[fullSourcePath] = standardizedImporter;
|
|
186
191
|
}
|
|
187
192
|
}
|
|
@@ -199,7 +204,11 @@ function serverPath(server, subPath) {
|
|
|
199
204
|
return path.posix.resolve(server.config.base, subPath);
|
|
200
205
|
}
|
|
201
206
|
function printSetupPageUrl(server) {
|
|
202
|
-
|
|
203
|
-
|
|
207
|
+
if (isCodeWorkspacesMode(server.config.mode)) {
|
|
208
|
+
server.config.logger.info(` ${color.green("➜")} ${color.bold("Select a widget from the preview panel to enter developer mode")}`);
|
|
209
|
+
} else {
|
|
210
|
+
const setupRoute = `${getBaseHref(server)}${SETUP_PATH}/`;
|
|
211
|
+
server.config.logger.info(` ${color.green("➜")} ${color.bold("Click to enter developer mode for your widget set")}: ${color.green(setupRoute)}`);
|
|
212
|
+
}
|
|
204
213
|
}
|
|
205
214
|
//# sourceMappingURL=FoundryWidgetDevPlugin.js.map
|
|
@@ -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","Error","URL","headers","host","numAttempts","parseInt","searchParams","get","errorMessage","logger","error","status","numEntrypoints","length","numConfigFiles","Object","keys","info","widgetIdToOverrides","injectedScripts","inlineScripts","join","resolveId","source","importer","standardizedSource","getFullSourcePath","startsWith","cwd","standardizedImporter","normalize","includes","replace","fullSourcePath","subPath","posix","base","setupRoute","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 (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 = 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 // 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 = 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
|
+
{"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":[]}
|
|
@@ -0,0 +1,66 @@
|
|
|
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 { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
|
|
18
|
+
import * as validateDevEnvironment from "../validateDevEnvironment.js";
|
|
19
|
+
function createMockLogger() {
|
|
20
|
+
return {
|
|
21
|
+
info: vi.fn(),
|
|
22
|
+
warn: vi.fn(),
|
|
23
|
+
warnOnce: vi.fn(),
|
|
24
|
+
error: vi.fn(),
|
|
25
|
+
clearScreen: vi.fn(),
|
|
26
|
+
hasErrorLogged: vi.fn(),
|
|
27
|
+
hasWarned: false
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
describe("validateDevEnvironment", () => {
|
|
31
|
+
beforeEach(() => {
|
|
32
|
+
vi.restoreAllMocks();
|
|
33
|
+
});
|
|
34
|
+
afterEach(() => {
|
|
35
|
+
vi.unstubAllEnvs();
|
|
36
|
+
});
|
|
37
|
+
describe("warnIfWrongDevCommand", () => {
|
|
38
|
+
test("warns when in Code Workspaces env but not using code-workspaces mode", () => {
|
|
39
|
+
vi.stubEnv("FOUNDRY_CONTAINER_RUNTIME_TYPE", "CODE_WORKSPACE");
|
|
40
|
+
const mockLogger = createMockLogger();
|
|
41
|
+
validateDevEnvironment.warnIfWrongDevCommand("development", mockLogger);
|
|
42
|
+
expect(mockLogger.warn).toHaveBeenCalledTimes(1);
|
|
43
|
+
expect(mockLogger.warn).toHaveBeenCalledWith(expect.stringContaining(`You should probably be using "npm run dev:remote" instead`));
|
|
44
|
+
});
|
|
45
|
+
test("warns when using code-workspaces mode but not in Code Workspaces env", () => {
|
|
46
|
+
vi.stubEnv("FOUNDRY_CONTAINER_RUNTIME_TYPE", undefined);
|
|
47
|
+
const mockLogger = createMockLogger();
|
|
48
|
+
validateDevEnvironment.warnIfWrongDevCommand("code-workspaces", mockLogger);
|
|
49
|
+
expect(mockLogger.warn).toHaveBeenCalledTimes(1);
|
|
50
|
+
expect(mockLogger.warn).toHaveBeenCalledWith(expect.stringContaining(`You should probably be using "npm run dev" instead`));
|
|
51
|
+
});
|
|
52
|
+
test("does not warn when in Code Workspaces env and using code-workspaces mode", () => {
|
|
53
|
+
vi.stubEnv("FOUNDRY_CONTAINER_RUNTIME_TYPE", "CODE_WORKSPACE");
|
|
54
|
+
const mockLogger = createMockLogger();
|
|
55
|
+
validateDevEnvironment.warnIfWrongDevCommand("code-workspaces", mockLogger);
|
|
56
|
+
expect(mockLogger.warn).not.toHaveBeenCalled();
|
|
57
|
+
});
|
|
58
|
+
test("does not warn when not in Code Workspaces env and not using code-workspaces mode", () => {
|
|
59
|
+
vi.stubEnv("FOUNDRY_CONTAINER_RUNTIME_TYPE", undefined);
|
|
60
|
+
const mockLogger = createMockLogger();
|
|
61
|
+
validateDevEnvironment.warnIfWrongDevCommand("development", mockLogger);
|
|
62
|
+
expect(mockLogger.warn).not.toHaveBeenCalled();
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=validateDevEnvironment.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateDevEnvironment.test.js","names":["afterEach","beforeEach","describe","expect","test","vi","validateDevEnvironment","createMockLogger","info","fn","warn","warnOnce","error","clearScreen","hasErrorLogged","hasWarned","restoreAllMocks","unstubAllEnvs","stubEnv","mockLogger","warnIfWrongDevCommand","toHaveBeenCalledTimes","toHaveBeenCalledWith","stringContaining","undefined","not","toHaveBeenCalled"],"sources":["validateDevEnvironment.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 { Logger } from \"vite\";\nimport { afterEach, beforeEach, describe, expect, test, vi } from \"vitest\";\nimport * as validateDevEnvironment from \"../validateDevEnvironment.js\";\n\nfunction createMockLogger(): Logger {\n return {\n info: vi.fn(),\n warn: vi.fn(),\n warnOnce: vi.fn(),\n error: vi.fn(),\n clearScreen: vi.fn(),\n hasErrorLogged: vi.fn(),\n hasWarned: false,\n };\n}\n\ndescribe(\"validateDevEnvironment\", () => {\n beforeEach(() => {\n vi.restoreAllMocks();\n });\n\n afterEach(() => {\n vi.unstubAllEnvs();\n });\n\n describe(\"warnIfWrongDevCommand\", () => {\n test(\"warns when in Code Workspaces env but not using code-workspaces mode\", () => {\n vi.stubEnv(\"FOUNDRY_CONTAINER_RUNTIME_TYPE\", \"CODE_WORKSPACE\");\n const mockLogger = createMockLogger();\n\n validateDevEnvironment.warnIfWrongDevCommand(\"development\", mockLogger);\n\n expect(mockLogger.warn).toHaveBeenCalledTimes(1);\n expect(mockLogger.warn).toHaveBeenCalledWith(\n expect.stringContaining(\n `You should probably be using \"npm run dev:remote\" instead`,\n ),\n );\n });\n\n test(\"warns when using code-workspaces mode but not in Code Workspaces env\", () => {\n vi.stubEnv(\"FOUNDRY_CONTAINER_RUNTIME_TYPE\", undefined);\n const mockLogger = createMockLogger();\n\n validateDevEnvironment.warnIfWrongDevCommand(\n \"code-workspaces\",\n mockLogger,\n );\n\n expect(mockLogger.warn).toHaveBeenCalledTimes(1);\n expect(mockLogger.warn).toHaveBeenCalledWith(\n expect.stringContaining(\n `You should probably be using \"npm run dev\" instead`,\n ),\n );\n });\n\n test(\"does not warn when in Code Workspaces env and using code-workspaces mode\", () => {\n vi.stubEnv(\"FOUNDRY_CONTAINER_RUNTIME_TYPE\", \"CODE_WORKSPACE\");\n const mockLogger = createMockLogger();\n\n validateDevEnvironment.warnIfWrongDevCommand(\n \"code-workspaces\",\n mockLogger,\n );\n\n expect(mockLogger.warn).not.toHaveBeenCalled();\n });\n\n test(\"does not warn when not in Code Workspaces env and not using code-workspaces mode\", () => {\n vi.stubEnv(\"FOUNDRY_CONTAINER_RUNTIME_TYPE\", undefined);\n const mockLogger = createMockLogger();\n\n validateDevEnvironment.warnIfWrongDevCommand(\"development\", mockLogger);\n\n expect(mockLogger.warn).not.toHaveBeenCalled();\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
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 color from "picocolors";
|
|
18
|
+
import { isCodeWorkspacesMode } from "./codeWorkspacesMode.js";
|
|
19
|
+
const FOUNDRY_CONTAINER_RUNTIME_TYPE = "FOUNDRY_CONTAINER_RUNTIME_TYPE";
|
|
20
|
+
const CODE_WORKSPACE_RUNTIME = "CODE_WORKSPACE";
|
|
21
|
+
export function warnIfWrongDevCommand(mode, logger) {
|
|
22
|
+
const isInCodeWorkspacesEnv = isCodeWorkspacesEnvironment();
|
|
23
|
+
const isUsingCodeWorkspacesMode = isCodeWorkspacesMode(mode);
|
|
24
|
+
if (isInCodeWorkspacesEnv && !isUsingCodeWorkspacesMode) {
|
|
25
|
+
logger.warn(color.yellow(`\n⚠️ You appear to be running in a Code Workspaces environment but are using "npm run dev".\n` + ` You should probably be using "npm run dev:remote" instead.\n`));
|
|
26
|
+
} else if (!isInCodeWorkspacesEnv && isUsingCodeWorkspacesMode) {
|
|
27
|
+
logger.warn(color.yellow(`\n⚠️ You are using "npm run dev:remote" but do not appear to be in a Code Workspaces environment.\n` + ` You should probably be using "npm run dev" instead.\n`));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function isCodeWorkspacesEnvironment() {
|
|
31
|
+
return process.env[FOUNDRY_CONTAINER_RUNTIME_TYPE] === CODE_WORKSPACE_RUNTIME;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=validateDevEnvironment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateDevEnvironment.js","names":["color","isCodeWorkspacesMode","FOUNDRY_CONTAINER_RUNTIME_TYPE","CODE_WORKSPACE_RUNTIME","warnIfWrongDevCommand","mode","logger","isInCodeWorkspacesEnv","isCodeWorkspacesEnvironment","isUsingCodeWorkspacesMode","warn","yellow","process","env"],"sources":["validateDevEnvironment.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 color from \"picocolors\";\nimport type { Logger } from \"vite\";\nimport { isCodeWorkspacesMode } from \"./codeWorkspacesMode.js\";\n\nconst FOUNDRY_CONTAINER_RUNTIME_TYPE = \"FOUNDRY_CONTAINER_RUNTIME_TYPE\";\nconst CODE_WORKSPACE_RUNTIME = \"CODE_WORKSPACE\";\n\nexport function warnIfWrongDevCommand(\n mode: string | undefined,\n logger: Logger,\n): void {\n const isInCodeWorkspacesEnv = isCodeWorkspacesEnvironment();\n const isUsingCodeWorkspacesMode = isCodeWorkspacesMode(mode);\n\n if (isInCodeWorkspacesEnv && !isUsingCodeWorkspacesMode) {\n logger.warn(\n color.yellow(\n `\\n⚠️ You appear to be running in a Code Workspaces environment but are using \"npm run dev\".\\n`\n + ` You should probably be using \"npm run dev:remote\" instead.\\n`,\n ),\n );\n } else if (!isInCodeWorkspacesEnv && isUsingCodeWorkspacesMode) {\n logger.warn(\n color.yellow(\n `\\n⚠️ You are using \"npm run dev:remote\" but do not appear to be in a Code Workspaces environment.\\n`\n + ` You should probably be using \"npm run dev\" instead.\\n`,\n ),\n );\n }\n}\n\nfunction isCodeWorkspacesEnvironment(): boolean {\n return process.env[FOUNDRY_CONTAINER_RUNTIME_TYPE] === CODE_WORKSPACE_RUNTIME;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,KAAK,MAAM,YAAY;AAE9B,SAASC,oBAAoB,QAAQ,yBAAyB;AAE9D,MAAMC,8BAA8B,GAAG,gCAAgC;AACvE,MAAMC,sBAAsB,GAAG,gBAAgB;AAE/C,OAAO,SAASC,qBAAqBA,CACnCC,IAAwB,EACxBC,MAAc,EACR;EACN,MAAMC,qBAAqB,GAAGC,2BAA2B,CAAC,CAAC;EAC3D,MAAMC,yBAAyB,GAAGR,oBAAoB,CAACI,IAAI,CAAC;EAE5D,IAAIE,qBAAqB,IAAI,CAACE,yBAAyB,EAAE;IACvDH,MAAM,CAACI,IAAI,CACTV,KAAK,CAACW,MAAM,CACV,gGAAgG,GAC5F,iEACN,CACF,CAAC;EACH,CAAC,MAAM,IAAI,CAACJ,qBAAqB,IAAIE,yBAAyB,EAAE;IAC9DH,MAAM,CAACI,IAAI,CACTV,KAAK,CAACW,MAAM,CACV,sGAAsG,GAClG,0DACN,CACF,CAAC;EACH;AACF;AAEA,SAASH,2BAA2BA,CAAA,EAAY;EAC9C,OAAOI,OAAO,CAACC,GAAG,CAACX,8BAA8B,CAAC,KAAKC,sBAAsB;AAC/E","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":"","names":[],"sources":["../../../../src/build-plugin/__tests__/validateWidgetSet.test.ts"],"version":3,"file":"validateWidgetSet.test.d.ts"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"AAgBA,cAIE,oBACA,yBACK,kBAAmB;AAC1B,cAAc,0BAA0B,4BAA6B;
|
|
1
|
+
{"mappings":"AAgBA,cAIE,oBACA,yBACK,kBAAmB;AAC1B,cAAc,0BAA0B,4BAA6B;AAGrE,OAAO,iBAAS,uBACdA,sBACAC,0BACAC,cAAc,sBACdC,oBAAoB,qBACnB","names":["widgetSetRid: string","widgetSetVersion: string","widgetBuilds: WidgetBuildOutputs[]","widgetSetInputSpec: WidgetSetInputSpec"],"sources":["../../../src/build-plugin/buildWidgetSetManifest.ts"],"version":3,"file":"buildWidgetSetManifest.d.ts"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":"AAgBA,cAAc,0BAA0B,4BAA6B;AAErE,OAAO,iBAAS,kBAAkBA,cAAc","names":["widgetBuilds: WidgetBuildOutputs[]"],"sources":["../../../src/build-plugin/validateWidgetSet.ts"],"version":3,"file":"validateWidgetSet.d.ts"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":"","names":[],"sources":["../../../../src/common/__tests__/standardizePathAndFileExtension.test.ts"],"version":3,"file":"standardizePathAndFileExtension.test.d.ts"}
|
package/build/types/common/{standardizeFileExtension.d.ts → standardizePathAndFileExtension.d.ts}
RENAMED
|
@@ -3,5 +3,7 @@
|
|
|
3
3
|
* `.jsx` file on disk. This standardizes these file extension to `.js` so that we can match imports
|
|
4
4
|
* to source files. Additionally, extension-less imports may be used depending on the module
|
|
5
5
|
* resolution setting so we append `.js` to config file imports to standardize those as well.
|
|
6
|
+
*
|
|
7
|
+
* Additionally, replaces Windows-style backslashes with forward slashes for path consistency.
|
|
6
8
|
*/
|
|
7
|
-
export declare function
|
|
9
|
+
export declare function standardizePathAndFileExtension(file: string): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":";;;;;;;;AA0BA,OAAO,iBAAS,gCAAgCA","names":["file: string"],"sources":["../../../src/common/standardizePathAndFileExtension.ts"],"version":3,"file":"standardizePathAndFileExtension.d.ts"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"AAoBA,cAAc,cAA6B,MAAO;
|
|
1
|
+
{"mappings":"AAoBA,cAAc,cAA6B,MAAO;AAyBlD,OAAO,iBAAS,0BAA0B","names":[],"sources":["../../../src/dev-plugin/FoundryWidgetDevPlugin.ts"],"version":3,"file":"FoundryWidgetDevPlugin.d.ts"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":"","names":[],"sources":["../../../../src/dev-plugin/__tests__/validateDevEnvironment.test.ts"],"version":3,"file":"validateDevEnvironment.test.d.ts"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":"AAiBA,cAAc,cAAc,MAAO;AAMnC,OAAO,iBAAS,sBACdA,0BACAC,QAAQ","names":["mode: string | undefined","logger: Logger"],"sources":["../../../src/dev-plugin/validateDevEnvironment.ts"],"version":3,"file":"validateDevEnvironment.d.ts"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@osdk/widget.vite-plugin",
|
|
3
|
-
"version": "3.3.0-
|
|
3
|
+
"version": "3.3.0-rc.12",
|
|
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/
|
|
34
|
-
"@osdk/
|
|
33
|
+
"@osdk/foundry-config-json": "~1.5.0-rc.2",
|
|
34
|
+
"@osdk/widget.api": "~3.3.0-rc.12"
|
|
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.
|
|
53
|
-
"@osdk/monorepo.
|
|
52
|
+
"@osdk/monorepo.api-extractor": "~0.5.0-beta.1",
|
|
53
|
+
"@osdk/monorepo.tsconfig": "~0.5.0-beta.1"
|
|
54
54
|
},
|
|
55
55
|
"publishConfig": {
|
|
56
56
|
"access": "public"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"standardizeFileExtension.js","names":["CONFIG_FILE_SUFFIX","standardizeFileExtension","file","endsWith","replace"],"sources":["standardizeFileExtension.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 { CONFIG_FILE_SUFFIX } from \"./constants.js\";\n\n/**\n * Users may import `.js` files in their code, where the source file is actually a `.ts`, `.tsx`, or\n * `.jsx` file on disk. This standardizes these file extension to `.js` so that we can match imports\n * to source files. Additionally, extension-less imports may be used depending on the module\n * resolution setting so we append `.js` to config file imports to standardize those as well.\n */\nexport function standardizeFileExtension(file: string): string {\n if (file.endsWith(CONFIG_FILE_SUFFIX)) {\n return file + \".js\";\n }\n return file.replace(/\\.[jt]sx?$/, \".js\");\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,kBAAkB,QAAQ,gBAAgB;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,wBAAwBA,CAACC,IAAY,EAAU;EAC7D,IAAIA,IAAI,CAACC,QAAQ,CAACH,kBAAkB,CAAC,EAAE;IACrC,OAAOE,IAAI,GAAG,KAAK;EACrB;EACA,OAAOA,IAAI,CAACE,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC;AAC1C","ignoreList":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"mappings":";;;;;;AAwBA,OAAO,iBAAS,yBAAyBA","names":["file: string"],"sources":["../../../src/common/standardizeFileExtension.ts"],"version":3,"file":"standardizeFileExtension.d.ts"}
|