@nexusclawhq/cli 0.3.9 → 0.3.10
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/CHANGELOG.md +9 -0
- package/dist/build-info.json +4 -4
- package/dist/nexus-cli/node_modules/@nexusclaw/shared/dist/index.d.ts +1 -0
- package/dist/nexus-cli/node_modules/@nexusclaw/shared/dist/index.js +1 -0
- package/dist/nexus-cli/node_modules/@nexusclaw/shared/dist/index.js.map +1 -1
- package/dist/nexus-cli/node_modules/@nexusclaw/shared/dist/package-payload.d.ts +67 -0
- package/dist/nexus-cli/node_modules/@nexusclaw/shared/dist/package-payload.js +148 -0
- package/dist/nexus-cli/node_modules/@nexusclaw/shared/dist/package-payload.js.map +1 -0
- package/dist/nexus-cli/node_modules/@nexusclaw/shared/package.json +4 -0
- package/dist/nexus-cli/src/cli.js +0 -0
- package/dist/nexus-cli/src/commands/package/format.js +3 -5
- package/dist/nexus-cli/src/commands/package/format.js.map +1 -1
- package/dist/nexus-cli/src/commands/package/helpers.d.ts +0 -2
- package/dist/nexus-cli/src/commands/package/helpers.js +0 -32
- package/dist/nexus-cli/src/commands/package/helpers.js.map +1 -1
- package/dist/nexus-cli/src/commands/package/pack.js +2 -2
- package/dist/nexus-cli/src/commands/package/pack.js.map +1 -1
- package/dist/nexus-cli/src/commands/package/publish.js +2 -1
- package/dist/nexus-cli/src/commands/package/publish.js.map +1 -1
- package/dist/nexus-cli/src/commands/package/validate.js +5 -4
- package/dist/nexus-cli/src/commands/package/validate.js.map +1 -1
- package/dist/nexus-cli/src/services/__env-probe.test.d.ts +1 -0
- package/dist/nexus-cli/src/services/__env-probe.test.js +13 -0
- package/dist/nexus-cli/src/services/__env-probe.test.js.map +1 -0
- package/dist/nexus-cli/src/services/ai-authoring-context-v2.pack.e2e.test.d.ts +1 -0
- package/dist/nexus-cli/src/services/ai-authoring-context-v2.pack.e2e.test.js +132 -0
- package/dist/nexus-cli/src/services/ai-authoring-context-v2.pack.e2e.test.js.map +1 -0
- package/dist/nexus-cli/src/services/package-payload.d.ts +8 -0
- package/dist/nexus-cli/src/services/package-payload.js +76 -0
- package/dist/nexus-cli/src/services/package-payload.js.map +1 -0
- package/dist/nexus-cli/src/services/package-payload.test.d.ts +1 -0
- package/dist/nexus-cli/src/services/package-payload.test.js +59 -0
- package/dist/nexus-cli/src/services/package-payload.test.js.map +1 -0
- package/dist/nexus-cli/src/services/workforce-bundle-archive.d.ts +1 -1
- package/dist/nexus-cli/src/services/workforce-bundle-remote.d.ts +1 -1
- package/dist/nexus-cli/src/templates/project/templates/drill-code-extension-page/src/components/drill-code-extension-page/index.js +70 -0
- package/dist/nexus-cli/src/templates/project/templates/drill-code-extension-page/src/metadata/drill-code-extension-page.manifest.json +63 -0
- package/dist/nexus-cli/src/templates/project/templates/drill-code-extension-page/src/tests/drill-code-extension-page.assertions.json +13 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
7
|
+
const node_child_process_1 = require("node:child_process");
|
|
8
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
9
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
10
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
11
|
+
const node_test_1 = __importDefault(require("node:test"));
|
|
12
|
+
const PACKAGE_ROOT = node_path_1.default.resolve(__dirname, '../..');
|
|
13
|
+
const RUNNING_INSIDE_PUBLISH = process.env.npm_command === 'publish';
|
|
14
|
+
const SKIP_REASON = RUNNING_INSIDE_PUBLISH
|
|
15
|
+
? 'skipped inside npm publish lifecycle (npm reserves the pack operation)'
|
|
16
|
+
: null;
|
|
17
|
+
function run(cmd, args, opts = { cwd: PACKAGE_ROOT }) {
|
|
18
|
+
return (0, node_child_process_1.execFileSync)(cmd, args, {
|
|
19
|
+
cwd: opts.cwd,
|
|
20
|
+
encoding: 'utf8',
|
|
21
|
+
env: { ...process.env, ...(opts.env ?? {}) },
|
|
22
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
async function buildTarballInTempDest() {
|
|
26
|
+
const dest = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'nexus-pack-dest-'));
|
|
27
|
+
const stdout = run('npm', ['pack', '--json', '--pack-destination', dest], {
|
|
28
|
+
cwd: PACKAGE_ROOT,
|
|
29
|
+
});
|
|
30
|
+
const jsonStart = stdout.indexOf('[\n');
|
|
31
|
+
let filename;
|
|
32
|
+
if (jsonStart !== -1) {
|
|
33
|
+
const jsonEnd = stdout.indexOf('\n]\n', jsonStart);
|
|
34
|
+
const sliceEnd = jsonEnd === -1 ? stdout.length : jsonEnd + 2;
|
|
35
|
+
try {
|
|
36
|
+
const parsed = JSON.parse(stdout.slice(jsonStart, sliceEnd));
|
|
37
|
+
filename = parsed[0]?.filename;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (!filename) {
|
|
43
|
+
const tgzLine = stdout
|
|
44
|
+
.split('\n')
|
|
45
|
+
.map((line) => line.trim())
|
|
46
|
+
.filter((line) => line.endsWith('.tgz'))
|
|
47
|
+
.pop();
|
|
48
|
+
strict_1.default.ok(tgzLine, `npm pack produced no tarball: ${stdout}`);
|
|
49
|
+
filename = tgzLine;
|
|
50
|
+
}
|
|
51
|
+
return { tarballPath: node_path_1.default.join(dest, filename), dest };
|
|
52
|
+
}
|
|
53
|
+
(0, node_test_1.default)('the npm-packed CLI exports the complete action fixture schema (not a shell)', { timeout: 180_000, skip: SKIP_REASON ?? false }, async () => {
|
|
54
|
+
const { tarballPath, dest: packDest } = await buildTarballInTempDest();
|
|
55
|
+
strict_1.default.ok(node_fs_1.default.existsSync(tarballPath), `npm pack did not produce a tarball at ${tarballPath}`);
|
|
56
|
+
const installRoot = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'nexus-packed-install-'));
|
|
57
|
+
try {
|
|
58
|
+
run('npm', ['install', '--no-audit', '--no-fund', tarballPath], {
|
|
59
|
+
cwd: installRoot,
|
|
60
|
+
});
|
|
61
|
+
const nexusBin = node_path_1.default.join(installRoot, 'node_modules', '.bin', 'nexus');
|
|
62
|
+
strict_1.default.ok(node_fs_1.default.existsSync(nexusBin), 'installed nexus binary not found');
|
|
63
|
+
const packDir = node_path_1.default.join(installRoot, 'context');
|
|
64
|
+
run(nexusBin, ['ai', 'context', 'export', '--surface', 'code', '--offline', '--workspace', installRoot, '--out', packDir], {
|
|
65
|
+
cwd: installRoot,
|
|
66
|
+
env: { ...process.env, HOME: process.env.HOME },
|
|
67
|
+
});
|
|
68
|
+
const schemaPath = node_path_1.default.join(packDir, 'schemas', 'code-action-cases-v1.schema.json');
|
|
69
|
+
strict_1.default.ok(node_fs_1.default.existsSync(schemaPath), 'schema file not exported');
|
|
70
|
+
const schema = JSON.parse(node_fs_1.default.readFileSync(schemaPath, 'utf8'));
|
|
71
|
+
const isShell = typeof schema === 'object' &&
|
|
72
|
+
schema !== null &&
|
|
73
|
+
Object.keys(schema).length <= 2 &&
|
|
74
|
+
schema.type === 'object';
|
|
75
|
+
strict_1.default.equal(isShell, false, 'packed CLI exported an anonymous schema shell');
|
|
76
|
+
const callsSchema = schema.properties.cases.items.properties.hostFixtures.properties.calls
|
|
77
|
+
.items;
|
|
78
|
+
const recordsCall = callsSchema.oneOf.find((candidate) => candidate.properties?.namespace?.const === 'records');
|
|
79
|
+
strict_1.default.ok(recordsCall, 'records fixture variant missing from packed schema');
|
|
80
|
+
strict_1.default.deepEqual(recordsCall.properties.method.enum, [
|
|
81
|
+
'get',
|
|
82
|
+
'query',
|
|
83
|
+
'create',
|
|
84
|
+
'update',
|
|
85
|
+
'delete',
|
|
86
|
+
]);
|
|
87
|
+
strict_1.default.equal(recordsCall.properties.method.enum.includes('records.query'), false);
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
try {
|
|
91
|
+
node_fs_1.default.rmSync(installRoot, { recursive: true, force: true });
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
node_fs_1.default.rmSync(packDest, { recursive: true, force: true });
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
(0, node_test_1.default)('the npm-packed CLI exposes build-info with gitSha and contentDigest', { timeout: 180_000, skip: SKIP_REASON ?? false }, async () => {
|
|
103
|
+
const { tarballPath, dest: packDest } = await buildTarballInTempDest();
|
|
104
|
+
const installRoot = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'nexus-packed-buildinfo-'));
|
|
105
|
+
try {
|
|
106
|
+
run('npm', ['install', '--no-audit', '--no-fund', tarballPath], {
|
|
107
|
+
cwd: installRoot,
|
|
108
|
+
});
|
|
109
|
+
const nexusBin = node_path_1.default.join(installRoot, 'node_modules', '.bin', 'nexus');
|
|
110
|
+
const output = run(nexusBin, ['--build-info', '--json'], {
|
|
111
|
+
cwd: installRoot,
|
|
112
|
+
});
|
|
113
|
+
const info = JSON.parse(output);
|
|
114
|
+
strict_1.default.equal(info.packageName, '@nexusclawhq/cli');
|
|
115
|
+
strict_1.default.ok(typeof info.gitSha === 'string' && info.gitSha !== 'unknown');
|
|
116
|
+
strict_1.default.match(info.contentDigest, /^sha256:[0-9a-f]{64}$/);
|
|
117
|
+
strict_1.default.ok(typeof info.version === 'string' && info.version !== '0.0.0');
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
try {
|
|
121
|
+
node_fs_1.default.rmSync(installRoot, { recursive: true, force: true });
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
node_fs_1.default.rmSync(packDest, { recursive: true, force: true });
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
//# sourceMappingURL=ai-authoring-context-v2.pack.e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-authoring-context-v2.pack.e2e.test.js","sourceRoot":"","sources":["../../../../src/services/ai-authoring-context-v2.pack.e2e.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { PackageFormat } from '@nexusclaw/shared';
|
|
2
|
+
export type PackagePayloadValidation = {
|
|
3
|
+
format: PackageFormat;
|
|
4
|
+
files: string[];
|
|
5
|
+
warnings: string[];
|
|
6
|
+
};
|
|
7
|
+
export declare function validatePackagePayloadDirectory(packageDirectory: string): PackagePayloadValidation;
|
|
8
|
+
export declare function formatPackagePayloadDirectory(packageDirectory: string): string[];
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.validatePackagePayloadDirectory = validatePackagePayloadDirectory;
|
|
7
|
+
exports.formatPackagePayloadDirectory = formatPackagePayloadDirectory;
|
|
8
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
const shared_1 = require("@nexusclaw/shared");
|
|
11
|
+
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
12
|
+
function validatePackagePayloadDirectory(packageDirectory) {
|
|
13
|
+
const payloadDirectory = node_path_1.default.join(packageDirectory, 'payload');
|
|
14
|
+
if (!node_fs_1.default.existsSync(payloadDirectory)) {
|
|
15
|
+
const metadataDirectory = node_path_1.default.join(packageDirectory, 'metadata');
|
|
16
|
+
return {
|
|
17
|
+
format: node_fs_1.default.existsSync(metadataDirectory)
|
|
18
|
+
? shared_1.PackageFormat.METADATA
|
|
19
|
+
: shared_1.PackageFormat.UNKNOWN,
|
|
20
|
+
files: [],
|
|
21
|
+
warnings: [],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const files = node_fs_1.default.readdirSync(payloadDirectory, { withFileTypes: true })
|
|
25
|
+
.filter((entry) => entry.isFile() && /\.(json|ya?ml)$/i.test(entry.name))
|
|
26
|
+
.map((entry) => node_path_1.default.join(payloadDirectory, entry.name))
|
|
27
|
+
.sort((left, right) => left.localeCompare(right));
|
|
28
|
+
if (files.length === 0) {
|
|
29
|
+
return { format: shared_1.PackageFormat.UNKNOWN, files: [], warnings: [] };
|
|
30
|
+
}
|
|
31
|
+
const documents = files.map((file) => {
|
|
32
|
+
const content = node_fs_1.default.readFileSync(file, 'utf8');
|
|
33
|
+
return (file.endsWith('.json')
|
|
34
|
+
? JSON.parse(content)
|
|
35
|
+
: js_yaml_1.default.load(content));
|
|
36
|
+
});
|
|
37
|
+
const payload = {
|
|
38
|
+
schemaVersion: shared_1.PACKAGE_PAYLOAD_SCHEMA_VERSION,
|
|
39
|
+
documents,
|
|
40
|
+
};
|
|
41
|
+
const result = (0, shared_1.validatePackagePayload)(payload);
|
|
42
|
+
if (!result.valid) {
|
|
43
|
+
throw new Error(result.errors.map((entry) => `${entry.path}: ${entry.message}`).join('\n'));
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
format: shared_1.PackageFormat.PAYLOAD,
|
|
47
|
+
files,
|
|
48
|
+
warnings: result.warnings.map((entry) => `${entry.path}: ${entry.message}`),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function formatPackagePayloadDirectory(packageDirectory) {
|
|
52
|
+
const payloadDirectory = node_path_1.default.join(packageDirectory, 'payload');
|
|
53
|
+
if (!node_fs_1.default.existsSync(payloadDirectory))
|
|
54
|
+
return [];
|
|
55
|
+
const files = node_fs_1.default.readdirSync(payloadDirectory, { withFileTypes: true })
|
|
56
|
+
.filter((entry) => entry.isFile() && /\.(json|ya?ml)$/i.test(entry.name))
|
|
57
|
+
.map((entry) => node_path_1.default.join(payloadDirectory, entry.name))
|
|
58
|
+
.sort((left, right) => left.localeCompare(right));
|
|
59
|
+
for (const file of files) {
|
|
60
|
+
const content = node_fs_1.default.readFileSync(file, 'utf8');
|
|
61
|
+
const value = file.endsWith('.json')
|
|
62
|
+
? JSON.parse(content)
|
|
63
|
+
: js_yaml_1.default.load(content);
|
|
64
|
+
const formatted = file.endsWith('.json')
|
|
65
|
+
? `${JSON.stringify(value, null, 2)}\n`
|
|
66
|
+
: js_yaml_1.default.dump(value, {
|
|
67
|
+
indent: 2,
|
|
68
|
+
lineWidth: 120,
|
|
69
|
+
noRefs: true,
|
|
70
|
+
sortKeys: false,
|
|
71
|
+
});
|
|
72
|
+
node_fs_1.default.writeFileSync(file, formatted, 'utf8');
|
|
73
|
+
}
|
|
74
|
+
return files;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=package-payload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-payload.js","sourceRoot":"","sources":["../../../../src/services/package-payload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
7
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
const node_test_1 = __importDefault(require("node:test"));
|
|
11
|
+
const shared_1 = require("@nexusclaw/shared");
|
|
12
|
+
const package_payload_1 = require("./package-payload");
|
|
13
|
+
(0, node_test_1.default)('validates payload packages without a Core source checkout', () => {
|
|
14
|
+
const root = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'nexus-payload-'));
|
|
15
|
+
const packageDirectory = node_path_1.default.join(root, 'package');
|
|
16
|
+
node_fs_1.default.mkdirSync(node_path_1.default.join(packageDirectory, 'payload'), { recursive: true });
|
|
17
|
+
node_fs_1.default.writeFileSync(node_path_1.default.join(packageDirectory, 'payload', 'objects.yaml'), [
|
|
18
|
+
'schemaVersion: payload/v1',
|
|
19
|
+
'moduleId: medtech-tool',
|
|
20
|
+
'kind: objects',
|
|
21
|
+
'metadata:',
|
|
22
|
+
' packageName: custom.medtech',
|
|
23
|
+
' packageVersion: 1.0.0',
|
|
24
|
+
'data: []',
|
|
25
|
+
'',
|
|
26
|
+
].join('\n'));
|
|
27
|
+
const previousCwd = process.cwd();
|
|
28
|
+
process.chdir(root);
|
|
29
|
+
try {
|
|
30
|
+
strict_1.default.deepEqual((0, package_payload_1.validatePackagePayloadDirectory)(packageDirectory), {
|
|
31
|
+
format: shared_1.PackageFormat.PAYLOAD,
|
|
32
|
+
files: [node_path_1.default.join(packageDirectory, 'payload', 'objects.yaml')],
|
|
33
|
+
warnings: [],
|
|
34
|
+
});
|
|
35
|
+
strict_1.default.equal(node_fs_1.default.existsSync(node_path_1.default.join(root, 'packages/backend/scripts/package-payload.ts')), false);
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
process.chdir(previousCwd);
|
|
39
|
+
node_fs_1.default.rmSync(root, { recursive: true, force: true });
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
(0, node_test_1.default)('rejects invalid payload with stable validation details', () => {
|
|
43
|
+
const root = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'nexus-payload-invalid-'));
|
|
44
|
+
node_fs_1.default.mkdirSync(node_path_1.default.join(root, 'payload'), { recursive: true });
|
|
45
|
+
node_fs_1.default.writeFileSync(node_path_1.default.join(root, 'payload', 'objects.json'), JSON.stringify({
|
|
46
|
+
schemaVersion: 'payload/v1',
|
|
47
|
+
moduleId: 'invalid',
|
|
48
|
+
kind: 'objects',
|
|
49
|
+
metadata: { packageName: 'custom.medtech', packageVersion: '1.0.0' },
|
|
50
|
+
data: {},
|
|
51
|
+
}));
|
|
52
|
+
try {
|
|
53
|
+
strict_1.default.throws(() => (0, package_payload_1.validatePackagePayloadDirectory)(root), /objects payload must provide an array/);
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
node_fs_1.default.rmSync(root, { recursive: true, force: true });
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=package-payload.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-payload.test.js","sourceRoot":"","sources":["../../../../src/services/package-payload.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,5 +8,5 @@ export declare function buildCanonicalWorkforceBundleArchive(options: {
|
|
|
8
8
|
portableBundleDigest: `sha256:${string}`;
|
|
9
9
|
runtimeBindingsDigest: `sha256:${string}`;
|
|
10
10
|
fileCount: number;
|
|
11
|
-
declaredSurfaces: ("
|
|
11
|
+
declaredSurfaces: ("employee" | "code" | "flow")[];
|
|
12
12
|
}>;
|
|
@@ -14,7 +14,7 @@ export declare function prepareRemoteWorkforceBundle(options: {
|
|
|
14
14
|
portableBundleDigest: `sha256:${string}`;
|
|
15
15
|
runtimeBindingsDigest: `sha256:${string}`;
|
|
16
16
|
fileCount: number;
|
|
17
|
-
declaredSurfaces: ("
|
|
17
|
+
declaredSurfaces: ("employee" | "code" | "flow")[];
|
|
18
18
|
};
|
|
19
19
|
sealed: import("./api-client").SealedExecutablePackageArtifact;
|
|
20
20
|
artifactInput: {
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
(() => {
|
|
2
|
+
const root = window.NexusExtensionRoot || document.getElementById('root') || document.body;
|
|
3
|
+
const context = window.NexusExtensionContext || {};
|
|
4
|
+
const accounts = context.datasets?.accounts;
|
|
5
|
+
const accountRows = Array.isArray(accounts?.records) ? accounts.records : [];
|
|
6
|
+
|
|
7
|
+
const escapeHtml = (value) => String(value ?? '')
|
|
8
|
+
.replace(/&/g, '&')
|
|
9
|
+
.replace(/</g, '<')
|
|
10
|
+
.replace(/>/g, '>')
|
|
11
|
+
.replace(/"/g, '"');
|
|
12
|
+
|
|
13
|
+
const pick = (record, keys) => {
|
|
14
|
+
for (const key of keys) {
|
|
15
|
+
const value = record?.[key];
|
|
16
|
+
if (value !== undefined && value !== null && value !== '') {
|
|
17
|
+
if (typeof value === 'object') return value.name || value.label || value.id || JSON.stringify(value);
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return '-';
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const accountTableRows = accountRows.length > 0
|
|
25
|
+
? accountRows.map((record) => [
|
|
26
|
+
'<tr>',
|
|
27
|
+
`<td>${escapeHtml(pick(record, ['displayName', 'name', 'Name']))}</td>`,
|
|
28
|
+
`<td>${escapeHtml(pick(record, ['industry', 'Industry']))}</td>`,
|
|
29
|
+
`<td>${escapeHtml(pick(record, ['phone', 'Phone']))}</td>`,
|
|
30
|
+
`<td>${escapeHtml(pick(record, ['ownerId', 'owner']))}</td>`,
|
|
31
|
+
'</tr>',
|
|
32
|
+
].join('')).join('')
|
|
33
|
+
: '<tr><td colspan="4" style="color:#667085;">No account records returned.</td></tr>';
|
|
34
|
+
|
|
35
|
+
root.innerHTML = [
|
|
36
|
+
'<main style="font-family:Inter,Arial,sans-serif;color:#172033;background:#f7f9fc;min-height:100%;padding:18px;box-sizing:border-box;">',
|
|
37
|
+
'<section style="background:#ffffff;border:1px solid #d7dde8;border-radius:8px;padding:18px;box-shadow:0 6px 18px rgba(19,36,64,0.08);">',
|
|
38
|
+
'<div style="font-size:12px;color:#2357c6;font-weight:700;text-transform:uppercase;">Code Extension Bundle Mounted</div>',
|
|
39
|
+
'<h1 style="font-size:22px;line-height:1.25;margin:8px 0 6px;">Drill Code Extension Page</h1>',
|
|
40
|
+
'<p style="font-size:13px;line-height:1.6;margin:0;color:#4a5568;">Workspace-owned code-extension bundle with governed Account data.</p>',
|
|
41
|
+
'<dl style="display:grid;grid-template-columns:140px 1fr;gap:8px 14px;margin:18px 0 0;font-size:13px;">',
|
|
42
|
+
'<dt style="font-weight:700;color:#24324a;">Workspace</dt><dd style="margin:0;">E2E-L2-Drill-001</dd>',
|
|
43
|
+
'<dt style="font-weight:700;color:#24324a;">Custom object</dt><dd style="margin:0;">drillExtensionPage01</dd>',
|
|
44
|
+
'<dt style="font-weight:700;color:#24324a;">Component ID</dt><dd style="margin:0;">drill-code-extension-page</dd>',
|
|
45
|
+
'<dt style="font-weight:700;color:#24324a;">Source owner</dt><dd style="margin:0;">workspace project</dd>',
|
|
46
|
+
'</dl>',
|
|
47
|
+
'<section style="margin-top:18px;">',
|
|
48
|
+
'<div style="display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:8px;">',
|
|
49
|
+
'<h2 style="font-size:16px;margin:0;">Account records</h2>',
|
|
50
|
+
`<span style="font-size:12px;color:#667085;">${escapeHtml(accounts?.loading ? 'Loading' : `${accountRows.length} shown / ${accounts?.totalCount ?? 0} total`)}</span>`,
|
|
51
|
+
'</div>',
|
|
52
|
+
accounts?.error ? `<div style="border:1px solid #fda29b;background:#fff1f0;color:#b42318;border-radius:6px;padding:10px;font-size:13px;">${escapeHtml(accounts.error)}</div>` : [
|
|
53
|
+
'<table style="width:100%;border-collapse:collapse;font-size:13px;background:#fff;">',
|
|
54
|
+
'<thead><tr style="background:#f2f5fa;color:#344054;text-align:left;">',
|
|
55
|
+
'<th style="padding:8px;border:1px solid #d7dde8;">Name</th>',
|
|
56
|
+
'<th style="padding:8px;border:1px solid #d7dde8;">Industry</th>',
|
|
57
|
+
'<th style="padding:8px;border:1px solid #d7dde8;">Phone</th>',
|
|
58
|
+
'<th style="padding:8px;border:1px solid #d7dde8;">Owner</th>',
|
|
59
|
+
'</tr></thead>',
|
|
60
|
+
`<tbody>${accountTableRows}</tbody>`,
|
|
61
|
+
'</table>',
|
|
62
|
+
].join(''),
|
|
63
|
+
'</section>',
|
|
64
|
+
'<pre style="white-space:pre-wrap;background:#111827;color:#e5e7eb;border-radius:6px;padding:10px;margin:18px 0 0;font-size:12px;line-height:1.5;">',
|
|
65
|
+
escapeHtml(JSON.stringify({ componentId: context.componentId, bundleHash: context.bundleHash, datasets: Object.keys(context.datasets || {}) }, null, 2)),
|
|
66
|
+
'</pre>',
|
|
67
|
+
'</section>',
|
|
68
|
+
'</main>',
|
|
69
|
+
].join('');
|
|
70
|
+
})();
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "workspace-extension-page/v1",
|
|
3
|
+
"targetEnvironment": "drill",
|
|
4
|
+
"targetWorkspace": "E2E-L2-Drill-001",
|
|
5
|
+
"object": {
|
|
6
|
+
"apiName": "drillExtensionPage01",
|
|
7
|
+
"labelSingular": "Drill Extension Page 01",
|
|
8
|
+
"labelPlural": "Drill Extension Page 01s",
|
|
9
|
+
"description": "Workspace-owned custom object used by the Drill code-extension page.",
|
|
10
|
+
"isCustom": true
|
|
11
|
+
},
|
|
12
|
+
"component": {
|
|
13
|
+
"componentId": "drill-code-extension-page",
|
|
14
|
+
"apiName": "drill_code_extension_page",
|
|
15
|
+
"name": "Drill Code Extension Page",
|
|
16
|
+
"sourcePath": "src/components/drill-code-extension-page/index.js",
|
|
17
|
+
"permissions": [
|
|
18
|
+
{ "type": "ui" },
|
|
19
|
+
{ "type": "data:read", "scope": ["drillExtensionPage01"] },
|
|
20
|
+
{ "type": "data:read", "scope": ["account"] }
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
"customPage": {
|
|
24
|
+
"apiName": "drill_code_extension_page",
|
|
25
|
+
"name": "Drill Code Extension Page",
|
|
26
|
+
"type": "APP",
|
|
27
|
+
"schema": {
|
|
28
|
+
"id": "drill-code-extension-page-schema",
|
|
29
|
+
"name": "Drill Code Extension Page",
|
|
30
|
+
"type": "app",
|
|
31
|
+
"layout": {
|
|
32
|
+
"id": "root",
|
|
33
|
+
"component": "CodeExtensionFrame",
|
|
34
|
+
"props": {
|
|
35
|
+
"componentId": "drill-code-extension-page",
|
|
36
|
+
"title": "Drill Code Extension Page",
|
|
37
|
+
"description": "Rendered from a governed workspace-owned code-extension bundle.",
|
|
38
|
+
"minHeight": 620,
|
|
39
|
+
"dataSources": [
|
|
40
|
+
{
|
|
41
|
+
"id": "accounts",
|
|
42
|
+
"type": "records",
|
|
43
|
+
"label": "Account records",
|
|
44
|
+
"config": {
|
|
45
|
+
"objectName": "account",
|
|
46
|
+
"first": 5,
|
|
47
|
+
"orderBy": [{ "name": "AscNullsLast" }]
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"menuItem": {
|
|
56
|
+
"appApiName": "e2e_drill_app",
|
|
57
|
+
"apiName": "drill_tab_code_extension_page",
|
|
58
|
+
"name": "Code Extension Page",
|
|
59
|
+
"type": "PAGE",
|
|
60
|
+
"position": 4,
|
|
61
|
+
"isActive": true
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "workspace-runtime-assertions/v1",
|
|
3
|
+
"targetWorkspace": "E2E-L2-Drill-001",
|
|
4
|
+
"expectedVisibleText": [
|
|
5
|
+
"Code Extension Bundle Mounted",
|
|
6
|
+
"Account records",
|
|
7
|
+
"Name",
|
|
8
|
+
"drillExtensionPage01",
|
|
9
|
+
"E2E-L2-Drill-001"
|
|
10
|
+
],
|
|
11
|
+
"expectedMenuItemApiName": "drill_tab_code_extension_page",
|
|
12
|
+
"expectedComponentId": "drill-code-extension-page"
|
|
13
|
+
}
|