alpic 0.0.0-dev.fdfada2 → 0.0.0-dev.fe18813
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__/auth.e2e.test.d.ts +1 -0
- package/dist/__tests__/auth.e2e.test.js +142 -0
- package/dist/__tests__/auth.e2e.test.js.map +1 -0
- package/dist/__tests__/deploy-flags.e2e.test.d.ts +1 -0
- package/dist/__tests__/deploy-flags.e2e.test.js +111 -0
- package/dist/__tests__/deploy-flags.e2e.test.js.map +1 -0
- package/dist/__tests__/deploy.e2e.test.d.ts +1 -0
- package/dist/__tests__/deploy.e2e.test.js +168 -0
- package/dist/__tests__/deploy.e2e.test.js.map +1 -0
- package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.d.ts +1 -0
- package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js +250 -0
- package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js.map +1 -0
- package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.d.ts +1 -0
- package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js +121 -0
- package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js.map +1 -0
- package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.d.ts +1 -0
- package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js +139 -0
- package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js.map +1 -0
- package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.d.ts +1 -0
- package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js +294 -0
- package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js.map +1 -0
- package/dist/__tests__/environment-variable/environment-variable-validation.test.d.ts +1 -0
- package/dist/__tests__/environment-variable/environment-variable-validation.test.js +19 -0
- package/dist/__tests__/environment-variable/environment-variable-validation.test.js.map +1 -0
- package/dist/__tests__/fixtures/demo-project/index.d.ts +1 -0
- package/dist/__tests__/fixtures/demo-project/index.js +4 -0
- package/dist/__tests__/fixtures/demo-project/index.js.map +1 -0
- package/dist/__tests__/git-flags.e2e.test.d.ts +1 -0
- package/dist/__tests__/git-flags.e2e.test.js +124 -0
- package/dist/__tests__/git-flags.e2e.test.js.map +1 -0
- package/dist/__tests__/git.e2e.test.d.ts +1 -0
- package/dist/__tests__/git.e2e.test.js +221 -0
- package/dist/__tests__/git.e2e.test.js.map +1 -0
- package/dist/__tests__/mock-server.d.ts +23 -0
- package/dist/__tests__/mock-server.js +573 -0
- package/dist/__tests__/mock-server.js.map +1 -0
- package/dist/__tests__/utils.d.ts +67 -0
- package/dist/__tests__/utils.js +255 -0
- package/dist/__tests__/utils.js.map +1 -0
- package/dist/api.d.ts +0 -1
- package/dist/api.js +5 -9
- package/dist/api.js.map +1 -1
- package/dist/commands/deploy.d.ts +7 -4
- package/dist/commands/deploy.js +39 -25
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/environment-variable/add.d.ts +14 -0
- package/dist/commands/environment-variable/add.js +46 -0
- package/dist/commands/environment-variable/add.js.map +1 -0
- package/dist/commands/environment-variable/list.d.ts +9 -0
- package/dist/commands/environment-variable/list.js +48 -0
- package/dist/commands/environment-variable/list.js.map +1 -0
- package/dist/commands/environment-variable/remove.d.ts +11 -0
- package/dist/commands/environment-variable/remove.js +32 -0
- package/dist/commands/environment-variable/remove.js.map +1 -0
- package/dist/commands/environment-variable/update.d.ts +13 -0
- package/dist/commands/environment-variable/update.js +40 -0
- package/dist/commands/environment-variable/update.js.map +1 -0
- package/dist/commands/git/connect.d.ts +10 -0
- package/dist/commands/git/connect.js +58 -0
- package/dist/commands/git/connect.js.map +1 -0
- package/dist/commands/git/disconnect.d.ts +9 -0
- package/dist/commands/git/disconnect.js +41 -0
- package/dist/commands/git/disconnect.js.map +1 -0
- package/dist/commands/git.d.ts +6 -0
- package/dist/commands/git.js +17 -0
- package/dist/commands/git.js.map +1 -0
- package/dist/commands/login.d.ts +6 -0
- package/dist/commands/login.js +32 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +6 -0
- package/dist/commands/logout.js +20 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/whoami.d.ts +6 -0
- package/dist/commands/whoami.js +13 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/env.d.ts +4 -0
- package/dist/env.js +10 -0
- package/dist/env.js.map +1 -0
- package/dist/lib/alpic-command.d.ts +6 -0
- package/dist/lib/alpic-command.js +27 -0
- package/dist/lib/alpic-command.js.map +1 -0
- package/dist/lib/archive.d.ts +3 -3
- package/dist/lib/archive.js +11 -15
- package/dist/lib/archive.js.map +1 -1
- package/dist/lib/auth/auth.d.ts +2 -0
- package/dist/lib/auth/auth.js +21 -0
- package/dist/lib/auth/auth.js.map +1 -0
- package/dist/lib/auth/oauth/client.d.ts +28 -0
- package/dist/lib/auth/oauth/client.js +110 -0
- package/dist/lib/auth/oauth/client.js.map +1 -0
- package/dist/lib/auth/oauth/constants.d.ts +2 -0
- package/dist/lib/auth/oauth/constants.js +3 -0
- package/dist/lib/auth/oauth/constants.js.map +1 -0
- package/dist/lib/auth/oauth/server/assets/alpic-mountain.png +0 -0
- package/dist/lib/auth/oauth/server/assets/authorize.html +195 -0
- package/dist/lib/auth/oauth/server/assets/callback.html +88 -0
- package/dist/lib/auth/oauth/server/index.d.ts +8 -0
- package/dist/lib/auth/oauth/server/index.js +102 -0
- package/dist/lib/auth/oauth/server/index.js.map +1 -0
- package/dist/lib/auth/whoami.d.ts +1 -0
- package/dist/lib/auth/whoami.js +41 -0
- package/dist/lib/auth/whoami.js.map +1 -0
- package/dist/lib/base-workflow.d.ts +10 -0
- package/dist/lib/base-workflow.js +22 -0
- package/dist/lib/base-workflow.js.map +1 -0
- package/dist/lib/config.d.ts +2 -2
- package/dist/lib/config.js +7 -7
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/deployment.d.ts +2 -3
- package/dist/lib/deployment.js +12 -8
- package/dist/lib/deployment.js.map +1 -1
- package/dist/lib/environment-variable.d.ts +35 -0
- package/dist/lib/environment-variable.js +277 -0
- package/dist/lib/environment-variable.js.map +1 -0
- package/dist/lib/git.d.ts +22 -0
- package/dist/lib/git.js +131 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/global-store.d.ts +28 -0
- package/dist/lib/global-store.js +76 -0
- package/dist/lib/global-store.js.map +1 -0
- package/dist/lib/project.d.ts +65 -61
- package/dist/lib/project.js +264 -250
- package/dist/lib/project.js.map +1 -1
- package/dist/lib/table.d.ts +8 -0
- package/dist/lib/table.js +27 -0
- package/dist/lib/table.js.map +1 -0
- package/dist/lib/telemetry.js +6 -6
- package/dist/lib/telemetry.js.map +1 -1
- package/dist/lib/utils.d.ts +1 -0
- package/dist/lib/utils.js +17 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/utils.test.d.ts +1 -0
- package/dist/lib/utils.test.js +14 -0
- package/dist/lib/utils.test.js.map +1 -0
- package/package.json +29 -28
- package/dist/lib/global-config.d.ts +0 -9
- package/dist/lib/global-config.js +0 -48
- package/dist/lib/global-config.js.map +0 -1
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { RouterOutput } from "@alpic-ai/api";
|
|
2
|
+
import type { ApiCall, MockApiServer } from "./mock-server.js";
|
|
3
|
+
type Expectable = string | RegExp;
|
|
4
|
+
type ProjectGetV1 = RouterOutput["projects"]["get"]["v1"];
|
|
5
|
+
export type CliSessionOptions = {
|
|
6
|
+
cwd?: string;
|
|
7
|
+
env?: Record<string, string | undefined>;
|
|
8
|
+
cols?: number;
|
|
9
|
+
rows?: number;
|
|
10
|
+
timeoutMs?: number;
|
|
11
|
+
};
|
|
12
|
+
export type CliController = {
|
|
13
|
+
/** Wait until stdout/stderr contains a string or matches a regex */
|
|
14
|
+
expect: (pattern: Expectable, opts?: {
|
|
15
|
+
timeoutMs?: number;
|
|
16
|
+
}) => Promise<void>;
|
|
17
|
+
/** Send a line (adds newline) */
|
|
18
|
+
send: (line: string) => Promise<void>;
|
|
19
|
+
/** Send raw data (no newline) */
|
|
20
|
+
write: (data: string) => void;
|
|
21
|
+
/** Current accumulated output */
|
|
22
|
+
output: () => string;
|
|
23
|
+
/** Clear accumulated output (handy between phases) */
|
|
24
|
+
clear: () => void;
|
|
25
|
+
/** End session (SIGTERM) */
|
|
26
|
+
stop: () => void;
|
|
27
|
+
};
|
|
28
|
+
export declare function cliSession(cmd: string, args: string[], options: CliSessionOptions, fn?: (cli: CliController) => Promise<void> | void): Promise<{
|
|
29
|
+
exitCode: number | null;
|
|
30
|
+
output: string;
|
|
31
|
+
}>;
|
|
32
|
+
export type BuildMockProjectParams = {
|
|
33
|
+
projectId: string;
|
|
34
|
+
teamId: string;
|
|
35
|
+
projectName: string;
|
|
36
|
+
environmentId: string;
|
|
37
|
+
environmentName: string;
|
|
38
|
+
sourceRepository?: string | null;
|
|
39
|
+
sourceBranch?: string | null;
|
|
40
|
+
};
|
|
41
|
+
export declare function buildMockProject(params: BuildMockProjectParams): ProjectGetV1;
|
|
42
|
+
export type SetupTestDirectoryOptions = {
|
|
43
|
+
/** If true, run git init and add origin/upstream remotes */
|
|
44
|
+
initGit?: boolean;
|
|
45
|
+
};
|
|
46
|
+
export declare function setupTestDirectory(options?: SetupTestDirectoryOptions): Promise<{
|
|
47
|
+
cwd: string;
|
|
48
|
+
binPath: string;
|
|
49
|
+
}>;
|
|
50
|
+
export declare function createConfigFile(cwd: string, projectId: string, teamId: string, projectName: string, environmentId: string, environmentName: string): void;
|
|
51
|
+
export declare function runGit(args: string[], cwd: string): void;
|
|
52
|
+
export declare function expectSuccessfulApiCall(call: ApiCall | undefined, customAssertions?: (call: ApiCall) => void): asserts call is ApiCall;
|
|
53
|
+
/**
|
|
54
|
+
* Create OAuth credentials in a temp config dir and return env for CLI subprocess.
|
|
55
|
+
* Use this to run commands with OAuth auth (no ALPIC_API_KEY).
|
|
56
|
+
* Caller must pass serverUrl so userinfo can be pointed at the mock server.
|
|
57
|
+
*/
|
|
58
|
+
export declare function createOAuthEnv(cwd: string, serverUrl: string): Record<string, string>;
|
|
59
|
+
export declare function verifyConfigFile(cwd: string, output: string, expected: {
|
|
60
|
+
projectName: string;
|
|
61
|
+
projectId?: string;
|
|
62
|
+
teamId?: string;
|
|
63
|
+
environmentId?: string;
|
|
64
|
+
environmentName?: string;
|
|
65
|
+
}): Promise<void>;
|
|
66
|
+
export declare function verifyDeploymentFlow(cli: CliController, mockServer: MockApiServer): Promise<void>;
|
|
67
|
+
export {};
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import pty from "node-pty";
|
|
2
|
+
import { execFileSync } from "node:child_process";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
5
|
+
import { cp, mkdtemp, readFile, rm } from "node:fs/promises";
|
|
6
|
+
import { tmpdir } from "node:os";
|
|
7
|
+
import { dirname, join } from "node:path";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
import { stripVTControlCharacters } from "node:util";
|
|
10
|
+
import { expect } from "vitest";
|
|
11
|
+
const __testDirname = dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
export async function cliSession(cmd, args, options, fn = async () => { }) {
|
|
13
|
+
const { cwd, env, cols = 100, rows = 30, timeoutMs = 8000 } = options;
|
|
14
|
+
const createdConfigDir = env?.ALPIC_GLOBAL_CONFIG_DIR === undefined;
|
|
15
|
+
const globalConfigDir = env?.ALPIC_GLOBAL_CONFIG_DIR ?? (await mkdtemp(join(tmpdir(), "alpic-cli-config-")));
|
|
16
|
+
const mergedEnv = {
|
|
17
|
+
...process.env,
|
|
18
|
+
ALPIC_GLOBAL_CONFIG_DIR: globalConfigDir,
|
|
19
|
+
// Resolve @alpic-ai/api to TypeScript source via the "development" export condition,
|
|
20
|
+
// so e2e tests run without building the api package first.
|
|
21
|
+
NODE_OPTIONS: [process.env.NODE_OPTIONS, "--conditions=development"].filter(Boolean).join(" "),
|
|
22
|
+
...Object.fromEntries(Object.entries(env ?? {}).filter(([, v]) => v !== undefined)),
|
|
23
|
+
};
|
|
24
|
+
for (const [k, v] of Object.entries(mergedEnv)) {
|
|
25
|
+
if (typeof v !== "string") {
|
|
26
|
+
console.error("[pty] bad env entry:", k, v, typeof v);
|
|
27
|
+
throw new Error(`env value for ${k} is not a string`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const term = pty.spawn(cmd, args, {
|
|
31
|
+
cwd,
|
|
32
|
+
env: mergedEnv,
|
|
33
|
+
name: "xterm-256color",
|
|
34
|
+
cols,
|
|
35
|
+
rows,
|
|
36
|
+
});
|
|
37
|
+
let buf = "";
|
|
38
|
+
const append = (data) => {
|
|
39
|
+
buf += data;
|
|
40
|
+
};
|
|
41
|
+
term.onData(append);
|
|
42
|
+
let exitCode = null;
|
|
43
|
+
const exitPromise = new Promise((resolve) => {
|
|
44
|
+
term.onExit((e) => {
|
|
45
|
+
exitCode = e.exitCode ?? null;
|
|
46
|
+
resolve();
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
const controller = {
|
|
50
|
+
expect: (pattern, opts) => waitFor(() => matches(buf, pattern), opts?.timeoutMs ?? timeoutMs, () => buf, pattern),
|
|
51
|
+
send: async (line) => {
|
|
52
|
+
term.write(line + "\r");
|
|
53
|
+
},
|
|
54
|
+
write: (data) => term.write(data),
|
|
55
|
+
output: () => stripVTControlCharacters(buf),
|
|
56
|
+
clear: () => {
|
|
57
|
+
buf = "";
|
|
58
|
+
},
|
|
59
|
+
stop: () => {
|
|
60
|
+
try {
|
|
61
|
+
term.kill();
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// ignore
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
try {
|
|
69
|
+
await fn(controller);
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
const didExitGracefully = await waitForExit(exitPromise, timeoutMs);
|
|
73
|
+
if (!didExitGracefully) {
|
|
74
|
+
controller.stop();
|
|
75
|
+
await Promise.race([exitPromise, sleep(200)]);
|
|
76
|
+
}
|
|
77
|
+
if (createdConfigDir) {
|
|
78
|
+
await rm(globalConfigDir, { recursive: true, force: true });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return { exitCode, output: stripVTControlCharacters(buf) };
|
|
82
|
+
}
|
|
83
|
+
function matches(text, pattern) {
|
|
84
|
+
const normalizedText = stripVTControlCharacters(text);
|
|
85
|
+
if (typeof pattern === "string") {
|
|
86
|
+
return normalizedText.includes(pattern);
|
|
87
|
+
}
|
|
88
|
+
return pattern.test(normalizedText);
|
|
89
|
+
}
|
|
90
|
+
async function waitFor(predicate, timeoutMs, getOutput, pattern) {
|
|
91
|
+
const start = Date.now();
|
|
92
|
+
while (true) {
|
|
93
|
+
if (predicate())
|
|
94
|
+
return;
|
|
95
|
+
if (Date.now() - start > timeoutMs) {
|
|
96
|
+
const out = getOutput();
|
|
97
|
+
throw new Error(`Timed out after ${timeoutMs}ms waiting for: ${patternToString(pattern)}\n\n` +
|
|
98
|
+
`--- current output ---\n${out}\n--- end output ---\n`);
|
|
99
|
+
}
|
|
100
|
+
await sleep(20);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function patternToString(p) {
|
|
104
|
+
return typeof p === "string" ? JSON.stringify(p) : `/${p.source}/${p.flags}`;
|
|
105
|
+
}
|
|
106
|
+
function sleep(ms) {
|
|
107
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
108
|
+
}
|
|
109
|
+
async function waitForExit(exitPromise, timeoutMs) {
|
|
110
|
+
return Promise.race([exitPromise.then(() => true), sleep(timeoutMs).then(() => false)]);
|
|
111
|
+
}
|
|
112
|
+
export function buildMockProject(params) {
|
|
113
|
+
const { projectId, teamId, projectName, environmentId, environmentName, sourceRepository = null, sourceBranch = null, } = params;
|
|
114
|
+
const mcpServerUrl = `https://mcp-${projectId}.alpic.ai`;
|
|
115
|
+
return {
|
|
116
|
+
id: projectId,
|
|
117
|
+
name: projectName,
|
|
118
|
+
teamId,
|
|
119
|
+
environments: [
|
|
120
|
+
{
|
|
121
|
+
id: environmentId,
|
|
122
|
+
name: environmentName,
|
|
123
|
+
sourceBranch,
|
|
124
|
+
mcpServerUrl,
|
|
125
|
+
createdAt: new Date(),
|
|
126
|
+
projectId,
|
|
127
|
+
latestDeployment: null,
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
productionEnvironment: {
|
|
131
|
+
id: environmentId,
|
|
132
|
+
name: environmentName,
|
|
133
|
+
mcpServerUrl,
|
|
134
|
+
domains: [],
|
|
135
|
+
latestDeployment: null,
|
|
136
|
+
},
|
|
137
|
+
sourceRepository,
|
|
138
|
+
runtime: "node24",
|
|
139
|
+
transport: null,
|
|
140
|
+
rootDirectory: null,
|
|
141
|
+
buildCommand: null,
|
|
142
|
+
buildOutputDir: null,
|
|
143
|
+
installCommand: null,
|
|
144
|
+
startCommand: null,
|
|
145
|
+
createdAt: new Date(),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
export async function setupTestDirectory(options = {}) {
|
|
149
|
+
const { initGit = false } = options;
|
|
150
|
+
const uniqueId = randomUUID();
|
|
151
|
+
const cwd = await mkdtemp(join(tmpdir(), `alpic-cli-e2e-${uniqueId}-`));
|
|
152
|
+
const fixturePath = join(__testDirname, "fixtures", "demo-project");
|
|
153
|
+
await cp(fixturePath, cwd, { recursive: true });
|
|
154
|
+
if (initGit) {
|
|
155
|
+
runGit(["init"], cwd);
|
|
156
|
+
runGit(["remote", "add", "origin", "git@github.com:acme/frontend.git"], cwd);
|
|
157
|
+
runGit(["remote", "add", "upstream", "https://github.com/acme/backend.git"], cwd);
|
|
158
|
+
}
|
|
159
|
+
const binPath = join(process.cwd(), "bin", "dev.js");
|
|
160
|
+
return { cwd, binPath };
|
|
161
|
+
}
|
|
162
|
+
export function createConfigFile(cwd, projectId, teamId, projectName, environmentId, environmentName) {
|
|
163
|
+
const configDir = join(cwd, ".alpic");
|
|
164
|
+
mkdirSync(configDir, { recursive: true });
|
|
165
|
+
const configPath = join(configDir, "project.json");
|
|
166
|
+
writeFileSync(configPath, JSON.stringify({
|
|
167
|
+
projectId,
|
|
168
|
+
teamId,
|
|
169
|
+
projectName,
|
|
170
|
+
environmentId,
|
|
171
|
+
environmentName,
|
|
172
|
+
}));
|
|
173
|
+
}
|
|
174
|
+
export function runGit(args, cwd) {
|
|
175
|
+
execFileSync("git", args, {
|
|
176
|
+
cwd,
|
|
177
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
export function expectSuccessfulApiCall(call, customAssertions) {
|
|
181
|
+
expect(call).toBeDefined();
|
|
182
|
+
expect(call?.responseStatus).toBe(200);
|
|
183
|
+
if (customAssertions && call) {
|
|
184
|
+
customAssertions(call);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Create OAuth credentials in a temp config dir and return env for CLI subprocess.
|
|
189
|
+
* Use this to run commands with OAuth auth (no ALPIC_API_KEY).
|
|
190
|
+
* Caller must pass serverUrl so userinfo can be pointed at the mock server.
|
|
191
|
+
*/
|
|
192
|
+
export function createOAuthEnv(cwd, serverUrl) {
|
|
193
|
+
const alpicConfigDir = join(cwd, ".config", "alpic");
|
|
194
|
+
mkdirSync(alpicConfigDir, { recursive: true });
|
|
195
|
+
const credentialsPath = join(alpicConfigDir, "credentials.json");
|
|
196
|
+
const expiresAt = Math.floor(Date.now() / 1000) + 3600; // seconds
|
|
197
|
+
writeFileSync(credentialsPath, JSON.stringify({
|
|
198
|
+
access_token: "test-oauth-token",
|
|
199
|
+
refresh_token: "test-refresh-token",
|
|
200
|
+
expires_at: expiresAt,
|
|
201
|
+
sub: "test-sub",
|
|
202
|
+
}), "utf-8");
|
|
203
|
+
return {
|
|
204
|
+
ALPIC_GLOBAL_CONFIG_DIR: alpicConfigDir,
|
|
205
|
+
ALPIC_COGNITO_URL: serverUrl,
|
|
206
|
+
ALPIC_API_BASE_URL: serverUrl,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
export async function verifyConfigFile(cwd, output, expected) {
|
|
210
|
+
const cfgPath = join(cwd, ".alpic", "project.json");
|
|
211
|
+
const cfg = await readFile(cfgPath, "utf8");
|
|
212
|
+
const config = JSON.parse(cfg);
|
|
213
|
+
expect(config.projectName).toBe(expected.projectName);
|
|
214
|
+
if (expected.projectId !== undefined) {
|
|
215
|
+
expect(config.projectId).toBe(expected.projectId);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
expect(config.projectId).toBeDefined();
|
|
219
|
+
}
|
|
220
|
+
if (expected.teamId !== undefined) {
|
|
221
|
+
expect(config.teamId).toBe(expected.teamId);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
expect(config.teamId).toBeDefined();
|
|
225
|
+
}
|
|
226
|
+
if (expected.environmentId !== undefined) {
|
|
227
|
+
expect(config.environmentId).toBe(expected.environmentId);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
expect(config.environmentId).toBeDefined();
|
|
231
|
+
}
|
|
232
|
+
if (expected.environmentName !== undefined) {
|
|
233
|
+
expect(config.environmentName).toBe(expected.environmentName);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
expect(config.environmentName).toBeDefined();
|
|
237
|
+
}
|
|
238
|
+
expect(output).toMatch(/Deployment completed|Deployment summary/);
|
|
239
|
+
}
|
|
240
|
+
export async function verifyDeploymentFlow(cli, mockServer) {
|
|
241
|
+
await cli.expect(/Collected \d+ file/);
|
|
242
|
+
await cli.expect("Upload complete");
|
|
243
|
+
const uploadCall = mockServer.getLastCall("POST", "/v1/deployments/upload");
|
|
244
|
+
expectSuccessfulApiCall(uploadCall);
|
|
245
|
+
await cli.expect("Deployment started");
|
|
246
|
+
const deployCall = mockServer.getLastCall("POST", /\/v1\/environments\/.*\/deploy/);
|
|
247
|
+
expectSuccessfulApiCall(deployCall);
|
|
248
|
+
await cli.expect("View deployment details:");
|
|
249
|
+
await cli.expect("Deployment summary:");
|
|
250
|
+
const deploymentStatusCalls = mockServer.getCalls("GET", /\/v1\/deployments\/.*/);
|
|
251
|
+
expect(deploymentStatusCalls.length).toBeGreaterThan(0);
|
|
252
|
+
const envCall = mockServer.getLastCall("GET", /\/v1\/environments\/.*/);
|
|
253
|
+
expectSuccessfulApiCall(envCall);
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/__tests__/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/api.d.ts
CHANGED
package/dist/api.js
CHANGED
|
@@ -2,16 +2,12 @@ import { createORPCClient } from "@orpc/client";
|
|
|
2
2
|
import { ResponseValidationPlugin } from "@orpc/contract/plugins";
|
|
3
3
|
import { OpenAPILink } from "@orpc/openapi-client/fetch";
|
|
4
4
|
import { contract } from "@alpic-ai/api";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
export function getFrontendBaseUrl() {
|
|
9
|
-
return process.env.ALPIC_FRONTEND_BASE_URL ?? "https://app.alpic.ai";
|
|
10
|
-
}
|
|
5
|
+
import { env } from "./env.js";
|
|
6
|
+
import { getApiToken } from "./lib/auth/auth.js";
|
|
11
7
|
const link = new OpenAPILink(contract, {
|
|
12
|
-
url:
|
|
13
|
-
headers: {
|
|
14
|
-
Authorization: `Bearer ${
|
|
8
|
+
url: env.ALPIC_API_BASE_URL,
|
|
9
|
+
headers: async () => {
|
|
10
|
+
return getApiToken().then((token) => (token ? { Authorization: `Bearer ${token}` } : {}));
|
|
15
11
|
},
|
|
16
12
|
plugins: [new ResponseValidationPlugin(contract)],
|
|
17
13
|
});
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE;IACrC,GAAG,EAAE,GAAG,CAAC,kBAAkB;IAC3B,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,OAAO,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,EAAE,CAAC,IAAI,wBAAwB,CAAC,QAAQ,CAAC,CAAC;CAClD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,GAAG,GAA0C,gBAAgB,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare class Deploy extends
|
|
1
|
+
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
2
|
+
export declare class Deploy extends AlpicCommand {
|
|
3
3
|
static description: string;
|
|
4
4
|
static examples: string[];
|
|
5
|
-
static
|
|
6
|
-
|
|
5
|
+
static flags: {
|
|
6
|
+
"non-interactive": import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
runtime: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
"root-dir": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
"project-name": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
10
|
};
|
|
8
11
|
run(): Promise<void>;
|
|
9
12
|
}
|
package/dist/commands/deploy.js
CHANGED
|
@@ -1,44 +1,61 @@
|
|
|
1
1
|
import * as p from "@clack/prompts";
|
|
2
|
-
import {
|
|
2
|
+
import { Flags } from "@oclif/core";
|
|
3
3
|
import chalk from "chalk";
|
|
4
4
|
import { readFileSync, rmSync } from "node:fs";
|
|
5
5
|
import { api } from "../api.js";
|
|
6
|
+
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
6
7
|
import { createTarArchive, getFilesToPack } from "../lib/archive.js";
|
|
7
8
|
import { deployAndWait, formatElapsed } from "../lib/deployment.js";
|
|
8
|
-
import {
|
|
9
|
+
import { ProjectWorkflow } from "../lib/project.js";
|
|
9
10
|
import { uploadToPresignedUrl } from "../lib/upload.js";
|
|
10
|
-
|
|
11
|
+
const RUNTIMES = ["node24", "node22", "python3.14", "python3.13"];
|
|
12
|
+
export class Deploy extends AlpicCommand {
|
|
11
13
|
static description = "Deploy a project to Alpic";
|
|
12
|
-
static examples = [
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
static examples = [
|
|
15
|
+
"<%= config.bin %> deploy",
|
|
16
|
+
"<%= config.bin %> deploy --non-interactive --project-name my-app --runtime node24",
|
|
17
|
+
];
|
|
18
|
+
static flags = {
|
|
19
|
+
"non-interactive": Flags.boolean({
|
|
20
|
+
description: "Skip all confirmation prompts",
|
|
21
|
+
required: false,
|
|
22
|
+
}),
|
|
23
|
+
runtime: Flags.string({
|
|
24
|
+
description: "New project runtime (node24, node22, python3.14, python3.13)",
|
|
25
|
+
required: false,
|
|
26
|
+
options: RUNTIMES,
|
|
27
|
+
}),
|
|
28
|
+
"root-dir": Flags.string({
|
|
29
|
+
description: "New project root directory (useful for monorepos)",
|
|
30
|
+
required: false,
|
|
31
|
+
}),
|
|
32
|
+
"project-name": Flags.string({
|
|
33
|
+
description: "New project name",
|
|
16
34
|
required: false,
|
|
17
35
|
}),
|
|
18
36
|
};
|
|
19
37
|
async run() {
|
|
20
|
-
const {
|
|
38
|
+
const { flags } = await this.parse(Deploy);
|
|
39
|
+
const projectFlags = {
|
|
40
|
+
"non-interactive": flags["non-interactive"],
|
|
41
|
+
projectName: flags["project-name"],
|
|
42
|
+
runtime: flags.runtime,
|
|
43
|
+
rootDir: flags["root-dir"],
|
|
44
|
+
};
|
|
21
45
|
p.intro("Deploying to Alpic");
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
this.exit(1);
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
const deployDir = resolveDeployDir(args.directory);
|
|
29
|
-
const config = await resolveProjectForDeploy(deployDir);
|
|
46
|
+
await this.ensureAuthenticated();
|
|
47
|
+
const workflow = new ProjectWorkflow(projectFlags);
|
|
48
|
+
const config = await workflow.resolveProjectForDeploy();
|
|
30
49
|
if (!config) {
|
|
31
|
-
|
|
32
|
-
this.exit(1);
|
|
33
|
-
return;
|
|
50
|
+
throw new Error("Deploy cancelled");
|
|
34
51
|
}
|
|
35
52
|
const spinner = p.spinner();
|
|
36
53
|
let tmpDir;
|
|
37
54
|
try {
|
|
38
55
|
spinner.start("Collecting source files...");
|
|
39
|
-
const files = getFilesToPack(
|
|
56
|
+
const files = getFilesToPack();
|
|
40
57
|
spinner.stop(`Collected ${files.length} file${files.length === 1 ? "" : "s"}`);
|
|
41
|
-
const result = await createTarArchive(files
|
|
58
|
+
const result = await createTarArchive(files);
|
|
42
59
|
tmpDir = result.tmpDir;
|
|
43
60
|
const archivePath = result.archivePath;
|
|
44
61
|
const { uploadUrl, token } = await api.deployments.uploadArtifact.v1();
|
|
@@ -53,8 +70,6 @@ export class Deploy extends Command {
|
|
|
53
70
|
const { deployment, elapsedMs } = await deployAndWait({
|
|
54
71
|
initial: initialDeployment,
|
|
55
72
|
startedAt: deployStartedAt,
|
|
56
|
-
teamId: config.teamId,
|
|
57
|
-
projectId: config.projectId,
|
|
58
73
|
});
|
|
59
74
|
const elapsedStr = formatElapsed(elapsedMs);
|
|
60
75
|
if (deployment.status !== "deployed") {
|
|
@@ -73,8 +88,7 @@ export class Deploy extends Command {
|
|
|
73
88
|
catch (error) {
|
|
74
89
|
spinner.stop();
|
|
75
90
|
const message = error instanceof Error ? error.message : String(error);
|
|
76
|
-
|
|
77
|
-
this.exit(1);
|
|
91
|
+
throw new Error(`Error: ${message}`);
|
|
78
92
|
}
|
|
79
93
|
finally {
|
|
80
94
|
if (tmpDir) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AlpicCommand } from "../../lib/alpic-command.js";
|
|
2
|
+
export declare class EnvironmentVariableAdd extends AlpicCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
"environment-id": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
key: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
value: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
secret: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
"env-file": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
"non-interactive": import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
};
|
|
13
|
+
run(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Flags } from "@oclif/core";
|
|
2
|
+
import { AlpicCommand } from "../../lib/alpic-command.js";
|
|
3
|
+
import { EnvironmentVariableWorkflow, resolveEnvironmentId } from "../../lib/environment-variable.js";
|
|
4
|
+
export class EnvironmentVariableAdd extends AlpicCommand {
|
|
5
|
+
static description = "Add one or more environment variables to an environment";
|
|
6
|
+
static examples = [
|
|
7
|
+
"<%= config.bin %> environment-variable add",
|
|
8
|
+
"<%= config.bin %> environment-variable add --key DATABASE_URL --value postgres://localhost/db",
|
|
9
|
+
"<%= config.bin %> environment-variable add --key PORT --value 3000 --no-secret",
|
|
10
|
+
"<%= config.bin %> environment-variable add --env-file .env",
|
|
11
|
+
"<%= config.bin %> environment-variable add --env-file .env --environment-id <environmentId>",
|
|
12
|
+
];
|
|
13
|
+
static flags = {
|
|
14
|
+
"environment-id": Flags.string({
|
|
15
|
+
description: "The ID of the environment",
|
|
16
|
+
required: false,
|
|
17
|
+
}),
|
|
18
|
+
key: Flags.string({
|
|
19
|
+
description: "The environment variable key",
|
|
20
|
+
required: false,
|
|
21
|
+
}),
|
|
22
|
+
value: Flags.string({
|
|
23
|
+
description: "The environment variable value",
|
|
24
|
+
required: false,
|
|
25
|
+
}),
|
|
26
|
+
secret: Flags.boolean({
|
|
27
|
+
description: "Mark the variable as secret. Defaults to true when not specified.",
|
|
28
|
+
allowNo: true,
|
|
29
|
+
}),
|
|
30
|
+
"env-file": Flags.string({
|
|
31
|
+
description: "Path to a .env file to import variables from (mutually exclusive with --key/--value)",
|
|
32
|
+
required: false,
|
|
33
|
+
}),
|
|
34
|
+
"non-interactive": Flags.boolean({
|
|
35
|
+
description: "Disable interactive prompts. Requires --key and --value (or --env-file).",
|
|
36
|
+
default: false,
|
|
37
|
+
}),
|
|
38
|
+
};
|
|
39
|
+
async run() {
|
|
40
|
+
const { flags } = await this.parse(EnvironmentVariableAdd);
|
|
41
|
+
await this.ensureAuthenticated();
|
|
42
|
+
const environmentId = resolveEnvironmentId(flags);
|
|
43
|
+
await new EnvironmentVariableWorkflow(flags).add(environmentId);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/commands/environment-variable/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAEtG,MAAM,OAAO,sBAAuB,SAAQ,YAAY;IACtD,MAAM,CAAU,WAAW,GAAG,yDAAyD,CAAC;IAExF,MAAM,CAAU,QAAQ,GAAG;QACzB,4CAA4C;QAC5C,+FAA+F;QAC/F,gFAAgF;QAChF,4DAA4D;QAC5D,6FAA6F;KAC9F,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACtB,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC;YAC7B,WAAW,EAAE,2BAA2B;YACxC,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC;YAChB,WAAW,EAAE,8BAA8B;YAC3C,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;YAClB,WAAW,EAAE,gCAAgC;YAC7C,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC;YACpB,WAAW,EAAE,mEAAmE;YAChF,OAAO,EAAE,IAAI;SACd,CAAC;QACF,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC;YACvB,WAAW,EAAE,sFAAsF;YACnG,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC;YAC/B,WAAW,EAAE,0EAA0E;YACvF,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAE3D,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAEjC,MAAM,aAAa,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAElD,MAAM,IAAI,2BAA2B,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAClE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AlpicCommand } from "../../lib/alpic-command.js";
|
|
2
|
+
export declare class EnvironmentVariableList extends AlpicCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
"environment-id": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
};
|
|
8
|
+
run(): Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import { Flags } from "@oclif/core";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { api } from "../../api.js";
|
|
5
|
+
import { AlpicCommand } from "../../lib/alpic-command.js";
|
|
6
|
+
import { resolveEnvironmentId } from "../../lib/environment-variable.js";
|
|
7
|
+
import { formatTable } from "../../lib/table.js";
|
|
8
|
+
import { formatAgo } from "../../lib/utils.js";
|
|
9
|
+
export class EnvironmentVariableList extends AlpicCommand {
|
|
10
|
+
static description = "List all environment variables for an environment";
|
|
11
|
+
static examples = [
|
|
12
|
+
"<%= config.bin %> environment-variable list",
|
|
13
|
+
"<%= config.bin %> environment-variable list --environment-id <environmentId>",
|
|
14
|
+
];
|
|
15
|
+
static flags = {
|
|
16
|
+
"environment-id": Flags.string({
|
|
17
|
+
description: "The ID of the environment",
|
|
18
|
+
required: false,
|
|
19
|
+
}),
|
|
20
|
+
};
|
|
21
|
+
async run() {
|
|
22
|
+
const { flags } = await this.parse(EnvironmentVariableList);
|
|
23
|
+
await this.ensureAuthenticated();
|
|
24
|
+
const environmentId = resolveEnvironmentId(flags);
|
|
25
|
+
const spinner = p.spinner();
|
|
26
|
+
spinner.start("Fetching environment variables...");
|
|
27
|
+
const environmentVariables = await api.environmentVariables.list.v1({ environmentId });
|
|
28
|
+
spinner.stop(`Found ${environmentVariables.length} environment variable${environmentVariables.length === 1 ? "" : "s"}`);
|
|
29
|
+
if (environmentVariables.length === 0) {
|
|
30
|
+
p.log.info("No environment variables defined.");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const rows = environmentVariables.map((variable) => ({
|
|
34
|
+
...variable,
|
|
35
|
+
createdAt: formatAgo(variable.createdAt),
|
|
36
|
+
}));
|
|
37
|
+
console.log(formatTable(rows, [
|
|
38
|
+
{ key: "key", header: "key", format: (value) => chalk.cyan(value) },
|
|
39
|
+
{
|
|
40
|
+
key: "value",
|
|
41
|
+
header: "value",
|
|
42
|
+
format: (value, row) => (row.isSecret ? chalk.gray.italic("<secret>") : chalk.bold(value)),
|
|
43
|
+
},
|
|
44
|
+
{ key: "createdAt", header: "created at" },
|
|
45
|
+
]));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=list.js.map
|