@napi-rs/cli 3.0.0-alpha.10 → 3.0.0-alpha.100

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 (199) hide show
  1. package/cli.mjs +1 -1
  2. package/dist/api/__tests__/create-npm-dirs.spec.d.ts +1 -0
  3. package/dist/api/__tests__/new.spec.d.ts +1 -0
  4. package/dist/api/build.d.ts +1 -1
  5. package/dist/api/create-npm-dirs.d.ts +5 -0
  6. package/dist/api/templates/index.d.ts +0 -7
  7. package/dist/api/templates/js-binding.d.ts +1 -0
  8. package/dist/api/templates/load-wasi-template.d.ts +2 -0
  9. package/dist/api/templates/wasi-worker-template.d.ts +2 -0
  10. package/dist/cli.js +3961 -15
  11. package/dist/def/artifacts.d.ts +21 -1
  12. package/dist/def/build.d.ts +149 -4
  13. package/dist/def/create-npm-dirs.d.ts +10 -0
  14. package/dist/def/new.d.ts +25 -7
  15. package/dist/def/pre-publish.d.ts +21 -2
  16. package/dist/def/rename.d.ts +16 -6
  17. package/dist/def/universalize.d.ts +10 -0
  18. package/dist/def/version.d.ts +10 -0
  19. package/dist/index.cjs +10052 -15662
  20. package/dist/index.js +3712 -32
  21. package/dist/utils/__tests__/config.spec.d.ts +1 -0
  22. package/dist/utils/config.d.ts +56 -4
  23. package/dist/utils/index.d.ts +1 -1
  24. package/dist/utils/metadata.d.ts +13 -1
  25. package/dist/utils/misc.d.ts +3 -3
  26. package/dist/utils/read-config.d.ts +7 -0
  27. package/dist/utils/target.d.ts +8 -6
  28. package/dist/utils/typegen.d.ts +1 -1
  29. package/dist/utils/version.d.ts +2 -1
  30. package/package.json +38 -34
  31. package/src/api/__tests__/create-npm-dirs.spec.ts +210 -0
  32. package/src/api/__tests__/new.spec.ts +429 -0
  33. package/src/api/artifacts.ts +81 -9
  34. package/src/api/build.ts +595 -183
  35. package/src/api/create-npm-dirs.ts +64 -13
  36. package/src/api/new.ts +389 -122
  37. package/src/api/pre-publish.ts +19 -11
  38. package/src/api/rename.ts +103 -17
  39. package/src/api/templates/index.ts +0 -7
  40. package/src/api/templates/js-binding.ts +159 -220
  41. package/src/api/templates/load-wasi-template.ts +216 -0
  42. package/src/api/templates/wasi-worker-template.ts +122 -0
  43. package/src/api/universalize.ts +13 -8
  44. package/src/api/version.ts +5 -2
  45. package/src/commands/artifacts.ts +2 -2
  46. package/src/commands/build.ts +1 -1
  47. package/src/commands/new.ts +46 -45
  48. package/src/def/artifacts.ts +22 -3
  49. package/src/def/build.ts +55 -8
  50. package/src/def/create-npm-dirs.ts +9 -0
  51. package/src/def/new.ts +28 -3
  52. package/src/def/pre-publish.ts +24 -3
  53. package/src/def/rename.ts +11 -2
  54. package/src/def/universalize.ts +9 -0
  55. package/src/def/version.ts +9 -0
  56. package/src/utils/__tests__/__fixtures__/napi_type_def +130 -130
  57. package/src/utils/__tests__/__snapshots__/config.spec.ts.md +97 -0
  58. package/src/utils/__tests__/__snapshots__/config.spec.ts.snap +0 -0
  59. package/src/utils/__tests__/__snapshots__/target.spec.ts.md +49 -0
  60. package/src/utils/__tests__/__snapshots__/target.spec.ts.snap +0 -0
  61. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.md +316 -332
  62. package/src/utils/__tests__/__snapshots__/typegen.spec.ts.snap +0 -0
  63. package/src/utils/__tests__/__snapshots__/version.spec.ts.md +8 -7
  64. package/src/utils/__tests__/__snapshots__/version.spec.ts.snap +0 -0
  65. package/src/utils/__tests__/config.spec.ts +81 -0
  66. package/src/utils/cargo.ts +2 -2
  67. package/src/utils/config.ts +127 -9
  68. package/src/utils/index.ts +1 -1
  69. package/src/utils/log.ts +1 -1
  70. package/src/utils/metadata.ts +52 -14
  71. package/src/utils/misc.ts +21 -12
  72. package/src/utils/read-config.ts +20 -0
  73. package/src/utils/target.ts +37 -5
  74. package/src/utils/typegen.ts +87 -52
  75. package/src/utils/version.ts +10 -8
  76. package/dist/api/artifacts.js +0 -53
  77. package/dist/api/artifacts.js.map +0 -1
  78. package/dist/api/build.js +0 -498
  79. package/dist/api/build.js.map +0 -1
  80. package/dist/api/create-npm-dirs.js +0 -64
  81. package/dist/api/create-npm-dirs.js.map +0 -1
  82. package/dist/api/load-wasi-template.d.ts +0 -1
  83. package/dist/api/load-wasi-template.js +0 -60
  84. package/dist/api/load-wasi-template.js.map +0 -1
  85. package/dist/api/new.js +0 -155
  86. package/dist/api/new.js.map +0 -1
  87. package/dist/api/pre-publish.js +0 -158
  88. package/dist/api/pre-publish.js.map +0 -1
  89. package/dist/api/rename.js +0 -29
  90. package/dist/api/rename.js.map +0 -1
  91. package/dist/api/templates/.gitignore.d.ts +0 -1
  92. package/dist/api/templates/.gitignore.js +0 -200
  93. package/dist/api/templates/.gitignore.js.map +0 -1
  94. package/dist/api/templates/.npmignore.d.ts +0 -1
  95. package/dist/api/templates/.npmignore.js +0 -15
  96. package/dist/api/templates/.npmignore.js.map +0 -1
  97. package/dist/api/templates/build.rs.d.ts +0 -1
  98. package/dist/api/templates/build.rs.js +0 -5
  99. package/dist/api/templates/build.rs.js.map +0 -1
  100. package/dist/api/templates/cargo.toml.d.ts +0 -6
  101. package/dist/api/templates/cargo.toml.js +0 -26
  102. package/dist/api/templates/cargo.toml.js.map +0 -1
  103. package/dist/api/templates/ci-template.d.ts +0 -1
  104. package/dist/api/templates/ci-template.js +0 -578
  105. package/dist/api/templates/ci-template.js.map +0 -1
  106. package/dist/api/templates/ci.yml.d.ts +0 -1
  107. package/dist/api/templates/ci.yml.js +0 -99
  108. package/dist/api/templates/ci.yml.js.map +0 -1
  109. package/dist/api/templates/index.js +0 -9
  110. package/dist/api/templates/index.js.map +0 -1
  111. package/dist/api/templates/js-binding.js +0 -293
  112. package/dist/api/templates/js-binding.js.map +0 -1
  113. package/dist/api/templates/lib.rs.d.ts +0 -1
  114. package/dist/api/templates/lib.rs.js +0 -8
  115. package/dist/api/templates/lib.rs.js.map +0 -1
  116. package/dist/api/templates/package.json.d.ts +0 -8
  117. package/dist/api/templates/package.json.js +0 -32
  118. package/dist/api/templates/package.json.js.map +0 -1
  119. package/dist/api/universalize.js +0 -39
  120. package/dist/api/universalize.js.map +0 -1
  121. package/dist/api/version.js +0 -17
  122. package/dist/api/version.js.map +0 -1
  123. package/dist/api/wasi-worker-template.d.ts +0 -1
  124. package/dist/api/wasi-worker-template.js +0 -53
  125. package/dist/api/wasi-worker-template.js.map +0 -1
  126. package/dist/cli.js.map +0 -1
  127. package/dist/commands/artifacts.js +0 -20
  128. package/dist/commands/artifacts.js.map +0 -1
  129. package/dist/commands/build.js +0 -35
  130. package/dist/commands/build.js.map +0 -1
  131. package/dist/commands/create-npm-dirs.js +0 -8
  132. package/dist/commands/create-npm-dirs.js.map +0 -1
  133. package/dist/commands/help.js +0 -13
  134. package/dist/commands/help.js.map +0 -1
  135. package/dist/commands/new.js +0 -110
  136. package/dist/commands/new.js.map +0 -1
  137. package/dist/commands/pre-publish.js +0 -9
  138. package/dist/commands/pre-publish.js.map +0 -1
  139. package/dist/commands/rename.js +0 -8
  140. package/dist/commands/rename.js.map +0 -1
  141. package/dist/commands/universalize.js +0 -8
  142. package/dist/commands/universalize.js.map +0 -1
  143. package/dist/commands/version.js +0 -8
  144. package/dist/commands/version.js.map +0 -1
  145. package/dist/def/artifacts.js +0 -39
  146. package/dist/def/artifacts.js.map +0 -1
  147. package/dist/def/build.js +0 -118
  148. package/dist/def/build.js.map +0 -1
  149. package/dist/def/create-npm-dirs.js +0 -39
  150. package/dist/def/create-npm-dirs.js.map +0 -1
  151. package/dist/def/new.js +0 -67
  152. package/dist/def/new.js.map +0 -1
  153. package/dist/def/pre-publish.js +0 -57
  154. package/dist/def/pre-publish.js.map +0 -1
  155. package/dist/def/rename.js +0 -59
  156. package/dist/def/rename.js.map +0 -1
  157. package/dist/def/universalize.js +0 -34
  158. package/dist/def/universalize.js.map +0 -1
  159. package/dist/def/version.js +0 -34
  160. package/dist/def/version.js.map +0 -1
  161. package/dist/index.js.map +0 -1
  162. package/dist/utils/__tests__/target.spec.js +0 -11
  163. package/dist/utils/__tests__/target.spec.js.map +0 -1
  164. package/dist/utils/__tests__/typegen.spec.js +0 -42
  165. package/dist/utils/__tests__/typegen.spec.js.map +0 -1
  166. package/dist/utils/__tests__/version.spec.js +0 -6
  167. package/dist/utils/__tests__/version.spec.js.map +0 -1
  168. package/dist/utils/cargo.js +0 -34
  169. package/dist/utils/cargo.js.map +0 -1
  170. package/dist/utils/ci.d.ts +0 -11
  171. package/dist/utils/ci.js +0 -96
  172. package/dist/utils/ci.js.map +0 -1
  173. package/dist/utils/config.js +0 -43
  174. package/dist/utils/config.js.map +0 -1
  175. package/dist/utils/index.js +0 -10
  176. package/dist/utils/index.js.map +0 -1
  177. package/dist/utils/log.js +0 -15
  178. package/dist/utils/log.js.map +0 -1
  179. package/dist/utils/metadata.js +0 -20
  180. package/dist/utils/metadata.js.map +0 -1
  181. package/dist/utils/misc.js +0 -41
  182. package/dist/utils/misc.js.map +0 -1
  183. package/dist/utils/target.js +0 -121
  184. package/dist/utils/target.js.map +0 -1
  185. package/dist/utils/typegen.js +0 -179
  186. package/dist/utils/typegen.js.map +0 -1
  187. package/dist/utils/version.js +0 -60
  188. package/dist/utils/version.js.map +0 -1
  189. package/src/api/load-wasi-template.ts +0 -62
  190. package/src/api/templates/.gitignore.ts +0 -199
  191. package/src/api/templates/.npmignore.ts +0 -14
  192. package/src/api/templates/build.rs.ts +0 -4
  193. package/src/api/templates/cargo.toml.ts +0 -35
  194. package/src/api/templates/ci-template.ts +0 -577
  195. package/src/api/templates/ci.yml.ts +0 -119
  196. package/src/api/templates/lib.rs.ts +0 -7
  197. package/src/api/templates/package.json.ts +0 -48
  198. package/src/api/wasi-worker-template.ts +0 -52
  199. package/src/utils/ci.ts +0 -111
