diff --git a/packages/catalog-realm/package.json b/packages/catalog-realm/package.json index 670cf12637..0511e2c080 100644 --- a/packages/catalog-realm/package.json +++ b/packages/catalog-realm/package.json @@ -8,7 +8,10 @@ "@cardstack/boxel-ui": "workspace:*", "@cardstack/local-types": "workspace:*", "@cardstack/runtime-common": "workspace:*", + "@ember/test-helpers": "catalog:", "@types/lodash": "catalog:", + "@types/qunit": "catalog:", + "@universal-ember/test-support": "catalog:", "@types/uuid": "catalog:", "chess.js": "catalog:", "concurrently": "catalog:", diff --git a/packages/catalog-realm/tsconfig.json b/packages/catalog-realm/tsconfig.json index bd925f1b7f..9465e96dac 100644 --- a/packages/catalog-realm/tsconfig.json +++ b/packages/catalog-realm/tsconfig.json @@ -23,10 +23,12 @@ "experimentalDecorators": true, "paths": { "https://cardstack.com/base/*": ["../base/*"], + "@cardstack/host/tests/*": ["../host/tests/*"], "@cardstack/boxel-host/commands/*": ["../host/app/commands/*"] }, "types": ["@cardstack/local-types"] }, + "include": ["**/*.ts", "**/*.gts"], "glint": { "environment": ["ember-loose", "ember-template-imports"] } diff --git a/packages/experiments-realm/package.json b/packages/experiments-realm/package.json index 4be0b2488a..48903a065b 100644 --- a/packages/experiments-realm/package.json +++ b/packages/experiments-realm/package.json @@ -8,6 +8,9 @@ "@cardstack/boxel-ui": "workspace:*", "@cardstack/local-types": "workspace:*", "@cardstack/runtime-common": "workspace:*", + "@ember/test-helpers": "catalog:", + "@types/qunit": "catalog:", + "@universal-ember/test-support": "catalog:", "@cardstack/view-transitions": "catalog:", "@types/lodash": "catalog:", "ember-animated": "catalog:", diff --git a/packages/experiments-realm/sample-command-card.gts b/packages/experiments-realm/sample-command-card.gts new file mode 100644 index 0000000000..c1e1d111c6 --- /dev/null +++ b/packages/experiments-realm/sample-command-card.gts @@ -0,0 +1,110 @@ +import { + CardDef, + field, + contains, + Component, +} from 'https://cardstack.com/base/card-api'; +import StringField from 'https://cardstack.com/base/string'; + +export class SampleCommandCard extends CardDef { + static displayName = 'Sample Command Card'; + @field title = contains(StringField); + + static isolated = class Isolated extends Component { + + }; +} + +// ── Tests (imports resolved via loader.shimModule in live-test.js) ──────────── +import { on } from '@ember/modifier'; +import { service } from '@ember/service'; +import { click, render } from '@ember/test-helpers'; +import GlimmerComponent from '@glimmer/component'; +import { module, test } from 'qunit'; + +import { getService } from '@universal-ember/test-support'; +import { baseRealm, type Store } from '@cardstack/runtime-common'; +import { + setupIntegrationTestRealm, + setupLocalIndexing, + setupOnSave, + setupCardLogs, + testRealmURL, + setupRealmCacheTeardown, + withCachedRealmSetup, + type TestContextWithSave, +} from '@cardstack/host/tests/helpers'; +import { TestRealmAdapter } from '@cardstack/host/tests/helpers/adapter'; +import { setupMockMatrix } from '@cardstack/host/tests/helpers/mock-matrix'; +import { setupRenderingTest } from '@cardstack/host/tests/helpers/setup'; + +class CreateCardButton extends GlimmerComponent { + @service declare store: Store; + + createCard = async () => { + await this.store.add( + new SampleCommandCard({ title: 'Hello from live-test' }), + ); + }; + + +} + +module('Experiments | SampleCommandCard', function (hooks) { + setupRenderingTest(hooks); + setupLocalIndexing(hooks); + setupOnSave(hooks); + setupRealmCacheTeardown(hooks); + setupCardLogs(hooks, async () => + (getService('loader-service') as any).loader.import( + `${baseRealm.url}card-api`, + ), + ); + + let mockMatrixUtils = setupMockMatrix(hooks, { + loggedInAs: '@testuser:localhost', + activeRealms: [testRealmURL], + autostart: true, + }); + + let testRealmAdapter: TestRealmAdapter; + + hooks.beforeEach(async function () { + ({ adapter: testRealmAdapter } = await withCachedRealmSetup(async () => + setupIntegrationTestRealm({ + mockMatrixUtils, + contents: { + 'sample-command-card.gts': { SampleCommandCard }, + '.realm.json': '{ "name": "Sample Realm" }', + }, + }), + )); + }); + + test('clicking Create Card writes a new card to the realm', async function (this: TestContextWithSave, assert) { + assert.expect(3); + + let savedUrl: URL | undefined; + this.onSave((url, doc) => { + savedUrl = url; + assert.strictEqual( + (doc as any).data.attributes.title, + 'Hello from live-test', + 'saved doc has correct title', + ); + }); + + await render(); + await click('button'); + + assert.ok(savedUrl, 'card was saved to realm'); + let relativePath = `${savedUrl!.href.substring(testRealmURL.length)}.json`; + let file = await testRealmAdapter.openFile(relativePath); + assert.ok(file, 'card JSON file exists in the realm adapter'); + }); +}); diff --git a/packages/experiments-realm/tsconfig.json b/packages/experiments-realm/tsconfig.json index f1208dafd2..c6a9b8992f 100644 --- a/packages/experiments-realm/tsconfig.json +++ b/packages/experiments-realm/tsconfig.json @@ -23,11 +23,13 @@ "experimentalDecorators": true, "paths": { "https://cardstack.com/base/*": ["../base/*"], + "@cardstack/host/tests/*": ["../host/tests/*"], "@cardstack/catalog/commands/*": ["../catalog-realm/commands/*"], "@cardstack/catalog/*": ["../catalog-realm/catalog-app/*"] }, "types": ["@cardstack/local-types"] }, + "include": ["**/*.ts", "**/*.gts"], "glint": { "environment": ["ember-loose", "ember-template-imports"] } diff --git a/packages/host/package.json b/packages/host/package.json index 5476e47028..576f160bee 100644 --- a/packages/host/package.json +++ b/packages/host/package.json @@ -48,7 +48,7 @@ "@cardstack/view-transitions": "catalog:", "@ember/optional-features": "^2.0.0", "@ember/string": "^3.1.1", - "@ember/test-helpers": "^3.3.1", + "@ember/test-helpers": "catalog:", "@ember/test-waiters": "catalog:", "@embroider/compat": "^3.5.5", "@embroider/core": "^3.4.15", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d67fb739df..7343e71b6b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -75,6 +75,9 @@ catalogs: '@ember/string': specifier: ^4.0.1 version: 4.0.1 + '@ember/test-helpers': + specifier: ^3.3.1 + version: 3.3.1 '@ember/test-waiters': specifier: ^4.1.1 version: 4.1.1 @@ -1584,12 +1587,21 @@ importers: '@cardstack/runtime-common': specifier: workspace:* version: link:../runtime-common + '@ember/test-helpers': + specifier: 'catalog:' + version: 3.3.1(@babel/core@7.28.6)(@glint/template@1.3.0)(ember-source@5.12.0(patch_hash=2586bd032e74105d65b7953ccaae1cd1d1175047a58ba89ec0057f1f8b7b7fe1)(@glimmer/component@2.0.0)(@glint/template@1.3.0)(rsvp@4.8.5)(webpack@5.104.1))(webpack@5.104.1) '@types/lodash': specifier: 'catalog:' version: 4.17.23 + '@types/qunit': + specifier: 'catalog:' + version: 2.19.13 '@types/uuid': specifier: 'catalog:' version: 9.0.8 + '@universal-ember/test-support': + specifier: 'catalog:' + version: 0.5.1(@babel/core@7.28.6)(@glint/template@1.3.0)(ember-source@5.12.0(patch_hash=2586bd032e74105d65b7953ccaae1cd1d1175047a58ba89ec0057f1f8b7b7fe1)(@glimmer/component@2.0.0)(@glint/template@1.3.0)(rsvp@4.8.5)(webpack@5.104.1))(qunit@2.25.0) chess.js: specifier: 'catalog:' version: 1.0.0-beta.8 @@ -1701,10 +1713,19 @@ importers: version: link:../runtime-common '@cardstack/view-transitions': specifier: 'catalog:' - version: 0.2.0(@babel/core@7.28.6)(ember-modifier@4.1.0(ember-source@5.12.0(patch_hash=2586bd032e74105d65b7953ccaae1cd1d1175047a58ba89ec0057f1f8b7b7fe1)(@glimmer/component@2.0.0)(@glint/template@1.3.0)(rsvp@4.8.5))) + version: 0.2.0(@babel/core@7.28.6)(ember-modifier@4.1.0(ember-source@5.12.0(patch_hash=2586bd032e74105d65b7953ccaae1cd1d1175047a58ba89ec0057f1f8b7b7fe1)(@glimmer/component@2.0.0)(@glint/template@1.3.0)(rsvp@4.8.5)(webpack@5.104.1))) + '@ember/test-helpers': + specifier: 'catalog:' + version: 3.3.1(@babel/core@7.28.6)(@glint/template@1.3.0)(ember-source@5.12.0(patch_hash=2586bd032e74105d65b7953ccaae1cd1d1175047a58ba89ec0057f1f8b7b7fe1)(@glimmer/component@2.0.0)(@glint/template@1.3.0)(rsvp@4.8.5)(webpack@5.104.1))(webpack@5.104.1) '@types/lodash': specifier: 'catalog:' version: 4.17.23 + '@types/qunit': + specifier: 'catalog:' + version: 2.19.13 + '@universal-ember/test-support': + specifier: 'catalog:' + version: 0.5.1(@babel/core@7.28.6)(@glint/template@1.3.0)(ember-source@5.12.0(patch_hash=2586bd032e74105d65b7953ccaae1cd1d1175047a58ba89ec0057f1f8b7b7fe1)(@glimmer/component@2.0.0)(@glint/template@1.3.0)(rsvp@4.8.5)(webpack@5.104.1))(qunit@2.25.0) chess.js: specifier: 'catalog:' version: 1.0.0-beta.8 @@ -1713,7 +1734,7 @@ importers: version: 8.2.2 ember-animated: specifier: 'catalog:' - version: 2.2.0(@babel/core@7.28.6)(@ember/test-helpers@5.4.1(@babel/core@7.28.6)(@glint/template@1.3.0))(@glint/template@1.3.0) + version: 2.2.0(@babel/core@7.28.6)(@ember/test-helpers@3.3.1(@babel/core@7.28.6)(@glint/template@1.3.0)(ember-source@5.12.0(patch_hash=2586bd032e74105d65b7953ccaae1cd1d1175047a58ba89ec0057f1f8b7b7fe1)(@glimmer/component@2.0.0)(@glint/template@1.3.0)(rsvp@4.8.5)(webpack@5.104.1))(webpack@5.104.1))(@glint/template@1.3.0) ember-concurrency: specifier: 'catalog:' version: 4.0.6(@babel/core@7.28.6)(@glint/template@1.3.0) @@ -1777,7 +1798,7 @@ importers: version: link:../runtime-common '@cardstack/view-transitions': specifier: 'catalog:' - version: 0.2.0(@babel/core@7.28.6)(ember-modifier@4.1.0(ember-source@5.12.0(patch_hash=2586bd032e74105d65b7953ccaae1cd1d1175047a58ba89ec0057f1f8b7b7fe1)(@glimmer/component@2.0.0)(@glint/template@1.3.0)(rsvp@4.8.5))) + version: 0.2.0(@babel/core@7.28.6)(ember-modifier@4.1.0(ember-source@5.12.0(patch_hash=2586bd032e74105d65b7953ccaae1cd1d1175047a58ba89ec0057f1f8b7b7fe1)(@glimmer/component@2.0.0)(@glint/template@1.3.0)(rsvp@4.8.5)(webpack@5.104.1))) '@ember/optional-features': specifier: ^2.0.0 version: 2.3.0 @@ -1785,7 +1806,7 @@ importers: specifier: ^3.1.1 version: 3.1.1 '@ember/test-helpers': - specifier: ^3.3.1 + specifier: 'catalog:' version: 3.3.1(@babel/core@7.28.6)(@glint/template@1.3.0)(ember-source@5.12.0(patch_hash=2586bd032e74105d65b7953ccaae1cd1d1175047a58ba89ec0057f1f8b7b7fe1)(@glimmer/component@2.0.0)(@glint/template@1.3.0)(rsvp@4.8.5)(webpack@5.104.1))(webpack@5.104.1) '@ember/test-waiters': specifier: 'catalog:' @@ -9641,7 +9662,7 @@ packages: glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} @@ -14868,7 +14889,7 @@ snapshots: '@cardstack/requirejs-monaco-ember-polyfill@0.0.1': {} - '@cardstack/view-transitions@0.2.0(@babel/core@7.28.6)(ember-modifier@4.1.0(ember-source@5.12.0(patch_hash=2586bd032e74105d65b7953ccaae1cd1d1175047a58ba89ec0057f1f8b7b7fe1)(@glimmer/component@2.0.0)(@glint/template@1.3.0)(rsvp@4.8.5)))': + '@cardstack/view-transitions@0.2.0(@babel/core@7.28.6)(ember-modifier@4.1.0(ember-source@5.12.0(patch_hash=2586bd032e74105d65b7953ccaae1cd1d1175047a58ba89ec0057f1f8b7b7fe1)(@glimmer/component@2.0.0)(@glint/template@1.3.0)(rsvp@4.8.5)(webpack@5.104.1)))': dependencies: '@embroider/addon-shim': 1.10.2 decorator-transforms: 2.3.1(@babel/core@7.28.6) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 21619f6b86..f1198ac5b3 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,98 +4,99 @@ packages: - vendor/* catalog: - '@actions/core': ^1.2.6 - '@actions/github': ^4.0.0 - '@aws-crypto/sha256-js': ^5.2.0 - '@babel/core': ^7.26.10 - '@babel/generator': ^7.17.8 - '@babel/helper-module-imports': ^7.18.2 - '@babel/helper-module-transforms': ^7.18.9 - '@babel/parser': 7.27.0 - '@babel/plugin-proposal-class-properties': ^7.18.6 - '@babel/plugin-proposal-decorators': ^7.23.2 - '@babel/plugin-syntax-class-properties': ^7.12.13 - '@babel/plugin-syntax-decorators': ^7.17.12 - '@babel/plugin-syntax-typescript': ^7.17.12 - '@babel/plugin-transform-class-properties': ^7.22.5 - '@babel/plugin-transform-class-static-block': ^7.22.11 - '@babel/plugin-transform-modules-amd': ^7.13.0 - '@babel/plugin-transform-typescript': ^7.16.8 - '@babel/preset-typescript': ^7.24.7 - '@babel/runtime': ^7.22.11 - '@babel/traverse': 7.27.0 - '@cardstack/requirejs-monaco-ember-polyfill': ^0.0.1 - '@cardstack/view-transitions': ^0.2.0 - '@ember/string': ^4.0.1 - '@ember/test-waiters': ^4.1.1 - '@eslint/eslintrc': ^2.1.4 - '@eslint/js': ^8.57.1 - '@floating-ui/dom': ^1.6.3 - '@glimmer/component': ^2.0.0 - '@glint/environment-ember-loose': ^1.5.2 - '@koa/cors': ^4.0.0 - '@koa/router': ^14.0.0 - '@lucide/lab': ^0.1.2 - '@lukeed/uuid': ^2.0.1 - '@octokit/rest': ^22.0.1 - '@percy/cli': ^1.31.1 - '@percy/ember': ^5.0.0 - '@playwright/test': ^1.54.0 - '@rollup/plugin-babel': ^6.0.4 - '@sentry/node': ^8.31.0 - '@simple-dom/interface': ^1.4.0 - '@simple-dom/parser': ^1.4.0 - '@simple-dom/serializer': ^1.4.0 - '@simple-dom/void-map': ^1.4.0 - '@sinonjs/fake-timers': ^11.2.2 - '@sqlite.org/sqlite-wasm': 3.45.1-build1 - '@tabler/icons': ^3.19.0 - '@types/archiver': ^7.0.0 - '@types/babel__core': ^7.1.19 - '@types/babel__generator': ^7.6.4 - '@types/babel__traverse': ^7.14.2 - '@types/diff': ^5.0.2 - '@types/dompurify': ^3.0.2 - '@types/eslint': 8.56.5 - '@types/flat': ^5.0.5 - '@types/fs-extra': ^11.0.4 - '@types/htmlbars-inline-precompile': ^3.0.3 - '@types/indefinite': ^2.3.4 - '@types/js-string-escape': ^1.0.1 - '@types/js-yaml': ^4.0.9 - '@types/jsdom': ^21.1.1 - '@types/jsonwebtoken': 9.0.10 - '@types/koa': ^2.13.5 - '@types/koa-compose': ^3.2.5 - '@types/koa__cors': ^4.0.0 - '@types/koa__router': ^12.0.0 - '@types/line-column': ^1.0.0 - '@types/lodash': ^4.17.15 - '@types/matrix-js-sdk': ^11.0.1 - '@types/mime-types': ^2.1.1 - '@types/ms': ^2.1.0 - '@types/node': ^24.3.0 - '@types/pg': ^8.11.5 - '@types/pluralize': ^0.0.30 - '@types/qs': ^6.9.17 - '@types/qunit': ^2.19.12 - '@types/rsvp': ^4.0.9 - '@types/sane': ^2.0.1 - '@types/sinon': ^17.0.3 - '@types/sinonjs__fake-timers': ^8.1.5 - '@types/statuses': ^2.0.5 - '@types/stream-chain': ^2.0.1 - '@types/stream-json': ^1.7.3 - '@types/string.prototype.matchall': ^4.0.1 - '@types/superagent': ^8.1.9 - '@types/supertest': ^2.0.12 - '@types/tmp': ^0.2.3 - '@types/uuid': ^9.0.8 - '@types/yargs': ^17.0.10 - '@typescript-eslint/eslint-plugin': ^7.18.0 - '@typescript-eslint/parser': ^7.18.0 - '@universal-ember/test-support': ^0.5.1 - '@vscode/vsce': ^3.1.0 + "@actions/core": ^1.2.6 + "@actions/github": ^4.0.0 + "@aws-crypto/sha256-js": ^5.2.0 + "@babel/core": ^7.26.10 + "@babel/generator": ^7.17.8 + "@babel/helper-module-imports": ^7.18.2 + "@babel/helper-module-transforms": ^7.18.9 + "@babel/parser": 7.27.0 + "@babel/plugin-proposal-class-properties": ^7.18.6 + "@babel/plugin-proposal-decorators": ^7.23.2 + "@babel/plugin-syntax-class-properties": ^7.12.13 + "@babel/plugin-syntax-decorators": ^7.17.12 + "@babel/plugin-syntax-typescript": ^7.17.12 + "@babel/plugin-transform-class-properties": ^7.22.5 + "@babel/plugin-transform-class-static-block": ^7.22.11 + "@babel/plugin-transform-modules-amd": ^7.13.0 + "@babel/plugin-transform-typescript": ^7.16.8 + "@babel/preset-typescript": ^7.24.7 + "@babel/runtime": ^7.22.11 + "@babel/traverse": 7.27.0 + "@cardstack/requirejs-monaco-ember-polyfill": ^0.0.1 + "@cardstack/view-transitions": ^0.2.0 + "@ember/string": ^4.0.1 + "@ember/test-helpers": ^3.3.1 + "@ember/test-waiters": ^4.1.1 + "@eslint/eslintrc": ^2.1.4 + "@eslint/js": ^8.57.1 + "@floating-ui/dom": ^1.6.3 + "@glimmer/component": ^2.0.0 + "@glint/environment-ember-loose": ^1.5.2 + "@koa/cors": ^4.0.0 + "@koa/router": ^14.0.0 + "@lucide/lab": ^0.1.2 + "@lukeed/uuid": ^2.0.1 + "@octokit/rest": ^22.0.1 + "@percy/cli": ^1.31.1 + "@percy/ember": ^5.0.0 + "@playwright/test": ^1.54.0 + "@rollup/plugin-babel": ^6.0.4 + "@sentry/node": ^8.31.0 + "@simple-dom/interface": ^1.4.0 + "@simple-dom/parser": ^1.4.0 + "@simple-dom/serializer": ^1.4.0 + "@simple-dom/void-map": ^1.4.0 + "@sinonjs/fake-timers": ^11.2.2 + "@sqlite.org/sqlite-wasm": 3.45.1-build1 + "@tabler/icons": ^3.19.0 + "@types/archiver": ^7.0.0 + "@types/babel__core": ^7.1.19 + "@types/babel__generator": ^7.6.4 + "@types/babel__traverse": ^7.14.2 + "@types/diff": ^5.0.2 + "@types/dompurify": ^3.0.2 + "@types/eslint": 8.56.5 + "@types/flat": ^5.0.5 + "@types/fs-extra": ^11.0.4 + "@types/htmlbars-inline-precompile": ^3.0.3 + "@types/indefinite": ^2.3.4 + "@types/js-string-escape": ^1.0.1 + "@types/js-yaml": ^4.0.9 + "@types/jsdom": ^21.1.1 + "@types/jsonwebtoken": 9.0.10 + "@types/koa": ^2.13.5 + "@types/koa-compose": ^3.2.5 + "@types/koa__cors": ^4.0.0 + "@types/koa__router": ^12.0.0 + "@types/line-column": ^1.0.0 + "@types/lodash": ^4.17.15 + "@types/matrix-js-sdk": ^11.0.1 + "@types/mime-types": ^2.1.1 + "@types/ms": ^2.1.0 + "@types/node": ^24.3.0 + "@types/pg": ^8.11.5 + "@types/pluralize": ^0.0.30 + "@types/qs": ^6.9.17 + "@types/qunit": ^2.19.12 + "@types/rsvp": ^4.0.9 + "@types/sane": ^2.0.1 + "@types/sinon": ^17.0.3 + "@types/sinonjs__fake-timers": ^8.1.5 + "@types/statuses": ^2.0.5 + "@types/stream-chain": ^2.0.1 + "@types/stream-json": ^1.7.3 + "@types/string.prototype.matchall": ^4.0.1 + "@types/superagent": ^8.1.9 + "@types/supertest": ^2.0.12 + "@types/tmp": ^0.2.3 + "@types/uuid": ^9.0.8 + "@types/yargs": ^17.0.10 + "@typescript-eslint/eslint-plugin": ^7.18.0 + "@typescript-eslint/parser": ^7.18.0 + "@universal-ember/test-support": ^0.5.1 + "@vscode/vsce": ^3.1.0 ajv: ^8.17.1 archiver: ^7.0.0 awesome-phonenumber: ^7.2.0