Skip to content

Commit 01348f1

Browse files
authored
Merge pull request #9392 from keymanapp/chore/developer/cleanup-filetype-references
chore(developer): refactor KeymanDeveloperProjectFile 🗜
2 parents eb23e68 + c20a670 commit 01348f1

File tree

5 files changed

+44
-41
lines changed

5 files changed

+44
-41
lines changed

common/web/types/src/kpj/keyman-developer-project.ts

Lines changed: 21 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -127,51 +127,38 @@ export class KeymanDeveloperProjectOptions {
127127
}
128128
};
129129

130-
export type KeymanDeveloperProjectFile = KeymanDeveloperProjectFile10 | KeymanDeveloperProjectFile20;
131-
132-
export class KeymanDeveloperProjectFile10 {
133-
readonly id: string; // 1.0 only
134-
readonly filename: string;
130+
export interface KeymanDeveloperProjectFile {
131+
get filename(): string;
132+
get fileType(): string;
135133
readonly filePath: string;
136-
readonly fileVersion: string; // 1.0 only
137-
/**
138-
* file extension of filename; warning: .model.ts is technically not the fileType because of 2 periods
139-
* @deprecated use `getFileType()`
140-
*/
141-
readonly fileType: KeymanFileTypes.Any; // 1.0 only
134+
};
135+
136+
export class KeymanDeveloperProjectFile10 implements KeymanDeveloperProjectFile {
137+
get filename(): string {
138+
return this.callbacks.path.basename(this.filePath);
139+
}
140+
get fileType(): string {
141+
return KeymanFileTypes.fromFilename(this.filename);
142+
}
142143
details: KeymanDeveloperProjectFileDetail_Kmn & KeymanDeveloperProjectFileDetail_Kps; // 1.0 only
143144
childFiles: KeymanDeveloperProjectFile[]; // 1.0 only
144-
constructor(id: string, filename: string, filePath: string, fileVersion:string, fileType: KeymanFileTypes.Any) {
145+
146+
constructor(public readonly id: string, public readonly filePath: string, public readonly fileVersion:string, private readonly callbacks: CompilerCallbacks) {
145147
this.details = {};
146148
this.childFiles = [];
147-
this.id = id;
148-
this.filename = filename;
149-
this.filePath = filePath;
150-
this.fileVersion = fileVersion;
151-
this.fileType = fileType;
152-
}
153-
getFileType() {
154-
return KeymanFileTypes.sourceTypeFromFilename(this.filename);
155149
}
156150
};
157151

158152
export type KeymanDeveloperProjectFileType20 = KeymanFileTypes.Source;
159153

160-
export class KeymanDeveloperProjectFile20 {
161-
readonly filename: string;
162-
readonly filePath: string;
163-
/**
164-
* file extension of filename, but .model.ts is technically not the ext because of 2 periods
165-
* @deprecated TODO: remove this from 2.0 or make it private
166-
*/
167-
readonly fileType: KeymanFileTypes.Source;
168-
constructor(filePath: string, private callbacks: CompilerCallbacks) {
169-
this.filename = this.callbacks.path.basename(filePath);
170-
this.filePath = filePath;
171-
this.fileType = KeymanFileTypes.sourceTypeFromFilename(this.filename);
154+
export class KeymanDeveloperProjectFile20 implements KeymanDeveloperProjectFile {
155+
get filename(): string {
156+
return this.callbacks.path.basename(this.filePath);
157+
}
158+
get fileType() {
159+
return KeymanFileTypes.fromFilename(this.filename);
172160
}
173-
getFileType() {
174-
return this.fileType;
161+
constructor(public readonly filePath: string, private readonly callbacks: CompilerCallbacks) {
175162
}
176163
};
177164

common/web/types/src/kpj/kpj-file-reader.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,9 @@ export class KPJFileReader {
8888
for (let sourceFile of project.Files?.File) {
8989
let file: KeymanDeveloperProjectFile10 = new KeymanDeveloperProjectFile10(
9090
sourceFile.ID || '',
91-
sourceFile.Filename || '',
9291
(sourceFile.Filepath || '').replace(/\\/g, '/'),
9392
sourceFile.FileVersion || '',
94-
sourceFile.FileType || ''
93+
this.callbacks
9594
);
9695
if (sourceFile.Details) {
9796
file.details.copyright = sourceFile.Details.Copyright;

common/web/types/src/util/file-types.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,31 @@ export type All = Source | Binary;
6868
*/
6969
export type Any = string;
7070

71+
/**
72+
* Gets the file type based on extension, dealing with multi-part file
73+
* extensions. Does not sniff contents of file or assume file existence. Does
74+
* transform upper-cased file extensions to lower-case.
75+
* @param filename
76+
* @returns file extension, or `""` if no extension. Note that this return value
77+
* differs from the other, more-specific fromFilename functions below,
78+
* which return `null` if a supported extension is not found.
79+
*/
80+
export function fromFilename(filename: string): Binary | Source | Any {
81+
const result =
82+
sourceOrBinaryTypeFromFilename(filename) ??
83+
filename.match(/\.[^\.]+$/)?.[0] ??
84+
"";
85+
return result;
86+
}
87+
7188
/**
7289
* Gets the file type based on extension, dealing with multi-part file
7390
* extensions. Does not sniff contents of file or assume file existence.
7491
* Does transform upper-cased file extensions to lower-case.
7592
* @param filename
7693
* @returns file type, or `null` if not found
7794
*/
78-
export function fromFilename(filename: string): Binary | Source {
95+
export function sourceOrBinaryTypeFromFilename(filename: string): Binary | Source {
7996
filename = filename.toLowerCase();
8097
const result =
8198
ALL_SOURCE.find(type => filename.endsWith(type)) ??

developer/src/kmc/src/commands/buildClasses/BuildKeyboardInfo.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ export class BuildKeyboardInfo extends BuildActivity {
8181
}
8282

8383
function findProjectFile(callbacks: CompilerCallbacks, project: KeymanDeveloperProject, ext: KeymanFileTypes.Source) {
84-
const file = project.files.find(file => file.getFileType() == ext);
84+
const file = project.files.find(file => file.fileType == ext);
8585
if(!file) {
8686
callbacks.reportMessage(InfrastructureMessages.Error_FileTypeNotFound({ext}));
8787
}

developer/src/kmc/src/commands/buildClasses/BuildModelInfo.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,19 @@ export class BuildModelInfo extends BuildActivity {
3535
return false;
3636
}
3737

38-
const metadata = project.files.find(file => file.getFileType() == KeymanFileTypes.Source.ModelInfo);
38+
const metadata = project.files.find(file => file.fileType == KeymanFileTypes.Source.ModelInfo);
3939
if(!metadata) {
4040
callbacks.reportMessage(InfrastructureMessages.Error_FileTypeNotFound({ext: KeymanFileTypes.Source.ModelInfo}));
4141
return false;
4242
}
4343

44-
const model = project.files.find(file => file.getFileType() == KeymanFileTypes.Source.Model);
44+
const model = project.files.find(file => file.fileType == KeymanFileTypes.Source.Model);
4545
if(!model) {
4646
callbacks.reportMessage(InfrastructureMessages.Error_FileTypeNotFound({ext: KeymanFileTypes.Source.Model}));
4747
return false;
4848
}
4949

50-
const kps = project.files.find(file => file.getFileType() == KeymanFileTypes.Source.Package);
50+
const kps = project.files.find(file => file.fileType == KeymanFileTypes.Source.Package);
5151
if(!kps) {
5252
callbacks.reportMessage(InfrastructureMessages.Error_FileTypeNotFound({ext: KeymanFileTypes.Source.Package}));
5353
return false;

0 commit comments

Comments
 (0)