@mpgd/cli 0.52.0 → 0.53.0

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.
Files changed (22) hide show
  1. package/dist/capacitor-shell-starter.d.ts +22 -0
  2. package/dist/capacitor-shell-starter.js +387 -18
  3. package/dist/index.js +35 -4
  4. package/dist/native-build-info.json +2 -2
  5. package/dist/native-build-target.js +363 -2
  6. package/dist/notifications-starter.d.ts +69 -0
  7. package/dist/notifications-starter.js +513 -0
  8. package/package.json +17 -17
  9. package/templates/notifications-overlay/common/docs/NOTIFICATIONS.md +75 -0
  10. package/templates/notifications-overlay/common/notifications/deployment.json +8 -0
  11. package/templates/notifications-overlay/common/notifications/topics.json +222 -0
  12. package/templates/notifications-overlay/common/src/platform/capacitorNotifications.ts +59 -0
  13. package/templates/notifications-overlay/common/src/platform/notificationOpens.ts +60 -0
  14. package/templates/notifications-overlay/common/src/platform/notificationSettings.ts +761 -0
  15. package/templates/notifications-overlay/common/src/platform/notifications.ts +131 -0
  16. package/templates/notifications-overlay/common/tools/validate-notifications.ts +75 -0
  17. package/templates/notifications-overlay/lite/src/lite/notificationSettingsPanel.ts +200 -0
  18. package/templates/notifications-overlay/phaser/src/scenes/NotificationSettingsScene.ts +282 -0
  19. package/templates/phaser-game/apps/target-ait/src/main.ts +15 -0
  20. package/templates/phaser-game/apps/target-ait/src/runtime-config.types.ts +5 -0
  21. package/templates/phaser-game/apps/target-ait/vite.config.ts +22 -1
  22. package/templates/phaser-game/docs/MPGD_KIT_WORKFLOWS.md +14 -0
@@ -1,5 +1,5 @@
1
1
  {
2
- "kitGitSha": "48bd874fd96f6dbca38c4ff5f0783088b61fab58",
2
+ "kitGitSha": "78bcaad6a3e53131be44f749c27b9377a2fd96dc",
3
3
  "kitDirty": false,
4
- "packageVersion": "0.52.0"
4
+ "packageVersion": "0.53.0"
5
5
  }
