gipity 1.0.339 → 1.0.355
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/README.md +4 -4
- package/dist/__tests__/cli-cmd-job.test.d.ts +1 -0
- package/dist/__tests__/cli-cmd-job.test.js +204 -0
- package/dist/__tests__/cli-cmd-job.test.js.map +1 -0
- package/dist/__tests__/cli-cmd-page.test.d.ts +1 -0
- package/dist/__tests__/cli-cmd-page.test.js +90 -0
- package/dist/__tests__/cli-cmd-page.test.js.map +1 -0
- package/dist/__tests__/cli-cmd-workflow.test.js +2 -2
- package/dist/__tests__/cli-cmd-workflow.test.js.map +1 -1
- package/dist/__tests__/flag-aliases.test.js +20 -0
- package/dist/__tests__/flag-aliases.test.js.map +1 -1
- package/dist/__tests__/template-vars.test.d.ts +1 -0
- package/dist/__tests__/template-vars.test.js +119 -0
- package/dist/__tests__/template-vars.test.js.map +1 -0
- package/dist/adopt-cwd.js +1 -0
- package/dist/adopt-cwd.js.map +1 -1
- package/dist/api.d.ts +6 -0
- package/dist/api.js +11 -0
- package/dist/api.js.map +1 -1
- package/dist/commands/add.js +139 -12
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/credits.js +21 -0
- package/dist/commands/credits.js.map +1 -1
- package/dist/commands/job.d.ts +2 -0
- package/dist/commands/job.js +251 -0
- package/dist/commands/job.js.map +1 -0
- package/dist/commands/logs.js +79 -0
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/page-eval.d.ts +2 -0
- package/dist/commands/page-eval.js +31 -0
- package/dist/commands/page-eval.js.map +1 -0
- package/dist/commands/page-inspect.js +91 -62
- package/dist/commands/page-inspect.js.map +1 -1
- package/dist/commands/page-screenshot.js +1 -1
- package/dist/commands/page-screenshot.js.map +1 -1
- package/dist/commands/page.d.ts +2 -0
- package/dist/commands/page.js +18 -0
- package/dist/commands/page.js.map +1 -0
- package/dist/commands/project.js +1 -0
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/workflow.js +63 -16
- package/dist/commands/workflow.js.map +1 -1
- package/dist/flag-aliases.d.ts +7 -2
- package/dist/flag-aliases.js +41 -2
- package/dist/flag-aliases.js.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/knowledge.d.ts +3 -3
- package/dist/knowledge.js +13 -10
- package/dist/knowledge.js.map +1 -1
- package/dist/project-setup.d.ts +3 -0
- package/dist/project-setup.js +24 -0
- package/dist/project-setup.js.map +1 -1
- package/dist/prompts.d.ts +6 -6
- package/dist/prompts.js +6 -6
- package/dist/prompts.js.map +1 -1
- package/dist/setup.js +1 -1
- package/dist/setup.js.map +1 -1
- package/dist/template-vars.d.ts +32 -0
- package/dist/template-vars.js +156 -0
- package/dist/template-vars.js.map +1 -0
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Gipity CLI
|
|
2
2
|
|
|
3
|
-
The
|
|
3
|
+
The full-stack platform tuned for AI agents.
|
|
4
4
|
|
|
5
|
-
[Gipity](https://gipity.ai) is the platform: hosting, databases, file storage, deployment, workflows, code execution, and monitoring. Agent-tuned from
|
|
5
|
+
[Gipity](https://gipity.ai) is the platform: hosting, databases, file storage, deployment, workflows, code execution, and monitoring. Agent-tuned from idea to deploy. Use standalone, or pair with Claude Code to give your local agent cloud superpowers. Any model, any infra, always your code.
|
|
6
6
|
|
|
7
7
|
This CLI connects [Claude Code](https://claude.ai/claude-code) to Gipity's cloud platform - databases, deployment, browser testing, image gen, and 50+ other capabilities your local agent doesn't have. It also syncs files so Claude Code and the Gipity web agent share the same project.
|
|
8
8
|
|
|
@@ -138,10 +138,10 @@ gipity sync down # Pull remote changes
|
|
|
138
138
|
| `gipity approval` | List, create, answer, or cancel pending approvals |
|
|
139
139
|
| `gipity workflow` | Manage and trigger automated workflows |
|
|
140
140
|
| `gipity file` | Browse remote files (ls, cat, tree) |
|
|
141
|
-
| `gipity
|
|
141
|
+
| `gipity add <template>` | Add a template (web-simple, 2d-game, 3d-world, web-fullstack, api) |
|
|
142
142
|
| `gipity test` | Run project tests in sandboxed containers |
|
|
143
143
|
| `gipity logs fn <name>` | View function execution logs |
|
|
144
|
-
| `gipity page
|
|
144
|
+
| `gipity page inspect <url>` | Inspect a URL: console errors, performance, failed resources |
|
|
145
145
|
| `gipity records` | Query and manage Records API tables |
|
|
146
146
|
| `gipity fn` | Manage and call serverless functions |
|
|
147
147
|
| `gipity rbac` | Manage RBAC policies |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { test, before, after } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { runCliAsync } from './helpers/spawn-cli.js';
|
|
4
|
+
import { startMockServer } from './helpers/mock-server.js';
|
|
5
|
+
import { makeAuthedHome, makeProjectDir } from './helpers/test-home.js';
|
|
6
|
+
let mock;
|
|
7
|
+
let home;
|
|
8
|
+
before(async () => { mock = await startMockServer(); home = makeAuthedHome(); });
|
|
9
|
+
after(async () => { await mock.stop(); });
|
|
10
|
+
function fresh(args) {
|
|
11
|
+
const d = makeProjectDir({ apiBase: mock.apiBase });
|
|
12
|
+
return runCliAsync(['--api-base', mock.apiBase, ...args], { env: { HOME: home }, cwd: d });
|
|
13
|
+
}
|
|
14
|
+
test('gipity job list shows jobs with name + runtime + compute + version', async () => {
|
|
15
|
+
mock.reset();
|
|
16
|
+
mock.on('GET /projects/p_TestProj/jobs', { body: { data: [
|
|
17
|
+
{ name: 'align', runtime: 'python-3.11', compute: 'gpu-small', version: 2, on_complete: 'notify', description: 'Forced alignment' },
|
|
18
|
+
{ name: 'render', runtime: 'node-20', compute: 'cpu-large', version: 1, description: null },
|
|
19
|
+
] } });
|
|
20
|
+
const r = await fresh(['job', 'list']);
|
|
21
|
+
assert.equal(r.status, 0, r.stderr);
|
|
22
|
+
assert.match(r.stdout, /align/);
|
|
23
|
+
assert.match(r.stdout, /python-3\.11/);
|
|
24
|
+
assert.match(r.stdout, /gpu-small/);
|
|
25
|
+
assert.match(r.stdout, /v2/);
|
|
26
|
+
assert.match(r.stdout, /→ notify/);
|
|
27
|
+
assert.match(r.stdout, /render/);
|
|
28
|
+
assert.match(r.stdout, /cpu-large/);
|
|
29
|
+
assert.doesNotMatch(r.stdout, /undefined/);
|
|
30
|
+
});
|
|
31
|
+
test('gipity job submit <name> posts and prints run_guid + status', async () => {
|
|
32
|
+
mock.reset();
|
|
33
|
+
mock.on('POST /projects/p_TestProj/jobs/align/submit', { body: { data: { run_guid: 'jr_xx1234', status: 'queued', replayed: false } } });
|
|
34
|
+
const r = await fresh(['job', 'submit', 'align', '{"audio":"foo.wav"}']);
|
|
35
|
+
assert.equal(r.status, 0, r.stderr);
|
|
36
|
+
assert.match(r.stdout, /jr_xx1234/);
|
|
37
|
+
assert.match(r.stdout, /queued/);
|
|
38
|
+
assert.doesNotMatch(r.stdout, /undefined/);
|
|
39
|
+
});
|
|
40
|
+
test('gipity job submit with --idempotency-key shows replayed marker', async () => {
|
|
41
|
+
mock.reset();
|
|
42
|
+
mock.on('POST /projects/p_TestProj/jobs/align/submit', { body: { data: { run_guid: 'jr_xx1234', status: 'success', replayed: true } } });
|
|
43
|
+
const r = await fresh(['job', 'submit', 'align', '--idempotency-key', 'k1']);
|
|
44
|
+
assert.equal(r.status, 0, r.stderr);
|
|
45
|
+
assert.match(r.stdout, /jr_xx1234/);
|
|
46
|
+
assert.match(r.stdout, /replayed/);
|
|
47
|
+
});
|
|
48
|
+
test('gipity job status <guid> renders progress + status', async () => {
|
|
49
|
+
mock.reset();
|
|
50
|
+
mock.on('GET /projects/p_TestProj/jobs/runs/jr_xx1234', { body: { data: {
|
|
51
|
+
guid: 'jr_xx1234',
|
|
52
|
+
status: 'running',
|
|
53
|
+
progress_pct: 0.42,
|
|
54
|
+
progress_message: 'thinking',
|
|
55
|
+
duration_ms: null,
|
|
56
|
+
error: null,
|
|
57
|
+
output: null,
|
|
58
|
+
} } });
|
|
59
|
+
const r = await fresh(['job', 'status', 'jr_xx1234']);
|
|
60
|
+
assert.equal(r.status, 0, r.stderr);
|
|
61
|
+
assert.match(r.stdout, /running/);
|
|
62
|
+
assert.match(r.stdout, /42%/);
|
|
63
|
+
assert.match(r.stdout, /thinking/);
|
|
64
|
+
});
|
|
65
|
+
test('gipity job runs <name> lists per-run rows with status + duration + guid', async () => {
|
|
66
|
+
mock.reset();
|
|
67
|
+
mock.on('GET /projects/p_TestProj/jobs/align/runs', { body: { data: [
|
|
68
|
+
{ status: 'success', duration_ms: 1234, trigger_type: 'cli', guid: 'jr_a', created_at: '2026-05-01T10:00:00Z' },
|
|
69
|
+
{ status: 'failed', duration_ms: 200, trigger_type: 'cli', guid: 'jr_b', created_at: '2026-05-02T10:00:00Z', error: 'kaboom' },
|
|
70
|
+
] } });
|
|
71
|
+
const r = await fresh(['job', 'runs', 'align']);
|
|
72
|
+
assert.equal(r.status, 0, r.stderr);
|
|
73
|
+
assert.match(r.stdout, /success/);
|
|
74
|
+
assert.match(r.stdout, /1234ms/);
|
|
75
|
+
assert.match(r.stdout, /jr_a/);
|
|
76
|
+
assert.match(r.stdout, /failed/);
|
|
77
|
+
assert.match(r.stdout, /kaboom/);
|
|
78
|
+
});
|
|
79
|
+
test('gipity job cancel <guid> sends DELETE and prints cancelled', async () => {
|
|
80
|
+
mock.reset();
|
|
81
|
+
mock.on('DELETE /projects/p_TestProj/jobs/runs/jr_xx1234', { body: { data: { success: true, status: 'cancelled' } } });
|
|
82
|
+
const r = await fresh(['job', 'cancel', 'jr_xx1234']);
|
|
83
|
+
assert.equal(r.status, 0, r.stderr);
|
|
84
|
+
assert.match(r.stdout, /cancelled/);
|
|
85
|
+
});
|
|
86
|
+
test('gipity job logs <guid> --no-follow does a one-shot GET (no stream)', async () => {
|
|
87
|
+
mock.reset();
|
|
88
|
+
mock.on('GET /projects/p_TestProj/jobs/runs/jr_xx1234', { body: { data: {
|
|
89
|
+
guid: 'jr_xx1234',
|
|
90
|
+
status: 'success',
|
|
91
|
+
progress_pct: 1,
|
|
92
|
+
output: { result: 'ok' },
|
|
93
|
+
duration_ms: 500,
|
|
94
|
+
} } });
|
|
95
|
+
const r = await fresh(['job', 'logs', 'jr_xx1234', '--no-follow']);
|
|
96
|
+
assert.equal(r.status, 0, r.stderr);
|
|
97
|
+
assert.match(r.stdout, /success/);
|
|
98
|
+
assert.match(r.stdout, /result/);
|
|
99
|
+
});
|
|
100
|
+
test('gipity job run-local fails clearly when jobs/<name>/ does not exist', async () => {
|
|
101
|
+
// No mock interaction needed - this is a local-only path that exits before
|
|
102
|
+
// any HTTP / Docker call.
|
|
103
|
+
const r = await fresh(['job', 'run-local', 'definitely-not-a-job']);
|
|
104
|
+
assert.notEqual(r.status, 0);
|
|
105
|
+
assert.match(r.stderr, /not found/i);
|
|
106
|
+
});
|
|
107
|
+
test('gipity job run-local with a mocked docker binary builds the right docker run command', async () => {
|
|
108
|
+
// Install a fake `docker` on PATH that records its argv to a temp file and
|
|
109
|
+
// exits 0. Then run-local should: (1) pass `docker info` probe, (2) shell out
|
|
110
|
+
// with `docker run --rm --network bridge --memory 1g --cpus 1 ...`. We assert
|
|
111
|
+
// on the recorded argv to pin the contract.
|
|
112
|
+
const { mkdtempSync, writeFileSync, readFileSync, mkdirSync, chmodSync } = await import('node:fs');
|
|
113
|
+
const { join } = await import('node:path');
|
|
114
|
+
const { tmpdir } = await import('node:os');
|
|
115
|
+
const sandboxRoot = mkdtempSync(`${tmpdir()}/gipity-runlocal-test-`);
|
|
116
|
+
// Project dir with a jobs/hello/main.py handler
|
|
117
|
+
const projDir = join(sandboxRoot, 'proj');
|
|
118
|
+
mkdirSync(join(projDir, 'jobs', 'hello'), { recursive: true });
|
|
119
|
+
writeFileSync(join(projDir, 'jobs', 'hello', 'main.py'), '# @gipity:job runtime=python-3.11\nprint("ok")\n');
|
|
120
|
+
// Make it a Gipity-linked project so requireConfig doesn't bail out.
|
|
121
|
+
writeFileSync(join(projDir, '.gipity.json'), JSON.stringify({
|
|
122
|
+
projectGuid: 'p_TestProj',
|
|
123
|
+
projectSlug: 'proj',
|
|
124
|
+
accountSlug: 'me',
|
|
125
|
+
agentGuid: 'a_x',
|
|
126
|
+
apiBase: mock.apiBase,
|
|
127
|
+
ignore: [],
|
|
128
|
+
}));
|
|
129
|
+
// Fake docker shim - records argv to a file and exits 0.
|
|
130
|
+
const fakeBin = join(sandboxRoot, 'bin');
|
|
131
|
+
mkdirSync(fakeBin, { recursive: true });
|
|
132
|
+
const recordFile = join(sandboxRoot, 'docker-argv.txt');
|
|
133
|
+
const fakeDocker = `#!/usr/bin/env bash
|
|
134
|
+
echo "$@" >> "${recordFile}"
|
|
135
|
+
exit 0
|
|
136
|
+
`;
|
|
137
|
+
writeFileSync(join(fakeBin, 'docker'), fakeDocker);
|
|
138
|
+
chmodSync(join(fakeBin, 'docker'), 0o755);
|
|
139
|
+
const r = await runCliAsync(['--api-base', mock.apiBase, 'job', 'run-local', 'hello'], {
|
|
140
|
+
env: {
|
|
141
|
+
HOME: home,
|
|
142
|
+
PATH: `${fakeBin}:${process.env.PATH ?? ''}`,
|
|
143
|
+
},
|
|
144
|
+
cwd: projDir,
|
|
145
|
+
});
|
|
146
|
+
assert.equal(r.status, 0, r.stderr);
|
|
147
|
+
const recorded = readFileSync(recordFile, 'utf-8');
|
|
148
|
+
// Two invocations: docker info (probe) + docker run ...
|
|
149
|
+
const lines = recorded.trim().split('\n');
|
|
150
|
+
assert.ok(lines.length >= 2, `expected at least 2 docker invocations, got ${lines.length}: ${recorded}`);
|
|
151
|
+
assert.match(lines[0], /^info$/);
|
|
152
|
+
const runLine = lines.find(l => l.startsWith('run ')) ?? '';
|
|
153
|
+
assert.match(runLine, /--rm/);
|
|
154
|
+
assert.match(runLine, /--network bridge/);
|
|
155
|
+
assert.match(runLine, /--memory 1g/);
|
|
156
|
+
assert.match(runLine, /--cpus 1/);
|
|
157
|
+
assert.match(runLine, /--user sandbox/);
|
|
158
|
+
assert.match(runLine, /--workdir \/work/);
|
|
159
|
+
assert.match(runLine, /-v .*\/jobs\/hello:\/work/);
|
|
160
|
+
assert.match(runLine, /python3 \/work\/main\.py/);
|
|
161
|
+
});
|
|
162
|
+
test('gipity job run-local exits non-zero when docker is not on PATH', async () => {
|
|
163
|
+
const { mkdtempSync } = await import('node:fs');
|
|
164
|
+
const { tmpdir } = await import('node:os');
|
|
165
|
+
const emptyBin = mkdtempSync(`${tmpdir()}/gipity-nodocker-`);
|
|
166
|
+
const { writeFileSync, mkdirSync } = await import('node:fs');
|
|
167
|
+
const { join } = await import('node:path');
|
|
168
|
+
const projDir = mkdtempSync(`${tmpdir()}/gipity-nodocker-proj-`);
|
|
169
|
+
mkdirSync(join(projDir, 'jobs', 'hello'), { recursive: true });
|
|
170
|
+
writeFileSync(join(projDir, 'jobs', 'hello', 'main.py'), 'print("x")\n');
|
|
171
|
+
writeFileSync(join(projDir, '.gipity.json'), JSON.stringify({
|
|
172
|
+
projectGuid: 'p_TestProj', projectSlug: 'proj', accountSlug: 'me',
|
|
173
|
+
agentGuid: 'a_x', apiBase: mock.apiBase, ignore: [],
|
|
174
|
+
}));
|
|
175
|
+
const r = await runCliAsync(['--api-base', mock.apiBase, 'job', 'run-local', 'hello'], {
|
|
176
|
+
env: { HOME: home, PATH: emptyBin },
|
|
177
|
+
cwd: projDir,
|
|
178
|
+
});
|
|
179
|
+
assert.notEqual(r.status, 0);
|
|
180
|
+
assert.match(r.stderr, /docker daemon not reachable/i);
|
|
181
|
+
});
|
|
182
|
+
test('gipity job logs <guid> --follow parses SSE events and prints stdout/stderr chunks', async () => {
|
|
183
|
+
// Pre-built SSE blob (mock server writes the body as one chunk + closes;
|
|
184
|
+
// the CLI's reader still processes each `event:`/`data:` pair correctly).
|
|
185
|
+
mock.reset();
|
|
186
|
+
const sse = [
|
|
187
|
+
`event: status\ndata: ${JSON.stringify({ status: 'running', progress_pct: null, progress_message: null, attempt: 1 })}\n\n`,
|
|
188
|
+
`event: log\ndata: ${JSON.stringify({ type: 'stdout', chunk: 'hello stdout\n' })}\n\n`,
|
|
189
|
+
`event: log\ndata: ${JSON.stringify({ type: 'stderr', chunk: 'an error\n' })}\n\n`,
|
|
190
|
+
`event: status\ndata: ${JSON.stringify({ status: 'success', progress_pct: 1, progress_message: 'done', attempt: 1 })}\n\n`,
|
|
191
|
+
`event: output\ndata: ${JSON.stringify({ result: 'ok' })}\n\n`,
|
|
192
|
+
].join('');
|
|
193
|
+
mock.on('GET /projects/p_TestProj/jobs/runs/jr_xx1234/logs/stream', {
|
|
194
|
+
raw: sse,
|
|
195
|
+
contentType: 'text/event-stream',
|
|
196
|
+
});
|
|
197
|
+
const r = await fresh(['job', 'logs', 'jr_xx1234']);
|
|
198
|
+
assert.equal(r.status, 0, `expected 0 got ${r.status}; stderr=${r.stderr}`);
|
|
199
|
+
assert.match(r.stdout, /hello stdout/);
|
|
200
|
+
assert.match(r.stderr, /an error/);
|
|
201
|
+
assert.match(r.stderr, /running/);
|
|
202
|
+
assert.match(r.stderr, /success/);
|
|
203
|
+
});
|
|
204
|
+
//# sourceMappingURL=cli-cmd-job.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-cmd-job.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-cmd-job.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { test, before, after } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { runCliAsync } from './helpers/spawn-cli.js';
|
|
4
|
+
import { startMockServer } from './helpers/mock-server.js';
|
|
5
|
+
import { makeAuthedHome } from './helpers/test-home.js';
|
|
6
|
+
let mock;
|
|
7
|
+
let home;
|
|
8
|
+
before(async () => { mock = await startMockServer(); home = makeAuthedHome(); });
|
|
9
|
+
after(async () => { await mock.stop(); });
|
|
10
|
+
function run(args) {
|
|
11
|
+
return runCliAsync(['--api-base', mock.apiBase, ...args], { env: { HOME: home } });
|
|
12
|
+
}
|
|
13
|
+
const baseBundle = {
|
|
14
|
+
url: 'https://example.com',
|
|
15
|
+
title: 'Example Domain',
|
|
16
|
+
console: ['Warning: deprecated API'],
|
|
17
|
+
failedResources: [],
|
|
18
|
+
timing: { ttfb: 120, domReady: 500, load: 800 },
|
|
19
|
+
elementCount: 42,
|
|
20
|
+
totalBytes: 12345,
|
|
21
|
+
largeResources: [],
|
|
22
|
+
renderBlocking: [],
|
|
23
|
+
oversizedImages: [],
|
|
24
|
+
lcp: null,
|
|
25
|
+
overflow: { scrollWidth: 1280, clientWidth: 1280, overflowX: false, amount: 0, culprits: [] },
|
|
26
|
+
};
|
|
27
|
+
test('gipity page inspect prints title, timing, and console summary', async () => {
|
|
28
|
+
mock.reset();
|
|
29
|
+
mock.on('POST /tools/browser/inspect', { body: { data: baseBundle } });
|
|
30
|
+
const r = await run(['page', 'inspect', 'https://example.com']);
|
|
31
|
+
assert.equal(r.status, 0, r.stderr);
|
|
32
|
+
assert.match(r.stdout, /Example Domain/);
|
|
33
|
+
assert.match(r.stdout, /TTFB:\s*120ms/);
|
|
34
|
+
assert.match(r.stdout, /Warning: deprecated API/);
|
|
35
|
+
assert.doesNotMatch(r.stdout, /undefined/);
|
|
36
|
+
});
|
|
37
|
+
test('gipity page inspect reports a clean layout when there is no horizontal overflow', async () => {
|
|
38
|
+
mock.reset();
|
|
39
|
+
mock.on('POST /tools/browser/inspect', { body: { data: baseBundle } });
|
|
40
|
+
const r = await run(['page', 'inspect', 'https://example.com']);
|
|
41
|
+
assert.equal(r.status, 0, r.stderr);
|
|
42
|
+
assert.match(r.stdout, /no horizontal overflow/);
|
|
43
|
+
});
|
|
44
|
+
test('gipity page inspect flags horizontal overflow and lists culprits under --all', async () => {
|
|
45
|
+
mock.reset();
|
|
46
|
+
mock.on('POST /tools/browser/inspect', { body: { data: {
|
|
47
|
+
...baseBundle,
|
|
48
|
+
overflow: {
|
|
49
|
+
scrollWidth: 1400, clientWidth: 1280, overflowX: true, amount: 120,
|
|
50
|
+
culprits: [{ tag: 'div', cls: 'hero wide', left: 0, right: 1400, width: 1400 }],
|
|
51
|
+
},
|
|
52
|
+
} } });
|
|
53
|
+
const r = await run(['page', 'inspect', 'https://example.com', '--all']);
|
|
54
|
+
assert.equal(r.status, 0, r.stderr);
|
|
55
|
+
assert.match(r.stdout, /Horizontal overflow: \+120px/);
|
|
56
|
+
assert.match(r.stdout, /div\.hero/);
|
|
57
|
+
});
|
|
58
|
+
test('gipity page inspect --json emits the raw inspect bundle', async () => {
|
|
59
|
+
mock.reset();
|
|
60
|
+
mock.on('POST /tools/browser/inspect', { body: { data: {
|
|
61
|
+
...baseBundle, url: 'https://x.example', title: 'X', console: [],
|
|
62
|
+
} } });
|
|
63
|
+
const r = await run(['page', 'inspect', 'https://x.example', '--json']);
|
|
64
|
+
assert.equal(r.status, 0, r.stderr);
|
|
65
|
+
const parsed = JSON.parse(r.stdout.trim());
|
|
66
|
+
assert.equal(parsed.title, 'X');
|
|
67
|
+
assert.equal(parsed.overflow.overflowX, false);
|
|
68
|
+
});
|
|
69
|
+
test('gipity page eval prints the serialized expression result', async () => {
|
|
70
|
+
mock.reset();
|
|
71
|
+
mock.on('POST /tools/browser/eval', { body: { data: {
|
|
72
|
+
url: 'https://example.com', result: 'Example Domain', truncated: false,
|
|
73
|
+
} } });
|
|
74
|
+
const r = await run(['page', 'eval', 'https://example.com', 'document.title']);
|
|
75
|
+
assert.equal(r.status, 0, r.stderr);
|
|
76
|
+
assert.match(r.stdout, /Example Domain/);
|
|
77
|
+
assert.doesNotMatch(r.stdout, /undefined/);
|
|
78
|
+
});
|
|
79
|
+
test('gipity page eval --json emits url, result, and truncated', async () => {
|
|
80
|
+
mock.reset();
|
|
81
|
+
mock.on('POST /tools/browser/eval', { body: { data: {
|
|
82
|
+
url: 'https://example.com', result: '42', truncated: true,
|
|
83
|
+
} } });
|
|
84
|
+
const r = await run(['page', 'eval', 'https://example.com', '1+41', '--json']);
|
|
85
|
+
assert.equal(r.status, 0, r.stderr);
|
|
86
|
+
const parsed = JSON.parse(r.stdout.trim());
|
|
87
|
+
assert.equal(parsed.result, '42');
|
|
88
|
+
assert.equal(parsed.truncated, true);
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=cli-cmd-page.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-cmd-page.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-cmd-page.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import { startMockServer } from './helpers/mock-server.js';
|
|
|
5
5
|
import { makeAuthedHome, makeProjectDir } from './helpers/test-home.js';
|
|
6
6
|
let mock;
|
|
7
7
|
let home;
|
|
8
|
-
const WF_A = { short_guid: 'wf_WflowAa0', name: 'Daily', description: 'Runs every day', is_active: 1, trigger_type: '
|
|
8
|
+
const WF_A = { short_guid: 'wf_WflowAa0', name: 'Daily', description: 'Runs every day', is_active: 1, trigger_type: 'schedule', cron_expression: '0 8 * * *', project_name: 'Test', project_slug: 'test-project' };
|
|
9
9
|
const WF_B = { short_guid: 'wf_WflowBb0', name: 'Manual', description: null, is_active: 0, trigger_type: 'manual', cron_expression: null, project_name: null, project_slug: null };
|
|
10
10
|
before(async () => { mock = await startMockServer(); home = makeAuthedHome(); });
|
|
11
11
|
after(async () => { await mock.stop(); });
|
|
@@ -31,7 +31,7 @@ test('gipity workflow info <name> resolves by name and shows details', async ()
|
|
|
31
31
|
assert.equal(r.status, 0, r.stderr);
|
|
32
32
|
assert.match(r.stdout, /Name:\s+Daily/);
|
|
33
33
|
assert.match(r.stdout, /Active:\s+yes/);
|
|
34
|
-
assert.match(r.stdout, /Trigger:\s+
|
|
34
|
+
assert.match(r.stdout, /Trigger:\s+schedule/);
|
|
35
35
|
assert.match(r.stdout, /step1/);
|
|
36
36
|
assert.doesNotMatch(r.stdout, /undefined/);
|
|
37
37
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-cmd-workflow.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-cmd-workflow.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAc,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExE,IAAI,IAAgB,CAAC;AACrB,IAAI,IAAY,CAAC;AAEjB,MAAM,IAAI,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"cli-cmd-workflow.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-cmd-workflow.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import { describe, it } from 'node:test';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
|
+
import { Command } from 'commander';
|
|
3
4
|
import { normalizeAliases } from '../flag-aliases.js';
|
|
5
|
+
/** Minimal program mirroring the real flag collision: `logs` aliases --from to
|
|
6
|
+
* --since, while `workflow create` declares --from for real. */
|
|
7
|
+
function buildProgram() {
|
|
8
|
+
const program = new Command();
|
|
9
|
+
program.command('logs').option('--since <when>', 'start time');
|
|
10
|
+
const wf = program.command('workflow');
|
|
11
|
+
wf.command('create').requiredOption('--from <path>', 'yaml path');
|
|
12
|
+
return program;
|
|
13
|
+
}
|
|
4
14
|
describe('normalizeAliases', () => {
|
|
5
15
|
it('rewrites --out to --output', () => {
|
|
6
16
|
assert.deepEqual(normalizeAliases(['node', 'gipity', 'generate', 'image', 'prompt', '--out', 'rice.jpg']), ['node', 'gipity', 'generate', 'image', 'prompt', '--output', 'rice.jpg']);
|
|
@@ -29,5 +39,15 @@ describe('normalizeAliases', () => {
|
|
|
29
39
|
it('does not rewrite a flag whose prefix matches an alias', () => {
|
|
30
40
|
assert.deepEqual(normalizeAliases(['--output-dir']), ['--output-dir']);
|
|
31
41
|
});
|
|
42
|
+
describe('command-scoped suppression', () => {
|
|
43
|
+
it('leaves --from alone for a command that declares it for real', () => {
|
|
44
|
+
const program = buildProgram();
|
|
45
|
+
assert.deepEqual(normalizeAliases(['node', 'gipity', 'workflow', 'create', '--from', 'workflows/x.yaml'], program), ['node', 'gipity', 'workflow', 'create', '--from', 'workflows/x.yaml']);
|
|
46
|
+
});
|
|
47
|
+
it('still aliases --from to --since for a command that does not', () => {
|
|
48
|
+
const program = buildProgram();
|
|
49
|
+
assert.deepEqual(normalizeAliases(['node', 'gipity', 'logs', '--from', '1h'], program), ['node', 'gipity', 'logs', '--since', '1h']);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
32
52
|
});
|
|
33
53
|
//# sourceMappingURL=flag-aliases.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flag-aliases.test.js","sourceRoot":"","sources":["../../src/__tests__/flag-aliases.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,SAAS,CACd,gBAAgB,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,EACxF,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,CAC1E,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,SAAS,CACd,gBAAgB,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,EAC1C,CAAC,UAAU,EAAE,UAAU,CAAC,CACzB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,SAAS,CACd,gBAAgB,CAAC,CAAC,gBAAgB,CAAC,CAAC,EACpC,CAAC,mBAAmB,CAAC,CACtB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,SAAS,CACd,gBAAgB,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAC7D,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,CAClD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,SAAS,CACd,gBAAgB,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,EACzE,CAAC,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CACpE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,SAAS,CACd,gBAAgB,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC,EAC9D,CAAC,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAC7C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,SAAS,CACd,gBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,EACxD,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,CAAC,CACvC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,SAAS,CACd,gBAAgB,CAAC,CAAC,cAAc,CAAC,CAAC,EAClC,CAAC,cAAc,CAAC,CACjB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"flag-aliases.test.js","sourceRoot":"","sources":["../../src/__tests__/flag-aliases.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD;gEACgE;AAChE,SAAS,YAAY;IACnB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAC/D,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACvC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;IAClE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,SAAS,CACd,gBAAgB,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,EACxF,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,CAC1E,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,SAAS,CACd,gBAAgB,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,EAC1C,CAAC,UAAU,EAAE,UAAU,CAAC,CACzB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,SAAS,CACd,gBAAgB,CAAC,CAAC,gBAAgB,CAAC,CAAC,EACpC,CAAC,mBAAmB,CAAC,CACtB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,SAAS,CACd,gBAAgB,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAC7D,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,CAClD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,SAAS,CACd,gBAAgB,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,EACzE,CAAC,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CACpE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,SAAS,CACd,gBAAgB,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC,EAC9D,CAAC,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAC7C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,SAAS,CACd,gBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,EACxD,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,CAAC,CACvC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,SAAS,CACd,gBAAgB,CAAC,CAAC,cAAc,CAAC,CAAC,EAClC,CAAC,cAAc,CAAC,CACjB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;YACrE,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;YAC/B,MAAM,CAAC,SAAS,CACd,gBAAgB,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EAAE,OAAO,CAAC,EACjG,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CACvE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;YACrE,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;YAC/B,MAAM,CAAC,SAAS,CACd,gBAAgB,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,EACrE,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAC5C,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the template-var substitution that `gipity init` runs before
|
|
3
|
+
* syncing local files up. The bug it guards against: karaoke-captions shipped
|
|
4
|
+
* literal `{{PROJECT_GUID}}` to production because init didn't substitute,
|
|
5
|
+
* every fn-call 404'd, and no error reached the Dashboard because the
|
|
6
|
+
* analytics script wasn't loaded either.
|
|
7
|
+
*/
|
|
8
|
+
import { describe, it } from 'node:test';
|
|
9
|
+
import assert from 'node:assert/strict';
|
|
10
|
+
import { mkdtempSync, mkdirSync, writeFileSync, readFileSync, rmSync } from 'fs';
|
|
11
|
+
import { tmpdir } from 'os';
|
|
12
|
+
import { join } from 'path';
|
|
13
|
+
import { buildTemplateVars, substituteString, substituteDir, KNOWN_PLACEHOLDERS, } from '../template-vars.js';
|
|
14
|
+
describe('buildTemplateVars', () => {
|
|
15
|
+
it('produces a value for every KNOWN_PLACEHOLDERS key', () => {
|
|
16
|
+
const vars = buildTemplateVars({ projectGuid: 'p_abc12345', projectName: 'My App' });
|
|
17
|
+
for (const key of KNOWN_PLACEHOLDERS) {
|
|
18
|
+
assert.ok(key in vars, `missing substitution for ${key}`);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
it('html-escapes the title', () => {
|
|
22
|
+
const vars = buildTemplateVars({ projectGuid: 'p_x', projectName: '<script>alert(1)</script>' });
|
|
23
|
+
assert.equal(vars['{{TITLE}}'], '<script>alert(1)</script>');
|
|
24
|
+
});
|
|
25
|
+
it('embeds projectGuid in the analytics script data-app attribute', () => {
|
|
26
|
+
const vars = buildTemplateVars({ projectGuid: 'p_kmunc98x', projectName: 'X' });
|
|
27
|
+
assert.match(vars['{{ANALYTICS_SCRIPT}}'], /data-app="p_kmunc98x"/);
|
|
28
|
+
});
|
|
29
|
+
it('omits meta tags when no description is provided', () => {
|
|
30
|
+
const vars = buildTemplateVars({ projectGuid: 'p_x', projectName: 'X' });
|
|
31
|
+
assert.equal(vars['{{DESCRIPTION_META}}'], '');
|
|
32
|
+
assert.equal(vars['{{OG_DESCRIPTION}}'], '');
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe('substituteString', () => {
|
|
36
|
+
it('replaces all known placeholders', () => {
|
|
37
|
+
const vars = buildTemplateVars({ projectGuid: 'p_abc', projectName: 'Acme' });
|
|
38
|
+
const out = substituteString(`const APP_GUID = '{{PROJECT_GUID}}';\n<title>{{TITLE}}</title>`, vars);
|
|
39
|
+
assert.match(out, /APP_GUID = 'p_abc'/);
|
|
40
|
+
assert.match(out, /<title>Acme<\/title>/);
|
|
41
|
+
assert.doesNotMatch(out, /\{\{PROJECT_GUID\}\}/);
|
|
42
|
+
assert.doesNotMatch(out, /\{\{TITLE\}\}/);
|
|
43
|
+
});
|
|
44
|
+
it('leaves unrelated content alone', () => {
|
|
45
|
+
const vars = buildTemplateVars({ projectGuid: 'p_x', projectName: 'X' });
|
|
46
|
+
const input = `const x = "{{NOT_A_TEMPLATE_VAR}}"; // user content`;
|
|
47
|
+
assert.equal(substituteString(input, vars), input);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe('substituteDir', () => {
|
|
51
|
+
function makeTmpProject() {
|
|
52
|
+
const dir = mkdtempSync(join(tmpdir(), 'gipity-tmpl-test-'));
|
|
53
|
+
return { dir, cleanup: () => rmSync(dir, { recursive: true, force: true }) };
|
|
54
|
+
}
|
|
55
|
+
it('rewrites every file that contains a known placeholder', async () => {
|
|
56
|
+
const { dir, cleanup } = makeTmpProject();
|
|
57
|
+
try {
|
|
58
|
+
mkdirSync(join(dir, 'src', 'js'), { recursive: true });
|
|
59
|
+
writeFileSync(join(dir, 'src', 'index.html'), `<title>{{TITLE}}</title>\n{{ANALYTICS_SCRIPT}}`);
|
|
60
|
+
writeFileSync(join(dir, 'src', 'js', 'main.js'), `const APP_GUID = '{{PROJECT_GUID}}';`);
|
|
61
|
+
writeFileSync(join(dir, 'src', 'image.png'), Buffer.from([0x89, 0x50]));
|
|
62
|
+
const result = await substituteDir(dir, { projectGuid: 'p_xyz98765', projectName: 'Caption Test 05' });
|
|
63
|
+
assert.equal(result.changed.length, 2, `changed: ${JSON.stringify(result.changed)}`);
|
|
64
|
+
assert.equal(result.unresolved.length, 0);
|
|
65
|
+
const html = readFileSync(join(dir, 'src', 'index.html'), 'utf-8');
|
|
66
|
+
assert.match(html, /<title>Caption Test 05<\/title>/);
|
|
67
|
+
assert.match(html, /data-app="p_xyz98765"/);
|
|
68
|
+
const js = readFileSync(join(dir, 'src', 'js', 'main.js'), 'utf-8');
|
|
69
|
+
assert.equal(js, `const APP_GUID = 'p_xyz98765';`);
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
cleanup();
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
it('flags placeholders we don\'t know about as unresolved', async () => {
|
|
76
|
+
const { dir, cleanup } = makeTmpProject();
|
|
77
|
+
try {
|
|
78
|
+
writeFileSync(join(dir, 'README.md'), `Hello {{FUTURE_THING}} world.`);
|
|
79
|
+
const result = await substituteDir(dir, { projectGuid: 'p_x', projectName: 'X' });
|
|
80
|
+
assert.equal(result.changed.length, 0);
|
|
81
|
+
assert.equal(result.unresolved.length, 1);
|
|
82
|
+
assert.deepEqual(result.unresolved[0].tokens, ['{{FUTURE_THING}}']);
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
cleanup();
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
it('does not touch files without any placeholder', async () => {
|
|
89
|
+
const { dir, cleanup } = makeTmpProject();
|
|
90
|
+
try {
|
|
91
|
+
writeFileSync(join(dir, 'plain.js'), `const x = 1;`);
|
|
92
|
+
const result = await substituteDir(dir, { projectGuid: 'p_x', projectName: 'X' });
|
|
93
|
+
assert.equal(result.changed.length, 0);
|
|
94
|
+
assert.equal(result.unresolved.length, 0);
|
|
95
|
+
assert.equal(readFileSync(join(dir, 'plain.js'), 'utf-8'), `const x = 1;`);
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
cleanup();
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
it('post-condition: no known placeholders remain in any rewritten file', async () => {
|
|
102
|
+
// This is the regression guard for the karaoke shipped-`{{PROJECT_GUID}}` bug.
|
|
103
|
+
const { dir, cleanup } = makeTmpProject();
|
|
104
|
+
try {
|
|
105
|
+
for (const key of KNOWN_PLACEHOLDERS) {
|
|
106
|
+
writeFileSync(join(dir, `${key.replace(/[{}]/g, '')}.html`), key);
|
|
107
|
+
}
|
|
108
|
+
await substituteDir(dir, { projectGuid: 'p_real', projectName: 'Real' });
|
|
109
|
+
for (const key of KNOWN_PLACEHOLDERS) {
|
|
110
|
+
const content = readFileSync(join(dir, `${key.replace(/[{}]/g, '')}.html`), 'utf-8');
|
|
111
|
+
assert.doesNotMatch(content, new RegExp(key.replace(/[{}]/g, '\\$&')), `placeholder ${key} leaked into deployed content`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
cleanup();
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
//# sourceMappingURL=template-vars.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-vars.test.js","sourceRoot":"","sources":["../../src/__tests__/template-vars.test.ts"],"names":[],"mappings":"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"}
|
package/dist/adopt-cwd.js
CHANGED