@forge/bundler 4.19.7-next.8 → 4.20.0-next.15
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 +68 -0
- package/out/config/node.d.ts +17 -10
- package/out/config/node.d.ts.map +1 -1
- package/out/config/node.js +71 -29
- package/package.json +9 -9
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,73 @@
|
|
|
1
1
|
# @forge/bundler
|
|
2
2
|
|
|
3
|
+
## 4.20.0-next.15
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 0e30430: Evergreen runtime using loader script
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [0e30430]
|
|
12
|
+
- Updated dependencies [cd7008b]
|
|
13
|
+
- @forge/cli-shared@6.3.0-next.14
|
|
14
|
+
- @forge/manifest@8.0.0-next.11
|
|
15
|
+
- @forge/lint@5.6.0-next.15
|
|
16
|
+
|
|
17
|
+
## 4.19.7-next.14
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- ffa1464: webpack upgrade to "5.94.0"
|
|
22
|
+
- Updated dependencies [ffa1464]
|
|
23
|
+
- @forge/babel-plugin-transform-ui@1.1.19-next.0
|
|
24
|
+
- @forge/util@1.4.5-next.0
|
|
25
|
+
- @forge/api@4.1.1-next.0
|
|
26
|
+
- @forge/cli-shared@6.3.0-next.13
|
|
27
|
+
- @forge/lint@5.6.0-next.14
|
|
28
|
+
|
|
29
|
+
## 4.19.7-next.13
|
|
30
|
+
|
|
31
|
+
### Patch Changes
|
|
32
|
+
|
|
33
|
+
- Updated dependencies [c84549a]
|
|
34
|
+
- @forge/manifest@8.0.0-next.10
|
|
35
|
+
- @forge/cli-shared@6.3.0-next.12
|
|
36
|
+
- @forge/lint@5.6.0-next.13
|
|
37
|
+
|
|
38
|
+
## 4.19.7-next.12
|
|
39
|
+
|
|
40
|
+
### Patch Changes
|
|
41
|
+
|
|
42
|
+
- Updated dependencies [8ca9a19]
|
|
43
|
+
- @forge/manifest@8.0.0-next.9
|
|
44
|
+
- @forge/cli-shared@6.3.0-next.11
|
|
45
|
+
- @forge/lint@5.6.0-next.12
|
|
46
|
+
|
|
47
|
+
## 4.19.7-next.11
|
|
48
|
+
|
|
49
|
+
### Patch Changes
|
|
50
|
+
|
|
51
|
+
- Updated dependencies [3e59d28]
|
|
52
|
+
- @forge/lint@5.6.0-next.11
|
|
53
|
+
|
|
54
|
+
## 4.19.7-next.10
|
|
55
|
+
|
|
56
|
+
### Patch Changes
|
|
57
|
+
|
|
58
|
+
- Updated dependencies [34bd8b6]
|
|
59
|
+
- @forge/cli-shared@6.3.0-next.10
|
|
60
|
+
- @forge/lint@5.5.2-next.10
|
|
61
|
+
|
|
62
|
+
## 4.19.7-next.9
|
|
63
|
+
|
|
64
|
+
### Patch Changes
|
|
65
|
+
|
|
66
|
+
- Updated dependencies [a9c6303]
|
|
67
|
+
- @forge/manifest@8.0.0-next.8
|
|
68
|
+
- @forge/cli-shared@6.2.1-next.9
|
|
69
|
+
- @forge/lint@5.5.2-next.9
|
|
70
|
+
|
|
3
71
|
## 4.19.7-next.8
|
|
4
72
|
|
|
5
73
|
### Patch Changes
|
package/out/config/node.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BaseError, FileSystemReader, UserError } from '@forge/cli-shared';
|
|
1
|
+
import { BaseError, FileSystemReader, UserError, StatsigService } from '@forge/cli-shared';
|
|
2
2
|
import { CommonWebpackConfig, ConfigBuilder, EntryPoint } from './common';
|
|
3
3
|
export declare const NODE_WEBPACK_CONFIG_NAME = "node-runtime";
|
|
4
4
|
export declare const NODE_WEBPACK_USER_CODE_DIR = "bundled";
|
|
@@ -12,28 +12,35 @@ export declare class WrapperNetworkError extends BaseError {
|
|
|
12
12
|
export declare class ParseWrapperCDNIndexError extends BaseError {
|
|
13
13
|
constructor(message: string, requestId: string | undefined);
|
|
14
14
|
}
|
|
15
|
-
export declare type
|
|
15
|
+
export declare type RuntimeScript = {
|
|
16
16
|
script: string;
|
|
17
17
|
version: string;
|
|
18
18
|
};
|
|
19
19
|
export interface WrapperProvider {
|
|
20
|
-
getNodeRuntimeWrapper(): Promise<
|
|
20
|
+
getNodeRuntimeWrapper(): Promise<RuntimeScript>;
|
|
21
|
+
getNodeRuntimeLoader(): Promise<RuntimeScript | undefined>;
|
|
21
22
|
}
|
|
22
23
|
export declare class LocalWrapperProvider implements WrapperProvider {
|
|
23
24
|
private readonly filesystemReader;
|
|
24
|
-
private readonly
|
|
25
|
-
constructor(filesystemReader: FileSystemReader,
|
|
26
|
-
getNodeRuntimeWrapper(): Promise<
|
|
25
|
+
private readonly runtimePath;
|
|
26
|
+
constructor(filesystemReader: FileSystemReader, runtimePath: string);
|
|
27
|
+
getNodeRuntimeWrapper(): Promise<RuntimeScript>;
|
|
28
|
+
getNodeRuntimeLoader(): Promise<RuntimeScript | undefined>;
|
|
27
29
|
}
|
|
28
30
|
export declare class NetworkWrapperProvider implements WrapperProvider {
|
|
31
|
+
protected readonly statsigService: StatsigService;
|
|
29
32
|
private wrapper;
|
|
33
|
+
private loader;
|
|
30
34
|
protected cdnUrl: string;
|
|
31
|
-
constructor();
|
|
32
|
-
private
|
|
33
|
-
|
|
35
|
+
constructor(statsigService: StatsigService);
|
|
36
|
+
private getScriptPathFromIndex;
|
|
37
|
+
private getFileFromCDN;
|
|
38
|
+
getNodeRuntimeWrapper(): Promise<RuntimeScript>;
|
|
39
|
+
getNodeRuntimeLoader(): Promise<RuntimeScript | undefined>;
|
|
34
40
|
}
|
|
35
|
-
export declare const getWrapperProvider: ({ fileSystemReader }: {
|
|
41
|
+
export declare const getWrapperProvider: ({ fileSystemReader, statsigService }: {
|
|
36
42
|
fileSystemReader: FileSystemReader;
|
|
43
|
+
statsigService: StatsigService;
|
|
37
44
|
}) => LocalWrapperProvider | NetworkWrapperProvider;
|
|
38
45
|
export declare const getNodeRuntimeBuildConfig: (wrapperProvider: WrapperProvider) => (entrypoints: EntryPoint[], config: ConfigBuilder) => CommonWebpackConfig;
|
|
39
46
|
//# sourceMappingURL=node.d.ts.map
|
package/out/config/node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/config/node.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/config/node.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,SAAS,EAGT,cAAc,EACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,UAAU,EAA0C,MAAM,UAAU,CAAC;AAIlH,eAAO,MAAM,wBAAwB,iBAAiB,CAAC;AACvD,eAAO,MAAM,0BAA0B,YAAY,CAAC;AACpD,eAAO,MAAM,yBAAyB,iBAAiB,CAAC;AAWxD,qBAAa,yBAA0B,SAAQ,SAAS;;CAIvD;AAED,qBAAa,mBAAoB,SAAQ,SAAS;gBACpC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;CAGhD;AAED,qBAAa,yBAA0B,SAAQ,SAAS;gBAC1C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS;CAG3D;AAED,oBAAY,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,qBAAqB,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAChD,oBAAoB,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;CAC5D;AAOD,qBAAa,oBAAqB,YAAW,eAAe;IAExD,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW;gBADX,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,EAAE,MAAM;IAEhC,qBAAqB,IAAI,OAAO,CAAC,aAAa,CAAC;IAW/C,oBAAoB,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;CAUjE;AAED,qBAAa,sBAAuB,YAAW,eAAe;IAKhD,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,cAAc;IAJ7D,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,MAAM,CAA4B;IAC1C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEM,cAAc,EAAE,cAAc;YAI/C,sBAAsB;IAgBpC,OAAO,CAAC,cAAc,CAmCpB;IAEI,qBAAqB,IAAI,OAAO,CAAC,aAAa,CAAC;IAO/C,oBAAoB,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;CAQjE;AAED,eAAO,MAAM,kBAAkB;sBAIX,gBAAgB;oBAClB,cAAc;mDAS/B,CAAC;AAEF,eAAO,MAAM,yBAAyB,oBAClB,eAAe,mBACnB,UAAU,EAAE,UAAU,aAAa,KAAG,mBAuEnD,CAAC"}
|
package/out/config/node.js
CHANGED
|
@@ -6,6 +6,7 @@ const cheerio_1 = tslib_1.__importDefault(require("cheerio"));
|
|
|
6
6
|
const node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
|
|
7
7
|
const cli_shared_1 = require("@forge/cli-shared");
|
|
8
8
|
const common_1 = require("./common");
|
|
9
|
+
const path_1 = tslib_1.__importDefault(require("path"));
|
|
9
10
|
exports.NODE_WEBPACK_CONFIG_NAME = 'node-runtime';
|
|
10
11
|
exports.NODE_WEBPACK_USER_CODE_DIR = 'bundled';
|
|
11
12
|
exports.NODE_RUNTIME_VERSION_FILE = 'runtime.json';
|
|
@@ -35,59 +36,75 @@ class ParseWrapperCDNIndexError extends cli_shared_1.BaseError {
|
|
|
35
36
|
}
|
|
36
37
|
}
|
|
37
38
|
exports.ParseWrapperCDNIndexError = ParseWrapperCDNIndexError;
|
|
39
|
+
var ScriptType;
|
|
40
|
+
(function (ScriptType) {
|
|
41
|
+
ScriptType["WRAPPER"] = "wrapper";
|
|
42
|
+
ScriptType["LOADER"] = "loader";
|
|
43
|
+
})(ScriptType || (ScriptType = {}));
|
|
38
44
|
class LocalWrapperProvider {
|
|
39
45
|
filesystemReader;
|
|
40
|
-
|
|
41
|
-
constructor(filesystemReader,
|
|
46
|
+
runtimePath;
|
|
47
|
+
constructor(filesystemReader, runtimePath) {
|
|
42
48
|
this.filesystemReader = filesystemReader;
|
|
43
|
-
this.
|
|
49
|
+
this.runtimePath = runtimePath;
|
|
44
50
|
}
|
|
45
51
|
async getNodeRuntimeWrapper() {
|
|
46
|
-
const wrapper = await this.filesystemReader.readFileAsync(this.
|
|
52
|
+
const wrapper = await this.filesystemReader.readFileAsync(path_1.default.join(this.runtimePath, 'dist/wrapper.js'));
|
|
47
53
|
if (!wrapper) {
|
|
48
54
|
throw new LocalWrapperNotFoundError();
|
|
49
55
|
}
|
|
50
56
|
return {
|
|
51
57
|
script: wrapper,
|
|
52
|
-
version: 'local'
|
|
58
|
+
version: 'local-wrapper'
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
async getNodeRuntimeLoader() {
|
|
62
|
+
const loader = await this.filesystemReader.readFileAsync(path_1.default.join(this.runtimePath, 'dist/loader.js'));
|
|
63
|
+
if (!loader) {
|
|
64
|
+
throw new LocalWrapperNotFoundError();
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
script: loader,
|
|
68
|
+
version: 'local-loader'
|
|
53
69
|
};
|
|
54
70
|
}
|
|
55
71
|
}
|
|
56
72
|
exports.LocalWrapperProvider = LocalWrapperProvider;
|
|
57
73
|
class NetworkWrapperProvider {
|
|
74
|
+
statsigService;
|
|
58
75
|
wrapper;
|
|
76
|
+
loader;
|
|
59
77
|
cdnUrl;
|
|
60
|
-
constructor() {
|
|
78
|
+
constructor(statsigService) {
|
|
79
|
+
this.statsigService = statsigService;
|
|
61
80
|
this.cdnUrl = (0, cli_shared_1.getEnvironmentConfig)(RuntimeCDN);
|
|
62
81
|
}
|
|
63
|
-
async
|
|
82
|
+
async getScriptPathFromIndex(htmlContent, requestId, scriptType) {
|
|
64
83
|
const html = cheerio_1.default.load(htmlContent);
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
84
|
+
const scriptPath = html('script')
|
|
85
|
+
?.get()
|
|
86
|
+
?.find((asset) => asset.attribs['src']?.includes(scriptType))?.attribs['src'];
|
|
87
|
+
if (typeof scriptPath !== 'string') {
|
|
88
|
+
throw new ParseWrapperCDNIndexError(`Unable to parse source of runtime ${scriptType}.`, requestId);
|
|
68
89
|
}
|
|
69
|
-
return new URL(
|
|
90
|
+
return new URL(scriptPath, this.cdnUrl).toString();
|
|
70
91
|
}
|
|
71
|
-
async
|
|
72
|
-
if (this.wrapper) {
|
|
73
|
-
return this.wrapper;
|
|
74
|
-
}
|
|
92
|
+
getFileFromCDN = async (scriptType) => {
|
|
75
93
|
try {
|
|
76
94
|
const indexResponse = await (0, node_fetch_1.default)(this.cdnUrl);
|
|
77
95
|
if (!indexResponse.ok) {
|
|
78
96
|
throw new WrapperNetworkError(`Failed to fetch runtime component: ${this.cdnUrl} ${indexResponse.status}.`, (0, cli_shared_1.getAtlassianTraceId)(indexResponse.headers));
|
|
79
97
|
}
|
|
80
|
-
const
|
|
81
|
-
const response = await (0, node_fetch_1.default)(
|
|
98
|
+
const scriptUrl = await this.getScriptPathFromIndex(await indexResponse.text(), (0, cli_shared_1.getAtlassianTraceId)(indexResponse.headers), scriptType);
|
|
99
|
+
const response = await (0, node_fetch_1.default)(scriptUrl);
|
|
82
100
|
if (!response.ok) {
|
|
83
|
-
throw new WrapperNetworkError(`Failed to fetch runtime component: ${
|
|
101
|
+
throw new WrapperNetworkError(`Failed to fetch runtime component: ${scriptUrl.toString()} ${response.status}.`, (0, cli_shared_1.getAtlassianTraceId)(response.headers));
|
|
84
102
|
}
|
|
85
103
|
const script = await response.text();
|
|
86
|
-
|
|
104
|
+
return {
|
|
87
105
|
script,
|
|
88
|
-
version: new URL(
|
|
106
|
+
version: new URL(scriptUrl).pathname
|
|
89
107
|
};
|
|
90
|
-
return this.wrapper;
|
|
91
108
|
}
|
|
92
109
|
catch (e) {
|
|
93
110
|
if (e instanceof ParseWrapperCDNIndexError) {
|
|
@@ -95,14 +112,28 @@ class NetworkWrapperProvider {
|
|
|
95
112
|
}
|
|
96
113
|
throw new WrapperNetworkError(e instanceof Error ? e.message : 'Networking error when retrieving runtime component, retry the command.');
|
|
97
114
|
}
|
|
115
|
+
};
|
|
116
|
+
async getNodeRuntimeWrapper() {
|
|
117
|
+
if (!this.wrapper) {
|
|
118
|
+
this.wrapper = await this.getFileFromCDN(ScriptType.WRAPPER);
|
|
119
|
+
}
|
|
120
|
+
return this.wrapper;
|
|
121
|
+
}
|
|
122
|
+
async getNodeRuntimeLoader() {
|
|
123
|
+
if (!this.loader) {
|
|
124
|
+
if (await this.statsigService.testForgeCliBundleRuntimeLoaderGate()) {
|
|
125
|
+
this.loader = await this.getFileFromCDN(ScriptType.LOADER);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return this.loader;
|
|
98
129
|
}
|
|
99
130
|
}
|
|
100
131
|
exports.NetworkWrapperProvider = NetworkWrapperProvider;
|
|
101
|
-
const getWrapperProvider = ({ fileSystemReader }) => {
|
|
102
|
-
if (process.env.
|
|
103
|
-
return new LocalWrapperProvider(fileSystemReader, process.env.
|
|
132
|
+
const getWrapperProvider = ({ fileSystemReader, statsigService }) => {
|
|
133
|
+
if (process.env.FORGE_RUNTIME_PATH) {
|
|
134
|
+
return new LocalWrapperProvider(fileSystemReader, process.env.FORGE_RUNTIME_PATH);
|
|
104
135
|
}
|
|
105
|
-
return new NetworkWrapperProvider();
|
|
136
|
+
return new NetworkWrapperProvider(statsigService);
|
|
106
137
|
};
|
|
107
138
|
exports.getWrapperProvider = getWrapperProvider;
|
|
108
139
|
const getNodeRuntimeBuildConfig = (wrapperProvider) => (entrypoints, config) => {
|
|
@@ -126,12 +157,23 @@ const getNodeRuntimeBuildConfig = (wrapperProvider) => (entrypoints, config) =>
|
|
|
126
157
|
compiler.hooks.make.tapPromise('AfterEmitPlugin', async (compilation) => {
|
|
127
158
|
const { RawSource } = compiler.webpack.sources;
|
|
128
159
|
const wrapper = await wrapperProvider.getNodeRuntimeWrapper();
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
160
|
+
const loader = await wrapperProvider.getNodeRuntimeLoader();
|
|
161
|
+
if (loader) {
|
|
162
|
+
const loaderSource = new RawSource(loader.script);
|
|
163
|
+
for (const entrypoint of entrypoints) {
|
|
164
|
+
compilation.emitAsset(`${entrypoint.name}.cjs`, loaderSource);
|
|
165
|
+
}
|
|
166
|
+
const wrapperSource = new RawSource(wrapper.script);
|
|
167
|
+
compilation.emitAsset('__forge_wrapper__.cjs', wrapperSource);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
const source = new RawSource(wrapper.script);
|
|
171
|
+
for (const entrypoint of entrypoints) {
|
|
172
|
+
compilation.emitAsset(`${entrypoint.name}.cjs`, source);
|
|
173
|
+
}
|
|
132
174
|
}
|
|
133
175
|
compilation.emitAsset(exports.NODE_RUNTIME_VERSION_FILE, new RawSource(JSON.stringify({
|
|
134
|
-
version: wrapper.version
|
|
176
|
+
version: loader ? loader.version : wrapper.version
|
|
135
177
|
}, null, 2)));
|
|
136
178
|
});
|
|
137
179
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forge/bundler",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.20.0-next.15",
|
|
4
4
|
"description": "Default bundler for Forge apps",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"author": "Atlassian",
|
|
@@ -19,13 +19,13 @@
|
|
|
19
19
|
"@babel/plugin-transform-optional-chaining": "^7.23.4",
|
|
20
20
|
"@babel/plugin-transform-react-jsx": "^7.23.4",
|
|
21
21
|
"@babel/preset-typescript": "^7.23.3",
|
|
22
|
-
"@forge/api": "4.1.0",
|
|
23
|
-
"@forge/babel-plugin-transform-ui": "1.1.
|
|
24
|
-
"@forge/cli-shared": "6.
|
|
22
|
+
"@forge/api": "4.1.1-next.0",
|
|
23
|
+
"@forge/babel-plugin-transform-ui": "1.1.19-next.0",
|
|
24
|
+
"@forge/cli-shared": "6.3.0-next.14",
|
|
25
25
|
"@forge/i18n": "0.0.2-next.0",
|
|
26
|
-
"@forge/lint": "5.
|
|
27
|
-
"@forge/manifest": "8.0.0-next.
|
|
28
|
-
"@forge/util": "1.4.
|
|
26
|
+
"@forge/lint": "5.6.0-next.15",
|
|
27
|
+
"@forge/manifest": "8.0.0-next.11",
|
|
28
|
+
"@forge/util": "1.4.5-next.0",
|
|
29
29
|
"assert": "^2.1.0",
|
|
30
30
|
"babel-loader": "^8.3.0",
|
|
31
31
|
"browserify-zlib": "^0.2.0",
|
|
@@ -54,13 +54,13 @@
|
|
|
54
54
|
"typescript": "4.8.4",
|
|
55
55
|
"url": "^0.11.3",
|
|
56
56
|
"util": "^0.12.5",
|
|
57
|
-
"webpack": "5.
|
|
57
|
+
"webpack": "5.94.0",
|
|
58
58
|
"webpack-bundle-analyzer": "^4.10.1",
|
|
59
59
|
"whatwg-url": "^12.0.1"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
62
|
"@atlassian/xen-test-util": "^4.2.0",
|
|
63
|
-
"@forge/runtime": "5.10.
|
|
63
|
+
"@forge/runtime": "5.10.3-next.0",
|
|
64
64
|
"@types/jest": "^29.5.12",
|
|
65
65
|
"@types/node": "14.18.63",
|
|
66
66
|
"@types/react": "^18.2.64",
|