electron-webauthn 0.0.5 → 0.0.7

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.
Files changed (87) hide show
  1. package/README.md +6 -257
  2. package/dist/example.d.ts +2 -0
  3. package/dist/example.d.ts.map +1 -0
  4. package/dist/example.js +24 -0
  5. package/dist/example.js.map +1 -0
  6. package/dist/helper.js +23 -0
  7. package/dist/index.d.ts +12 -4
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +46 -8
  10. package/dist/index.js.map +1 -1
  11. package/dist/objc/auth-services.js +28 -0
  12. package/dist/objc/authentication-services/as-authorization-controller-delegate.d.ts +53 -0
  13. package/dist/objc/authentication-services/as-authorization-controller-delegate.d.ts.map +1 -0
  14. package/dist/objc/authentication-services/as-authorization-controller-delegate.js +41 -0
  15. package/dist/objc/authentication-services/as-authorization-controller-delegate.js.map +1 -0
  16. package/dist/objc/authentication-services/as-authorization-controller-presentation-context-providing.d.ts +42 -0
  17. package/dist/objc/authentication-services/as-authorization-controller-presentation-context-providing.d.ts.map +1 -0
  18. package/dist/objc/authentication-services/as-authorization-controller-presentation-context-providing.js +32 -0
  19. package/dist/objc/authentication-services/as-authorization-controller-presentation-context-providing.js.map +1 -0
  20. package/dist/objc/authentication-services/as-authorization-controller.d.ts +28 -0
  21. package/dist/objc/authentication-services/as-authorization-controller.d.ts.map +1 -0
  22. package/dist/objc/authentication-services/as-authorization-controller.js +13 -0
  23. package/dist/objc/authentication-services/as-authorization-controller.js.map +1 -0
  24. package/dist/objc/authentication-services/as-authorization-platform-public-key-credential-provider.d.ts +22 -0
  25. package/dist/objc/authentication-services/as-authorization-platform-public-key-credential-provider.d.ts.map +1 -0
  26. package/dist/objc/authentication-services/as-authorization-platform-public-key-credential-provider.js +13 -0
  27. package/dist/objc/authentication-services/as-authorization-platform-public-key-credential-provider.js.map +1 -0
  28. package/dist/objc/authentication-services/index.d.ts +3 -0
  29. package/dist/objc/authentication-services/index.d.ts.map +1 -0
  30. package/dist/objc/authentication-services/index.js +4 -0
  31. package/dist/objc/authentication-services/index.js.map +1 -0
  32. package/dist/objc/foundation/helpers.js +142 -0
  33. package/dist/objc/foundation/index.d.ts +3 -0
  34. package/dist/objc/foundation/index.d.ts.map +1 -0
  35. package/dist/objc/foundation/index.js +4 -0
  36. package/dist/objc/foundation/index.js.map +1 -0
  37. package/dist/objc/foundation/main.js +4 -0
  38. package/dist/objc/foundation/nsarray.d.ts +18 -0
  39. package/dist/objc/foundation/nsarray.d.ts.map +1 -0
  40. package/dist/objc/foundation/nsarray.js +16 -0
  41. package/dist/objc/foundation/nsarray.js.map +1 -0
  42. package/dist/objc/foundation/nsdata.d.ts +109 -0
  43. package/dist/objc/foundation/nsdata.d.ts.map +1 -0
  44. package/dist/objc/foundation/nsdata.js +120 -0
  45. package/dist/objc/foundation/nsdata.js.map +1 -0
  46. package/dist/objc/foundation/nserror.d.ts +32 -0
  47. package/dist/objc/foundation/nserror.d.ts.map +1 -0
  48. package/dist/objc/foundation/nserror.js +71 -0
  49. package/dist/objc/foundation/nserror.js.map +1 -0
  50. package/dist/objc/foundation/nsstring.d.ts +15 -0
  51. package/dist/objc/foundation/nsstring.d.ts.map +1 -0
  52. package/dist/objc/foundation/nsstring.js +12 -0
  53. package/dist/objc/foundation/nsstring.js.map +1 -0
  54. package/dist/objc/foundation/nsvalue.js +2 -0
  55. package/dist/objc/foundation/nsview.d.ts +7 -0
  56. package/dist/objc/foundation/nsview.d.ts.map +1 -0
  57. package/dist/objc/foundation/nsview.js +3 -0
  58. package/dist/objc/foundation/nsview.js.map +1 -0
  59. package/dist/objc/foundation/nswindow.d.ts +5 -0
  60. package/dist/objc/foundation/nswindow.d.ts.map +1 -0
  61. package/dist/objc/foundation/nswindow.js +3 -0
  62. package/dist/objc/foundation/nswindow.js.map +1 -0
  63. package/dist/objc/foundation.js +28 -0
  64. package/dist/objc/helpers.d.ts +21 -0
  65. package/dist/objc/helpers.d.ts.map +1 -0
  66. package/dist/objc/helpers.js +32 -0
  67. package/dist/objc/helpers.js.map +1 -0
  68. package/dist/test/example.d.ts +2 -0
  69. package/dist/test/example.d.ts.map +1 -0
  70. package/dist/test/example.js +24 -0
  71. package/dist/test/example.js.map +1 -0
  72. package/dist/test/index.d.ts +2 -0
  73. package/dist/test/index.d.ts.map +1 -0
  74. package/dist/test/index.js +9 -0
  75. package/dist/test/index.js.map +1 -0
  76. package/dist/test/window.d.ts +5 -0
  77. package/dist/test/window.d.ts.map +1 -0
  78. package/dist/test/window.js +58 -0
  79. package/dist/test/window.js.map +1 -0
  80. package/dist/window.d.ts +5 -0
  81. package/dist/window.d.ts.map +1 -0
  82. package/dist/window.js +58 -0
  83. package/dist/window.js.map +1 -0
  84. package/package.json +23 -41
  85. package/LICENSE +0 -21
  86. package/index.d.ts +0 -68
  87. package/index.js +0 -316
