Skip to content

Commit ed8849f

Browse files
authored
Merge pull request #1120 from izaera/fix-fds-build
fix: build and start for FDS Cell Renderer projects
2 parents 8c96d3a + 1628698 commit ed8849f

23 files changed

+414
-241
lines changed

projects/js-toolkit/packages/js-toolkit-core/src/index.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ export {default as Project} from './project/liferayCli/Project';
3434
export {
3535
Bundler2BuildOptions,
3636
CustomElementBuildOptions,
37+
FDSCellRendererBuildOptions,
38+
MinifiableBuildOptions,
3739
ThemeSpritemapBuildOptions,
40+
WebpackBuildOptions,
3841
} from './project/liferayCli/Build';
3942

4043
// Format library
@@ -67,9 +70,12 @@ export type {
6770

6871
export type {
6972
default as LiferayJson,
70-
BuildConfig,
73+
AnyTypedBuildConfig,
7174
Bundler2BuildConfig,
7275
CustomElementBuildConfig,
76+
FDSCellRendererBuildConfig,
77+
ThemeSpritemapBuildConfig,
78+
TypedBuildConfig,
7379
} from './schema/LiferayJson';
7480

7581
export type {

projects/js-toolkit/packages/js-toolkit-core/src/project/liferayCli/Build.ts

+90-42
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ import fs from 'fs';
77

88
import FilePath from '../../file/FilePath';
99
import LiferayJson, {
10-
BuildConfig,
1110
Bundler2BuildConfig,
1211
CustomElementBuildConfig,
12+
FDSCellRendererBuildConfig,
13+
ThemeSpritemapBuildConfig,
1314
} from '../../schema/LiferayJson';
1415
import Project from './Project';
1516
import persist, {Location} from './persist';
@@ -23,25 +24,31 @@ type BuildType =
2324
type BuildOptions =
2425
| Bundler2BuildOptions
2526
| CustomElementBuildOptions
26-
| ThemeSpritemapBuildOptions
27-
| {};
27+
| FDSCellRendererBuildOptions
28+
| ThemeSpritemapBuildOptions;
2829

29-
export interface Bundler2BuildOptions {
30-
minify: boolean;
31-
}
30+
export type Bundler2BuildOptions = MinifiableBuildOptions;
3231

33-
export interface CustomElementBuildOptions {
34-
externals: {[bareIdentifier: string]: string};
32+
export interface CustomElementBuildOptions extends WebpackBuildOptions {
3533
htmlElementName: string | null;
36-
minify: boolean;
3734
portletCategoryName: string;
3835
}
3936

37+
export type FDSCellRendererBuildOptions = WebpackBuildOptions;
38+
4039
export interface ThemeSpritemapBuildOptions {
4140
enableSVG4Everybody: boolean;
4241
extendClay: boolean;
4342
}
4443

44+
export interface MinifiableBuildOptions {
45+
minify: boolean;
46+
}
47+
48+
export interface WebpackBuildOptions extends MinifiableBuildOptions {
49+
externals: {[bareIdentifier: string]: string};
50+
}
51+
4552
type OptionValue = boolean | number | string;
4653

4754
export default class Build {
@@ -52,28 +59,30 @@ export default class Build {
5259
constructor(project: Project, liferayJson: LiferayJson) {
5360
this._project = project;
5461

55-
const config: BuildConfig = liferayJson.build?.options || {};
56-
5762
switch (liferayJson.build.type) {
5863
case 'customElement':
5964
this.type = 'customElement';
6065
this.dir = project.dir.join('build');
6166
this.options = this._toCustomElementBuildOptions(
6267
project,
63-
config as CustomElementBuildConfig
68+
liferayJson.build?.options
6469
);
6570
break;
6671

6772
case 'fdsCellRenderer':
6873
this.type = 'fdsCellRenderer';
6974
this.dir = project.dir.join('build');
70-
this.options = {};
75+
this.options = this._toFDSCellRendererBuildOptions(
76+
liferayJson.build?.options
77+
);
7178
break;
7279

7380
case 'themeSpritemap':
7481
this.type = 'themeSpritemap';
7582
this.dir = project.dir.join('build');
76-
this.options = config as ThemeSpritemapBuildOptions;
83+
this.options = this._toThemeSpriteMapBuildOptions(
84+
liferayJson.build?.options
85+
);
7786
break;
7887

7988
case 'bundler2': {
@@ -87,14 +96,16 @@ export default class Build {
8796
bundler2Project.buildDir.asNative
8897
).resolve();
8998
this.options = this._toBundler2BuildOptions(
90-
config as Bundler2BuildConfig
99+
liferayJson.build?.options
91100
);
92101
break;
93102
}
94103

95104
default:
96105
throw new Error(
97-
`Unknown project build type type: ${liferayJson.build.type}`
106+
`Unknown project build type type: ${
107+
(liferayJson.build as unknown)['type']
108+
}`
98109
);
99110
}
100111
}
@@ -146,10 +157,68 @@ export default class Build {
146157
config: CustomElementBuildConfig
147158
): CustomElementBuildOptions {
148159

160+
// Infer htmlElementName from source code if needed
161+
162+
if (!config.htmlElementName) {
163+
config.htmlElementName = findHtmlElementName(
164+
project.mainModuleFile
165+
);
166+
}
167+
168+
if (!config.portletCategoryName) {
169+
config.portletCategoryName = 'category.remote-apps';
170+
}
171+
172+
const webpackOptions = this._toWebpackBuildOptions(config);
173+
174+
return {
175+
externals: webpackOptions.externals,
176+
htmlElementName: config.htmlElementName,
177+
minify: webpackOptions.minify,
178+
portletCategoryName: config.portletCategoryName,
179+
};
180+
}
181+
182+
private _toFDSCellRendererBuildOptions(
183+
config: FDSCellRendererBuildConfig
184+
): FDSCellRendererBuildOptions {
185+
const webpackOptions = this._toWebpackBuildOptions(config);
186+
187+
return {
188+
externals: webpackOptions.externals,
189+
minify: webpackOptions.minify,
190+
};
191+
}
192+
193+
private _toThemeSpriteMapBuildOptions(
194+
config: ThemeSpritemapBuildConfig
195+
): ThemeSpritemapBuildOptions {
196+
return {
197+
enableSVG4Everybody: !!config.enableSVG4Everybody,
198+
extendClay: !!config.extendClay,
199+
};
200+
}
201+
202+
private _toBundler2BuildOptions(
203+
_config: Bundler2BuildConfig
204+
): Bundler2BuildOptions {
205+
return {
206+
minify: process.env.NODE_ENV !== 'development',
207+
};
208+
}
209+
210+
private _toWebpackBuildOptions(
211+
config: CustomElementBuildConfig | FDSCellRendererBuildConfig
212+
): WebpackBuildOptions {
213+
const options: WebpackBuildOptions = {
214+
externals: {},
215+
minify: process.env.NODE_ENV !== 'development',
216+
};
217+
149218
// Turn arrays coming from liferay.json into objects
150219

151-
if (Array.isArray(config['externals'])) {
152-
config.externals = config.externals.reduce(
220+
if (Array.isArray(config.externals)) {
221+
options.externals = config.externals.reduce(
153222
(map, bareIdentifier) => {
154223
map[bareIdentifier] = bareIdentifier;
155224

@@ -158,14 +227,9 @@ export default class Build {
158227
{}
159228
);
160229
}
161-
162-
const options: CustomElementBuildOptions = {
163-
externals: config.externals || {},
164-
htmlElementName: config.htmlElementName,
165-
minify: process.env.NODE_ENV !== 'development',
166-
portletCategoryName:
167-
config.portletCategoryName || 'category.remote-apps',
168-
};
230+
else if (config.externals) {
231+
options.externals = config.externals;
232+
}
169233

170234
// Remove externals mapped to null
171235

@@ -180,25 +244,9 @@ export default class Build {
180244
{}
181245
);
182246

183-
// Infer htmlElementName from source code if needed
184-
185-
if (!options.htmlElementName) {
186-
options.htmlElementName = findHtmlElementName(
187-
project.mainModuleFile
188-
);
189-
}
190-
191247
return options;
192248
}
193249

194-
private _toBundler2BuildOptions(
195-
_config: Bundler2BuildConfig
196-
): Bundler2BuildOptions {
197-
return {
198-
minify: process.env.NODE_ENV !== 'development',
199-
};
200-
}
201-
202250
private _project: Project;
203251
}
204252

projects/js-toolkit/packages/js-toolkit-core/src/project/liferayCli/Dist.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ export default class Dist {
3535

3636
default:
3737
throw new Error(
38-
`Unknown project build type type: ${liferayJson.build.type}`
38+
`Unknown project build type type: ${
39+
(liferayJson.build as unknown)['type']
40+
}`
3941
);
4042
}
4143
}

projects/js-toolkit/packages/js-toolkit-core/src/project/liferayCli/Project.ts

+54-13
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import path from 'path';
1414
import resolve from 'resolve';
1515

1616
import FilePath from '../../file/FilePath';
17-
import LiferayJson, {CustomElementBuildConfig} from '../../schema/LiferayJson';
17+
import LiferayJson from '../../schema/LiferayJson';
1818
import PkgJson from '../../schema/PkgJson';
1919
import Build from './Build';
2020
import Deploy from './Deploy';
@@ -30,6 +30,7 @@ export default class Project {
3030
readonly deploy: Deploy;
3131
readonly dir: FilePath;
3232
readonly dist: Dist;
33+
readonly isWorkspace: boolean;
3334
readonly mainModuleFile: FilePath;
3435
readonly pkgJson: PkgJson;
3536
readonly srcDir: FilePath;
@@ -43,6 +44,8 @@ export default class Project {
4344
reload(): void {
4445
const self = this as Writable<Project>;
4546

47+
self.isWorkspace = this._isWorkspace();
48+
4649
self.assetsDir = this.dir.join('assets');
4750
self.srcDir = this.dir.join('src');
4851

@@ -63,7 +66,7 @@ export default class Project {
6366
self.mainModuleFile = this.srcDir.join('index.js');
6467
}
6568

66-
let liferayJson = this._loadLiferayJson();
69+
let liferayJson: LiferayJson = this._loadLiferayJson();
6770

6871
const clientExtensionYamlPath = this.dir.join('client-extension.yaml')
6972
.asNative;
@@ -152,8 +155,36 @@ export default class Project {
152155
return autopresets.length ? autopresets[0] : null;
153156
}
154157

158+
private _isWorkspace(): boolean {
159+
let isWorkspace = false;
160+
let dir = this.dir.resolve().asNative;
161+
162+
while (!isWorkspace) {
163+
try {
164+
isWorkspace = fs
165+
.readFileSync(path.join(dir, 'settings.gradle'), 'utf-8')
166+
.includes('"com.liferay.gradle.plugins.workspace"');
167+
}
168+
catch (error) {
169+
170+
// ignore
171+
172+
}
173+
174+
const newDir = path.dirname(dir);
175+
176+
if (newDir === dir) {
177+
break;
178+
}
179+
180+
dir = newDir;
181+
}
182+
183+
return isWorkspace;
184+
}
185+
155186
private _loadLiferayJson(): LiferayJson {
156-
const items: LiferayJson[] = [{}];
187+
const items: unknown[] = [{}];
157188

158189
const autopreset = this._getAutopreset();
159190

@@ -185,7 +216,19 @@ export default class Project {
185216
}
186217
});
187218

188-
return merge.all(items.map((item) => this._normalizeLiferayJson(item)));
219+
const liferayJson: LiferayJson = merge.all(
220+
items.map((item) => this._normalizeLiferayJson(item))
221+
);
222+
223+
// Default project type is 'bundler2'
224+
225+
liferayJson.build = liferayJson.build || {
226+
options: {},
227+
type: 'bundler2',
228+
};
229+
liferayJson.build.type = liferayJson.build.type || 'bundler2';
230+
231+
return liferayJson;
189232
}
190233

191234
private _normalizeClientExtensionYaml(
@@ -201,18 +244,16 @@ export default class Project {
201244
};
202245
}
203246

204-
private _normalizeLiferayJson(liferayJson: LiferayJson): LiferayJson {
205-
liferayJson.build = liferayJson.build || {};
206-
liferayJson.build.type = liferayJson.build.type || 'bundler2';
247+
private _normalizeLiferayJson(liferayJson: any): LiferayJson {
207248

208-
const options = liferayJson.build?.options;
249+
// Normalize externals if they exist
209250

210-
if (options && options['externals']) {
211-
const typeOptions = options as CustomElementBuildConfig;
251+
const options = liferayJson.build?.options;
212252

213-
if (Array.isArray(typeOptions.externals)) {
214-
typeOptions.externals = typeOptions.externals.reduce(
215-
(map, bareIdentifier) => {
253+
if (options && options.externals) {
254+
if (Array.isArray(options.externals)) {
255+
options.externals = options.externals.reduce(
256+
(map: string, bareIdentifier: string) => {
216257
map[bareIdentifier] = bareIdentifier;
217258

218259
return map;

0 commit comments

Comments
 (0)