Merge pull request 'Update dependencies' (#70) from chore/update_dependencies into master
CI / Lint (push) Successful in 1m7s
CI / Test (push) Successful in 59s

Reviewed-on: #70
This commit was merged in pull request #70.
This commit is contained in:
2026-08-06 22:00:01 +00:00
16 changed files with 2604 additions and 2659 deletions
+6 -10
View File
@@ -6,7 +6,7 @@ import { fn } from '@ember/helper';
import { service } from '@ember/service';
import { modifier } from 'ember-modifier';
import { task } from 'ember-concurrency';
import { EventFactory } from 'applesauce-factory';
import { EventFactory } from 'applesauce-core';
import config from 'marco/config/environment';
import DropdownMenu from './dropdown-menu';
import PhotoCarousel from './photo-carousel';
@@ -201,21 +201,17 @@ export default class PhotoGallery extends Component {
const eventId = this.currentPhoto.eventId;
// Publish Nostr kind: 5 deletion event first so we don't end up with dead blossom links on a failure
const factory = new EventFactory({ signer: this.nostrAuth.signer });
const tags = [['e', eventId]];
if (this.currentPhoto.placeIdentifier) {
tags.push(['i', this.currentPhoto.placeIdentifier]);
}
const template = {
kind: 5,
created_at: Math.floor(Date.now() / 1000),
content: 'Deleted photo',
tags,
};
const event = await factory.sign(template);
const event = await EventFactory.fromKind(5)
.content('Deleted photo')
.modifyPublicTags(() => tags)
.as(this.nostrAuth.signer)
.sign();
await this.nostrRelay.publish(this.nostrData.activeWriteRelays, event);
// Remove from local store by adding the kind 5 to it
+5 -13
View File
@@ -155,8 +155,6 @@ export default class PlacePhotoUpload extends Component {
this.isPublishing = true;
try {
const factory = new EventFactory({ signer: this.nostrAuth.signer });
const tags = [['i', `osm:${osmType}:${osmId}`]];
for (const tag of this.selectedTags) {
@@ -198,17 +196,11 @@ export default class PlacePhotoUpload extends Component {
tags.push(imeta);
// NIP-XX draft Place Photo event
const template = {
kind: 360,
content: '',
tags,
};
if (!template.created_at) {
template.created_at = Math.floor(Date.now() / 1000);
}
const event = await factory.sign(template);
const event = await EventFactory.fromKind(360)
.content('')
.modifyPublicTags(() => tags)
.as(this.nostrAuth.signer)
.sign();
await this.nostrRelay.publish(this.nostrData.activeWriteRelays, event);
this.nostrData.store.add(event);
+1 -3
View File
@@ -179,10 +179,8 @@ export default class SearchController extends Controller {
const targetName = params.selected || params.q;
if (targetName && pois.length > 0) {
let matchedPlace = null;
// 1. Exact Name Match
matchedPlace = pois.find(
let matchedPlace = pois.find(
(p) =>
p.osmTags &&
(p.osmTags.name === targetName || p.osmTags['name:en'] === targetName)
+7 -10
View File
@@ -35,23 +35,20 @@ export default class BlossomService extends Service {
}
async _getAuthHeader(action, hash, serverUrl) {
const factory = new EventFactory({ signer: this.nostrAuth.signer });
const now = Math.floor(Date.now() / 1000);
const serverHostname = new URL(serverUrl).hostname;
const authTemplate = {
kind: 24242,
created_at: now,
content: action === 'upload' ? 'Upload photo for place' : 'Delete photo',
tags: [
const authEvent = await EventFactory.fromKind(24242)
.content(action === 'upload' ? 'Upload photo for place' : 'Delete photo')
.modifyPublicTags(() => [
['t', action],
['x', hash],
['expiration', String(now + 3600)],
['server', serverHostname],
],
};
const authEvent = await factory.sign(authTemplate);
])
.created(now)
.as(this.nostrAuth.signer)
.sign();
const base64 = btoa(JSON.stringify(authEvent));
const base64url = base64
.replace(/\+/g, '-')
+1 -1
View File
@@ -114,7 +114,7 @@ export default class ImageProcessorService extends Service {
});
});
} catch (e) {
throw new Error(`Failed to process image: ${e.message}`);
throw new Error(`Failed to process image: ${e.message}`, { cause: e });
}
}
-6
View File
@@ -150,9 +150,6 @@ export default class NostrAuthService extends Service {
const relay = DEFAULT_CONNECT_RELAY;
localStorage.setItem(STORAGE_KEY_CONNECT_RELAY, relay);
// Override aggressive 10s EOSE timeout to allow time for QR scanning
this.nostrRelay.pool.relay(relay).eoseTimeout = 180000; // 3 minutes
this._signerInstance = new NostrConnectSigner({
pool: this.nostrRelay.pool,
relays: [relay],
@@ -235,9 +232,6 @@ export default class NostrAuthService extends Service {
const localSigner = this._getLocalSigner();
// Override aggressive 10s EOSE timeout to allow time for QR scanning
this.nostrRelay.pool.relay(relay).eoseTimeout = 180000; // 3 minutes
this._signerInstance = new NostrConnectSigner({
pool: this.nostrRelay.pool,
relays: [relay],
+3
View File
@@ -45,6 +45,9 @@ export default class OsmAuthService extends Service {
clientId: clientId,
redirectUrl: redirectUrl,
storeRefreshToken: true,
onAccessTokenExpiry() {
return this.exchangeRefreshTokenForAccessToken();
},
},
new MarcoOsmAuthStorage()
);
-1
View File
@@ -1530,7 +1530,6 @@ button.create-place {
color: #5f6368;
border-radius: 50%;
margin-left: 4px;
padding-left: 8px;
}
.search-submit-btn:hover {
+2 -2
View File
@@ -102,7 +102,7 @@ import molarTooth from '@waysidemapping/pinhead/dist/icons/molar_tooth.svg?raw';
import needleAndSpoolOfThread from '@waysidemapping/pinhead/dist/icons/needle_and_spool_of_thread.svg?raw';
import openBook from '@waysidemapping/pinhead/dist/icons/open_book.svg?raw';
import palace from '@waysidemapping/pinhead/dist/icons/palace.svg?raw';
import parkingP from '@waysidemapping/pinhead/dist/icons/parking_p.svg?raw';
import parkingP from '@waysidemapping/pinhead/dist/icons/p_wide.svg?raw';
import personCricketBattingAtCricketBall from '@waysidemapping/pinhead/dist/icons/person_cricket_batting_at_cricket_ball.svg?raw';
import personBoardingTramWithDestinationDisplayAndPantographOnTramTrack from '@waysidemapping/pinhead/dist/icons/person_boarding_tram_with_destination_display_and_pantograph_on_tram_track.svg?raw';
import personJockeyingRacehorse from '@waysidemapping/pinhead/dist/icons/person_jockeying_racehorse.svg?raw';
@@ -118,7 +118,7 @@ import policeOfficerWithStopArm from '@waysidemapping/pinhead/dist/icons/police_
import planeTopRight from '@waysidemapping/pinhead/dist/icons/plane_top_right.svg?raw';
import roundStructureWithFlag from '@waysidemapping/pinhead/dist/icons/round_structure_with_flag.svg?raw';
import sailingShipInWater from '@waysidemapping/pinhead/dist/icons/sailing_ship_in_water.svg?raw';
import scissorsOpen from '@waysidemapping/pinhead/dist/icons/scissors_open.svg?raw';
import scissorsOpen from '@waysidemapping/pinhead/dist/icons/open_scissors.svg?raw';
import shipwreckInWater from '@waysidemapping/pinhead/dist/icons/shipwreck_in_water.svg?raw';
import steamTrainOnRailwayTrack from '@waysidemapping/pinhead/dist/icons/steam_train_on_railway_track.svg?raw';
import shoppingBag from '@waysidemapping/pinhead/dist/icons/shopping_bag.svg?raw';
-2
View File
@@ -37,8 +37,6 @@ export default {
'@babel/plugin-transform-runtime',
{
absoluteRuntime: dirname(fileURLToPath(import.meta.url)),
useESModules: true,
regenerator: false,
},
],
...macros.babelMacros,
+1 -1
View File
@@ -22,7 +22,7 @@ import eslintConfigPrettier from 'eslint-config-prettier';
import qunit from 'eslint-plugin-qunit';
import n from 'eslint-plugin-n';
import babelParser from '@babel/eslint-parser/experimental-worker';
import babelParser from '@babel/eslint-parser';
const esmParserOptions = {
ecmaFeatures: { modules: true },
+51 -52
View File
@@ -39,61 +39,61 @@
"version": "pnpm build && git add release/"
},
"devDependencies": {
"@babel/core": "^7.28.5",
"@babel/eslint-parser": "^7.28.5",
"@babel/plugin-transform-runtime": "^7.28.5",
"@babel/runtime": "^7.28.4",
"@ember/test-helpers": "^5.4.1",
"@ember/test-waiters": "^4.1.1",
"@embroider/core": "^4.4.2",
"@babel/core": "^8.0.1",
"@babel/eslint-parser": "^8.0.1",
"@babel/plugin-transform-runtime": "^8.0.1",
"@babel/runtime": "^8.0.0",
"@ember/test-helpers": "^5.4.3",
"@ember/test-waiters": "^4.1.2",
"@embroider/core": "^4.6.3",
"@embroider/legacy-inspector-support": "^0.1.3",
"@embroider/macros": "^1.19.6",
"@embroider/macros": "^1.20.6",
"@embroider/router": "^3.0.6",
"@embroider/vite": "^1.5.0",
"@eslint/js": "^9.39.2",
"@glimmer/component": "^2.0.0",
"@embroider/vite": "^1.7.9",
"@eslint/js": "^10.0.1",
"@glimmer/component": "^2.1.1",
"@remotestorage/module-places": "~1.3.0",
"@rollup/plugin-babel": "^6.1.0",
"@warp-drive/core": "~5.8.0",
"@warp-drive/ember": "~5.8.0",
"@warp-drive/json-api": "~5.8.0",
"@warp-drive/legacy": "~5.8.0",
"@warp-drive/utilities": "~5.8.0",
"babel-plugin-ember-template-compilation": "^3.0.1",
"concurrently": "^9.2.1",
"decorator-transforms": "^2.3.1",
"ember-cli": "^6.10.0",
"ember-cli-deprecation-workflow": "^4.0.0",
"ember-modifier": "^4.2.2",
"@rollup/plugin-babel": "^7.1.0",
"@warp-drive/core": "~5.8.2",
"@warp-drive/ember": "~5.8.2",
"@warp-drive/json-api": "~5.8.2",
"@warp-drive/legacy": "~5.8.2",
"@warp-drive/utilities": "~5.8.2",
"babel-plugin-ember-template-compilation": "^4.0.0",
"concurrently": "^10.0.4",
"decorator-transforms": "^2.4.0",
"ember-cli": "^7.1.0",
"ember-cli-deprecation-workflow": "^4.0.1",
"ember-modifier": "^4.3.0",
"ember-page-title": "^9.0.3",
"ember-qunit": "^9.0.4",
"ember-resolver": "^13.1.1",
"ember-source": "~6.11.0-alpha.6",
"ember-qunit": "^9.1.0",
"ember-resolver": "^13.2.0",
"ember-source": "~7.1.0",
"ember-template-lint": "^7.9.3",
"ember-truth-helpers": "^5.0.0",
"ember-welcome-page": "^8.0.4",
"eslint": "^9.39.2",
"eslint": "^10.8.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-ember": "^12.7.5",
"eslint-plugin-n": "^17.23.1",
"eslint-plugin-qunit": "^8.2.5",
"eslint-plugin-warp-drive": "^5.8.0",
"eslint-plugin-ember": "^13.5.0",
"eslint-plugin-n": "^18.2.2",
"eslint-plugin-qunit": "^8.2.6",
"eslint-plugin-warp-drive": "^5.8.2",
"feather-icons": "^4.29.2",
"globals": "^16.5.0",
"globals": "^17.9.0",
"latlon-geohash": "^2.0.0",
"ol": "^10.7.0",
"ol-mapbox-style": "^13.2.0",
"prettier": "^3.7.4",
"prettier-plugin-ember-template-tag": "^2.1.2",
"qunit": "^2.25.0",
"qunit-dom": "^3.5.0",
"ol": "^10.10.0",
"ol-mapbox-style": "^13.4.2",
"prettier": "^3.9.6",
"prettier-plugin-ember-template-tag": "^2.1.7",
"qunit": "^2.26.0",
"qunit-dom": "^3.6.0",
"remotestorage-widget": "^1.8.1",
"remotestoragejs": "2.0.0-beta.9",
"sinon": "^21.0.1",
"stylelint": "^16.26.1",
"stylelint-config-standard": "^38.0.0",
"testem": "^3.17.0",
"vite": "^7.3.0"
"sinon": "^22.1.0",
"stylelint": "^17.14.1",
"stylelint-config-standard": "^40.0.0",
"testem": "^3.20.1",
"vite": "^8.0.0"
},
"engines": {
"node": ">= 22"
@@ -102,17 +102,16 @@
"edition": "octane"
},
"dependencies": {
"@noble/hashes": "^2.2.0",
"@waysidemapping/pinhead": "^15.20.0",
"applesauce-core": "^5.2.0",
"applesauce-factory": "^4.0.0",
"applesauce-relay": "^5.2.0",
"applesauce-signers": "^5.2.0",
"@noble/hashes": "^2.3.0",
"@waysidemapping/pinhead": "^15.25.0",
"applesauce-core": "^6.2.0",
"applesauce-relay": "^6.2.1",
"applesauce-signers": "^6.2.2",
"blurhash": "^2.0.5",
"ember-concurrency": "^5.2.0",
"ember-lifeline": "^7.0.0",
"nostr-idb": "^5.0.0",
"oauth2-pkce": "^2.1.3",
"ember-lifeline": "^7.1.0",
"nostr-idb": "^5.1.0",
"oauth2-pkce": "^3.0.0",
"qrcode": "^1.5.4",
"rxjs": "^7.8.2"
}
+13
View File
@@ -0,0 +1,13 @@
diff --git a/async-arrow-task-transform.js b/async-arrow-task-transform.js
index 4eb856a2a7753ef583e10e07f2b602c0c1c0c21d..6a808d035834567dcfc491ecaa7f59e77d344887 100644
--- a/async-arrow-task-transform.js
+++ b/async-arrow-task-transform.js
@@ -331,7 +331,7 @@ function cleanupUnusedTaskFactoryImports(programPath, usedTaskFactories) {
}
module.exports = declare((api) => {
- api.assertVersion(7);
+ // api.assertVersion(7);
return {
name: 'transform-ember-concurrency-async-function-tasks',
+2498 -2547
View File
File diff suppressed because it is too large Load Diff
+2
View File
@@ -0,0 +1,2 @@
patchedDependencies:
ember-concurrency@5.2.0: patches/ember-concurrency@5.2.0.patch
@@ -6,6 +6,9 @@ import PhotoGallery from 'marco/components/photo-gallery';
import { setupNostrMocks } from 'marco/tests/helpers/mock-nostr';
import sinon from 'sinon';
const USER_A = 'a'.repeat(64);
const USER_B = 'b'.repeat(64);
class MockBlossomService extends Service {
async delete() {
return true;
@@ -34,7 +37,7 @@ module('Integration | Component | photo-gallery', function (hooks) {
this.photos = [
{
eventId: 'event1',
pubkey: 'userA',
pubkey: USER_A,
placeIdentifier: 'osm:node:12345',
url: 'https://example.com/a3b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1.jpg',
thumbUrl:
@@ -42,7 +45,7 @@ module('Integration | Component | photo-gallery', function (hooks) {
},
{
eventId: 'event2',
pubkey: 'userB',
pubkey: USER_B,
placeIdentifier: 'osm:node:12345',
url: 'photo2.jpg',
},
@@ -55,7 +58,7 @@ module('Integration | Component | photo-gallery', function (hooks) {
});
test('it does not show delete button if user is not creator', async function (assert) {
this.nostrAuth.pubkey = 'userB'; // Different from photo1's pubkey
this.nostrAuth.pubkey = USER_B; // Different from photo1's pubkey
this.selectedPhoto = this.photos[0];
await render(
@@ -80,7 +83,7 @@ module('Integration | Component | photo-gallery', function (hooks) {
});
test('it shows delete button if user is creator and setting is enabled', async function (assert) {
this.nostrAuth.pubkey = 'userA'; // Matches photo1's pubkey
this.nostrAuth.pubkey = USER_A; // Matches photo1's pubkey
this.settings.update('experimentalEnablePhotoDeletion', true); // Enable the setting
this.selectedPhoto = this.photos[0];
@@ -106,7 +109,7 @@ module('Integration | Component | photo-gallery', function (hooks) {
});
test('it handles cancellation of deletion', async function (assert) {
this.nostrAuth.pubkey = 'userA';
this.nostrAuth.pubkey = USER_A;
this.settings.update('experimentalEnablePhotoDeletion', true);
this.selectedPhoto = this.photos[0];
@@ -133,7 +136,7 @@ module('Integration | Component | photo-gallery', function (hooks) {
});
test('it performs full deletion flow when confirmed', async function (assert) {
this.nostrAuth.pubkey = 'userA';
this.nostrAuth.pubkey = USER_A;
this.settings.update('experimentalEnablePhotoDeletion', true);
// Override the mock's getter just for this test
Object.defineProperty(this.nostrAuth, 'signer', {
@@ -141,11 +144,11 @@ module('Integration | Component | photo-gallery', function (hooks) {
get: () => ({
signEvent: async (e) => ({
...e,
id: 'signed-id',
sig: 'sig',
pubkey: 'userA',
id: 'a3b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1',
sig: 'b3b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1',
pubkey: USER_A,
}),
getPublicKey: async () => 'userA',
getPublicKey: async () => USER_A,
}),
});
this.selectedPhoto = this.photos[0];
@@ -227,7 +230,7 @@ module('Integration | Component | photo-gallery', function (hooks) {
});
test('it copies event id to clipboard', async function (assert) {
this.nostrAuth.pubkey = 'userA';
this.nostrAuth.pubkey = USER_A;
this.selectedPhoto = this.photos[0];
const clipboardStub = sinon