@@ -0,0 +1,28 @@
1
+ import type { NobjcObject } from "objc-js";
2
+ declare class _ASAuthorizationController extends NobjcObject {
3
+ /**
4
+ * ASAuthorizationController.init(authorizationRequests: NSArray<ASAuthorizationRequest>)
5
+ * @private Do not use this method directly.
6
+ */
7
+ initWithAuthorizationRequests$(authorizationRequests: NobjcObject): _ASAuthorizationController;
8
+ /**
9
+ * ASAuthorizationController.performRequests()
10
+ */
11
+ performRequests(): void;
12
+ performRequestsWithOptions$(options: NobjcObject): void;
13
+ performAutoFillAssistedRequests(): void;
14
+ cancel(): void;
15
+ setDelegate$(delegate: NobjcObject): void;
16
+ delegate(): NobjcObject;
17
+ setPresentationContextProvider$(provider: NobjcObject): void;
18
+ presentationContextProvider(): NobjcObject;
19
+ }
20
+ export declare const ASAuthorizationController: typeof _ASAuthorizationController;
21
+ /**
22
+ * Create an ASAuthorizationController instance
23
+ * @param authorizationRequests An NSArray of authorization requests
24
+ * @returns An initialized controller instance
25
+ */
26
+ export declare function createAuthorizationController(authorizationRequests: NobjcObject): _ASAuthorizationController;
27
+ export {};
28
+ //# sourceMappingURL=as-authorization-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"as-authorization-controller.d.ts","sourceRoot":"","sources":["../../../src/objc/authentication-services/as-authorization-controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,OAAO,OAAO,0BAA2B,SAAQ,WAAW;IAC1D;;;OAGG;IACH,8BAA8B,CAC5B,qBAAqB,EAAE,WAAW,GACjC,0BAA0B;IAE7B;;OAEG;IACH,eAAe,IAAI,IAAI;IAGvB,2BAA2B,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAGvD,+BAA+B,IAAI,IAAI;IAGvC,MAAM,IAAI,IAAI;IAGd,YAAY,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IACzC,QAAQ,IAAI,WAAW;IAGvB,+BAA+B,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAC5D,2BAA2B,IAAI,WAAW;CAC3C;AAED,eAAO,MAAM,yBAAyB,EAC2B,OAAO,0BAA0B,CAAC;AAInG;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,qBAAqB,EAAE,WAAW,GACjC,0BAA0B,CAG5B"}
@@ -0,0 +1,13 @@
1
+ import { AuthenticationServices } from "./index.js";
2
+ export const ASAuthorizationController = AuthenticationServices.ASAuthorizationController;
3
+ // Helper Functions
4
+ /**
5
+ * Create an ASAuthorizationController instance
6
+ * @param authorizationRequests An NSArray of authorization requests
7
+ * @returns An initialized controller instance
8
+ */
9
+ export function createAuthorizationController(authorizationRequests) {
10
+ const instance = ASAuthorizationController.alloc();
11
+ return instance.initWithAuthorizationRequests$(authorizationRequests);
12
+ }
13
+ //# sourceMappingURL=as-authorization-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"as-authorization-controller.js","sourceRoot":"","sources":["../../../src/objc/authentication-services/as-authorization-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAoCpD,MAAM,CAAC,MAAM,yBAAyB,GACpC,sBAAsB,CAAC,yBAAyE,CAAC;AAEnG,mBAAmB;AAEnB;;;;GAIG;AACH,MAAM,UAAU,6BAA6B,CAC3C,qBAAkC;IAElC,MAAM,QAAQ,GAAI,yBAAiC,CAAC,KAAK,EAAE,CAAC;IAC5D,OAAO,QAAQ,CAAC,8BAA8B,CAAC,qBAAqB,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { NobjcObject } from "objc-js";
2
+ declare class _ASAuthorizationPlatformPublicKeyCredentialProvider extends NobjcObject {
3
+ /**
4
+ * ASAuthorizationPlatformPublicKeyCredentialProvider.init(relyingPartyIdentifier: String)
5
+ * @private Do not use this method directly.
6
+ */
7
+ initWithRelyingPartyIdentifier$(relyingPartyIdentifier: NobjcObject): _ASAuthorizationPlatformPublicKeyCredentialProvider;
8
+ createCredentialRegistrationRequestWithChallenge$name$userID$(challenge: NobjcObject, name: NobjcObject, userID: NobjcObject): NobjcObject;
9
+ /**
10
+ * ASAuthorizationPlatformPublicKeyCredentialProvider.createCredentialAssertionRequest(challenge: NSData)
11
+ */
12
+ createCredentialAssertionRequestWithChallenge$(challenge: NobjcObject): NobjcObject;
13
+ }
14
+ export declare const ASAuthorizationPlatformPublicKeyCredentialProvider: typeof _ASAuthorizationPlatformPublicKeyCredentialProvider;
15
+ /**
16
+ * Create an ASAuthorizationPlatformPublicKeyCredentialProvider instance
17
+ * @param relyingPartyIdentifier The relying party identifier (domain)
18
+ * @returns An initialized provider instance
19
+ */
20
+ export declare function createPlatformPublicKeyCredentialProvider(relyingPartyIdentifier: NobjcObject): _ASAuthorizationPlatformPublicKeyCredentialProvider;
21
+ export {};
22
+ //# sourceMappingURL=as-authorization-platform-public-key-credential-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"as-authorization-platform-public-key-credential-provider.d.ts","sourceRoot":"","sources":["../../../src/objc/authentication-services/as-authorization-platform-public-key-credential-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,OAAO,OAAO,mDAAoD,SAAQ,WAAW;IACnF;;;OAGG;IACH,+BAA+B,CAC7B,sBAAsB,EAAE,WAAW,GAClC,mDAAmD;IAGtD,6DAA6D,CAC3D,SAAS,EAAE,WAAW,EACtB,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,WAAW,GAClB,WAAW;IAEd;;OAEG;IACH,8CAA8C,CAC5C,SAAS,EAAE,WAAW,GACrB,WAAW;CACf;AAED,eAAO,MAAM,kDAAkD,EAC2B,OAAO,mDAAmD,CAAC;AAIrJ;;;;GAIG;AACH,wBAAgB,yCAAyC,CACvD,sBAAsB,EAAE,WAAW,GAClC,mDAAmD,CAKrD"}
@@ -0,0 +1,13 @@
1
+ import { AuthenticationServices } from "./index.js";
2
+ export const ASAuthorizationPlatformPublicKeyCredentialProvider = AuthenticationServices.ASAuthorizationPlatformPublicKeyCredentialProvider;
3
+ // Helper Functions
4
+ /**
5
+ * Create an ASAuthorizationPlatformPublicKeyCredentialProvider instance
6
+ * @param relyingPartyIdentifier The relying party identifier (domain)
7
+ * @returns An initialized provider instance
8
+ */
9
+ export function createPlatformPublicKeyCredentialProvider(relyingPartyIdentifier) {
10
+ const instance = ASAuthorizationPlatformPublicKeyCredentialProvider.alloc();
11
+ return instance.initWithRelyingPartyIdentifier$(relyingPartyIdentifier);
12
+ }
13
+ //# sourceMappingURL=as-authorization-platform-public-key-credential-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"as-authorization-platform-public-key-credential-provider.js","sourceRoot":"","sources":["../../../src/objc/authentication-services/as-authorization-platform-public-key-credential-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AA4BpD,MAAM,CAAC,MAAM,kDAAkD,GAC7D,sBAAsB,CAAC,kDAA2H,CAAC;AAErJ,mBAAmB;AAEnB;;;;GAIG;AACH,MAAM,UAAU,yCAAyC,CACvD,sBAAmC;IAEnC,MAAM,QAAQ,GACZ,kDACD,CAAC,KAAK,EAAE,CAAC;IACV,OAAO,QAAQ,CAAC,+BAA+B,CAAC,sBAAsB,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { NobjcLibrary } from "objc-js";
2
+ export declare const AuthenticationServices: NobjcLibrary;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/objc/authentication-services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,eAAO,MAAM,sBAAsB,cAElC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { NobjcLibrary } from "objc-js";
2
+ // Load the framework
3
+ export const AuthenticationServices = new NobjcLibrary("/System/Library/Frameworks/AuthenticationServices.framework/AuthenticationServices");
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/objc/authentication-services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,qBAAqB;AACrB,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,YAAY,CACpD,oFAAoF,CACrF,CAAC"}
@@ -0,0 +1,142 @@
1
+ import { NSArray, NSData, NSString } from "./main";
2
+ /**
3
+ * Foundation Framework Helpers
4
+ *
5
+ * This module provides convenient helper functions for working with
6
+ * Foundation framework objects in JavaScript/TypeScript.
7
+ *
8
+ * Key features:
9
+ * - NSString: String conversion helpers
10
+ * - NSData: Data conversion between Objective-C and JavaScript
11
+ * - NSArray: Array creation and manipulation
12
+ */
13
+ /**
14
+ * NSData to Buffer Conversion Methods
15
+ *
16
+ * Two methods are provided for converting NSData to JavaScript Buffers:
17
+ *
18
+ * 1. bufferFromNSData (base64): Uses base64 as an intermediate format.
19
+ * - Most reliable and compatible
20
+ * - Recommended for general use
21
+ * - Slight overhead due to base64 encoding/decoding
22
+ *
23
+ * 2. bufferFromNSDataDirect (direct): Uses getBytes:length: for direct memory copy.
24
+ * - More efficient for large data
25
+ * - Direct memory access
26
+ * - May have compatibility issues with some nobjc versions
27
+ */
28
+ /**
29
+ * Convert NSData to a JavaScript Buffer using base64 encoding
30
+ * This is the most reliable method for data conversion.
31
+ * @param data The NSData object
32
+ * @returns A Buffer containing the data
33
+ */
34
+ export function bufferFromNSData(data) {
35
+ const nsData = data;
36
+ const length = nsData.length();
37
+ if (length === 0) {
38
+ return Buffer.alloc(0);
39
+ }
40
+ // Use base64 encoding as a reliable bridge between NSData and JS Buffer
41
+ const base64String = nsData.base64EncodedStringWithOptions$(0);
42
+ const base64Str = base64String.UTF8String();
43
+ return Buffer.from(base64Str, "base64");
44
+ }
45
+ /**
46
+ * Convert NSData to a JavaScript Buffer using direct memory copy
47
+ * This method uses getBytes:length: for direct memory access.
48
+ * May be more efficient for large data, but requires proper buffer allocation.
49
+ * @param data The NSData object
50
+ * @returns A Buffer containing the data
51
+ */
52
+ export function bufferFromNSDataDirect(data) {
53
+ const nsData = data;
54
+ const length = nsData.length();
55
+ if (length === 0) {
56
+ return Buffer.alloc(0);
57
+ }
58
+ // Allocate a buffer and copy bytes directly
59
+ const buffer = Buffer.alloc(length);
60
+ nsData.getBytes$length$(buffer, length);
61
+ return buffer;
62
+ }
63
+ /**
64
+ * Convert NSData to a JavaScript Uint8Array
65
+ * @param data The NSData object
66
+ * @returns A Uint8Array containing the data
67
+ */
68
+ export function uint8ArrayFromNSData(data) {
69
+ const buffer = bufferFromNSData(data);
70
+ return new Uint8Array(buffer);
71
+ }
72
+ /**
73
+ * Convert NSData to a base64 string
74
+ * @param data The NSData object
75
+ * @returns A base64-encoded string
76
+ */
77
+ export function base64FromNSData(data) {
78
+ const nsData = data;
79
+ const nsString = nsData.base64EncodedStringWithOptions$(0);
80
+ return nsString.UTF8String();
81
+ }
82
+ /**
83
+ * Create NSData from a base64 string
84
+ * @param base64String The base64-encoded string
85
+ * @returns An NSData object
86
+ */
87
+ export function NSDataFromBase64(base64String) {
88
+ const nsString = NSString.stringWithUTF8String$(base64String);
89
+ const nsData = NSData.alloc();
90
+ return nsData.initWithBase64EncodedString$options$(nsString, 0);
91
+ }
92
+ /**
93
+ * Get the length of NSData
94
+ * @param data The NSData object
95
+ * @returns The length in bytes
96
+ */
97
+ export function NSDataLength(data) {
98
+ const nsData = data;
99
+ return nsData.length();
100
+ }
101
+ /**
102
+ * Create a copy of NSData
103
+ * @param data The NSData object
104
+ * @returns A new NSData object with copied data
105
+ */
106
+ export function NSDataCopy(data) {
107
+ return NSData.dataWithData$(data);
108
+ }
109
+ /**
110
+ * Compare two NSData objects for equality
111
+ * @param data1 The first NSData object
112
+ * @param data2 The second NSData object
113
+ * @returns True if the data is equal
114
+ */
115
+ export function NSDataIsEqual(data1, data2) {
116
+ const nsData1 = data1;
117
+ return nsData1.isEqualToData$(data2);
118
+ }
119
+ /**
120
+ * Extract a subrange of NSData
121
+ * Note: This method may not work with all versions of nobjc due to NSRange struct limitations.
122
+ * As an alternative, convert to Buffer, slice, and convert back.
123
+ * @param data The NSData object
124
+ * @param location The starting position
125
+ * @param length The number of bytes to extract
126
+ * @returns A new NSData object containing the subdata
127
+ */
128
+ export function NSDataSubdata(data, location, length) {
129
+ // Workaround: Convert to buffer, slice, and convert back
130
+ // This avoids the NSRange struct issue with nobjc
131
+ const buffer = bufferFromNSData(data);
132
+ const slicedBuffer = buffer.subarray(location, location + length);
133
+ return NSDataFromBuffer(slicedBuffer);
134
+ }
135
+ // NSArray helpers
136
+ export function NSArrayFromObjects(objects) {
137
+ let array = NSArray.array();
138
+ for (const obj of objects) {
139
+ array = array.arrayByAddingObject$(obj);
140
+ }
141
+ return array;
142
+ }
@@ -0,0 +1,3 @@
1
+ import { NobjcLibrary } from "objc-js";
2
+ export declare const Foundation: NobjcLibrary;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/objc/foundation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,eAAO,MAAM,UAAU,cAEtB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { NobjcLibrary } from "objc-js";
2
+ // Load the framework
3
+ export const Foundation = new NobjcLibrary("/System/Library/Frameworks/Foundation.framework/Foundation");
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/objc/foundation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,qBAAqB;AACrB,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,YAAY,CACxC,4DAA4D,CAC7D,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { NobjcLibrary, NobjcObject } from "@iamevan/nobjc";
2
+ // Load the Foundation framework
3
+ export const Foundation = new NobjcLibrary("/System/Library/Frameworks/Foundation.framework/Foundation");
4
+ export const NSArray = Foundation.NSArray;
@@ -0,0 +1,18 @@
1
+ import type { NobjcObject } from "objc-js";
2
+ declare class _NSArray extends NobjcObject {
3
+ static arrayWithObject$(object: NobjcObject): _NSArray;
4
+ static arrayWithArray$(array: _NSArray): _NSArray;
5
+ static array(): _NSArray;
6
+ count(): number;
7
+ objectAtIndex$(index: number): NobjcObject;
8
+ arrayByAddingObject$(object: NobjcObject): _NSArray;
9
+ }
10
+ export declare const NSArray: typeof _NSArray;
11
+ /**
12
+ * Create an NSArray from an array of objects
13
+ * @param objects The array of objects
14
+ * @returns An NSArray object
15
+ */
16
+ export declare function NSArrayFromObjects(objects: NobjcObject[]): _NSArray;
17
+ export {};
18
+ //# sourceMappingURL=nsarray.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nsarray.d.ts","sourceRoot":"","sources":["../../../src/objc/foundation/nsarray.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,OAAO,OAAO,QAAS,SAAQ,WAAW;IACxC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,QAAQ;IACtD,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ;IACjD,MAAM,CAAC,KAAK,IAAI,QAAQ;IACxB,KAAK,IAAI,MAAM;IACf,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;IAC1C,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,QAAQ;CACpD;AACD,eAAO,MAAM,OAAO,EAAoC,OAAO,QAAQ,CAAC;AAIxE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,QAAQ,CAMnE"}
@@ -0,0 +1,16 @@
1
+ import { Foundation } from "./index.js";
2
+ export const NSArray = Foundation.NSArray;
3
+ // Helper Functions
4
+ /**
5
+ * Create an NSArray from an array of objects
6
+ * @param objects The array of objects
7
+ * @returns An NSArray object
8
+ */
9
+ export function NSArrayFromObjects(objects) {
10
+ let array = NSArray.array();
11
+ for (const obj of objects) {
12
+ array = array.arrayByAddingObject$(obj);
13
+ }
14
+ return array;
15
+ }
16
+ //# sourceMappingURL=nsarray.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nsarray.js","sourceRoot":"","sources":["../../../src/objc/foundation/nsarray.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAYxC,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAqC,CAAC;AAExE,mBAAmB;AAEnB;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAsB;IACvD,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,KAAK,GAAG,KAAK,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,109 @@
1
+ import { type _NSString } from "./nsstring.js";
2
+ import type { NobjcObject } from "objc-js";
3
+ /**
4
+ * NSData to Buffer Conversion Methods
5
+ * Recommended method: bufferFromNSDataDirect
6
+ *
7
+ * Two methods are provided for converting NSData to JavaScript Buffers:
8
+ *
9
+ * 1. bufferFromNSData (base64): Uses base64 as an intermediate format.
10
+ * - Most reliable and compatible
11
+ * - Recommended for general use
12
+ * - Slight overhead due to base64 encoding/decoding
13
+ *
14
+ * 2. bufferFromNSDataDirect (direct): Uses getBytes:length: for direct memory copy.
15
+ * - More efficient for large data
16
+ * - Direct memory access
17
+ */
18
+ export declare class _NSData extends NobjcObject {
19
+ static dataWithBytes$length$(bytes: Buffer, length: number): _NSData;
20
+ static dataWithData$(data: _NSData): _NSData;
21
+ static data(): _NSData;
22
+ length(): number;
23
+ bytes(): any;
24
+ isEqualToData$(other: _NSData): boolean;
25
+ subdataWithRange$(range: {
26
+ location: number;
27
+ length: number;
28
+ }): _NSData;
29
+ base64EncodedStringWithOptions$(options: number): _NSString;
30
+ initWithBase64EncodedString$options$(base64String: _NSString, options: number): _NSData;
31
+ writeToFile$atomically$(path: _NSString, atomically: boolean): boolean;
32
+ static dataWithContentsOfFile$(path: _NSString): _NSData;
33
+ description(): _NSString;
34
+ getBytes$length$(buffer: Buffer, length: number): void;
35
+ getBytes$range$(buffer: Buffer, range: {
36
+ location: number;
37
+ length: number;
38
+ }): void;
39
+ }
40
+ export declare const NSData: typeof _NSData;
41
+ /**
42
+ * Create NSData from a JavaScript Buffer
43
+ * @param buffer The Buffer object
44
+ * @returns An NSData object
45
+ */
46
+ export declare function NSDataFromBuffer(buffer: Buffer): NobjcObject;
47
+ /**
48
+ * Convert NSData to a JavaScript Buffer using base64 encoding
49
+ * This is the most reliable method for data conversion.
50
+ * @param data The NSData object
51
+ * @returns A Buffer containing the data
52
+ */
53
+ export declare function bufferFromNSData(data: NobjcObject): Buffer;
54
+ /**
55
+ * Convert NSData to a JavaScript Buffer using direct memory copy
56
+ * This method uses getBytes:length: for direct memory access.
57
+ * May be more efficient for large data, but requires proper buffer allocation.
58
+ * @param data The NSData object
59
+ * @returns A Buffer containing the data
60
+ */
61
+ export declare function bufferFromNSDataDirect(data: NobjcObject): Buffer;
62
+ /**
63
+ * Convert NSData to a JavaScript Uint8Array
64
+ * @param data The NSData object
65
+ * @returns A Uint8Array containing the data
66
+ */
67
+ export declare function uint8ArrayFromNSData(data: NobjcObject): Uint8Array;
68
+ /**
69
+ * Convert NSData to a base64 string
70
+ * @param data The NSData object
71
+ * @returns A base64-encoded string
72
+ */
73
+ export declare function base64FromNSData(data: NobjcObject): string;
74
+ /**
75
+ * Create NSData from a base64 string
76
+ * @param base64String The base64-encoded string
77
+ * @returns An NSData object
78
+ */
79
+ export declare function NSDataFromBase64(base64String: string): NobjcObject;
80
+ /**
81
+ * Get the length of NSData
82
+ * @param data The NSData object
83
+ * @returns The length in bytes
84
+ */
85
+ export declare function NSDataLength(data: NobjcObject): number;
86
+ /**
87
+ * Create a copy of NSData
88
+ * @param data The NSData object
89
+ * @returns A new NSData object with copied data
90
+ */
91
+ export declare function NSDataCopy(data: NobjcObject): NobjcObject;
92
+ /**
93
+ * Compare two NSData objects for equality
94
+ * @param data1 The first NSData object
95
+ * @param data2 The second NSData object
96
+ * @returns True if the data is equal
97
+ */
98
+ export declare function NSDataIsEqual(data1: NobjcObject, data2: NobjcObject): boolean;
99
+ /**
100
+ * Extract a subrange of NSData
101
+ * Note: This method may not work with all versions of nobjc due to NSRange struct limitations.
102
+ * As an alternative, convert to Buffer, slice, and convert back.
103
+ * @param data The NSData object
104
+ * @param location The starting position
105
+ * @param length The number of bytes to extract
106
+ * @returns A new NSData object containing the subdata
107
+ */
108
+ export declare function NSDataSubdata(data: NobjcObject, location: number, length: number): NobjcObject;
109
+ //# sourceMappingURL=nsdata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nsdata.d.ts","sourceRoot":"","sources":["../../../src/objc/foundation/nsdata.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;;;;;;;;;;GAcG;AAGH,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,WAAW;IAE9C,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IACpE,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAC5C,MAAM,CAAC,IAAI,IAAI,OAAO;IAGtB,MAAM,IAAI,MAAM;IAChB,KAAK,IAAI,GAAG;IAGZ,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAGvC,iBAAiB,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;IAGvE,+BAA+B,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS;IAG3D,oCAAoC,CAClC,YAAY,EAAE,SAAS,EACvB,OAAO,EAAE,MAAM,GACd,OAAO;IAGV,uBAAuB,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO;IAGtE,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO;IAGxD,WAAW,IAAI,SAAS;IAGxB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IACtD,eAAe,CACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAC1C,IAAI;CACR;AACD,eAAO,MAAM,MAAM,EAAmC,OAAO,OAAO,CAAC;AAIrE;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAE5D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAY1D;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAYhE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAGlE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAI1D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,WAAW,CAIlE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAGtD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,CAEzD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAG7E;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,WAAW,CAMb"}
@@ -0,0 +1,120 @@
1
+ import { Foundation } from "./index.js";
2
+ import { NSString } from "./nsstring.js";
3
+ export const NSData = Foundation.NSData;
4
+ // Helper Functions
5
+ /**
6
+ * Create NSData from a JavaScript Buffer
7
+ * @param buffer The Buffer object
8
+ * @returns An NSData object
9
+ */
10
+ export function NSDataFromBuffer(buffer) {
11
+ return NSData.dataWithBytes$length$(buffer, buffer.length);
12
+ }
13
+ /**
14
+ * Convert NSData to a JavaScript Buffer using base64 encoding
15
+ * This is the most reliable method for data conversion.
16
+ * @param data The NSData object
17
+ * @returns A Buffer containing the data
18
+ */
19
+ export function bufferFromNSData(data) {
20
+ const nsData = data;
21
+ const length = nsData.length();
22
+ if (length === 0) {
23
+ return Buffer.alloc(0);
24
+ }
25
+ // Use base64 encoding as a reliable bridge between NSData and JS Buffer
26
+ const base64String = nsData.base64EncodedStringWithOptions$(0);
27
+ const base64Str = base64String.UTF8String();
28
+ return Buffer.from(base64Str, "base64");
29
+ }
30
+ /**
31
+ * Convert NSData to a JavaScript Buffer using direct memory copy
32
+ * This method uses getBytes:length: for direct memory access.
33
+ * May be more efficient for large data, but requires proper buffer allocation.
34
+ * @param data The NSData object
35
+ * @returns A Buffer containing the data
36
+ */
37
+ export function bufferFromNSDataDirect(data) {
38
+ const nsData = data;
39
+ const length = nsData.length();
40
+ if (length === 0) {
41
+ return Buffer.alloc(0);
42
+ }
43
+ // Allocate a buffer and copy bytes directly
44
+ const buffer = Buffer.alloc(length);
45
+ nsData.getBytes$length$(buffer, length);
46
+ return buffer;
47
+ }
48
+ /**
49
+ * Convert NSData to a JavaScript Uint8Array
50
+ * @param data The NSData object
51
+ * @returns A Uint8Array containing the data
52
+ */
53
+ export function uint8ArrayFromNSData(data) {
54
+ const buffer = bufferFromNSData(data);
55
+ return new Uint8Array(buffer);
56
+ }
57
+ /**
58
+ * Convert NSData to a base64 string
59
+ * @param data The NSData object
60
+ * @returns A base64-encoded string
61
+ */
62
+ export function base64FromNSData(data) {
63
+ const nsData = data;
64
+ const nsString = nsData.base64EncodedStringWithOptions$(0);
65
+ return nsString.UTF8String();
66
+ }
67
+ /**
68
+ * Create NSData from a base64 string
69
+ * @param base64String The base64-encoded string
70
+ * @returns An NSData object
71
+ */
72
+ export function NSDataFromBase64(base64String) {
73
+ const nsString = NSString.stringWithUTF8String$(base64String);
74
+ const nsData = NSData.alloc();
75
+ return nsData.initWithBase64EncodedString$options$(nsString, 0);
76
+ }
77
+ /**
78
+ * Get the length of NSData
79
+ * @param data The NSData object
80
+ * @returns The length in bytes
81
+ */
82
+ export function NSDataLength(data) {
83
+ const nsData = data;
84
+ return nsData.length();
85
+ }
86
+ /**
87
+ * Create a copy of NSData
88
+ * @param data The NSData object
89
+ * @returns A new NSData object with copied data
90
+ */
91
+ export function NSDataCopy(data) {
92
+ return NSData.dataWithData$(data);
93
+ }
94
+ /**
95
+ * Compare two NSData objects for equality
96
+ * @param data1 The first NSData object
97
+ * @param data2 The second NSData object
98
+ * @returns True if the data is equal
99
+ */
100
+ export function NSDataIsEqual(data1, data2) {
101
+ const nsData1 = data1;
102
+ return nsData1.isEqualToData$(data2);
103
+ }
104
+ /**
105
+ * Extract a subrange of NSData
106
+ * Note: This method may not work with all versions of nobjc due to NSRange struct limitations.
107
+ * As an alternative, convert to Buffer, slice, and convert back.
108
+ * @param data The NSData object
109
+ * @param location The starting position
110
+ * @param length The number of bytes to extract
111
+ * @returns A new NSData object containing the subdata
112
+ */
113
+ export function NSDataSubdata(data, location, length) {
114
+ // Workaround: Convert to buffer, slice, and convert back
115
+ // This avoids the NSRange struct issue with nobjc
116
+ const buffer = bufferFromNSData(data);
117
+ const slicedBuffer = buffer.subarray(location, location + length);
118
+ return NSDataFromBuffer(slicedBuffer);
119
+ }
120
+ //# sourceMappingURL=nsdata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nsdata.js","sourceRoot":"","sources":["../../../src/objc/foundation/nsdata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { NobjcObject } from "objc-js";
2
+ import { type _NSString } from "./nsstring.js";
3
+ export declare class _NSError extends NobjcObject {
4
+ domain(): _NSString;
5
+ code(): number;
6
+ userInfo(): NobjcObject;
7
+ localizedDescription(): _NSString;
8
+ localizedFailureReason(): _NSString;
9
+ localizedRecoverySuggestion(): _NSString;
10
+ localizedRecoveryOptions(): NobjcObject;
11
+ }
12
+ export declare const NSError: typeof _NSError;
13
+ /**
14
+ * Parse an NSError object into a JavaScript-friendly format
15
+ * @param error The NSError object
16
+ * @returns An object containing the error details
17
+ */
18
+ export declare function parseNSError(error: NobjcObject): {
19
+ domain: string;
20
+ code: number;
21
+ localizedDescription: string;
22
+ localizedFailureReason?: string;
23
+ localizedRecoverySuggestion?: string;
24
+ userInfo?: Record<string, any>;
25
+ };
26
+ /**
27
+ * Convert an NSError to a JavaScript Error object
28
+ * @param error The NSError object
29
+ * @returns A JavaScript Error with NSError details
30
+ */
31
+ export declare function nsErrorToJSError(error: NobjcObject): Error;
32
+ //# sourceMappingURL=nserror.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nserror.d.ts","sourceRoot":"","sources":["../../../src/objc/foundation/nserror.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAG/C,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IAE/C,MAAM,IAAI,SAAS;IACnB,IAAI,IAAI,MAAM;IACd,QAAQ,IAAI,WAAW;IACvB,oBAAoB,IAAI,SAAS;IACjC,sBAAsB,IAAI,SAAS;IACnC,2BAA2B,IAAI,SAAS;IACxC,wBAAwB,IAAI,WAAW;CACxC;AAED,eAAO,MAAM,OAAO,EAAoC,OAAO,QAAQ,CAAC;AAExE;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC,CAmDA;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,CAM1D"}