@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 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
@@ -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 WrapperScript = {
15
+ export declare type RuntimeScript = {
16
16
  script: string;
17
17
  version: string;
18
18
  };
19
19
  export interface WrapperProvider {
20
- getNodeRuntimeWrapper(): Promise<WrapperScript>;
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 path;
25
- constructor(filesystemReader: FileSystemReader, path: string);
26
- getNodeRuntimeWrapper(): Promise<WrapperScript>;
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 getWrapperPathFromIndex;
33
- getNodeRuntimeWrapper(): Promise<WrapperScript>;
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
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/config/node.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAA6C,MAAM,mBAAmB,CAAC;AAEtH,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,UAAU,EAA0C,MAAM,UAAU,CAAC;AAElH,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;CACjD;AAED,qBAAa,oBAAqB,YAAW,eAAe;IAExD,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI;gBADJ,gBAAgB,EAAE,gBAAgB,EAClC,IAAI,EAAE,MAAM;IAEzB,qBAAqB,IAAI,OAAO,CAAC,aAAa,CAAC;CAUtD;AAED,qBAAa,sBAAuB,YAAW,eAAe;IAC5D,OAAO,CAAC,OAAO,CAA4B;IAC3C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;;YAKX,uBAAuB;IAS/B,qBAAqB,IAAI,OAAO,CAAC,aAAa,CAAC;CAuCtD;AAED,eAAO,MAAM,kBAAkB;sBAA8C,gBAAgB;mDAQ5F,CAAC;AAEF,eAAO,MAAM,yBAAyB,oBAClB,eAAe,mBACnB,UAAU,EAAE,UAAU,aAAa,KAAG,mBA4DnD,CAAC"}
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"}
@@ -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
- path;
41
- constructor(filesystemReader, path) {
46
+ runtimePath;
47
+ constructor(filesystemReader, runtimePath) {
42
48
  this.filesystemReader = filesystemReader;
43
- this.path = path;
49
+ this.runtimePath = runtimePath;
44
50
  }
45
51
  async getNodeRuntimeWrapper() {
46
- const wrapper = await this.filesystemReader.readFileAsync(this.path);
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 getWrapperPathFromIndex(htmlContent, requestId) {
82
+ async getScriptPathFromIndex(htmlContent, requestId, scriptType) {
64
83
  const html = cheerio_1.default.load(htmlContent);
65
- const wrapperPath = html('script')?.get()?.[0]?.attribs['src'];
66
- if (typeof wrapperPath !== 'string') {
67
- throw new ParseWrapperCDNIndexError('Unable to parse source of runtime component.', requestId);
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(wrapperPath, this.cdnUrl).toString();
90
+ return new URL(scriptPath, this.cdnUrl).toString();
70
91
  }
71
- async getNodeRuntimeWrapper() {
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 wrapperUrl = await this.getWrapperPathFromIndex(await indexResponse.text(), (0, cli_shared_1.getAtlassianTraceId)(indexResponse.headers));
81
- const response = await (0, node_fetch_1.default)(wrapperUrl);
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: ${wrapperUrl.toString()} ${response.status}.`, (0, cli_shared_1.getAtlassianTraceId)(response.headers));
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
- this.wrapper = {
104
+ return {
87
105
  script,
88
- version: new URL(wrapperUrl).pathname
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.FORGE_WRAPPER_PATH) {
103
- return new LocalWrapperProvider(fileSystemReader, process.env.FORGE_WRAPPER_PATH);
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 source = new RawSource(wrapper.script);
130
- for (const entrypoint of entrypoints) {
131
- compilation.emitAsset(`${entrypoint.name}.cjs`, source);
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.19.7-next.8",
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.18",
24
- "@forge/cli-shared": "6.2.1-next.8",
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.5.2-next.8",
27
- "@forge/manifest": "8.0.0-next.7",
28
- "@forge/util": "1.4.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.90.3",
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.2",
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",