@@ -13338,6 +13338,22 @@ function resolveConfiguredBaseDir(baseEnv, fallbackBaseDir, productCatalogFile,
13338
13338
  function configuredFileExists(baseDir, file) {
13339
13339
  return existsSync13(isAbsolute10(file) ? file : resolve16(baseDir, file));
13340
13340
  }
13341
+ function normalizeNotificationTopicsEnv(baseEnv, fallbackBaseDir = process.cwd()) {
13342
+ const file = readConfiguredPath(baseEnv.MPGD_NOTIFICATION_TOPICS_FILE);
13343
+ if (file === void 0) {
13344
+ return {};
13345
+ }
13346
+ if (isAbsolute10(file)) {
13347
+ return { MPGD_NOTIFICATION_TOPICS_FILE: file };
13348
+ }
13349
+ const base = [
13350
+ fallbackBaseDir,
13351
+ readConfiguredPath(baseEnv.INIT_CWD),
13352
+ readConfiguredPath(baseEnv.PWD),
13353
+ process.cwd()
13354
+ ].find((candidate) => candidate !== void 0 && existsSync13(resolve16(candidate, file)));
13355
+ return { MPGD_NOTIFICATION_TOPICS_FILE: resolve16(base ?? fallbackBaseDir, file) };
13356
+ }
13341
13357
 
13342
13358
  // node_modules/.cache/mpgd-native-build/tools/target/native-build-attempt.js
13343
13359
  import { randomUUID as randomUUID3 } from "node:crypto";
@@ -14390,7 +14406,349 @@ import { dirname as dirname9, isAbsolute as isAbsolute11, join as join13, relati
14390
14406
  import { chmodSync as chmodSync2, existsSync as existsSync21, lstatSync as lstatSync12, mkdirSync as mkdirSync11, readdirSync as readdirSync6, readFileSync as readFileSync21, realpathSync as realpathSync9, renameSync as renameSync5, unlinkSync as unlinkSync2, writeFileSync as writeFileSync15 } from "node:fs";
14391
14407
  import path9 from "node:path";
14392
14408
  import { DOMParser as DOMParser2 } from "@xmldom/xmldom";
14393
- import { satisfies, valid } from "semver";
14409
+ import { satisfies, valid, validRange } from "semver";
14410
+
14411
+ // node_modules/.cache/mpgd-native-build/packages/cli/src/notifications-starter.js
14412
+ var notificationsMessagingPlugin = "@capacitor-firebase/messaging";
14413
+ var notificationsGameDependencies = Object.freeze({
14414
+ [notificationsMessagingPlugin]: "8.5.2",
14415
+ "@capacitor/local-notifications": "8.3.1",
14416
+ firebase: "12.19.0"
14417
+ });
14418
+ var notificationsShellPlugins = Object.freeze([
14419
+ notificationsMessagingPlugin,
14420
+ "@capacitor/local-notifications"
14421
+ ]);
14422
+ var gatewayImport = {
14423
+ anchor: "import type { RuntimeConfig } from '../runtimeDetector';\n",
14424
+ replacement: [
14425
+ "import { createStarterCapacitorNotifications } from '../capacitorNotifications';",
14426
+ "import type { RuntimeConfig } from '../runtimeDetector';",
14427
+ ""
14428
+ ].join("\n")
14429
+ };
14430
+ var gatewayProviders = (platform) => ({
14431
+ anchor: " const providers = createStoreProviders(runtime, () => gateway);\n",
14432
+ replacement: [
14433
+ " const providers = [",
14434
+ " ...createStoreProviders(runtime, () => gateway),",
14435
+ " // Notifications v2 (FCM and local reminders); `notifications/topics.json`",
14436
+ " // maps the topics, and the shell needs the two plugins",
14437
+ " // (`mpgd target init capacitor --providers notifications`).",
14438
+ ` ...(await createStarterCapacitorNotifications('${platform}', runtime.configTarget)),`,
14439
+ " ];",
14440
+ ""
14441
+ ].join("\n")
14442
+ });
14443
+ var commonEdits = {
14444
+ "src/platform/buildGateways/capacitorAndroid.ts": [gatewayImport, gatewayProviders("android")],
14445
+ "src/platform/buildGateways/capacitorIos.ts": [gatewayImport, gatewayProviders("ios")],
14446
+ "src/platform/buildGateways/reddit.ts": [
14447
+ {
14448
+ anchor: "import { createDevvitWebPaymentsClient } from '@mpgd/adapter-devvit/web';\n",
14449
+ replacement: [
14450
+ "import {",
14451
+ " createDevvitWebLoginPrompt,",
14452
+ " createDevvitWebPaymentsClient,",
14453
+ "} from '@mpgd/adapter-devvit/web';",
14454
+ ""
14455
+ ].join("\n")
14456
+ },
14457
+ {
14458
+ anchor: "import type { RuntimeConfig } from '../runtimeDetector';\n",
14459
+ replacement: [
14460
+ "import { starterNotificationTopics } from '../notifications';",
14461
+ "import type { RuntimeConfig } from '../runtimeDetector';",
14462
+ ""
14463
+ ].join("\n")
14464
+ },
14465
+ {
14466
+ anchor: " ...(commerce === undefined ? {} : { commerce }),\n",
14467
+ replacement: [
14468
+ " ...(commerce === undefined ? {} : { commerce }),",
14469
+ " // Notifications v2: the game-rendered opt-in the server bridge serves",
14470
+ " // (a gated beta: `integrations.notifications` stays approval-required",
14471
+ " // until Reddit approves the app), and Reddit login for a logged-out",
14472
+ " // player, who must log in before opting in.",
14473
+ " ...notificationOptions(runtime),",
14474
+ " loginPrompt: createDevvitWebLoginPrompt(),",
14475
+ ""
14476
+ ].join("\n")
14477
+ },
14478
+ {
14479
+ anchor: "function createCommerceOptions(): DevvitGatewayCommerceOptions | undefined {\n",
14480
+ replacement: [
14481
+ "function notificationOptions(",
14482
+ " runtime: RuntimeConfig,",
14483
+ "): Pick<Parameters<typeof createDevvitPlatformGateway>[0], 'notifications'> {",
14484
+ " const topics = starterNotificationTopics(runtime.configTarget).map((topic) => topic.id);",
14485
+ " return topics.length === 0 ? {} : { notifications: { topics } };",
14486
+ "}",
14487
+ "",
14488
+ "function createCommerceOptions(): DevvitGatewayCommerceOptions | undefined {",
14489
+ ""
14490
+ ].join("\n")
14491
+ }
14492
+ ],
14493
+ "apps/target-devvit/src/server/index.ts": [
14494
+ {
14495
+ anchor: "import { context, createServer, getServerPort, payments, reddit, redis } from '@devvit/web/server';\n",
14496
+ replacement: [
14497
+ "import {",
14498
+ " context,",
14499
+ " createServer,",
14500
+ " getServerPort,",
14501
+ " notifications,",
14502
+ " payments,",
14503
+ " reddit,",
14504
+ " redis,",
14505
+ "} from '@devvit/web/server';",
14506
+ ""
14507
+ ].join("\n")
14508
+ },
14509
+ {
14510
+ anchor: [
14511
+ "import {",
14512
+ " createDevvitCommerceBridgeProducts,",
14513
+ " createDevvitCommerceV2BridgeHandler,",
14514
+ "} from '@mpgd/adapter-devvit/server';",
14515
+ ""
14516
+ ].join("\n"),
14517
+ replacement: [
14518
+ "import {",
14519
+ " createDevvitCommerceBridgeProducts,",
14520
+ " createDevvitCommerceV2BridgeHandler,",
14521
+ " createDevvitNotificationService,",
14522
+ " createDevvitNotificationsV2BridgeHandler,",
14523
+ "} from '@mpgd/adapter-devvit/server';",
14524
+ ""
14525
+ ].join("\n")
14526
+ },
14527
+ {
14528
+ anchor: "import type { ProductCatalog } from '@mpgd/catalog';\n",
14529
+ replacement: [
14530
+ "import { resolveNotificationTopicsForTarget, type NotificationTopicCatalog, type ProductCatalog } from '@mpgd/catalog';",
14531
+ "import { assertNotificationDeployment } from '@mpgd/platform/notifications';",
14532
+ ""
14533
+ ].join("\n")
14534
+ },
14535
+ {
14536
+ anchor: "import devvitManifest from '../../devvit.json';\n",
14537
+ replacement: [
14538
+ "import notificationDeploymentJson from '../../../../notifications/deployment.json';",
14539
+ "import notificationTopicsJson from '../../../../notifications/topics.json';",
14540
+ "import devvitManifest from '../../devvit.json';",
14541
+ ""
14542
+ ].join("\n")
14543
+ },
14544
+ {
14545
+ anchor: [
14546
+ "const handleBridgeRequest = createDevvitBridgeHandler({",
14547
+ " redis,",
14548
+ " currentPlayerId,",
14549
+ " currentDisplayName,",
14550
+ " storageKeyNamespace: gameName,",
14551
+ " ...(commerce === undefined ? {} : { commerce }),",
14552
+ "});",
14553
+ ""
14554
+ ].join("\n"),
14555
+ replacement: [
14556
+ "/**",
14557
+ " * Notifications v2 (`notifications/topics.json`, mapped for the `reddit`",
14558
+ " * target): the game-rendered opt-in for the logged-in requester, and the",
14559
+ " * service that records consent and sends server reminders over the Devvit",
14560
+ " * notifications plugin. Devvit notifications are a gated beta: the game",
14561
+ " * shows them only once `integrations.notifications` is `available`.",
14562
+ " */",
14563
+ "const notificationTopicCatalog = notificationTopicsJson as NotificationTopicCatalog;",
14564
+ "const redditNotificationTopics = readRedditNotificationTopics();",
14565
+ "const notificationService: Parameters<typeof handleNotificationTask>[0]['notifications'] =",
14566
+ " redditNotificationTopics.length === 0 ? undefined : createNotificationService();",
14567
+ "// The opt-in is served only with the service that sends; a refused catalog turns both off.",
14568
+ "const notificationsBridge = notificationService === undefined",
14569
+ " ? undefined",
14570
+ " : createDevvitNotificationsV2BridgeHandler({",
14571
+ " notifications,",
14572
+ " currentUserId: currentPlayerId,",
14573
+ " topics: redditNotificationTopics,",
14574
+ " });",
14575
+ "const handleBridgeRequest = createDevvitBridgeHandler({",
14576
+ " redis,",
14577
+ " currentPlayerId,",
14578
+ " currentDisplayName,",
14579
+ " storageKeyNamespace: gameName,",
14580
+ " ...(commerce === undefined ? {} : { commerce }),",
14581
+ " ...(notificationsBridge === undefined ? {} : { notifications: notificationsBridge }),",
14582
+ "});",
14583
+ ""
14584
+ ].join("\n")
14585
+ },
14586
+ {
14587
+ anchor: [
14588
+ "/**",
14589
+ " * The notifications v2 service (`createDevvitNotificationService` from",
14590
+ " * `@mpgd/adapter-devvit/server`). None until the game declares a topic",
14591
+ " * catalog, so the scheduler tasks below do no work.",
14592
+ " */",
14593
+ "const notificationService: Parameters<typeof handleNotificationTask>[0]['notifications'] = undefined;",
14594
+ ""
14595
+ ].join("\n"),
14596
+ replacement: [
14597
+ "/** The topic ids the catalog maps for Reddit; none when the catalog cannot be read. */",
14598
+ "function readRedditNotificationTopics(): readonly string[] {",
14599
+ " try {",
14600
+ " return resolveNotificationTopicsForTarget(notificationTopicCatalog, 'reddit').map((topic) => topic.id);",
14601
+ " } catch (error) {",
14602
+ " console.error(`devvit notifications disabled: ${errorMessage(error)}`);",
14603
+ " return [];",
14604
+ " }",
14605
+ "}",
14606
+ "",
14607
+ "/**",
14608
+ " * The notifications v2 service over Redis and the Devvit plugin; the",
14609
+ " * scheduler tasks below run its reminders and purges. A catalog or",
14610
+ " * deployment the service refuses turns notifications off, never the game",
14611
+ " * server.",
14612
+ " */",
14613
+ "function createNotificationService(): Parameters<typeof handleNotificationTask>[0]['notifications'] {",
14614
+ " try {",
14615
+ " return createDevvitNotificationService({",
14616
+ " redis,",
14617
+ " notifications,",
14618
+ " catalog: notificationTopicCatalog,",
14619
+ " deployment: assertNotificationDeployment(notificationDeploymentJson),",
14620
+ " }).service;",
14621
+ " } catch (error) {",
14622
+ " console.error(`devvit notifications disabled: ${errorMessage(error)}`);",
14623
+ " return undefined;",
14624
+ " }",
14625
+ "}",
14626
+ ""
14627
+ ].join("\n")
14628
+ }
14629
+ ]
14630
+ };
14631
+ var phaserEdits = {
14632
+ "src/runtime/createGame.ts": [
14633
+ {
14634
+ anchor: "import { LobbyScene } from '../scenes/LobbyScene';\n",
14635
+ replacement: [
14636
+ "import { LobbyScene } from '../scenes/LobbyScene';",
14637
+ "import {",
14638
+ " NotificationSettingsScene,",
14639
+ " routeNotificationSettingsOpens,",
14640
+ "} from '../scenes/NotificationSettingsScene';",
14641
+ ""
14642
+ ].join("\n")
14643
+ },
14644
+ {
14645
+ anchor: " scene: [BootScene, LobbyScene, PlayScene],\n",
14646
+ replacement: " scene: [BootScene, LobbyScene, PlayScene, NotificationSettingsScene],\n"
14647
+ },
14648
+ {
14649
+ anchor: " ownGameAudio(game, input.context);\n",
14650
+ replacement: [
14651
+ " ownGameAudio(game, input.context);",
14652
+ " // The advertising opt-out action and consent notices open the settings screen.",
14653
+ " routeNotificationSettingsOpens(game, input.context);",
14654
+ ""
14655
+ ].join("\n")
14656
+ }
14657
+ ],
14658
+ "src/scenes/LobbyScene.ts": [
14659
+ {
14660
+ anchor: "import { starterContextKey, type StarterContext } from '../runtime/gameContext';\n",
14661
+ replacement: [
14662
+ "import { starterContextKey, type StarterContext } from '../runtime/gameContext';",
14663
+ "import { notificationSettingsSceneKey } from './NotificationSettingsScene';",
14664
+ ""
14665
+ ].join("\n")
14666
+ },
14667
+ {
14668
+ anchor: " this.input.once('pointerdown', () => this.scene.start('PlayScene'));\n",
14669
+ replacement: [
14670
+ " // The settings button shows only where this target has notifications.",
14671
+ " const notificationsButton = context.platform.notificationsV2 === undefined",
14672
+ " ? undefined",
14673
+ " : this.add",
14674
+ " .text(940, 16, locale === 'ko' ? '\uC54C\uB9BC \uC124\uC815' : 'Notifications', {",
14675
+ " color: '#5eead4',",
14676
+ " fontFamily: 'Arial, sans-serif',",
14677
+ " fontSize: '22px',",
14678
+ " })",
14679
+ " .setOrigin(1, 0)",
14680
+ " .setPadding(16, 12, 16, 12)",
14681
+ " .setInteractive({ useHandCursor: true });",
14682
+ " notificationsButton?.on('pointerup', () => this.scene.start(notificationSettingsSceneKey));",
14683
+ " // A tap anywhere else starts the game; the scene drops this listener on shutdown.",
14684
+ " this.input.on('pointerdown', (_pointer: Phaser.Input.Pointer, over: Phaser.GameObjects.GameObject[]) => {",
14685
+ " if (notificationsButton === undefined || !over.includes(notificationsButton)) {",
14686
+ " this.scene.start('PlayScene');",
14687
+ " }",
14688
+ " });",
14689
+ ""
14690
+ ].join("\n")
14691
+ }
14692
+ ]
14693
+ };
14694
+ var liteEdits = {
14695
+ "src/runtime/createGame.ts": [
14696
+ {
14697
+ anchor: "import { createTapGame } from '../lite/tapGame';\n",
14698
+ replacement: [
14699
+ "import { mountNotificationSettingsPanel } from '../lite/notificationSettingsPanel';",
14700
+ "import { createTapGame } from '../lite/tapGame';",
14701
+ ""
14702
+ ].join("\n")
14703
+ },
14704
+ {
14705
+ anchor: " const shell = createTapGame({ mount, title: '__GAME_TITLE__' });\n",
14706
+ replacement: [
14707
+ " const shell = createTapGame({ mount, title: '__GAME_TITLE__' });",
14708
+ " const disposeNotificationSettings = mountNotificationSettingsPanel(mount, input.context);",
14709
+ ""
14710
+ ].join("\n")
14711
+ },
14712
+ {
14713
+ anchor: " audio.dispose();\n",
14714
+ replacement: [" audio.dispose();", " disposeNotificationSettings();", ""].join("\n")
14715
+ }
14716
+ ]
14717
+ };
14718
+ var readmeSection = [
14719
+ "",
14720
+ "## Notifications",
14721
+ "",
14722
+ "This game was created with `--providers notifications`. Its topics live in",
14723
+ "`notifications/topics.json` and the backend settings (`advertisingRules`,",
14724
+ "the advertising sender) in `notifications/deployment.json`; run",
14725
+ "`pnpm validate:notifications` after every change and before every release.",
14726
+ "Replace the sender contact placeholder in `notifications/deployment.json`",
14727
+ "before any advertising is sent. The notification settings screen asks for the",
14728
+ "OS or host permission and records reminder, advertising (\uAD11\uACE0\uC131 \uC815\uBCF4",
14729
+ "\uC218\uC2E0\uB3D9\uC758), and night consent through the notifications runtime. See",
14730
+ "`docs/NOTIFICATIONS.md` and, for Android and iOS, the mpgd-kit Firebase setup",
14731
+ "guide; `mpgd target init capacitor --providers notifications` installs the two",
14732
+ "Capacitor plugins into a game-owned shell.",
14733
+ ""
14734
+ ].join("\n");
14735
+ var notificationsCapacitorGateways = Object.freeze({
14736
+ android: "src/platform/buildGateways/capacitorAndroid.ts",
14737
+ ios: "src/platform/buildGateways/capacitorIos.ts"
14738
+ });
14739
+ var notificationsCapacitorGatewayModules = Object.freeze([
14740
+ "src/platform/capacitorNotifications.ts",
14741
+ "src/platform/notifications.ts",
14742
+ "src/platform/notificationSettings.ts",
14743
+ "src/platform/notificationOpens.ts"
14744
+ ]);
14745
+ var notificationsCapacitorSupportFiles = Object.freeze([
14746
+ ...notificationsCapacitorGatewayModules,
14747
+ "notifications/topics.json",
14748
+ "notifications/deployment.json",
14749
+ "tools/validate-notifications.ts",
14750
+ "docs/NOTIFICATIONS.md"
14751
+ ]);
14394
14752
 
14395
14753
  // node_modules/.cache/mpgd-native-build/packages/cli/src/native-shell-identity.js
14396
14754
  function assertAndroidSettingsAppProject(source) {
@@ -16633,7 +16991,10 @@ assertDisjointMiniGameTargetOutputs(config.targets, targetPath, [
16633
16991
  }
16634
16992
  ]);
16635
16993
  var runtimeTargetConfigMatrix = loadTargetConfigMatrix();
16636
- var monetizationCatalogEnv = normalizeMonetizationCatalogEnv(process.env, configBaseDir);
16994
+ var monetizationCatalogEnv = {
16995
+ ...normalizeMonetizationCatalogEnv(process.env, configBaseDir),
16996
+ ...normalizeNotificationTopicsEnv(process.env, configBaseDir)
16997
+ };
16637
16998
  var targetScopedEnv = {
16638
16999
  ...process.env,
16639
17000
  ...monetizationCatalogEnv,
@@ -0,0 +1,69 @@
1
+ /**
2
+ * The notifications starter (`mpgd game create --providers notifications`):
3
+ * the files `templates/notifications-overlay` adds to a generated game, and the
4
+ * anchored edits it makes to the base template, so a game without
5
+ * notifications ships none of it (notifications v2 RFC, PR C1).
6
+ *
7
+ * Every edit names an anchor that must occur exactly once in the base file,
8
+ * so a template change that moves an anchor fails the CLI's tests instead of
9
+ * generating a half-wired game.
10
+ */
11
+ /** The provider id that selects the notifications starter. */
12
+ export declare const notificationsProviderId = "notifications";
13
+ /** The push plugin the notifications starter adds (FCM on Android and iOS). */
14
+ export declare const notificationsMessagingPlugin = "@capacitor-firebase/messaging";
15
+ /**
16
+ * The npm packages a game with notifications declares. The two Capacitor
17
+ * plugins are the optional peers `@mpgd/adapter-capacitor/notifications`
18
+ * loads, at the versions the adapter is tested with; `firebase` is the
19
+ * package the messaging plugin's web fallback imports, which the bundler
20
+ * must resolve even though a native shell never loads it.
21
+ */
22
+ export declare const notificationsGameDependencies: Readonly<Record<string, string>>;
23
+ /**
24
+ * The `firebase` range the starter's `@capacitor-firebase/messaging` version
25
+ * declares as its peer (its web fallback imports the SDK). A game that keeps
26
+ * its own `firebase` must be in it before the starter adds the plugin; the
27
+ * starter test pins it to the plugin's published metadata.
28
+ */
29
+ export declare const notificationsMessagingFirebaseRange = "^12.6.0";
30
+ /** The plugins `mpgd target init capacitor --providers notifications` installs into the shell. */
31
+ export declare const notificationsShellPlugins: readonly string[];
32
+ /** Never installed next to the messaging plugin: on iOS both claim Capacitor's one push handler. */
33
+ export declare const conflictingPushPlugin = "@capacitor/push-notifications";
34
+ export type NotificationsStarterTemplate = 'phaser' | 'lite';
35
+ export interface NotificationsStarterFile {
36
+ readonly relativePath: string;
37
+ readonly content: string;
38
+ }
39
+ /**
40
+ * Applies the notifications starter to a generated game's template files:
41
+ * adds the overlay's files (`common` and the template's own) and edits the
42
+ * base files at their anchors. Throws when an anchor is missing, so a
43
+ * template change cannot silently drop the wiring.
44
+ */
45
+ export declare function applyNotificationsStarter<File extends NotificationsStarterFile>(baseFiles: readonly File[], overlay: {
46
+ readonly template: NotificationsStarterTemplate;
47
+ readonly common: readonly File[];
48
+ readonly phaser: readonly File[];
49
+ readonly lite: readonly File[];
50
+ }): readonly File[];
51
+ /** The Capacitor gateways the notifications starter wires, by native platform. */
52
+ export declare const notificationsCapacitorGateways: Readonly<Record<'android' | 'ios', string>>;
53
+ /** The starter modules a wired Capacitor gateway imports, directly or through one another. */
54
+ export declare const notificationsCapacitorGatewayModules: readonly string[];
55
+ /**
56
+ * The files `mpgd target init capacitor --providers notifications` writes
57
+ * with a wired gateway when the game has none: the modules it imports, the
58
+ * catalog files they read, the validator, and the game's notifications doc.
59
+ */
60
+ export declare const notificationsCapacitorSupportFiles: readonly string[];
61
+ /** Whether a Capacitor gateway already registers a notifications provider. */
62
+ export declare function capacitorGatewayRegistersNotifications(source: string): boolean;
63
+ /**
64
+ * The template's Capacitor gateway with the notifications provider wired in:
65
+ * the same anchored edits `--providers notifications` makes at generation.
66
+ */
67
+ export declare function wireCapacitorGatewayNotifications(relativePath: string, source: string): string;
68
+ /** Reads `--providers` for `mpgd game create`: only `notifications` is a game-level provider today. */
69
+ export declare function readGameCreateProviders(value: string | undefined): readonly string[];