@@ -0,0 +1 @@
1
+ export {};
@@ -1,5 +1,10 @@
1
1
  import { Target } from './target.js';
2
- interface UserNapiConfig {
2
+ export type ValueOfConstArray<T> = T[Exclude<keyof T, keyof Array<any>>];
3
+ export declare const SupportedPackageManagers: readonly ["yarn", "pnpm"];
4
+ export declare const SupportedTestFrameworks: readonly ["ava"];
5
+ export type SupportedPackageManager = ValueOfConstArray<typeof SupportedPackageManagers>;
6
+ export type SupportedTestFramework = ValueOfConstArray<typeof SupportedTestFrameworks>;
7
+ export interface UserNapiConfig {
3
8
  /**
4
9
  * Name of the binary to be generated, default to `index`
5
10
  */
@@ -22,6 +27,46 @@ interface UserNapiConfig {
22
27
  * Whether generate const enum for typescript bindings
23
28
  */
24
29
  constEnum?: boolean;
30
+ /**
31
+ * dts header prepend to the generated dts file
32
+ */
33
+ dtsHeader?: string;
34
+ /**
35
+ * dts header file path to be prepended to the generated dts file
36
+ * if both dtsHeader and dtsHeaderFile are provided, dtsHeaderFile will be used
37
+ */
38
+ dtsHeaderFile?: string;
39
+ /**
40
+ * wasm compilation options
41
+ */
42
+ wasm?: {
43
+ /**
44
+ * https://developer.mozilla.org/en-US/docs/WebAssembly/JavaScript_interface/Memory
45
+ * @default 4000 pages (256MiB)
46
+ */
47
+ initialMemory?: number;
48
+ /**
49
+ * @default 65536 pages (4GiB)
50
+ */
51
+ maximumMemory?: number;
52
+ /**
53
+ * Browser wasm binding configuration
54
+ */
55
+ browser: {
56
+ /**
57
+ * Whether to use fs module in browser
58
+ */
59
+ fs?: boolean;
60
+ /**
61
+ * Whether to initialize wasm asynchronously
62
+ */
63
+ asyncInit?: boolean;
64
+ /**
65
+ * Whether to inject `buffer` to emnapi context
66
+ */
67
+ buffer?: boolean;
68
+ };
69
+ };
25
70
  /**
26
71
  * @deprecated binaryName instead
27
72
  */
@@ -54,6 +99,10 @@ export interface CommonPackageJsonFields {
54
99
  author?: string;
55
100
  authors?: string[];
56
101
  license?: string;
102
+ cpu?: string[];
103
+ os?: string[];
104
+ libc?: string[];
105
+ files?: string[];
57
106
  repository?: any;
58
107
  homepage?: any;
59
108
  engines?: Record<string, string>;
@@ -65,13 +114,16 @@ export interface CommonPackageJsonFields {
65
114
  main?: string;
66
115
  module?: string;
67
116
  types?: string;
117
+ browser?: string;
68
118
  exports?: any;
69
119
  dependencies?: Record<string, string>;
70
120
  devDependencies?: Record<string, string>;
121
+ ava?: {
122
+ timeout?: string;
123
+ };
71
124
  }
72
- export type NapiConfig = Required<Pick<UserNapiConfig, 'binaryName' | 'packageName' | 'npmClient'>> & {
125
+ export type NapiConfig = Required<Pick<UserNapiConfig, 'binaryName' | 'packageName' | 'npmClient'>> & Pick<UserNapiConfig, 'wasm' | 'dtsHeader' | 'dtsHeaderFile' | 'constEnum'> & {
73
126
  targets: Target[];
74
127
  packageJson: CommonPackageJsonFields;
75
128
  };
76
- export declare function readNapiConfig(path: string): Promise<NapiConfig>;
77
- export {};
129
+ export declare function readNapiConfig(path: string, configPath?: string): Promise<NapiConfig>;
@@ -1,4 +1,3 @@
1
- export * from './ci.js';
2
1
  export * from './log.js';
3
2
  export * from './misc.js';
4
3
  export * from './target.js';
@@ -7,3 +6,4 @@ export * from './metadata.js';
7
6
  export * from './config.js';
8
7
  export * from './cargo.js';
9
8
  export * from './typegen.js';
9
+ export * from './read-config.js';
@@ -13,6 +13,18 @@ export interface Crate {
13
13
  targets: CrateTarget[];
14
14
  features: Record<string, string[]>;
15
15
  manifest_path: string;
16
+ dependencies: Array<{
17
+ name: string;
18
+ source: string;
19
+ req: string;
20
+ kind: string | null;
21
+ rename: string | null;
22
+ optional: boolean;
23
+ uses_default_features: boolean;
24
+ features: string[];
25
+ target: string | null;
26
+ registry: string | null;
27
+ }>;
16
28
  }
17
29
  export interface CargoWorkspaceMetadata {
18
30
  version: number;
@@ -21,4 +33,4 @@ export interface CargoWorkspaceMetadata {
21
33
  target_directory: string;
22
34
  workspace_root: string;
23
35
  }
24
- export declare function parseMetadata(manifestPath: string): CargoWorkspaceMetadata;
36
+ export declare function parseMetadata(manifestPath: string): Promise<CargoWorkspaceMetadata>;
@@ -1,5 +1,4 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- import { readFile, writeFile, copyFile, mkdir, unlink, stat, readdir } from 'fs';
1
+ import { readFile, writeFile, copyFile, mkdir, unlink, stat, readdir } from 'node:fs';
3
2
  export declare const readFileAsync: typeof readFile.__promisify__;
4
3
  export declare const writeFileAsync: typeof writeFile.__promisify__;
5
4
  export declare const unlinkAsync: typeof unlink.__promisify__;
@@ -8,6 +7,7 @@ export declare const mkdirAsync: typeof mkdir.__promisify__;
8
7
  export declare const statAsync: typeof stat.__promisify__;
9
8
  export declare const readdirAsync: typeof readdir.__promisify__;
10
9
  export declare function fileExists(path: string): Promise<boolean>;
10
+ export declare function dirExistsAsync(path: string): Promise<boolean>;
11
11
  export declare function pick<O, K extends keyof O>(o: O, ...keys: K[]): Pick<O, K>;
12
12
  export declare function updatePackageJson(path: string, partial: Record<string, any>): Promise<void>;
13
- export declare const CLI_VERSION: any;
13
+ export declare const CLI_VERSION: string;
@@ -0,0 +1,7 @@
1
+ interface MinimalNapiOptions {
2
+ cwd: string;
3
+ configPath?: string;
4
+ packageJsonPath?: string;
5
+ }
6
+ export declare function readConfig(options: MinimalNapiOptions): Promise<import("./config.js").NapiConfig>;
7
+ export {};
@@ -1,17 +1,19 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- export type Platform = NodeJS.Platform | 'wasm' | 'wasi';
3
- export declare const AVAILABLE_TARGETS: readonly ["aarch64-apple-darwin", "aarch64-linux-android", "aarch64-unknown-linux-gnu", "aarch64-unknown-linux-musl", "aarch64-pc-windows-msvc", "x86_64-apple-darwin", "x86_64-pc-windows-msvc", "x86_64-unknown-linux-gnu", "x86_64-unknown-linux-musl", "x86_64-unknown-freebsd", "i686-pc-windows-msvc", "armv7-unknown-linux-gnueabihf", "armv7-linux-androideabi", "universal-apple-darwin", "riscv64gc-unknown-linux-gnu"];
1
+ export type Platform = NodeJS.Platform | 'wasm' | 'wasi' | 'openharmony';
2
+ export declare const UNIVERSAL_TARGETS: {
3
+ readonly 'universal-apple-darwin': readonly ["aarch64-apple-darwin", "x86_64-apple-darwin"];
4
+ };
5
+ export declare const AVAILABLE_TARGETS: readonly ["aarch64-apple-darwin", "aarch64-linux-android", "aarch64-unknown-linux-gnu", "aarch64-unknown-linux-musl", "aarch64-unknown-linux-ohos", "aarch64-pc-windows-msvc", "x86_64-apple-darwin", "x86_64-pc-windows-msvc", "x86_64-unknown-linux-gnu", "x86_64-unknown-linux-musl", "x86_64-unknown-linux-ohos", "x86_64-unknown-freebsd", "i686-pc-windows-msvc", "armv7-unknown-linux-gnueabihf", "armv7-unknown-linux-musleabihf", "armv7-linux-androideabi", "universal-apple-darwin", "riscv64gc-unknown-linux-gnu", "powerpc64le-unknown-linux-gnu", "s390x-unknown-linux-gnu", "wasm32-wasi-preview1-threads", "wasm32-wasip1-threads"];
4
6
  export type TargetTriple = (typeof AVAILABLE_TARGETS)[number];
5
- export declare const DEFAULT_TARGETS: readonly ["x86_64-apple-darwin", "x86_64-pc-windows-msvc", "x86_64-unknown-linux-gnu"];
7
+ export declare const DEFAULT_TARGETS: readonly ["x86_64-apple-darwin", "aarch64-apple-darwin", "x86_64-pc-windows-msvc", "x86_64-unknown-linux-gnu"];
6
8
  export declare const TARGET_LINKER: Record<string, string>;
7
- type NodeJSArch = 'arm' | 'arm64' | 'ia32' | 'mips' | 'mipsel' | 'ppc' | 'ppc64' | 'riscv64' | 's390' | 's390x' | 'x32' | 'x64' | 'universal';
9
+ type NodeJSArch = 'arm' | 'arm64' | 'ia32' | 'mips' | 'mipsel' | 'ppc' | 'ppc64' | 'riscv64' | 's390' | 's390x' | 'x32' | 'x64' | 'universal' | 'wasm32';
8
10
  export declare const NodeArchToCpu: Record<string, string>;
9
11
  export declare const UniArchsByPlatform: Partial<Record<Platform, NodeJSArch[]>>;
10
12
  export interface Target {
11
13
  triple: string;
12
14
  platformArchABI: string;
13
15
  platform: Platform;
14
- arch: NodeJSArch | 'wasm32';
16
+ arch: NodeJSArch;
15
17
  abi: string | null;
16
18
  }
17
19
  /**
@@ -1,5 +1,5 @@
1
1
  export declare const DEFAULT_TYPE_DEF_HEADER = "/* auto-generated by NAPI-RS */\n/* eslint-disable */\n";
2
- export declare function processTypeDef(intermediateTypeFile: string, constEnum: boolean, header?: string): Promise<{
2
+ export declare function processTypeDef(intermediateTypeFile: string, constEnum: boolean): Promise<{
3
3
  dts: string;
4
4
  exports: string[];
5
5
  }>;
@@ -6,6 +6,7 @@ export declare enum NapiVersion {
6
6
  Napi5 = 5,
7
7
  Napi6 = 6,
8
8
  Napi7 = 7,
9
- Napi8 = 8
9
+ Napi8 = 8,
10
+ Napi9 = 9
10
11
  }
11
12
  export declare function napiEngineRequirement(napiVersion: NapiVersion): string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@napi-rs/cli",
3
- "version": "3.0.0-alpha.10",
3
+ "version": "3.0.0-alpha.100",
4
4
  "description": "Cli tools for napi-rs",
5
5
  "author": "LongYinan <lynweklm@gmail.com>",
6
6
  "homepage": "https://github.com/napi-rs/napi-rs",
@@ -18,12 +18,12 @@
18
18
  "exports": {
19
19
  ".": {
20
20
  "import": {
21
- "default": "./dist/index.js",
22
- "types": "./dist/index.d.ts"
21
+ "types": "./dist/index.d.ts",
22
+ "default": "./dist/index.js"
23
23
  },
24
24
  "require": {
25
- "default": "./dist/index.cjs",
26
- "types": "./dist/index.d.ts"
25
+ "types": "./dist/index.d.ts",
26
+ "default": "./dist/index.cjs"
27
27
  }
28
28
  },
29
29
  "./package.json": {
@@ -67,45 +67,47 @@
67
67
  "url": "https://github.com/napi-rs/napi-rs/issues"
68
68
  },
69
69
  "dependencies": {
70
- "@octokit/rest": "^20.0.2",
71
- "@tybys/wasm-util": "0.8.0",
72
- "clipanion": "^3.2.1",
70
+ "@inquirer/prompts": "^7.4.0",
71
+ "@napi-rs/cross-toolchain": "^0.0.19",
72
+ "@napi-rs/wasm-tools": "^0.0.3",
73
+ "@octokit/rest": "^22.0.0",
74
+ "clipanion": "^4.0.0-rc.4",
73
75
  "colorette": "^2.0.20",
74
- "debug": "^4.3.4",
75
- "emnapi": "0.44.0",
76
- "inquirer": "^9.2.12",
76
+ "debug": "^4.4.0",
77
+ "emnapi": "^1.4.0",
78
+ "find-up": "^7.0.0",
77
79
  "js-yaml": "^4.1.0",
78
80
  "lodash-es": "^4.17.21",
79
- "toml": "^3.0.0",
80
- "typanion": "^3.14.0"
81
+ "semver": "^7.7.1",
82
+ "typanion": "^3.14.0",
83
+ "wasm-sjlj": "^1.0.6"
81
84
  },
82
85
  "devDependencies": {
83
- "@emnapi/core": "0.44.0",
84
- "@emnapi/runtime": "0.44.0",
86
+ "@emnapi/core": "^1.4.0",
87
+ "@emnapi/runtime": "^1.4.0",
88
+ "@oxc-node/core": "^0.0.29",
89
+ "@std/toml": "npm:@jsr/std__toml@^1.0.8",
85
90
  "@types/debug": "^4.1.12",
86
91
  "@types/inquirer": "^9.0.7",
87
92
  "@types/js-yaml": "^4.0.9",
88
- "@types/lodash-es": "^4.17.11",
89
- "ava": "^5.3.1",
93
+ "@types/lodash-es": "^4.17.12",
94
+ "@types/node": "^22.13.16",
95
+ "@types/semver": "^7.7.0",
96
+ "ava": "^6.2.0",
90
97
  "env-paths": "^3.0.0",
91
- "esbuild": "^0.19.5",
92
- "prettier": "^3.1.0",
93
- "ts-node": "^10.9.1",
94
- "tslib": "^2.6.2",
95
- "typescript": "^5.2.2"
98
+ "prettier": "^3.5.3",
99
+ "rolldown": "^1.0.0-beta.23",
100
+ "tslib": "^2.8.1",
101
+ "typescript": "^5.8.2"
96
102
  },
97
103
  "peerDependencies": {
98
- "@emnapi/runtime": "0.44.0",
99
- "@tybys/wasm-util": "0.8.0",
100
- "emnapi": "0.44.0"
104
+ "@emnapi/runtime": "^1.1.0",
105
+ "emnapi": "^1.1.0"
101
106
  },
102
107
  "peerDependenciesMeta": {
103
108
  "@emnapi/runtime": {
104
109
  "optional": true
105
110
  },
106
- "@tybys/wasm-util": {
107
- "optional": true
108
- },
109
111
  "emnapi": {
110
112
  "optional": true
111
113
  }
@@ -115,18 +117,20 @@
115
117
  "url": "https://github.com/sponsors/Brooooooklyn"
116
118
  },
117
119
  "scripts": {
118
- "codegen": "node --loader ts-node/esm/transpile-only ./codegen/index.ts",
119
- "build": "tsc && yarn build:cjs",
120
- "build:cjs": "node ./esbuild.mjs",
121
- "test": "node --loader ts-node/esm/transpile-only ../node_modules/ava/entrypoints/cli.mjs"
120
+ "clean": "node --import @oxc-node/core/register ./clean.ts",
121
+ "codegen": "node --import @oxc-node/core/register ./codegen/index.ts",
122
+ "build": "tsc && yarn clean && rolldown -c rolldown.config.js",
123
+ "test": "node --import @oxc-node/core/register ../node_modules/ava/entrypoints/cli.mjs"
122
124
  },
123
125
  "ava": {
124
126
  "extensions": {
125
127
  "ts": "module"
126
128
  },
129
+ "timeout": "1m",
127
130
  "files": [
128
- "**/__tests__/**/*.spec.ts"
131
+ "**/__tests__/**/*.spec.ts",
132
+ "e2e/**/*.spec.ts"
129
133
  ]
130
134
  },
131
- "gitHead": "14cd2224924a404662fdf565eb242535c2cb358b"
135
+ "gitHead": "40839a3a5e798bcbc59c5466d741f45a4794d1fd"
132
136
  }
@@ -0,0 +1,210 @@
1
+ import { existsSync } from 'node:fs'
2
+ import { mkdir, readFile, rm, writeFile } from 'node:fs/promises'
3
+ import { tmpdir } from 'node:os'
4
+ import { join } from 'node:path'
5
+
6
+ import ava, { TestFn } from 'ava'
7
+
8
+ import { createNpmDirs } from '../create-npm-dirs.js'
9
+
10
+ const test = ava as TestFn<{
11
+ tmpDir: string
12
+ packageJsonPath: string
13
+ }>
14
+
15
+ test.beforeEach(async (t) => {
16
+ // Create a unique temp directory for tests
17
+ const timestamp = Date.now()
18
+ const random = Math.random().toString(36).substring(7)
19
+ const tmpDir = join(
20
+ tmpdir(),
21
+ 'napi-rs-test',
22
+ `create-npm-dirs-${timestamp}-${random}`,
23
+ )
24
+ const packageJsonPath = join(tmpDir, 'package.json')
25
+
26
+ // Create the directory
27
+ await mkdir(tmpDir, { recursive: true })
28
+
29
+ t.context = { tmpDir, packageJsonPath }
30
+ })
31
+
32
+ test.afterEach.always(async (t) => {
33
+ // Clean up any created directories
34
+ if (existsSync(t.context.tmpDir)) {
35
+ await rm(t.context.tmpDir, { recursive: true, force: true })
36
+ }
37
+ })
38
+
39
+ test('should omit exports fields from publishConfig in scoped packages', async (t) => {
40
+ const { tmpDir, packageJsonPath } = t.context
41
+
42
+ // Create a package.json with publishConfig that includes exports field
43
+ const packageJson = {
44
+ name: 'test-package',
45
+ version: '1.0.0',
46
+ publishConfig: {
47
+ registry: 'https://custom-registry.com',
48
+ access: 'public',
49
+ exports: {
50
+ '.': './dist/index.js',
51
+ './package.json': './package.json',
52
+ },
53
+ tag: 'beta',
54
+ },
55
+ napi: {
56
+ binaryName: 'test-package',
57
+ targets: ['x86_64-unknown-linux-gnu'],
58
+ },
59
+ }
60
+
61
+ await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2))
62
+
63
+ await createNpmDirs({
64
+ cwd: tmpDir,
65
+ packageJsonPath: 'package.json',
66
+ })
67
+
68
+ // Check that the scoped package directory was created
69
+ const scopedDir = join(tmpDir, 'npm', 'linux-x64-gnu')
70
+ t.true(existsSync(scopedDir))
71
+
72
+ // Read the generated package.json for the scoped package
73
+ const scopedPackageJsonPath = join(scopedDir, 'package.json')
74
+ t.true(existsSync(scopedPackageJsonPath))
75
+
76
+ const scopedPackageJson = JSON.parse(
77
+ await readFile(scopedPackageJsonPath, 'utf-8'),
78
+ )
79
+
80
+ // Verify that publishConfig only contains registry and access, not exports
81
+ t.truthy(scopedPackageJson.publishConfig)
82
+ t.is(scopedPackageJson.publishConfig.registry, 'https://custom-registry.com')
83
+ t.is(scopedPackageJson.publishConfig.access, 'public')
84
+ t.is(scopedPackageJson.publishConfig.exports, undefined)
85
+ t.is(scopedPackageJson.publishConfig.tag, undefined)
86
+ })
87
+
88
+ test('should handle package without publishConfig', async (t) => {
89
+ const { tmpDir, packageJsonPath } = t.context
90
+
91
+ // Create a package.json without publishConfig
92
+ const packageJson = {
93
+ name: 'test-package-no-config',
94
+ version: '1.0.0',
95
+ napi: {
96
+ binaryName: 'test-package-no-config',
97
+ targets: ['x86_64-unknown-linux-gnu'],
98
+ },
99
+ }
100
+
101
+ await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2))
102
+
103
+ await createNpmDirs({
104
+ cwd: tmpDir,
105
+ packageJsonPath: 'package.json',
106
+ })
107
+
108
+ // Check that the scoped package directory was created
109
+ const scopedDir = join(tmpDir, 'npm', 'linux-x64-gnu')
110
+ t.true(existsSync(scopedDir))
111
+
112
+ // Read the generated package.json for the scoped package
113
+ const scopedPackageJsonPath = join(scopedDir, 'package.json')
114
+ const scopedPackageJson = JSON.parse(
115
+ await readFile(scopedPackageJsonPath, 'utf-8'),
116
+ )
117
+
118
+ // Verify that publishConfig is not present when not in source
119
+ t.is(scopedPackageJson.publishConfig, undefined)
120
+ })
121
+
122
+ test('should preserve only registry and access in publishConfig', async (t) => {
123
+ const { tmpDir, packageJsonPath } = t.context
124
+
125
+ // Create a package.json with minimal publishConfig
126
+ const packageJson = {
127
+ name: 'test-package-minimal',
128
+ version: '1.0.0',
129
+ publishConfig: {
130
+ registry: 'https://npm.company.com',
131
+ access: 'restricted',
132
+ },
133
+ napi: {
134
+ binaryName: 'test-package-minimal',
135
+ targets: ['aarch64-apple-darwin'],
136
+ },
137
+ }
138
+
139
+ await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2))
140
+
141
+ await createNpmDirs({
142
+ cwd: tmpDir,
143
+ packageJsonPath: 'package.json',
144
+ })
145
+
146
+ // Check that the scoped package directory was created
147
+ const scopedDir = join(tmpDir, 'npm', 'darwin-arm64')
148
+ t.true(existsSync(scopedDir))
149
+
150
+ // Read the generated package.json for the scoped package
151
+ const scopedPackageJsonPath = join(scopedDir, 'package.json')
152
+ const scopedPackageJson = JSON.parse(
153
+ await readFile(scopedPackageJsonPath, 'utf-8'),
154
+ )
155
+
156
+ // Verify that publishConfig contains exactly registry and access
157
+ t.truthy(scopedPackageJson.publishConfig)
158
+ t.is(scopedPackageJson.publishConfig.registry, 'https://npm.company.com')
159
+ t.is(scopedPackageJson.publishConfig.access, 'restricted')
160
+ t.is(Object.keys(scopedPackageJson.publishConfig).length, 2)
161
+ })
162
+
163
+ test('should handle WASM targets correctly with publishConfig', async (t) => {
164
+ const { tmpDir, packageJsonPath } = t.context
165
+
166
+ // Create a package.json for WASM target
167
+ const packageJson = {
168
+ name: 'test-wasm-package',
169
+ version: '1.0.0',
170
+ publishConfig: {
171
+ registry: 'https://wasm-registry.com',
172
+ access: 'public',
173
+ exports: './wasm.js',
174
+ browser: './browser.js',
175
+ },
176
+ napi: {
177
+ binaryName: 'test-wasm-package',
178
+ targets: ['wasm32-wasi-preview1-threads'],
179
+ },
180
+ }
181
+
182
+ await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2))
183
+
184
+ await createNpmDirs({
185
+ cwd: tmpDir,
186
+ packageJsonPath: 'package.json',
187
+ })
188
+
189
+ // Check that the scoped package directory was created
190
+ const scopedDir = join(tmpDir, 'npm', 'wasm32-wasi')
191
+ t.true(existsSync(scopedDir))
192
+
193
+ // Read the generated package.json for the scoped package
194
+ const scopedPackageJsonPath = join(scopedDir, 'package.json')
195
+ const scopedPackageJson = JSON.parse(
196
+ await readFile(scopedPackageJsonPath, 'utf-8'),
197
+ )
198
+
199
+ // Verify that publishConfig is correctly filtered for WASM too
200
+ t.truthy(scopedPackageJson.publishConfig)
201
+ t.is(scopedPackageJson.publishConfig.registry, 'https://wasm-registry.com')
202
+ t.is(scopedPackageJson.publishConfig.access, 'public')
203
+ t.is(scopedPackageJson.publishConfig.exports, undefined)
204
+ t.is(scopedPackageJson.publishConfig.browser, undefined)
205
+
206
+ // Verify WASM-specific fields are set correctly
207
+ t.truthy(scopedPackageJson.main)
208
+ t.truthy(scopedPackageJson.browser)
209
+ t.truthy(scopedPackageJson.dependencies)
210
+ })