movehat 0.2.1 → 0.2.2
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.
- package/dist/__tests__/deployContract.test.js +56 -47
- package/dist/__tests__/deployContract.test.js.map +1 -1
- package/dist/__tests__/exports.test.d.ts +2 -0
- package/dist/__tests__/exports.test.d.ts.map +1 -0
- package/dist/__tests__/exports.test.js +30 -0
- package/dist/__tests__/exports.test.js.map +1 -0
- package/dist/__tests__/fixtures/sigint-deploy-harness.d.ts +4 -3
- package/dist/__tests__/fixtures/sigint-deploy-harness.d.ts.map +1 -1
- package/dist/__tests__/fixtures/sigint-deploy-harness.js +8 -7
- package/dist/__tests__/fixtures/sigint-deploy-harness.js.map +1 -1
- package/dist/__tests__/fork/api.test.js +5 -0
- package/dist/__tests__/fork/api.test.js.map +1 -1
- package/dist/__tests__/fork/api.timeout.test.d.ts +2 -0
- package/dist/__tests__/fork/api.timeout.test.d.ts.map +1 -0
- package/dist/__tests__/fork/api.timeout.test.js +98 -0
- package/dist/__tests__/fork/api.timeout.test.js.map +1 -0
- package/dist/commands/__tests__/compile.toml-mutation.test.d.ts +2 -0
- package/dist/commands/__tests__/compile.toml-mutation.test.d.ts.map +1 -0
- package/dist/commands/__tests__/compile.toml-mutation.test.js +69 -0
- package/dist/commands/__tests__/compile.toml-mutation.test.js.map +1 -0
- package/dist/commands/__tests__/init.test.js +73 -11
- package/dist/commands/__tests__/init.test.js.map +1 -1
- package/dist/commands/init.d.ts +22 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +55 -6
- package/dist/commands/init.js.map +1 -1
- package/dist/core/AccountManager.d.ts.map +1 -1
- package/dist/core/AccountManager.js +14 -2
- package/dist/core/AccountManager.js.map +1 -1
- package/dist/core/Publisher.d.ts.map +1 -1
- package/dist/core/Publisher.js +52 -68
- package/dist/core/Publisher.js.map +1 -1
- package/dist/core/__tests__/AccountManager.global-state.test.d.ts +2 -0
- package/dist/core/__tests__/AccountManager.global-state.test.d.ts.map +1 -0
- package/dist/core/__tests__/AccountManager.global-state.test.js +69 -0
- package/dist/core/__tests__/AccountManager.global-state.test.js.map +1 -0
- package/dist/core/__tests__/movementProfile.test.d.ts +2 -0
- package/dist/core/__tests__/movementProfile.test.d.ts.map +1 -0
- package/dist/core/__tests__/movementProfile.test.js +112 -0
- package/dist/core/__tests__/movementProfile.test.js.map +1 -0
- package/dist/core/config.js +6 -5
- package/dist/core/config.js.map +1 -1
- package/dist/core/movementProfile.d.ts +55 -22
- package/dist/core/movementProfile.d.ts.map +1 -1
- package/dist/core/movementProfile.js +77 -99
- package/dist/core/movementProfile.js.map +1 -1
- package/dist/fork/__tests__/server.cors.test.d.ts +2 -0
- package/dist/fork/__tests__/server.cors.test.d.ts.map +1 -0
- package/dist/fork/__tests__/server.cors.test.js +79 -0
- package/dist/fork/__tests__/server.cors.test.js.map +1 -0
- package/dist/fork/api.d.ts +9 -1
- package/dist/fork/api.d.ts.map +1 -1
- package/dist/fork/api.js +37 -7
- package/dist/fork/api.js.map +1 -1
- package/dist/fork/server.d.ts +20 -1
- package/dist/fork/server.d.ts.map +1 -1
- package/dist/fork/server.js +19 -9
- package/dist/fork/server.js.map +1 -1
- package/dist/harness/Harness.d.ts +6 -2
- package/dist/harness/Harness.d.ts.map +1 -1
- package/dist/harness/Harness.js +8 -2
- package/dist/harness/Harness.js.map +1 -1
- package/dist/harness/codeObject.d.ts.map +1 -1
- package/dist/harness/codeObject.js +30 -33
- package/dist/harness/codeObject.js.map +1 -1
- package/dist/harness/script.d.ts +3 -3
- package/dist/harness/script.d.ts.map +1 -1
- package/dist/harness/script.js +33 -29
- package/dist/harness/script.js.map +1 -1
- package/dist/helpers/__tests__/setupLocalTesting.fork-network.test.d.ts +2 -0
- package/dist/helpers/__tests__/setupLocalTesting.fork-network.test.d.ts.map +1 -0
- package/dist/helpers/__tests__/setupLocalTesting.fork-network.test.js +172 -0
- package/dist/helpers/__tests__/setupLocalTesting.fork-network.test.js.map +1 -0
- package/dist/helpers/setupLocalTesting.d.ts.map +1 -1
- package/dist/helpers/setupLocalTesting.js +28 -2
- package/dist/helpers/setupLocalTesting.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/node/LocalNodeManager.d.ts +8 -0
- package/dist/node/LocalNodeManager.d.ts.map +1 -1
- package/dist/node/LocalNodeManager.js +10 -1
- package/dist/node/LocalNodeManager.js.map +1 -1
- package/dist/node/__tests__/LocalNodeManager.api-port.test.d.ts +2 -0
- package/dist/node/__tests__/LocalNodeManager.api-port.test.d.ts.map +1 -0
- package/dist/node/__tests__/LocalNodeManager.api-port.test.js +55 -0
- package/dist/node/__tests__/LocalNodeManager.api-port.test.js.map +1 -0
- package/dist/node/__tests__/LocalNodeManager.test.js +4 -3
- package/dist/node/__tests__/LocalNodeManager.test.js.map +1 -1
- package/dist/templates/move/Move.toml +1 -1
- package/dist/templates/move/sources/Counter.move +31 -4
- package/dist/templates/scripts/deploy-counter.ts +10 -0
- package/dist/types/config.d.ts +8 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/utils/__tests__/childProcessAdapter.maxBuffer.test.d.ts +2 -0
- package/dist/utils/__tests__/childProcessAdapter.maxBuffer.test.d.ts.map +1 -0
- package/dist/utils/__tests__/childProcessAdapter.maxBuffer.test.js +43 -0
- package/dist/utils/__tests__/childProcessAdapter.maxBuffer.test.js.map +1 -0
- package/dist/utils/childProcessAdapter.d.ts +7 -0
- package/dist/utils/childProcessAdapter.d.ts.map +1 -1
- package/dist/utils/childProcessAdapter.js +20 -2
- package/dist/utils/childProcessAdapter.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/deployContract.test.ts +59 -50
- package/src/__tests__/exports.test.ts +32 -0
- package/src/__tests__/fixtures/sigint-deploy-harness.ts +8 -7
- package/src/__tests__/fork/api.test.ts +5 -0
- package/src/__tests__/fork/api.timeout.test.ts +150 -0
- package/src/commands/__tests__/compile.toml-mutation.test.ts +77 -0
- package/src/commands/__tests__/init.test.ts +96 -11
- package/src/commands/init.ts +77 -6
- package/src/core/AccountManager.ts +18 -1
- package/src/core/Publisher.ts +58 -77
- package/src/core/__tests__/AccountManager.global-state.test.ts +83 -0
- package/src/core/__tests__/movementProfile.test.ts +131 -0
- package/src/core/config.ts +9 -5
- package/src/core/movementProfile.ts +75 -127
- package/src/fork/__tests__/server.cors.test.ts +101 -0
- package/src/fork/api.ts +69 -10
- package/src/fork/server.ts +38 -9
- package/src/harness/Harness.ts +11 -2
- package/src/harness/codeObject.ts +37 -43
- package/src/harness/script.ts +40 -39
- package/src/helpers/__tests__/setupLocalTesting.fork-network.test.ts +212 -0
- package/src/helpers/setupLocalTesting.ts +36 -2
- package/src/index.ts +9 -1
- package/src/node/LocalNodeManager.ts +24 -2
- package/src/node/__tests__/LocalNodeManager.api-port.test.ts +62 -0
- package/src/node/__tests__/LocalNodeManager.test.ts +4 -3
- package/src/templates/move/Move.toml +1 -1
- package/src/templates/move/sources/Counter.move +31 -4
- package/src/templates/scripts/deploy-counter.ts +10 -0
- package/src/types/config.ts +8 -1
- package/src/utils/__tests__/childProcessAdapter.maxBuffer.test.ts +51 -0
- package/src/utils/childProcessAdapter.ts +32 -2
|
@@ -10,7 +10,8 @@ vi.mock("prompts", () => ({
|
|
|
10
10
|
vi.mock("../../helpers/banner.js", () => ({
|
|
11
11
|
printMovehatBanner: () => undefined,
|
|
12
12
|
}));
|
|
13
|
-
const
|
|
13
|
+
const initModule = await import("../init.js");
|
|
14
|
+
const { default: initCommand, resolveProjectNames, InvalidProjectNameError } = initModule;
|
|
14
15
|
/**
|
|
15
16
|
* Strategy: real tmpdir + real fs ops (matches §6.1's example-as-canonical
|
|
16
17
|
* scaffold philosophy — if `init` can't actually copy files end-to-end,
|
|
@@ -23,10 +24,29 @@ const { default: initCommand } = await import("../init.js");
|
|
|
23
24
|
* `src/commands/` so `path.join(__dirname, "..", "templates")` resolves
|
|
24
25
|
* to `src/templates/` cleanly. No bundling step required.
|
|
25
26
|
*/
|
|
27
|
+
describe("resolveProjectNames", () => {
|
|
28
|
+
const cases = [
|
|
29
|
+
["my_project", { dirName: "my_project", npmName: "my_project", moveName: "my_project", sanitized: false }],
|
|
30
|
+
["my-project", { dirName: "my-project", npmName: "my-project", moveName: "my_project", sanitized: true }],
|
|
31
|
+
["/tmp/my-project", { dirName: "/tmp/my-project", npmName: "my-project", moveName: "my_project", sanitized: true }],
|
|
32
|
+
["123abc", { dirName: "123abc", npmName: "123abc", moveName: "pkg_123abc", sanitized: true }],
|
|
33
|
+
["_underscore", { dirName: "_underscore", npmName: "_underscore", moveName: "_underscore", sanitized: false }],
|
|
34
|
+
["UPPER", { dirName: "UPPER", npmName: "UPPER", moveName: "UPPER", sanitized: false }],
|
|
35
|
+
[" spaced ", { dirName: "spaced", npmName: "spaced", moveName: "spaced", sanitized: false }],
|
|
36
|
+
["with spaces", { dirName: "with spaces", npmName: "with spaces", moveName: "with_spaces", sanitized: true }],
|
|
37
|
+
];
|
|
38
|
+
it.each(cases)("derives names for %j", (input, expected) => {
|
|
39
|
+
expect(resolveProjectNames(input)).toEqual(expected);
|
|
40
|
+
});
|
|
41
|
+
it.each(["", " ", ".", "..", "/", "////"])("rejects %j as an invalid project name", (input) => {
|
|
42
|
+
expect(() => resolveProjectNames(input)).toThrow(InvalidProjectNameError);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
26
45
|
describe("initCommand", () => {
|
|
27
46
|
let tmpParent;
|
|
28
47
|
let origCwd;
|
|
29
48
|
let exitSpy;
|
|
49
|
+
let warnSpy;
|
|
30
50
|
beforeEach(() => {
|
|
31
51
|
promptsMock.mockReset();
|
|
32
52
|
origCwd = process.cwd();
|
|
@@ -42,6 +62,7 @@ describe("initCommand", () => {
|
|
|
42
62
|
}));
|
|
43
63
|
vi.spyOn(console, "log").mockImplementation(() => undefined);
|
|
44
64
|
vi.spyOn(console, "error").mockImplementation(() => undefined);
|
|
65
|
+
warnSpy = vi.spyOn(console, "warn").mockImplementation(() => undefined);
|
|
45
66
|
});
|
|
46
67
|
afterEach(() => {
|
|
47
68
|
process.chdir(origCwd);
|
|
@@ -51,8 +72,8 @@ describe("initCommand", () => {
|
|
|
51
72
|
vi.restoreAllMocks();
|
|
52
73
|
});
|
|
53
74
|
it("happy path: scaffolds a project from the canonical template", async () => {
|
|
54
|
-
await initCommand("
|
|
55
|
-
const target = join(tmpParent, "
|
|
75
|
+
await initCommand("my_test_project");
|
|
76
|
+
const target = join(tmpParent, "my_test_project");
|
|
56
77
|
expect(existsSync(target)).toBe(true);
|
|
57
78
|
// Canonical files at the project root.
|
|
58
79
|
expect(existsSync(join(target, "package.json"))).toBe(true);
|
|
@@ -69,20 +90,25 @@ describe("initCommand", () => {
|
|
|
69
90
|
// Excluded template-development directory.
|
|
70
91
|
expect(existsSync(join(target, "types"))).toBe(false);
|
|
71
92
|
expect(existsSync(join(target, ".vscode"))).toBe(false);
|
|
93
|
+
// Move.toml gets a valid Move identifier.
|
|
94
|
+
const moveToml = readFileSync(join(target, "move", "Move.toml"), "utf-8");
|
|
95
|
+
expect(moveToml).toContain('name = "my_test_project"');
|
|
96
|
+
expect(moveToml).not.toContain("{{movePackageName}}");
|
|
97
|
+
expect(moveToml).not.toContain("{{projectName}}");
|
|
72
98
|
});
|
|
73
99
|
it("substitutes {{projectName}} placeholders inside template files", async () => {
|
|
74
|
-
await initCommand("
|
|
75
|
-
const pkg = readFileSync(join(tmpParent, "
|
|
76
|
-
expect(pkg).toContain("
|
|
100
|
+
await initCommand("substituted_project");
|
|
101
|
+
const pkg = readFileSync(join(tmpParent, "substituted_project", "package.json"), "utf-8");
|
|
102
|
+
expect(pkg).toContain("substituted_project");
|
|
77
103
|
expect(pkg).not.toContain("{{projectName}}");
|
|
78
|
-
const readme = readFileSync(join(tmpParent, "
|
|
79
|
-
expect(readme).toContain("
|
|
104
|
+
const readme = readFileSync(join(tmpParent, "substituted_project", "README.md"), "utf-8");
|
|
105
|
+
expect(readme).toContain("substituted_project");
|
|
80
106
|
});
|
|
81
107
|
it("prompts for project name when none is provided", async () => {
|
|
82
|
-
promptsMock.mockResolvedValueOnce({ projectName: "
|
|
108
|
+
promptsMock.mockResolvedValueOnce({ projectName: "from_prompt" });
|
|
83
109
|
await initCommand();
|
|
84
110
|
expect(promptsMock).toHaveBeenCalledTimes(1);
|
|
85
|
-
expect(existsSync(join(tmpParent, "
|
|
111
|
+
expect(existsSync(join(tmpParent, "from_prompt"))).toBe(true);
|
|
86
112
|
});
|
|
87
113
|
it("exits 0 when the user Ctrl+Cs the prompt (no project created)", async () => {
|
|
88
114
|
promptsMock.mockResolvedValueOnce({});
|
|
@@ -92,10 +118,46 @@ describe("initCommand", () => {
|
|
|
92
118
|
it("exits 1 when the template copy step hits an unwriteable target", async () => {
|
|
93
119
|
// Plant a directory where the command will try to write package.json
|
|
94
120
|
// as a file — fs.writeFile rejects with EISDIR.
|
|
95
|
-
const targetName = "
|
|
121
|
+
const targetName = "blocked_project";
|
|
96
122
|
mkdirSync(join(tmpParent, targetName, "package.json"), { recursive: true });
|
|
97
123
|
await expect(initCommand(targetName)).rejects.toThrow("__test_exit_1__");
|
|
98
124
|
expect(exitSpy).toHaveBeenCalledWith(1);
|
|
99
125
|
});
|
|
126
|
+
it("sanitizes Move.toml for hyphenated names but keeps package.json original", async () => {
|
|
127
|
+
await initCommand("my-project");
|
|
128
|
+
const target = join(tmpParent, "my-project");
|
|
129
|
+
expect(existsSync(target)).toBe(true);
|
|
130
|
+
// package.json keeps the original (npm allows hyphens).
|
|
131
|
+
const pkg = readFileSync(join(target, "package.json"), "utf-8");
|
|
132
|
+
expect(pkg).toContain('"my-project"');
|
|
133
|
+
// Move.toml gets the sanitized identifier.
|
|
134
|
+
const moveToml = readFileSync(join(target, "move", "Move.toml"), "utf-8");
|
|
135
|
+
expect(moveToml).toContain('name = "my_project"');
|
|
136
|
+
expect(moveToml).not.toContain('"my-project"');
|
|
137
|
+
// Warning was emitted.
|
|
138
|
+
expect(warnSpy).toHaveBeenCalled();
|
|
139
|
+
const warningText = warnSpy.mock.calls.flat().join(" ");
|
|
140
|
+
expect(warningText).toContain("my-project");
|
|
141
|
+
expect(warningText).toContain("my_project");
|
|
142
|
+
});
|
|
143
|
+
it("with a path argument, creates the dir at the full path and sanitizes Move.toml", async () => {
|
|
144
|
+
const nestedPath = join(tmpParent, "nested", "sub-project");
|
|
145
|
+
await initCommand(nestedPath);
|
|
146
|
+
expect(existsSync(nestedPath)).toBe(true);
|
|
147
|
+
const moveToml = readFileSync(join(nestedPath, "move", "Move.toml"), "utf-8");
|
|
148
|
+
expect(moveToml).toContain('name = "sub_project"');
|
|
149
|
+
const pkg = readFileSync(join(nestedPath, "package.json"), "utf-8");
|
|
150
|
+
expect(pkg).toContain('"sub-project"');
|
|
151
|
+
});
|
|
152
|
+
it("prefixes Move.toml package name with pkg_ for names that start with a digit", async () => {
|
|
153
|
+
await initCommand("123abc");
|
|
154
|
+
const moveToml = readFileSync(join(tmpParent, "123abc", "move", "Move.toml"), "utf-8");
|
|
155
|
+
expect(moveToml).toContain('name = "pkg_123abc"');
|
|
156
|
+
expect(warnSpy).toHaveBeenCalled();
|
|
157
|
+
});
|
|
158
|
+
it.each([".", "..", "/", " "])("rejects %j as an invalid project name and exits 1", async (input) => {
|
|
159
|
+
await expect(initCommand(input)).rejects.toThrow("__test_exit_1__");
|
|
160
|
+
expect(exitSpy).toHaveBeenCalledWith(1);
|
|
161
|
+
});
|
|
100
162
|
});
|
|
101
163
|
//# sourceMappingURL=init.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/init.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACnF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC5B,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IACxB,OAAO,EAAE,WAAW;CACrB,CAAC,CAAC,CAAC;AAEJ,4BAA4B;AAC5B,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,kBAAkB,EAAE,GAAG,EAAE,CAAC,SAAS;CACpC,CAAC,CAAC,CAAC;AAEJ,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/init.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACnF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC5B,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IACxB,OAAO,EAAE,WAAW;CACrB,CAAC,CAAC,CAAC;AAEJ,4BAA4B;AAC5B,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,kBAAkB,EAAE,GAAG,EAAE,CAAC,SAAS;CACpC,CAAC,CAAC,CAAC;AAEJ,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;AAC9C,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,GAAG,UAAU,CAAC;AAE1F;;;;;;;;;;;GAWG;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,MAAM,KAAK,GAGN;QACH,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC1G,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACzG,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACnH,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC7F,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC9G,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACtF,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC9F,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KAC9G,CAAC;IAEF,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,sBAAsB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QACzD,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAC1C,uCAAuC,EACvC,CAAC,KAAK,EAAE,EAAE;QACR,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC5E,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,SAAiB,CAAC;IACtB,IAAI,OAAe,CAAC;IACpB,IAAI,OAAoC,CAAC;IACzC,IAAI,OAAoC,CAAC;IAEzC,UAAU,CAAC,GAAG,EAAE;QACd,WAAW,CAAC,SAAS,EAAE,CAAC;QACxB,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACxB,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACzB,oEAAoE;QACpE,qEAAqE;QACrE,kDAAkD;QAClD,OAAO,GAAG,EAAE;aACT,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC;aACtB,kBAAkB,CAAC,CAAC,CAAC,IAAa,EAAE,EAAE;YACrC,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC,CAAU,CAAC,CAAC;QACf,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC7D,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC/D,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,WAAW,CAAC,iBAAiB,CAAC,CAAC;QAErC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QAClD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,uCAAuC;QACvC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,uCAAuC;QACvC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,2CAA2C;QAC3C,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,0CAA0C;QAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1E,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACvD,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QACtD,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,WAAW,CAAC,qBAAqB,CAAC,CAAC;QAEzC,MAAM,GAAG,GAAG,YAAY,CACtB,IAAI,CAAC,SAAS,EAAE,qBAAqB,EAAE,cAAc,CAAC,EACtD,OAAO,CACR,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAE7C,MAAM,MAAM,GAAG,YAAY,CACzB,IAAI,CAAC,SAAS,EAAE,qBAAqB,EAAE,WAAW,CAAC,EACnD,OAAO,CACR,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,WAAW,CAAC,qBAAqB,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;QAElE,MAAM,WAAW,EAAE,CAAC;QAEpB,MAAM,CAAC,WAAW,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,WAAW,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAEtC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC/D,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,qEAAqE;QACrE,gDAAgD;QAChD,MAAM,UAAU,GAAG,iBAAiB,CAAC;QACrC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5E,MAAM,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACzE,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,WAAW,CAAC,YAAY,CAAC,CAAC;QAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC7C,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,wDAAwD;QACxD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;QAChE,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACtC,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1E,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAClD,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC/C,uBAAuB;QACvB,MAAM,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACnC,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxD,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;QAC9F,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QAE5D,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC;QAE9B,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9E,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAE5B,MAAM,QAAQ,GAAG,YAAY,CAC3B,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAC9C,OAAO,CACR,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAC9B,mDAAmD,EACnD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACpE,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
export declare class InvalidProjectNameError extends Error {
|
|
2
|
+
constructor(message: string);
|
|
3
|
+
}
|
|
4
|
+
export interface ProjectNames {
|
|
5
|
+
/** User input as-is (after trim) — used for the filesystem target. */
|
|
6
|
+
dirName: string;
|
|
7
|
+
/** Basename of the resolved path — used for package.json + README.md. */
|
|
8
|
+
npmName: string;
|
|
9
|
+
/** Valid Move identifier — used for Move.toml. */
|
|
10
|
+
moveName: string;
|
|
11
|
+
/** True when moveName had to diverge from npmName to satisfy Move identifier rules. */
|
|
12
|
+
sanitized: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Derive filesystem, npm, and Move identifier names from a single user input.
|
|
16
|
+
*
|
|
17
|
+
* Move identifiers must match `[a-zA-Z_][a-zA-Z0-9_]*`. npm package names are
|
|
18
|
+
* looser (hyphens allowed). The filesystem accepts almost anything. Rather
|
|
19
|
+
* than reject inputs that would compile fine for npm but not for Move, we
|
|
20
|
+
* sanitize the Move identifier and leave the npm name + dir unchanged.
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveProjectNames(input: string): ProjectNames;
|
|
1
23
|
/**
|
|
2
24
|
* Initialize a new Movehat project with template files
|
|
3
25
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAA8B,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAUA,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CA0B/D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAA8B,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,iBA0I7D"}
|
package/dist/commands/init.js
CHANGED
|
@@ -6,6 +6,41 @@ import { printMovehatBanner } from "../helpers/banner.js";
|
|
|
6
6
|
import { logger, createSpinnerChain, formatCommand } from "../ui/index.js";
|
|
7
7
|
const __filename = fileURLToPath(import.meta.url);
|
|
8
8
|
const __dirname = path.dirname(__filename);
|
|
9
|
+
export class InvalidProjectNameError extends Error {
|
|
10
|
+
constructor(message) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = "InvalidProjectNameError";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Derive filesystem, npm, and Move identifier names from a single user input.
|
|
17
|
+
*
|
|
18
|
+
* Move identifiers must match `[a-zA-Z_][a-zA-Z0-9_]*`. npm package names are
|
|
19
|
+
* looser (hyphens allowed). The filesystem accepts almost anything. Rather
|
|
20
|
+
* than reject inputs that would compile fine for npm but not for Move, we
|
|
21
|
+
* sanitize the Move identifier and leave the npm name + dir unchanged.
|
|
22
|
+
*/
|
|
23
|
+
export function resolveProjectNames(input) {
|
|
24
|
+
const trimmed = input.trim();
|
|
25
|
+
if (trimmed === "" ||
|
|
26
|
+
trimmed === "." ||
|
|
27
|
+
trimmed === ".." ||
|
|
28
|
+
/^\/+$/.test(trimmed)) {
|
|
29
|
+
throw new InvalidProjectNameError(`Project name '${input}' must include at least one character besides path separators.`);
|
|
30
|
+
}
|
|
31
|
+
const dirName = trimmed;
|
|
32
|
+
const npmName = path.basename(path.resolve(trimmed));
|
|
33
|
+
let moveName = npmName.replace(/[^a-zA-Z0-9_]/g, "_");
|
|
34
|
+
if (!/^[a-zA-Z_]/.test(moveName)) {
|
|
35
|
+
moveName = `pkg_${moveName}`;
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
dirName,
|
|
39
|
+
npmName,
|
|
40
|
+
moveName,
|
|
41
|
+
sanitized: moveName !== npmName,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
9
44
|
/**
|
|
10
45
|
* Initialize a new Movehat project with template files
|
|
11
46
|
*
|
|
@@ -43,8 +78,22 @@ export default async function initCommand(projectName) {
|
|
|
43
78
|
}
|
|
44
79
|
projectName = response.projectName;
|
|
45
80
|
}
|
|
46
|
-
|
|
47
|
-
|
|
81
|
+
let names;
|
|
82
|
+
try {
|
|
83
|
+
names = resolveProjectNames(projectName);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (error instanceof InvalidProjectNameError) {
|
|
87
|
+
logger.error(error.message);
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
const { dirName, npmName, moveName, sanitized } = names;
|
|
93
|
+
const projectPath = path.resolve(process.cwd(), dirName);
|
|
94
|
+
if (sanitized) {
|
|
95
|
+
logger.warning(`'${npmName}' is not a valid Move identifier; using '${moveName}' for move/Move.toml. (package.json keeps '${npmName}'.)`);
|
|
96
|
+
}
|
|
48
97
|
logger.newline();
|
|
49
98
|
logger.info(`Initializing new Movehat project in ${projectPath}...`);
|
|
50
99
|
logger.newline();
|
|
@@ -54,17 +103,17 @@ export default async function initCommand(projectName) {
|
|
|
54
103
|
// Step 1: Create project structure
|
|
55
104
|
await steps.add('Creating project structure', async () => {
|
|
56
105
|
await fs.mkdir(projectPath, { recursive: true });
|
|
57
|
-
await copyFile(path.join(templatesDir, "package.json"), path.join(projectPath, "package.json"), { projectName:
|
|
106
|
+
await copyFile(path.join(templatesDir, "package.json"), path.join(projectPath, "package.json"), { projectName: npmName });
|
|
58
107
|
await copyFile(path.join(templatesDir, "tsconfig.json"), path.join(projectPath, "tsconfig.json"));
|
|
59
108
|
await copyFile(path.join(templatesDir, ".mocharc.json"), path.join(projectPath, ".mocharc.json"));
|
|
60
109
|
await copyFile(path.join(templatesDir, "movehat.config.ts"), path.join(projectPath, "movehat.config.ts"));
|
|
61
110
|
await copyFile(path.join(templatesDir, ".env.example"), path.join(projectPath, ".env.example"));
|
|
62
111
|
await copyFile(path.join(templatesDir, "gitignore"), path.join(projectPath, ".gitignore"));
|
|
63
|
-
await copyFile(path.join(templatesDir, "README.md"), path.join(projectPath, "README.md"), { projectName:
|
|
112
|
+
await copyFile(path.join(templatesDir, "README.md"), path.join(projectPath, "README.md"), { projectName: npmName });
|
|
64
113
|
});
|
|
65
114
|
// Step 2: Setup Move project
|
|
66
115
|
await steps.add('Setting up Move project', async () => {
|
|
67
|
-
await copyDir(path.join(templatesDir, "move"), path.join(projectPath, "move"), { projectName:
|
|
116
|
+
await copyDir(path.join(templatesDir, "move"), path.join(projectPath, "move"), { projectName: npmName, movePackageName: moveName });
|
|
68
117
|
});
|
|
69
118
|
// Step 3: Add deployment scripts
|
|
70
119
|
await steps.add('Adding deployment scripts', async () => {
|
|
@@ -81,7 +130,7 @@ export default async function initCommand(projectName) {
|
|
|
81
130
|
logger.newline();
|
|
82
131
|
// Next steps
|
|
83
132
|
logger.section('Next steps');
|
|
84
|
-
logger.item(formatCommand(`cd ${
|
|
133
|
+
logger.item(formatCommand(`cd ${dirName}`), 2);
|
|
85
134
|
logger.item(formatCommand('cp .env.example .env'), 2);
|
|
86
135
|
logger.plain(' # Edit .env with your credentials');
|
|
87
136
|
logger.item(formatCommand('npm install'), 2);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE3E,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,WAAW,CAAC,WAAoB;IAC5D,mCAAmC;IACnC,kBAAkB,EAAE,CAAC;IAErB,uBAAuB;IACvB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;YAC7B,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,eAAe;SACzB,CAAC,CAAC;QAEH,qCAAqC;QACrC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC1B,MAAM,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;IACrC,CAAC;IAED,MAAM,SAAS,GAAG,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccountManager.d.ts","sourceRoot":"","sources":["../../src/core/AccountManager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,
|
|
1
|
+
{"version":3,"file":"AccountManager.d.ts","sourceRoot":"","sources":["../../src/core/AccountManager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAIR,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD;;;;;GAKG;AACH,qBAAa,cAAc;IAKzB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAmC;IACtD,OAAO,CAAC,MAAM,CAAC,WAAW,CAAkC;IAC5D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkC;IACzD,OAAO,CAAC,MAAM,CAAC,UAAU,CAAS;IAKlC,OAAO,CAAC,MAAM,CAAC,eAAe,CAA+C;IAE7E;;;;;;;;;;OAUG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO;IAW9C;;;;;;;;;;OAUG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,GAAE,OAAe,GAAG,OAAO;IAcpE;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAQ5D;;;;;;;;;OASG;IACH,MAAM,CAAC,kBAAkB,CAAC,MAAM,GAAE,MAAsB,GAAG,OAAO;IAalE;;;;;;;;OAQG;IACH,MAAM,CAAC,yBAAyB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;IAqBhE;;;;;;;;;OASG;IACH,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,EAAE;IAkB/D;;;;;;;;OAQG;IACH,MAAM,CAAC,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAapD;;;;;;;OAOG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IA0D/C;;;;;;;;;;OAUG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAiDlD;;;;;;;;OAQG;IACH,MAAM,CAAC,SAAS,IAAI,IAAI;IAOxB;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,MAAM;IAI5B;;;;OAIG;IACH,MAAM,CAAC,cAAc,IAAI,OAAO,EAAE;IAIlC;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIvC;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAQjD;;;;;;;;;OASG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAUtE;;;;;;OAMG;IACH,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CA0BpE"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Account, Ed25519PrivateKey, } from "@aptos-labs/ts-sdk";
|
|
1
|
+
import { Account, Ed25519PrivateKey, PrivateKey, PrivateKeyVariants, } from "@aptos-labs/ts-sdk";
|
|
2
2
|
import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
3
3
|
import { join } from "path";
|
|
4
4
|
/**
|
|
@@ -8,10 +8,18 @@ import { join } from "path";
|
|
|
8
8
|
* Provides a pool of reusable test accounts with labels for better test readability.
|
|
9
9
|
*/
|
|
10
10
|
export class AccountManager {
|
|
11
|
+
// Class-static maps: shared across every consumer in the same Node
|
|
12
|
+
// process (e.g. two Harness instances). Re-using a label across
|
|
13
|
+
// "sessions" overwrites the labelMap entry. Documented + fixed by
|
|
14
|
+
// contract in `AccountManager.global-state.test.ts` (audit F8).
|
|
11
15
|
static pool = new Map(); // address → Account
|
|
12
16
|
static privateKeys = new Map(); // address → privateKey hex
|
|
13
17
|
static labelMap = new Map(); // label → address
|
|
14
18
|
static poolLoaded = false;
|
|
19
|
+
// `defaultPoolPath` is captured ONCE at module-import time. A later
|
|
20
|
+
// `process.chdir(...)` does NOT redirect the save destination — pass
|
|
21
|
+
// an explicit `poolPath` to `saveAccountPool`/`loadAccountPool` when
|
|
22
|
+
// per-test isolation matters. See audit finding F8.
|
|
15
23
|
static defaultPoolPath = join(process.cwd(), ".movehat", "accounts");
|
|
16
24
|
/**
|
|
17
25
|
* Get a test account from the pool. If label is provided and exists, returns that account.
|
|
@@ -101,7 +109,11 @@ export class AccountManager {
|
|
|
101
109
|
* const account = AccountManager.loadAccountFromPrivateKey("0xabc123...");
|
|
102
110
|
*/
|
|
103
111
|
static loadAccountFromPrivateKey(privateKeyHex) {
|
|
104
|
-
|
|
112
|
+
// Format into AIP-80 shape (`ed25519-priv-0x…`) before constructing
|
|
113
|
+
// the SDK type. Without this, raw-hex inputs trigger a noisy
|
|
114
|
+
// deprecation warning from `@aptos-labs/ts-sdk` on every call.
|
|
115
|
+
const formatted = PrivateKey.formatPrivateKey(privateKeyHex, PrivateKeyVariants.Ed25519);
|
|
116
|
+
const privateKey = new Ed25519PrivateKey(formatted);
|
|
105
117
|
const account = Account.fromPrivateKey({ privateKey });
|
|
106
118
|
const address = account.accountAddress.toString();
|
|
107
119
|
// Add to pool for tracking
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccountManager.js","sourceRoot":"","sources":["../../src/core/AccountManager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,iBAAiB,
|
|
1
|
+
{"version":3,"file":"AccountManager.js","sourceRoot":"","sources":["../../src/core/AccountManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Publisher.d.ts","sourceRoot":"","sources":["../../src/core/Publisher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Publisher.d.ts","sourceRoot":"","sources":["../../src/core/Publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkC,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAGL,cAAc,EAEf,MAAM,kBAAkB,CAAC;AAK1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAU3E,gBAAgB;AAChB,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;CAC3C;AAED,gBAAgB;AAChB,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED;;;;GAIG;AACH,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,GAAE,aAAkB;IAE/C,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC;CA0P3D"}
|
package/dist/core/Publisher.js
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { join } from "path";
|
|
3
|
-
import { randomUUID } from "crypto";
|
|
1
|
+
import { PrivateKey, PrivateKeyVariants } from "@aptos-labs/ts-sdk";
|
|
4
2
|
import { extractNamedAddresses } from "../commands/compile.js";
|
|
5
3
|
import { saveDeployment, loadDeployment, validateSafeName, } from "./deployments.js";
|
|
6
|
-
import { validatePathSafety
|
|
4
|
+
import { validatePathSafety } from "./shell.js";
|
|
7
5
|
import { CliExecutionError, ModuleAlreadyDeployedError, PostPublishError } from "../errors.js";
|
|
8
6
|
import { runCli } from "../utils/runCli.js";
|
|
9
7
|
import { logger } from "../ui/index.js";
|
|
10
|
-
import {
|
|
8
|
+
import { writeTempKeyFile, removeKeyFile, removeKeyFileSyncBestEffort, ensureSignalHandler, cleanupCallbacks, } from "./movementProfile.js";
|
|
11
9
|
import { parseTxHash } from "../utils/parseCliOutput.js";
|
|
12
10
|
/**
|
|
13
11
|
* Publishes a Move module via the Movement CLI.
|
|
@@ -54,17 +52,10 @@ export class Publisher {
|
|
|
54
52
|
logger.info(`Redeploying module "${moduleName}" on ${config.network}...`);
|
|
55
53
|
}
|
|
56
54
|
const dir = input.packageDir || config.moveDir;
|
|
57
|
-
// Bug #37: use a UUID-suffixed profile name per deploy so concurrent
|
|
58
|
-
// Publisher.deploy() calls in the same process don't fight over the
|
|
59
|
-
// same key in ~/.aptos/config.yaml. The previous code reused
|
|
60
|
-
// config.profile (default "default"), which meant two parallel
|
|
61
|
-
// deploys would clobber each other's profile data mid-publish.
|
|
62
|
-
const profile = `movehat-deploy-${randomUUID().slice(0, 8)}`;
|
|
63
55
|
// Validate (no shell escape — runCli uses spawn, which takes args
|
|
64
56
|
// verbatim and would treat the single-quote wrapping as part of the
|
|
65
|
-
// literal path
|
|
57
|
+
// literal path, breaking Movement CLI argument parsing).
|
|
66
58
|
const safeDir = validatePathSafety(dir, "package directory");
|
|
67
|
-
const safeProfile = validateProfileSafety(profile);
|
|
68
59
|
logger.step(`Publishing module "${moduleName}" from ${dir}...`);
|
|
69
60
|
try {
|
|
70
61
|
// Get the deployer address to use for named addresses
|
|
@@ -93,46 +84,41 @@ export class Publisher {
|
|
|
93
84
|
console.log(buildResult.stdout.trim());
|
|
94
85
|
// Publish using direct parameters (avoid config file issues)
|
|
95
86
|
logger.step("Publishing to blockchain...");
|
|
96
|
-
//
|
|
97
|
-
//
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
//
|
|
103
|
-
//
|
|
104
|
-
//
|
|
105
|
-
// restore-in-finally was destructive: if the process died between
|
|
106
|
-
// write and restore, the user's Move.toml stayed mutated.
|
|
87
|
+
// Format the private key into AIP-80 shape so the Movement CLI
|
|
88
|
+
// doesn't emit its raw-hex deprecation warning. `formatPrivateKey`
|
|
89
|
+
// is idempotent for already-prefixed inputs.
|
|
90
|
+
const formattedPrivateKey = PrivateKey.formatPrivateKey(config.privateKey, PrivateKeyVariants.Ed25519);
|
|
91
|
+
// Move.toml is NOT mutated. All address overrides flow through
|
|
92
|
+
// the `--named-addresses` flag above, which Movement CLI applies
|
|
93
|
+
// during build + publish. Rewriting Move.toml on disk would risk
|
|
94
|
+
// leaving the user's file mutated if the process died before the
|
|
95
|
+
// restore step.
|
|
107
96
|
let publishOut = "";
|
|
108
97
|
let publishErr = "";
|
|
109
|
-
//
|
|
110
|
-
//
|
|
111
|
-
|
|
112
|
-
//
|
|
113
|
-
//
|
|
114
|
-
|
|
115
|
-
//
|
|
116
|
-
//
|
|
117
|
-
//
|
|
98
|
+
// Pass the private key to Movement CLI via a 0o600 temp file
|
|
99
|
+
// (`--private-key-file <path>`) and the on-chain address via
|
|
100
|
+
// `--sender-account <addr>`. This avoids the CLI's profile-yaml
|
|
101
|
+
// lookup chain entirely — no CWD / HOME / .aptos / .movement
|
|
102
|
+
// dance, no CLI-variant dependency.
|
|
103
|
+
const keyFilePath = writeTempKeyFile(formattedPrivateKey);
|
|
104
|
+
// Register a sync cleanup hook BEFORE invoking the CLI. If the
|
|
105
|
+
// user Ctrl+C's (or the process is SIGTERM'd) between the file
|
|
106
|
+
// write and our finally, the SIGINT handler iterates every
|
|
107
|
+
// registered callback and unlinks this deploy's key file
|
|
108
|
+
// synchronously so the private key never persists on disk after
|
|
109
|
+
// an abnormal exit. The signal-handler path uses the
|
|
110
|
+
// best-effort variant because the event loop is dead and we
|
|
111
|
+
// cannot logger.warning.
|
|
118
112
|
ensureSignalHandler();
|
|
119
|
-
const syncCleanup = () =>
|
|
113
|
+
const syncCleanup = () => removeKeyFileSyncBestEffort(keyFilePath);
|
|
120
114
|
cleanupCallbacks.add(syncCleanup);
|
|
121
|
-
// Add our deploy profile under the unique key. The mutex serializes
|
|
122
|
-
// read-modify-write cycles so concurrent deploys in the same process
|
|
123
|
-
// can't drop each other's profiles. Other user profiles in the same
|
|
124
|
-
// file are preserved untouched.
|
|
125
|
-
await withYamlLock(() => addProfile(movementConfigPath, profile, {
|
|
126
|
-
private_key: cleanPrivateKey,
|
|
127
|
-
public_key: account.publicKey.toString(),
|
|
128
|
-
account: deployerAddress,
|
|
129
|
-
rest_url: config.rpc,
|
|
130
|
-
}));
|
|
131
115
|
try {
|
|
132
|
-
// Execute publish command
|
|
133
|
-
//
|
|
134
|
-
//
|
|
135
|
-
//
|
|
116
|
+
// Execute publish command. Private key reaches the CLI via the
|
|
117
|
+
// temp key file path (--private-key-file) — never on the
|
|
118
|
+
// command line — so it can't leak through `ps aux`. runCli's
|
|
119
|
+
// stdout/stderr redaction still applies as defense in depth
|
|
120
|
+
// for any `ed25519-priv-…` substring that surfaces in CLI
|
|
121
|
+
// output (Movement CLI sometimes echoes the key on error).
|
|
136
122
|
const publishResult = await runCli({
|
|
137
123
|
command: "movement",
|
|
138
124
|
args: [
|
|
@@ -142,8 +128,10 @@ export class Publisher {
|
|
|
142
128
|
safeDir,
|
|
143
129
|
"--url",
|
|
144
130
|
config.rpc,
|
|
145
|
-
"--
|
|
146
|
-
|
|
131
|
+
"--private-key-file",
|
|
132
|
+
keyFilePath,
|
|
133
|
+
"--sender-account",
|
|
134
|
+
deployerAddress,
|
|
147
135
|
"--assume-yes",
|
|
148
136
|
...namedAddrArgs,
|
|
149
137
|
],
|
|
@@ -157,24 +145,20 @@ export class Publisher {
|
|
|
157
145
|
console.error(publishErr.trim());
|
|
158
146
|
}
|
|
159
147
|
finally {
|
|
160
|
-
//
|
|
161
|
-
//
|
|
162
|
-
//
|
|
163
|
-
//
|
|
164
|
-
//
|
|
165
|
-
//
|
|
166
|
-
//
|
|
167
|
-
//
|
|
168
|
-
//
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
`Run 'movement config delete-profile --profile ${profile}' to clean up manually.`);
|
|
175
|
-
});
|
|
176
|
-
// Unregister the sync cleanup hook — normal path. (The signal
|
|
177
|
-
// handler stays installed for the process lifetime; cheap.)
|
|
148
|
+
// Unlink the temp key file via the observable cleanup helper.
|
|
149
|
+
// ENOENT and other already-gone outcomes are benign (null).
|
|
150
|
+
// A non-null Error means the unlink failed AND the file still
|
|
151
|
+
// exists on disk — the private key would persist silently
|
|
152
|
+
// otherwise, so we emit a warning with the manual-cleanup
|
|
153
|
+
// hint. The SIGINT signal handler's sync callback below also
|
|
154
|
+
// tries to remove the same file; if SIGINT fires before this
|
|
155
|
+
// finally runs the file is gone and the next finally call
|
|
156
|
+
// sees ENOENT (benign).
|
|
157
|
+
const cleanupErr = removeKeyFile(keyFilePath);
|
|
158
|
+
if (cleanupErr) {
|
|
159
|
+
logger.warning(`Failed to remove temp key file '${keyFilePath}': ${cleanupErr.message}. ` +
|
|
160
|
+
`The file has mode 0o600 but should be removed manually: rm ${keyFilePath}`);
|
|
161
|
+
}
|
|
178
162
|
cleanupCallbacks.delete(syncCleanup);
|
|
179
163
|
}
|
|
180
164
|
// Extract transaction hash from output via the shared helper
|