Skip to content

Commit cbce07d

Browse files
committed
fix: media directory & add profile directory
1 parent e5eba7e commit cbce07d

File tree

10 files changed

+132
-19
lines changed

10 files changed

+132
-19
lines changed

index.d.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ export declare class ElementJsonFileReference {
3434
}
3535

3636
export declare class MediaDirectory {
37-
static from(resource: Resource): MediaDirectory | null
37+
static from(resourceDirectory: ResourceDirectory): MediaDirectory | null
3838
getUri(): Uri
39-
getResource(): Resource
39+
getResourceDirectory(): ResourceDirectory
4040
findAll(): Array<Uri>
4141
}
4242

@@ -64,6 +64,13 @@ export declare class Product {
6464
getResourceDirectories(): Array<Uri>
6565
}
6666

67+
export declare class ProfileDirectory {
68+
static from(resourceDirectory: ResourceDirectory): ProfileDirectory | null
69+
getUri(): Uri
70+
getResourceDirectory(): ResourceDirectory
71+
findAll(): Array<Uri>
72+
}
73+
6774
export declare class Project {
6875
getProjectDetector(): ProjectDetector
6976
static findAll(projectDetector: ProjectDetector): Array<Project>

index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -557,13 +557,14 @@ if (!nativeBinding) {
557557
throw new Error(`Failed to load native binding`)
558558
}
559559

560-
const { ElementDirectory, ElementJsonFile, ElementJsonFileReference, MediaDirectory, Module, Product, Project, ProjectDetector, QualifierUtils, RawfileDirectory, ResfileDirectory, Resource, ResourceDirectory, Uri, QualifierType } = nativeBinding
560+
const { ElementDirectory, ElementJsonFile, ElementJsonFileReference, MediaDirectory, Module, Product, ProfileDirectory, Project, ProjectDetector, QualifierUtils, RawfileDirectory, ResfileDirectory, Resource, ResourceDirectory, Uri, QualifierType } = nativeBinding
561561
export { ElementDirectory }
562562
export { ElementJsonFile }
563563
export { ElementJsonFileReference }
564564
export { MediaDirectory }
565565
export { Module }
566566
export { Product }
567+
export { ProfileDirectory }
567568
export { Project }
568569
export { ProjectDetector }
569570
export { QualifierUtils }

project-detector.wasi-browser.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ export const ElementJsonFileReference = __napiModule.exports.ElementJsonFileRefe
6262
export const MediaDirectory = __napiModule.exports.MediaDirectory
6363
export const Module = __napiModule.exports.Module
6464
export const Product = __napiModule.exports.Product
65+
export const ProfileDirectory = __napiModule.exports.ProfileDirectory
6566
export const Project = __napiModule.exports.Project
6667
export const ProjectDetector = __napiModule.exports.ProjectDetector
6768
export const QualifierUtils = __napiModule.exports.QualifierUtils

project-detector.wasi.cjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ module.exports.ElementJsonFileReference = __napiModule.exports.ElementJsonFileRe
114114
module.exports.MediaDirectory = __napiModule.exports.MediaDirectory
115115
module.exports.Module = __napiModule.exports.Module
116116
module.exports.Product = __napiModule.exports.Product
117+
module.exports.ProfileDirectory = __napiModule.exports.ProfileDirectory
117118
module.exports.Project = __napiModule.exports.Project
118119
module.exports.ProjectDetector = __napiModule.exports.ProjectDetector
119120
module.exports.QualifierUtils = __napiModule.exports.QualifierUtils

src/node/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export * from './interfaces'
55
export * from './media-directory'
66
export * from './module'
77
export * from './product'
8+
export * from './profile-directory'
89
export * from './project'
910
export * from './project-detector'
1011
export * from './rawfile-directory'

src/node/media-directory.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { Uri } from '../../index'
22
import type { ProjectDetector } from './project-detector'
3-
import type { Resource } from './resource'
3+
import type { ResourceDirectory } from './resource-directory'
44
import { signal } from 'alien-signals'
55
import { MediaDirectory as RustMediaDirectory } from '../../index'
66
import { DisposableSignal } from './types'
@@ -15,21 +15,21 @@ export namespace MediaDirectory {
1515
return null
1616
return {
1717
getUri: () => mediaDirectory.getUri(),
18-
getResource: () => mediaDirectory.getResource(),
18+
getResourceDirectory: () => mediaDirectory.getResourceDirectory(),
1919
findAll: () => mediaDirectory.findAll(),
2020
getUnderlyingMediaDirectory: () => mediaDirectory,
2121
}
2222
}
2323

24-
export function from(resource: Resource): DisposableSignal<MediaDirectory | null> {
25-
const mediaDirectory = signal<MediaDirectory | null>(fromRustMediaDirectory(RustMediaDirectory.from(resource.getUnderlyingResource())))
24+
export function from(resourceDirectory: ResourceDirectory): DisposableSignal<MediaDirectory | null> {
25+
const mediaDirectory = signal<MediaDirectory | null>(fromRustMediaDirectory(RustMediaDirectory.from(resourceDirectory.getUnderlyingResourceDirectory())))
2626

2727
const handle = (event: keyof ProjectDetector.EventMap, uri: Uri) => {
28-
if (uri.isEqual(resource.getUri())) {
28+
if (uri.isEqual(resourceDirectory.getUri())) {
2929
switch (event) {
3030
case 'file-created':
3131
case 'file-changed':
32-
mediaDirectory(fromRustMediaDirectory(RustMediaDirectory.from(resource.getUnderlyingResource())))
32+
mediaDirectory(fromRustMediaDirectory(RustMediaDirectory.from(resourceDirectory.getUnderlyingResourceDirectory())))
3333
break
3434
case 'file-deleted':
3535
mediaDirectory(null)
@@ -41,11 +41,11 @@ export namespace MediaDirectory {
4141
const mediaFileUris = mediaDirectory()?.findAll() ?? []
4242
const existingMediaFileIndex = mediaFileUris.findIndex(mediaFileUri => mediaFileUri.isEqual(uri))
4343
if (existingMediaFileIndex !== -1) {
44-
mediaDirectory(fromRustMediaDirectory(RustMediaDirectory.from(resource.getUnderlyingResource())))
44+
mediaDirectory(fromRustMediaDirectory(RustMediaDirectory.from(resourceDirectory.getUnderlyingResourceDirectory())))
4545
}
4646
}
4747

48-
resource.getProduct().getModule().getProject().getProjectDetector().on('*', handle)
49-
return DisposableSignal.fromSignal(mediaDirectory, () => resource.getProduct().getModule().getProject().getProjectDetector().off('*', handle))
48+
resourceDirectory.getResource().getProduct().getModule().getProject().getProjectDetector().on('*', handle)
49+
return DisposableSignal.fromSignal(mediaDirectory, () => resourceDirectory.getResource().getProduct().getModule().getProject().getProjectDetector().off('*', handle))
5050
}
5151
}

src/node/profile-directory.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import type { Uri } from '../../index'
2+
import type { ProjectDetector } from './project-detector'
3+
import type { ResourceDirectory } from './resource-directory'
4+
import { signal } from 'alien-signals'
5+
import { ProfileDirectory as RustProfileDirectory } from '../../index'
6+
import { DisposableSignal } from './types'
7+
8+
export interface ProfileDirectory extends RustProfileDirectory {
9+
getUnderlyingProfileDirectory(): RustProfileDirectory
10+
}
11+
12+
export namespace ProfileDirectory {
13+
function fromRustProfileDirectory(profileDirectory: RustProfileDirectory | null): ProfileDirectory | null {
14+
if (!profileDirectory)
15+
return null
16+
return {
17+
getUri: () => profileDirectory.getUri(),
18+
getResourceDirectory: () => profileDirectory.getResourceDirectory(),
19+
findAll: () => profileDirectory.findAll(),
20+
getUnderlyingProfileDirectory: () => profileDirectory,
21+
}
22+
}
23+
24+
export function from(resourceDirectory: ResourceDirectory): DisposableSignal<ProfileDirectory | null> {
25+
const profileDirectory = signal<ProfileDirectory | null>(fromRustProfileDirectory(RustProfileDirectory.from(resourceDirectory.getUnderlyingResourceDirectory())))
26+
27+
const handle = (event: keyof ProjectDetector.EventMap, uri: Uri) => {
28+
if (uri.isEqual(resourceDirectory.getUri())) {
29+
switch (event) {
30+
case 'file-created':
31+
case 'file-changed':
32+
profileDirectory(fromRustProfileDirectory(RustProfileDirectory.from(resourceDirectory.getUnderlyingResourceDirectory())))
33+
break
34+
case 'file-deleted':
35+
profileDirectory(null)
36+
break
37+
}
38+
return
39+
}
40+
41+
const profileUris = profileDirectory()?.findAll() ?? []
42+
const existingProfileIndex = profileUris.findIndex(profileUri => profileUri.isEqual(uri))
43+
if (existingProfileIndex !== -1) {
44+
profileDirectory(fromRustProfileDirectory(RustProfileDirectory.from(resourceDirectory.getUnderlyingResourceDirectory())))
45+
}
46+
}
47+
48+
resourceDirectory.getResource().getProduct().getModule().getProject().getProjectDetector().on('*', handle)
49+
return DisposableSignal.fromSignal(profileDirectory, () => resourceDirectory.getResource().getProduct().getModule().getProject().getProjectDetector().off('*', handle))
50+
}
51+
}

src/rust/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ pub mod resfile_directory;
1111
pub mod resource;
1212
pub mod resource_directory;
1313
pub mod utils;
14+
pub mod profile_directory;

src/rust/media_directory.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
1-
use crate::{resource::Resource, utils::uri::Uri};
1+
use crate::{resource_directory::ResourceDirectory, utils::uri::Uri};
22
use napi::{bindgen_prelude::Reference, Env};
33
use napi_derive::napi;
44
use std::{fs, path::Path};
55

66
#[napi]
77
pub struct MediaDirectory {
88
uri: Uri,
9-
resource: Reference<Resource>,
9+
resource_directory: Reference<ResourceDirectory>,
1010
}
1111

1212
#[napi]
1313
impl MediaDirectory {
1414
#[napi]
15-
pub fn from(resource: Reference<Resource>) -> Option<MediaDirectory> {
16-
let uri = Uri::file(Path::new(&resource.get_uri().fs_path()).join("media").to_string_lossy().to_string());
15+
pub fn from(resource_directory: Reference<ResourceDirectory>) -> Option<MediaDirectory> {
16+
let uri = Uri::file(Path::new(&resource_directory.get_uri().fs_path()).join("media").to_string_lossy().to_string());
1717
if !fs::metadata(uri.fs_path()).map(|metadata| metadata.is_dir()).unwrap_or(false) {
1818
return None;
1919
}
2020

21-
Some(Self { uri, resource })
21+
Some(Self { uri, resource_directory })
2222
}
2323

2424
#[napi]
@@ -27,8 +27,8 @@ impl MediaDirectory {
2727
}
2828

2929
#[napi]
30-
pub fn get_resource(&self, env: Env) -> Reference<Resource> {
31-
self.resource.clone(env).unwrap()
30+
pub fn get_resource_directory(&self, env: Env) -> Reference<ResourceDirectory> {
31+
self.resource_directory.clone(env).unwrap()
3232
}
3333

3434
#[napi]

src/rust/profile_directory.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
use std::{fs, path::Path};
2+
use crate::{resource_directory::ResourceDirectory, utils::uri::Uri};
3+
use napi::{bindgen_prelude::Reference, Env};
4+
use napi_derive::napi;
5+
6+
#[napi]
7+
pub struct ProfileDirectory {
8+
uri: Uri,
9+
resource_directory: Reference<ResourceDirectory>,
10+
}
11+
12+
#[napi]
13+
impl ProfileDirectory {
14+
#[napi]
15+
pub fn from(resource_directory: Reference<ResourceDirectory>) -> Option<ProfileDirectory> {
16+
let uri = Uri::file(Path::new(&resource_directory.get_uri().fs_path()).join("profile").to_string_lossy().to_string());
17+
if !fs::metadata(uri.fs_path()).map(|metadata| metadata.is_dir()).unwrap_or(false) {
18+
return None;
19+
}
20+
21+
Some(Self { uri, resource_directory })
22+
}
23+
24+
#[napi]
25+
pub fn get_uri(&self) -> Uri {
26+
self.uri.clone()
27+
}
28+
29+
#[napi]
30+
pub fn get_resource_directory(&self, env: Env) -> Reference<ResourceDirectory> {
31+
self.resource_directory.clone(env).unwrap()
32+
}
33+
34+
#[napi]
35+
pub fn find_all(&self) -> Vec<Uri> {
36+
let mut profile_directories = Vec::new();
37+
let profiles = match fs::read_dir(self.uri.fs_path()) {
38+
Ok(profiles) => profiles,
39+
Err(_) => return profile_directories,
40+
};
41+
42+
for profile in profiles.flatten() {
43+
if profile.metadata().map(|metadata| metadata.is_dir()).unwrap_or(false) {
44+
profile_directories.push(Uri::file(profile.path().to_string_lossy().to_string()));
45+
}
46+
}
47+
48+
profile_directories
49+
}
50+
}

0 commit comments

Comments
 (0)