Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@
}
},
"./worker": "./dist/worker.mjs",
"./viewer-settings": {
"types": "./dist/viewer-settings.d.ts",
"import": "./dist/viewer-settings.mjs"
},
"./lib/*": "./lib/*"
},
"bin": {
Expand Down
37 changes: 36 additions & 1 deletion rollup.config.mjs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { execSync } from 'node:child_process';
import { copyFileSync } from 'node:fs';
import { resolve as resolvePath } from 'node:path';

import json from '@rollup/plugin-json';
Expand Down Expand Up @@ -116,6 +117,40 @@ const cjs = {
cache: false
};

// Viewer settings re-export - bundled from the same vendored viewer as the html
// writer, so producers author settings against the exact viewer version embedded
// in html exports, with no viewer dependency of their own. The declaration is
// copied from the viewer package rather than emitted by tsc: an emitted d.ts
// would just re-export from '@playcanvas/supersplat-viewer', which consumers of
// this package do not have installed.
const viewerSettings = {
input: 'src/lib/viewer-settings.ts',
output: {
dir: 'dist',
format: 'esm',
sourcemap: true,
entryFileNames: 'viewer-settings.mjs'
},
plugins: [
typescript({
tsconfig: './tsconfig.json',
declaration: false,
declarationDir: undefined
}),
resolve(),
{
name: 'copy-viewer-settings-dts',
writeBundle() {
copyFileSync(
'node_modules/@playcanvas/supersplat-viewer/dist/settings.d.ts',
'dist/viewer-settings.d.ts'
);
}
}
],
cache: false
};

// CLI build - Node.js specific
const cli = {
input: 'src/cli/index.ts',
Expand All @@ -140,4 +175,4 @@ const cli = {
cache: false
};

export default [worker, esm, cjs, cli];
export default [worker, esm, cjs, viewerSettings, cli];
7 changes: 7 additions & 0 deletions src/lib/viewer-settings.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/**
* The viewer's settings api — types, shared defaults, validation and authoring ranges —
Comment thread
slimbuck marked this conversation as resolved.
* re-exported from the vendored viewer. Producers building on this package author their
* experience settings against the exact viewer version embedded in html exports, without
* needing a viewer dependency of their own.
*/
export * from '@playcanvas/supersplat-viewer/settings';
34 changes: 34 additions & 0 deletions test/viewer-settings.test.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/**
* Packaging tests for the viewer-settings subpath re-export.
*/

import assert from 'node:assert';
import { existsSync } from 'node:fs';
import { dirname, join } from 'node:path';
import { describe, it } from 'node:test';
import { fileURLToPath } from 'node:url';

import * as viewer from '@playcanvas/supersplat-viewer/settings';

// self-referencing import: resolves through this package's exports map, as a consumer would
import * as reexport from '@playcanvas/splat-transform/viewer-settings';

const __dirname = dirname(fileURLToPath(import.meta.url));

describe('viewer-settings subpath', () => {
it('re-exports the complete viewer settings api', () => {
Comment thread
slimbuck marked this conversation as resolved.
for (const key of Object.keys(viewer)) {
assert.ok(key in reexport, `missing export: ${key}`);
}
});

it('agrees with the viewer on shared defaults', () => {
assert.deepStrictEqual(reexport.defaultSettings(), viewer.defaultSettings());
assert.deepStrictEqual(reexport.defaultPostEffectSettings(), viewer.defaultPostEffectSettings());
});

it('ships a flattened declaration next to the bundle', () => {
assert.ok(existsSync(join(__dirname, '..', 'dist', 'viewer-settings.d.ts')),
'dist/viewer-settings.d.ts should be copied by the build');
});
});