@bigbluebutton/tlschema 2.0.0-alpha.19

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 (261) hide show
  1. package/LICENSE +190 -0
  2. package/dist-cjs/TLStore.js +133 -0
  3. package/dist-cjs/TLStore.js.map +7 -0
  4. package/dist-cjs/assets/TLBaseAsset.js +37 -0
  5. package/dist-cjs/assets/TLBaseAsset.js.map +7 -0
  6. package/dist-cjs/assets/TLBookmarkAsset.js +38 -0
  7. package/dist-cjs/assets/TLBookmarkAsset.js.map +7 -0
  8. package/dist-cjs/assets/TLImageAsset.js +76 -0
  9. package/dist-cjs/assets/TLImageAsset.js.map +7 -0
  10. package/dist-cjs/assets/TLVideoAsset.js +76 -0
  11. package/dist-cjs/assets/TLVideoAsset.js.map +7 -0
  12. package/dist-cjs/createPresenceStateDerivation.js +68 -0
  13. package/dist-cjs/createPresenceStateDerivation.js.map +7 -0
  14. package/dist-cjs/createTLSchema.js +68 -0
  15. package/dist-cjs/createTLSchema.js.map +7 -0
  16. package/dist-cjs/index.d.ts +1414 -0
  17. package/dist-cjs/index.js +142 -0
  18. package/dist-cjs/index.js.map +7 -0
  19. package/dist-cjs/misc/TLColor.js +36 -0
  20. package/dist-cjs/misc/TLColor.js.map +7 -0
  21. package/dist-cjs/misc/TLCursor.js +55 -0
  22. package/dist-cjs/misc/TLCursor.js.map +7 -0
  23. package/dist-cjs/misc/TLHandle.js +36 -0
  24. package/dist-cjs/misc/TLHandle.js.map +7 -0
  25. package/dist-cjs/misc/TLOpacity.js +30 -0
  26. package/dist-cjs/misc/TLOpacity.js.map +7 -0
  27. package/dist-cjs/misc/TLScribble.js +40 -0
  28. package/dist-cjs/misc/TLScribble.js.map +7 -0
  29. package/dist-cjs/misc/geometry-types.js +37 -0
  30. package/dist-cjs/misc/geometry-types.js.map +7 -0
  31. package/dist-cjs/misc/id-validator.js +33 -0
  32. package/dist-cjs/misc/id-validator.js.map +7 -0
  33. package/dist-cjs/records/TLAsset.js +74 -0
  34. package/dist-cjs/records/TLAsset.js.map +7 -0
  35. package/dist-cjs/records/TLCamera.js +74 -0
  36. package/dist-cjs/records/TLCamera.js.map +7 -0
  37. package/dist-cjs/records/TLDocument.js +82 -0
  38. package/dist-cjs/records/TLDocument.js.map +7 -0
  39. package/dist-cjs/records/TLInstance.js +452 -0
  40. package/dist-cjs/records/TLInstance.js.map +7 -0
  41. package/dist-cjs/records/TLPage.js +74 -0
  42. package/dist-cjs/records/TLPage.js.map +7 -0
  43. package/dist-cjs/records/TLPageState.js +209 -0
  44. package/dist-cjs/records/TLPageState.js.map +7 -0
  45. package/dist-cjs/records/TLPointer.js +76 -0
  46. package/dist-cjs/records/TLPointer.js.map +7 -0
  47. package/dist-cjs/records/TLPresence.js +170 -0
  48. package/dist-cjs/records/TLPresence.js.map +7 -0
  49. package/dist-cjs/records/TLRecord.js +17 -0
  50. package/dist-cjs/records/TLRecord.js.map +7 -0
  51. package/dist-cjs/records/TLShape.js +147 -0
  52. package/dist-cjs/records/TLShape.js.map +7 -0
  53. package/dist-cjs/shapes/TLArrowShape.js +156 -0
  54. package/dist-cjs/shapes/TLArrowShape.js.map +7 -0
  55. package/dist-cjs/shapes/TLBaseShape.js +52 -0
  56. package/dist-cjs/shapes/TLBaseShape.js.map +7 -0
  57. package/dist-cjs/shapes/TLBookmarkShape.js +57 -0
  58. package/dist-cjs/shapes/TLBookmarkShape.js.map +7 -0
  59. package/dist-cjs/shapes/TLDrawShape.js +89 -0
  60. package/dist-cjs/shapes/TLDrawShape.js.map +7 -0
  61. package/dist-cjs/shapes/TLEmbedShape.js +709 -0
  62. package/dist-cjs/shapes/TLEmbedShape.js.map +7 -0
  63. package/dist-cjs/shapes/TLFrameShape.js +33 -0
  64. package/dist-cjs/shapes/TLFrameShape.js.map +7 -0
  65. package/dist-cjs/shapes/TLGeoShape.js +230 -0
  66. package/dist-cjs/shapes/TLGeoShape.js.map +7 -0
  67. package/dist-cjs/shapes/TLGroupShape.js +28 -0
  68. package/dist-cjs/shapes/TLGroupShape.js.map +7 -0
  69. package/dist-cjs/shapes/TLHighlightShape.js +38 -0
  70. package/dist-cjs/shapes/TLHighlightShape.js.map +7 -0
  71. package/dist-cjs/shapes/TLImageShape.js +69 -0
  72. package/dist-cjs/shapes/TLImageShape.js.map +7 -0
  73. package/dist-cjs/shapes/TLLineShape.js +70 -0
  74. package/dist-cjs/shapes/TLLineShape.js.map +7 -0
  75. package/dist-cjs/shapes/TLNoteShape.js +144 -0
  76. package/dist-cjs/shapes/TLNoteShape.js.map +7 -0
  77. package/dist-cjs/shapes/TLTextShape.js +67 -0
  78. package/dist-cjs/shapes/TLTextShape.js.map +7 -0
  79. package/dist-cjs/shapes/TLVideoShape.js +53 -0
  80. package/dist-cjs/shapes/TLVideoShape.js.map +7 -0
  81. package/dist-cjs/store-migrations.js +81 -0
  82. package/dist-cjs/store-migrations.js.map +7 -0
  83. package/dist-cjs/styles/StyleProp.js +94 -0
  84. package/dist-cjs/styles/StyleProp.js.map +7 -0
  85. package/dist-cjs/styles/TLColorStyle.js +283 -0
  86. package/dist-cjs/styles/TLColorStyle.js.map +7 -0
  87. package/dist-cjs/styles/TLDashStyle.js +29 -0
  88. package/dist-cjs/styles/TLDashStyle.js.map +7 -0
  89. package/dist-cjs/styles/TLFillStyle.js +29 -0
  90. package/dist-cjs/styles/TLFillStyle.js.map +7 -0
  91. package/dist-cjs/styles/TLFontStyle.js +36 -0
  92. package/dist-cjs/styles/TLFontStyle.js.map +7 -0
  93. package/dist-cjs/styles/TLHorizontalAlignStyle.js +29 -0
  94. package/dist-cjs/styles/TLHorizontalAlignStyle.js.map +7 -0
  95. package/dist-cjs/styles/TLSizeStyle.js +29 -0
  96. package/dist-cjs/styles/TLSizeStyle.js.map +7 -0
  97. package/dist-cjs/styles/TLVerticalAlignStyle.js +29 -0
  98. package/dist-cjs/styles/TLVerticalAlignStyle.js.map +7 -0
  99. package/dist-cjs/translations/languages.js +59 -0
  100. package/dist-cjs/translations/languages.js.map +7 -0
  101. package/dist-cjs/translations/translations.js +63 -0
  102. package/dist-cjs/translations/translations.js.map +7 -0
  103. package/dist-cjs/util-types.js +17 -0
  104. package/dist-cjs/util-types.js.map +7 -0
  105. package/dist-esm/TLStore.mjs +113 -0
  106. package/dist-esm/TLStore.mjs.map +7 -0
  107. package/dist-esm/assets/TLBaseAsset.mjs +17 -0
  108. package/dist-esm/assets/TLBaseAsset.mjs.map +7 -0
  109. package/dist-esm/assets/TLBookmarkAsset.mjs +18 -0
  110. package/dist-esm/assets/TLBookmarkAsset.mjs.map +7 -0
  111. package/dist-esm/assets/TLImageAsset.mjs +56 -0
  112. package/dist-esm/assets/TLImageAsset.mjs.map +7 -0
  113. package/dist-esm/assets/TLVideoAsset.mjs +56 -0
  114. package/dist-esm/assets/TLVideoAsset.mjs.map +7 -0
  115. package/dist-esm/createPresenceStateDerivation.mjs +48 -0
  116. package/dist-esm/createPresenceStateDerivation.mjs.map +7 -0
  117. package/dist-esm/createTLSchema.mjs +48 -0
  118. package/dist-esm/createTLSchema.mjs.map +7 -0
  119. package/dist-esm/index.d.mts +1414 -0
  120. package/dist-esm/index.mjs +193 -0
  121. package/dist-esm/index.mjs.map +7 -0
  122. package/dist-esm/misc/TLColor.mjs +16 -0
  123. package/dist-esm/misc/TLColor.mjs.map +7 -0
  124. package/dist-esm/misc/TLCursor.mjs +35 -0
  125. package/dist-esm/misc/TLCursor.mjs.map +7 -0
  126. package/dist-esm/misc/TLHandle.mjs +16 -0
  127. package/dist-esm/misc/TLHandle.mjs.map +7 -0
  128. package/dist-esm/misc/TLOpacity.mjs +10 -0
  129. package/dist-esm/misc/TLOpacity.mjs.map +7 -0
  130. package/dist-esm/misc/TLScribble.mjs +20 -0
  131. package/dist-esm/misc/TLScribble.mjs.map +7 -0
  132. package/dist-esm/misc/geometry-types.mjs +17 -0
  133. package/dist-esm/misc/geometry-types.mjs.map +7 -0
  134. package/dist-esm/misc/id-validator.mjs +13 -0
  135. package/dist-esm/misc/id-validator.mjs.map +7 -0
  136. package/dist-esm/records/TLAsset.mjs +57 -0
  137. package/dist-esm/records/TLAsset.mjs.map +7 -0
  138. package/dist-esm/records/TLCamera.mjs +54 -0
  139. package/dist-esm/records/TLCamera.mjs.map +7 -0
  140. package/dist-esm/records/TLDocument.mjs +62 -0
  141. package/dist-esm/records/TLDocument.mjs.map +7 -0
  142. package/dist-esm/records/TLInstance.mjs +432 -0
  143. package/dist-esm/records/TLInstance.mjs.map +7 -0
  144. package/dist-esm/records/TLPage.mjs +54 -0
  145. package/dist-esm/records/TLPage.mjs.map +7 -0
  146. package/dist-esm/records/TLPageState.mjs +189 -0
  147. package/dist-esm/records/TLPageState.mjs.map +7 -0
  148. package/dist-esm/records/TLPointer.mjs +56 -0
  149. package/dist-esm/records/TLPointer.mjs.map +7 -0
  150. package/dist-esm/records/TLPresence.mjs +150 -0
  151. package/dist-esm/records/TLPresence.mjs.map +7 -0
  152. package/dist-esm/records/TLRecord.mjs +1 -0
  153. package/dist-esm/records/TLRecord.mjs.map +7 -0
  154. package/dist-esm/records/TLShape.mjs +127 -0
  155. package/dist-esm/records/TLShape.mjs.map +7 -0
  156. package/dist-esm/shapes/TLArrowShape.mjs +136 -0
  157. package/dist-esm/shapes/TLArrowShape.mjs.map +7 -0
  158. package/dist-esm/shapes/TLBaseShape.mjs +32 -0
  159. package/dist-esm/shapes/TLBaseShape.mjs.map +7 -0
  160. package/dist-esm/shapes/TLBookmarkShape.mjs +37 -0
  161. package/dist-esm/shapes/TLBookmarkShape.mjs.map +7 -0
  162. package/dist-esm/shapes/TLDrawShape.mjs +69 -0
  163. package/dist-esm/shapes/TLDrawShape.mjs.map +7 -0
  164. package/dist-esm/shapes/TLEmbedShape.mjs +689 -0
  165. package/dist-esm/shapes/TLEmbedShape.mjs.map +7 -0
  166. package/dist-esm/shapes/TLFrameShape.mjs +13 -0
  167. package/dist-esm/shapes/TLFrameShape.mjs.map +7 -0
  168. package/dist-esm/shapes/TLGeoShape.mjs +212 -0
  169. package/dist-esm/shapes/TLGeoShape.mjs.map +7 -0
  170. package/dist-esm/shapes/TLGroupShape.mjs +8 -0
  171. package/dist-esm/shapes/TLGroupShape.mjs.map +7 -0
  172. package/dist-esm/shapes/TLHighlightShape.mjs +18 -0
  173. package/dist-esm/shapes/TLHighlightShape.mjs.map +7 -0
  174. package/dist-esm/shapes/TLImageShape.mjs +49 -0
  175. package/dist-esm/shapes/TLImageShape.mjs.map +7 -0
  176. package/dist-esm/shapes/TLLineShape.mjs +50 -0
  177. package/dist-esm/shapes/TLLineShape.mjs.map +7 -0
  178. package/dist-esm/shapes/TLNoteShape.mjs +126 -0
  179. package/dist-esm/shapes/TLNoteShape.mjs.map +7 -0
  180. package/dist-esm/shapes/TLTextShape.mjs +47 -0
  181. package/dist-esm/shapes/TLTextShape.mjs.map +7 -0
  182. package/dist-esm/shapes/TLVideoShape.mjs +33 -0
  183. package/dist-esm/shapes/TLVideoShape.mjs.map +7 -0
  184. package/dist-esm/store-migrations.mjs +61 -0
  185. package/dist-esm/store-migrations.mjs.map +7 -0
  186. package/dist-esm/styles/StyleProp.mjs +74 -0
  187. package/dist-esm/styles/StyleProp.mjs.map +7 -0
  188. package/dist-esm/styles/TLColorStyle.mjs +263 -0
  189. package/dist-esm/styles/TLColorStyle.mjs.map +7 -0
  190. package/dist-esm/styles/TLDashStyle.mjs +9 -0
  191. package/dist-esm/styles/TLDashStyle.mjs.map +7 -0
  192. package/dist-esm/styles/TLFillStyle.mjs +9 -0
  193. package/dist-esm/styles/TLFillStyle.mjs.map +7 -0
  194. package/dist-esm/styles/TLFontStyle.mjs +16 -0
  195. package/dist-esm/styles/TLFontStyle.mjs.map +7 -0
  196. package/dist-esm/styles/TLHorizontalAlignStyle.mjs +9 -0
  197. package/dist-esm/styles/TLHorizontalAlignStyle.mjs.map +7 -0
  198. package/dist-esm/styles/TLSizeStyle.mjs +9 -0
  199. package/dist-esm/styles/TLSizeStyle.mjs.map +7 -0
  200. package/dist-esm/styles/TLVerticalAlignStyle.mjs +9 -0
  201. package/dist-esm/styles/TLVerticalAlignStyle.mjs.map +7 -0
  202. package/dist-esm/translations/languages.mjs +39 -0
  203. package/dist-esm/translations/languages.mjs.map +7 -0
  204. package/dist-esm/translations/translations.mjs +43 -0
  205. package/dist-esm/translations/translations.mjs.map +7 -0
  206. package/dist-esm/util-types.mjs +1 -0
  207. package/dist-esm/util-types.mjs.map +7 -0
  208. package/package.json +64 -0
  209. package/src/TLStore.ts +160 -0
  210. package/src/assets/TLBaseAsset.ts +44 -0
  211. package/src/assets/TLBookmarkAsset.ts +31 -0
  212. package/src/assets/TLImageAsset.ts +73 -0
  213. package/src/assets/TLVideoAsset.ts +73 -0
  214. package/src/createPresenceStateDerivation.ts +53 -0
  215. package/src/createTLSchema.ts +65 -0
  216. package/src/index.ts +168 -0
  217. package/src/migrations.test.ts +1768 -0
  218. package/src/misc/TLColor.ts +28 -0
  219. package/src/misc/TLCursor.ts +54 -0
  220. package/src/misc/TLHandle.ts +41 -0
  221. package/src/misc/TLOpacity.ts +11 -0
  222. package/src/misc/TLScribble.ts +39 -0
  223. package/src/misc/geometry-types.ts +37 -0
  224. package/src/misc/id-validator.ts +14 -0
  225. package/src/records/TLAsset.ts +80 -0
  226. package/src/records/TLCamera.ts +74 -0
  227. package/src/records/TLDocument.ts +77 -0
  228. package/src/records/TLInstance.ts +493 -0
  229. package/src/records/TLPage.ts +72 -0
  230. package/src/records/TLPageState.ts +216 -0
  231. package/src/records/TLPointer.ts +74 -0
  232. package/src/records/TLPresence.ts +179 -0
  233. package/src/records/TLRecord.ts +21 -0
  234. package/src/records/TLShape.ts +214 -0
  235. package/src/shapes/TLArrowShape.ts +160 -0
  236. package/src/shapes/TLBaseShape.ts +67 -0
  237. package/src/shapes/TLBookmarkShape.ts +44 -0
  238. package/src/shapes/TLDrawShape.ts +89 -0
  239. package/src/shapes/TLEmbedShape.ts +754 -0
  240. package/src/shapes/TLFrameShape.ts +18 -0
  241. package/src/shapes/TLGeoShape.ts +226 -0
  242. package/src/shapes/TLGroupShape.ts +14 -0
  243. package/src/shapes/TLHighlightShape.ts +24 -0
  244. package/src/shapes/TLImageShape.ts +59 -0
  245. package/src/shapes/TLLineShape.ts +61 -0
  246. package/src/shapes/TLNoteShape.ts +137 -0
  247. package/src/shapes/TLTextShape.ts +55 -0
  248. package/src/shapes/TLVideoShape.ts +40 -0
  249. package/src/store-migrations.ts +63 -0
  250. package/src/styles/StyleProp.ts +105 -0
  251. package/src/styles/TLColorStyle.ts +296 -0
  252. package/src/styles/TLDashStyle.ts +11 -0
  253. package/src/styles/TLFillStyle.ts +11 -0
  254. package/src/styles/TLFontStyle.ts +19 -0
  255. package/src/styles/TLHorizontalAlignStyle.ts +11 -0
  256. package/src/styles/TLSizeStyle.ts +11 -0
  257. package/src/styles/TLVerticalAlignStyle.ts +11 -0
  258. package/src/translations/languages.ts +39 -0
  259. package/src/translations/translations.test.ts +43 -0
  260. package/src/translations/translations.ts +73 -0
  261. package/src/util-types.ts +2 -0
@@ -0,0 +1,709 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var TLEmbedShape_exports = {};
20
+ __export(TLEmbedShape_exports, {
21
+ EMBED_DEFINITIONS: () => EMBED_DEFINITIONS,
22
+ embedShapeMigrations: () => embedShapeMigrations,
23
+ embedShapePermissionDefaults: () => embedShapePermissionDefaults,
24
+ embedShapeProps: () => embedShapeProps
25
+ });
26
+ module.exports = __toCommonJS(TLEmbedShape_exports);
27
+ var import_store = require("@bigbluebutton/store");
28
+ var import_validate = require("@bigbluebutton/validate");
29
+ const TLDRAW_APP_RE = /(^\/r\/[^/]+\/?$)/;
30
+ const safeParseUrl = (url) => {
31
+ try {
32
+ return new URL(url);
33
+ } catch (err) {
34
+ return;
35
+ }
36
+ };
37
+ const EMBED_DEFINITIONS = [
38
+ {
39
+ type: "tldraw",
40
+ title: "tldraw",
41
+ hostnames: ["beta.tldraw.com", "tldraw.com"],
42
+ minWidth: 300,
43
+ minHeight: 300,
44
+ width: 720,
45
+ height: 500,
46
+ doesResize: true,
47
+ canUnmount: true,
48
+ toEmbedUrl: (url) => {
49
+ const urlObj = safeParseUrl(url);
50
+ if (urlObj && urlObj.pathname.match(TLDRAW_APP_RE)) {
51
+ return url;
52
+ }
53
+ return;
54
+ },
55
+ fromEmbedUrl: (url) => {
56
+ const urlObj = safeParseUrl(url);
57
+ if (urlObj && urlObj.pathname.match(TLDRAW_APP_RE)) {
58
+ return url;
59
+ }
60
+ return;
61
+ }
62
+ },
63
+ {
64
+ type: "figma",
65
+ title: "Figma",
66
+ hostnames: ["figma.com"],
67
+ width: 720,
68
+ height: 500,
69
+ doesResize: true,
70
+ canUnmount: true,
71
+ toEmbedUrl: (url) => {
72
+ if (!!url.match(
73
+ // eslint-disable-next-line no-useless-escape
74
+ /https:\/\/([\w\.-]+\.)?figma.com\/(file|proto)\/([0-9a-zA-Z]{22,128})(?:\/.*)?$/
75
+ ) && !url.includes("figma.com/embed")) {
76
+ return `https://www.figma.com/embed?embed_host=share&url=${url}`;
77
+ }
78
+ return;
79
+ },
80
+ fromEmbedUrl: (url) => {
81
+ const urlObj = safeParseUrl(url);
82
+ if (urlObj && urlObj.pathname.match(/^\/embed\/?$/)) {
83
+ const outUrl = urlObj.searchParams.get("url");
84
+ if (outUrl) {
85
+ return outUrl;
86
+ }
87
+ }
88
+ return;
89
+ }
90
+ },
91
+ {
92
+ type: "google_maps",
93
+ title: "Google Maps",
94
+ hostnames: ["google.*"],
95
+ width: 720,
96
+ height: 500,
97
+ doesResize: true,
98
+ canUnmount: false,
99
+ toEmbedUrl: (url) => {
100
+ if (url.includes("/maps/")) {
101
+ const match = url.match(/@(.*),(.*),(.*)z/);
102
+ let result;
103
+ if (match) {
104
+ const [, lat, lng, z] = match;
105
+ const host = new URL(url).host.replace("www.", "");
106
+ result = `https://${host}/maps/embed/v1/view?key=${process.env.NEXT_PUBLIC_GC_API_KEY}&center=${lat},${lng}&zoom=${z}`;
107
+ } else {
108
+ result = "";
109
+ }
110
+ return result;
111
+ }
112
+ return;
113
+ },
114
+ fromEmbedUrl: (url) => {
115
+ const urlObj = safeParseUrl(url);
116
+ if (!urlObj)
117
+ return;
118
+ const matches = urlObj.pathname.match(/^\/maps\/embed\/v1\/view\/?$/);
119
+ if (matches && urlObj.searchParams.has("center") && urlObj.searchParams.get("zoom")) {
120
+ const zoom = urlObj.searchParams.get("zoom");
121
+ const [lat, lon] = urlObj.searchParams.get("center").split(",");
122
+ return `https://www.google.com/maps/@${lat},${lon},${zoom}z`;
123
+ }
124
+ return;
125
+ }
126
+ },
127
+ {
128
+ type: "val_town",
129
+ title: "Val Town",
130
+ hostnames: ["val.town"],
131
+ minWidth: 260,
132
+ minHeight: 100,
133
+ width: 720,
134
+ height: 500,
135
+ doesResize: true,
136
+ canUnmount: false,
137
+ toEmbedUrl: (url) => {
138
+ const urlObj = safeParseUrl(url);
139
+ const matches = urlObj && urlObj.pathname.match(/\/v\/([^/]+)\/?/);
140
+ if (matches) {
141
+ return `https://www.val.town/embed/${matches[1]}`;
142
+ }
143
+ return;
144
+ },
145
+ fromEmbedUrl: (url) => {
146
+ const urlObj = safeParseUrl(url);
147
+ const matches = urlObj && urlObj.pathname.match(/\/embed\/([^/]+)\/?/);
148
+ if (matches) {
149
+ return `https://www.val.town/v/${matches[1]}`;
150
+ }
151
+ return;
152
+ }
153
+ },
154
+ {
155
+ type: "codesandbox",
156
+ title: "CodeSandbox",
157
+ hostnames: ["codesandbox.io"],
158
+ minWidth: 300,
159
+ minHeight: 300,
160
+ width: 720,
161
+ height: 500,
162
+ doesResize: true,
163
+ canUnmount: false,
164
+ toEmbedUrl: (url) => {
165
+ const urlObj = safeParseUrl(url);
166
+ const matches = urlObj && urlObj.pathname.match(/\/s\/([^/]+)\/?/);
167
+ if (matches) {
168
+ return `https://codesandbox.io/embed/${matches[1]}`;
169
+ }
170
+ return;
171
+ },
172
+ fromEmbedUrl: (url) => {
173
+ const urlObj = safeParseUrl(url);
174
+ const matches = urlObj && urlObj.pathname.match(/\/embed\/([^/]+)\/?/);
175
+ if (matches) {
176
+ return `https://codesandbox.io/s/${matches[1]}`;
177
+ }
178
+ return;
179
+ }
180
+ },
181
+ {
182
+ type: "codepen",
183
+ title: "Codepen",
184
+ hostnames: ["codepen.io"],
185
+ minWidth: 300,
186
+ minHeight: 300,
187
+ width: 520,
188
+ height: 400,
189
+ doesResize: true,
190
+ canUnmount: false,
191
+ toEmbedUrl: (url) => {
192
+ const CODEPEN_URL_REGEXP = /https:\/\/codepen.io\/([^/]+)\/pen\/([^/]+)/;
193
+ const matches = url.match(CODEPEN_URL_REGEXP);
194
+ if (matches) {
195
+ const [_, user, id] = matches;
196
+ return `https://codepen.io/${user}/embed/${id}`;
197
+ }
198
+ return;
199
+ },
200
+ fromEmbedUrl: (url) => {
201
+ const CODEPEN_EMBED_REGEXP = /https:\/\/codepen.io\/([^/]+)\/embed\/([^/]+)/;
202
+ const matches = url.match(CODEPEN_EMBED_REGEXP);
203
+ if (matches) {
204
+ const [_, user, id] = matches;
205
+ return `https://codepen.io/${user}/pen/${id}`;
206
+ }
207
+ return;
208
+ }
209
+ },
210
+ {
211
+ type: "scratch",
212
+ title: "Scratch",
213
+ hostnames: ["scratch.mit.edu"],
214
+ width: 520,
215
+ height: 400,
216
+ doesResize: false,
217
+ canUnmount: false,
218
+ toEmbedUrl: (url) => {
219
+ const SCRATCH_URL_REGEXP = /https?:\/\/scratch.mit.edu\/projects\/([^/]+)/;
220
+ const matches = url.match(SCRATCH_URL_REGEXP);
221
+ if (matches) {
222
+ const [_, id] = matches;
223
+ return `https://scratch.mit.edu/projects/embed/${id}`;
224
+ }
225
+ return;
226
+ },
227
+ fromEmbedUrl: (url) => {
228
+ const SCRATCH_EMBED_REGEXP = /https:\/\/scratch.mit.edu\/projects\/embed\/([^/]+)/;
229
+ const matches = url.match(SCRATCH_EMBED_REGEXP);
230
+ if (matches) {
231
+ const [_, id] = matches;
232
+ return `https://scratch.mit.edu/projects/${id}`;
233
+ }
234
+ return;
235
+ }
236
+ },
237
+ {
238
+ type: "youtube",
239
+ title: "YouTube",
240
+ hostnames: ["*.youtube.com", "youtube.com", "youtu.be"],
241
+ width: 800,
242
+ height: 450,
243
+ doesResize: true,
244
+ canUnmount: false,
245
+ overridePermissions: {
246
+ "allow-presentation": true
247
+ },
248
+ isAspectRatioLocked: true,
249
+ toEmbedUrl: (url) => {
250
+ const urlObj = safeParseUrl(url);
251
+ if (!urlObj)
252
+ return;
253
+ const hostname = urlObj.hostname.replace(/^www./, "");
254
+ if (hostname === "youtu.be") {
255
+ const videoId = urlObj.pathname.split("/").filter(Boolean)[0];
256
+ return `https://www.youtube.com/embed/${videoId}`;
257
+ } else if ((hostname === "youtube.com" || hostname === "m.youtube.com") && urlObj.pathname.match(/^\/watch/)) {
258
+ const videoId = urlObj.searchParams.get("v");
259
+ return `https://www.youtube.com/embed/${videoId}`;
260
+ }
261
+ return;
262
+ },
263
+ fromEmbedUrl: (url) => {
264
+ const urlObj = safeParseUrl(url);
265
+ if (!urlObj)
266
+ return;
267
+ const hostname = urlObj.hostname.replace(/^www./, "");
268
+ if (hostname === "youtube.com") {
269
+ const matches = urlObj.pathname.match(/^\/embed\/([^/]+)\/?/);
270
+ if (matches) {
271
+ return `https://www.youtube.com/watch?v=${matches[1]}`;
272
+ }
273
+ }
274
+ return;
275
+ }
276
+ },
277
+ {
278
+ type: "google_calendar",
279
+ title: "Google Calendar",
280
+ hostnames: ["calendar.google.*"],
281
+ width: 720,
282
+ height: 500,
283
+ minWidth: 460,
284
+ minHeight: 360,
285
+ doesResize: true,
286
+ canUnmount: false,
287
+ instructionLink: "https://support.google.com/calendar/answer/41207?hl=en",
288
+ toEmbedUrl: (url) => {
289
+ const urlObj = safeParseUrl(url);
290
+ const cidQs = urlObj?.searchParams.get("cid");
291
+ if (urlObj?.pathname.match(/\/calendar\/u\/0/) && cidQs) {
292
+ urlObj.pathname = "/calendar/embed";
293
+ const keys = Array.from(urlObj.searchParams.keys());
294
+ for (const key of keys) {
295
+ urlObj.searchParams.delete(key);
296
+ }
297
+ urlObj.searchParams.set("src", cidQs);
298
+ return urlObj.href;
299
+ }
300
+ return;
301
+ },
302
+ fromEmbedUrl: (url) => {
303
+ const urlObj = safeParseUrl(url);
304
+ const srcQs = urlObj?.searchParams.get("src");
305
+ if (urlObj?.pathname.match(/\/calendar\/embed/) && srcQs) {
306
+ urlObj.pathname = "/calendar/u/0";
307
+ const keys = Array.from(urlObj.searchParams.keys());
308
+ for (const key of keys) {
309
+ urlObj.searchParams.delete(key);
310
+ }
311
+ urlObj.searchParams.set("cid", srcQs);
312
+ return urlObj.href;
313
+ }
314
+ return;
315
+ }
316
+ },
317
+ {
318
+ type: "google_slides",
319
+ title: "Google Slides",
320
+ hostnames: ["docs.google.*"],
321
+ width: 720,
322
+ height: 500,
323
+ minWidth: 460,
324
+ minHeight: 360,
325
+ doesResize: true,
326
+ canUnmount: false,
327
+ toEmbedUrl: (url) => {
328
+ const urlObj = safeParseUrl(url);
329
+ if (urlObj?.pathname.match(/^\/presentation/) && urlObj?.pathname.match(/\/pub\/?$/)) {
330
+ urlObj.pathname = urlObj.pathname.replace(/\/pub$/, "/embed");
331
+ const keys = Array.from(urlObj.searchParams.keys());
332
+ for (const key of keys) {
333
+ urlObj.searchParams.delete(key);
334
+ }
335
+ return urlObj.href;
336
+ }
337
+ return;
338
+ },
339
+ fromEmbedUrl: (url) => {
340
+ const urlObj = safeParseUrl(url);
341
+ if (urlObj?.pathname.match(/^\/presentation/) && urlObj?.pathname.match(/\/embed\/?$/)) {
342
+ urlObj.pathname = urlObj.pathname.replace(/\/embed$/, "/pub");
343
+ const keys = Array.from(urlObj.searchParams.keys());
344
+ for (const key of keys) {
345
+ urlObj.searchParams.delete(key);
346
+ }
347
+ return urlObj.href;
348
+ }
349
+ return;
350
+ }
351
+ },
352
+ {
353
+ type: "github_gist",
354
+ title: "GitHub Gist",
355
+ hostnames: ["gist.github.com"],
356
+ width: 720,
357
+ height: 500,
358
+ doesResize: true,
359
+ canUnmount: true,
360
+ toEmbedUrl: (url) => {
361
+ const urlObj = safeParseUrl(url);
362
+ if (urlObj && urlObj.pathname.match(/\/([^/]+)\/([^/]+)/)) {
363
+ if (!url.split("/").pop())
364
+ return;
365
+ return url;
366
+ }
367
+ return;
368
+ },
369
+ fromEmbedUrl: (url) => {
370
+ const urlObj = safeParseUrl(url);
371
+ if (urlObj && urlObj.pathname.match(/\/([^/]+)\/([^/]+)/)) {
372
+ if (!url.split("/").pop())
373
+ return;
374
+ return url;
375
+ }
376
+ return;
377
+ }
378
+ },
379
+ {
380
+ type: "replit",
381
+ title: "Replit",
382
+ hostnames: ["replit.com"],
383
+ width: 720,
384
+ height: 500,
385
+ doesResize: true,
386
+ canUnmount: false,
387
+ toEmbedUrl: (url) => {
388
+ const urlObj = safeParseUrl(url);
389
+ if (urlObj && urlObj.pathname.match(/\/@([^/]+)\/([^/]+)/)) {
390
+ return `${url}?embed=true`;
391
+ }
392
+ return;
393
+ },
394
+ fromEmbedUrl: (url) => {
395
+ const urlObj = safeParseUrl(url);
396
+ if (urlObj && urlObj.pathname.match(/\/@([^/]+)\/([^/]+)/) && urlObj.searchParams.has("embed")) {
397
+ urlObj.searchParams.delete("embed");
398
+ return urlObj.href;
399
+ }
400
+ return;
401
+ }
402
+ },
403
+ {
404
+ type: "felt",
405
+ title: "Felt",
406
+ hostnames: ["felt.com"],
407
+ width: 720,
408
+ height: 500,
409
+ doesResize: true,
410
+ canUnmount: false,
411
+ toEmbedUrl: (url) => {
412
+ const urlObj = safeParseUrl(url);
413
+ if (urlObj && urlObj.pathname.match(/^\/map\//)) {
414
+ return urlObj.origin + "/embed" + urlObj.pathname;
415
+ }
416
+ return;
417
+ },
418
+ fromEmbedUrl: (url) => {
419
+ const urlObj = safeParseUrl(url);
420
+ if (urlObj && urlObj.pathname.match(/^\/embed\/map\//)) {
421
+ urlObj.pathname = urlObj.pathname.replace(/^\/embed/, "");
422
+ return urlObj.href;
423
+ }
424
+ return;
425
+ }
426
+ },
427
+ {
428
+ type: "spotify",
429
+ title: "Spotify",
430
+ hostnames: ["open.spotify.com"],
431
+ width: 720,
432
+ height: 500,
433
+ minHeight: 500,
434
+ overrideOutlineRadius: 12,
435
+ doesResize: true,
436
+ canUnmount: false,
437
+ toEmbedUrl: (url) => {
438
+ const urlObj = safeParseUrl(url);
439
+ if (urlObj && urlObj.pathname.match(/^\/(artist|album)\//)) {
440
+ return urlObj.origin + "/embed" + urlObj.pathname;
441
+ }
442
+ return;
443
+ },
444
+ fromEmbedUrl: (url) => {
445
+ const urlObj = safeParseUrl(url);
446
+ if (urlObj && urlObj.pathname.match(/^\/embed\/(artist|album)\//)) {
447
+ return urlObj.origin + urlObj.pathname.replace(/^\/embed/, "");
448
+ }
449
+ return;
450
+ }
451
+ },
452
+ {
453
+ type: "vimeo",
454
+ title: "Vimeo",
455
+ hostnames: ["vimeo.com", "player.vimeo.com"],
456
+ width: 640,
457
+ height: 360,
458
+ doesResize: true,
459
+ canUnmount: false,
460
+ isAspectRatioLocked: true,
461
+ toEmbedUrl: (url) => {
462
+ const urlObj = safeParseUrl(url);
463
+ if (urlObj && urlObj.hostname === "vimeo.com") {
464
+ if (urlObj.pathname.match(/^\/[0-9]+/)) {
465
+ return "https://player.vimeo.com/video/" + urlObj.pathname.split("/")[1] + "?title=0&byline=0";
466
+ }
467
+ }
468
+ return;
469
+ },
470
+ fromEmbedUrl: (url) => {
471
+ const urlObj = safeParseUrl(url);
472
+ if (urlObj && urlObj.hostname === "player.vimeo.com") {
473
+ const matches = urlObj.pathname.match(/^\/video\/([^/]+)\/?$/);
474
+ if (matches) {
475
+ return "https://vimeo.com/" + matches[1];
476
+ }
477
+ }
478
+ return;
479
+ }
480
+ },
481
+ {
482
+ type: "excalidraw",
483
+ title: "Excalidraw",
484
+ hostnames: ["excalidraw.com"],
485
+ width: 720,
486
+ height: 500,
487
+ doesResize: true,
488
+ canUnmount: false,
489
+ isAspectRatioLocked: true,
490
+ toEmbedUrl: (url) => {
491
+ const urlObj = safeParseUrl(url);
492
+ if (urlObj && urlObj.hash.match(/#room=/)) {
493
+ return url;
494
+ }
495
+ return;
496
+ },
497
+ fromEmbedUrl: (url) => {
498
+ const urlObj = safeParseUrl(url);
499
+ if (urlObj && urlObj.hash.match(/#room=/)) {
500
+ return url;
501
+ }
502
+ return;
503
+ }
504
+ },
505
+ {
506
+ type: "observable",
507
+ title: "Observable",
508
+ hostnames: ["observablehq.com"],
509
+ width: 720,
510
+ height: 500,
511
+ doesResize: true,
512
+ canUnmount: false,
513
+ isAspectRatioLocked: false,
514
+ backgroundColor: "#fff",
515
+ toEmbedUrl: (url) => {
516
+ const urlObj = safeParseUrl(url);
517
+ if (urlObj && urlObj.pathname.match(/^\/@([^/]+)\/([^/]+)\/?$/)) {
518
+ return `${urlObj.origin}/embed${urlObj.pathname}?cell=*`;
519
+ }
520
+ if (urlObj && urlObj.pathname.match(/^\/d\/([^/]+)\/?$/)) {
521
+ const pathName = urlObj.pathname.replace(/^\/d/, "");
522
+ return `${urlObj.origin}/embed${pathName}?cell=*`;
523
+ }
524
+ return;
525
+ },
526
+ fromEmbedUrl: (url) => {
527
+ const urlObj = safeParseUrl(url);
528
+ if (urlObj && urlObj.pathname.match(/^\/embed\/@([^/]+)\/([^/]+)\/?$/)) {
529
+ return `${urlObj.origin}${urlObj.pathname.replace("/embed", "")}#cell-*`;
530
+ }
531
+ if (urlObj && urlObj.pathname.match(/^\/embed\/([^/]+)\/?$/)) {
532
+ return `${urlObj.origin}${urlObj.pathname.replace("/embed", "/d")}#cell-*`;
533
+ }
534
+ return;
535
+ }
536
+ }
537
+ ];
538
+ const embedShapePermissionDefaults = {
539
+ // ========================================================================================
540
+ // Disabled permissions
541
+ // ========================================================================================
542
+ // [MDN] Experimental: Allows for downloads to occur without a gesture from the user.
543
+ // [REASON] Disabled because otherwise the <iframe/> trick the user on behalf of us to performing an action
544
+ "allow-downloads-without-user-activation": false,
545
+ // [MDN] Allows for downloads to occur with a gesture from the user.
546
+ // [REASON] Disabled because otherwise the <iframe/> trick the user on behalf of us to performing an action
547
+ "allow-downloads": false,
548
+ // [MDN] Lets the resource open modal windows.
549
+ // [REASON] The <iframe/> could 'window.prompt("Enter your tldraw password")'
550
+ "allow-modals": false,
551
+ // [MDN] Lets the resource lock the screen orientation.
552
+ // [REASON] Would interfer with tldraw interface
553
+ "allow-orientation-lock": false,
554
+ // [MDN] Lets the resource use the Pointer Lock API.
555
+ // [REASON] Maybe we should allow this for games embeds (scratch/codepen/codesandbox)
556
+ "allow-pointer-lock": false,
557
+ // [MDN] Allows popups (such as window.open(), target="_blank", or showModalDialog()). If this keyword is not used, the popup will silently fail to open.
558
+ // [REASON] We shouldn't allow popups as a embed could pretend to be us by opening a mocked version of tldraw. This is very unobvious when it is performed as an action within out app
559
+ "allow-popups": true,
560
+ // [MDN] Lets the sandboxed document open new windows without those windows inheriting the sandboxing. For example, this can safely sandbox an advertisement without forcing the same restrictions upon the page the ad links to.
561
+ // [REASON] We're alread disabling popups.
562
+ "allow-popups-to-escape-sandbox": false,
563
+ // [MDN] Lets the resource start a presentation session.
564
+ // [REASON] Prevents embed from navigating away from tldraw and pretending to be us
565
+ "allow-presentation": false,
566
+ // [MDN] Experimental: Lets the resource request access to the parent's storage capabilities with the Storage Access API.
567
+ // [REASON] We don't want anyone else to access our storage
568
+ "allow-storage-access-by-user-activation": false,
569
+ // [MDN] Lets the resource navigate the top-level browsing context (the one named _top).
570
+ // [REASON] Prevents embed from navigating away from tldraw and pretending to be us
571
+ "allow-top-navigation": false,
572
+ // [MDN] Lets the resource navigate the top-level browsing context, but only if initiated by a user gesture.
573
+ // [REASON] Prevents embed from navigating away from tldraw and pretending to be us
574
+ "allow-top-navigation-by-user-activation": false,
575
+ // ========================================================================================
576
+ // Enabled permissions
577
+ // ========================================================================================
578
+ // [MDN] Lets the resource run scripts (but not create popup windows).
579
+ "allow-scripts": true,
580
+ // [MDN] If this token is not used, the resource is treated as being from a special origin that always fails the same-origin policy (potentially preventing access to data storage/cookies and some JavaScript APIs).
581
+ "allow-same-origin": true,
582
+ // [MDN] Allows the resource to submit forms. If this keyword is not used, form submission is blocked.
583
+ "allow-forms": true
584
+ };
585
+ const embedShapeProps = {
586
+ w: import_validate.T.nonZeroNumber,
587
+ h: import_validate.T.nonZeroNumber,
588
+ url: import_validate.T.string
589
+ };
590
+ const Versions = {
591
+ GenOriginalUrlInEmbed: 1,
592
+ RemoveDoesResize: 2,
593
+ RemoveTmpOldUrl: 3,
594
+ RemovePermissionOverrides: 4
595
+ };
596
+ const embedShapeMigrations = (0, import_store.defineMigrations)({
597
+ currentVersion: Versions.RemovePermissionOverrides,
598
+ migrators: {
599
+ [Versions.GenOriginalUrlInEmbed]: {
600
+ // add tmpOldUrl property
601
+ up: (shape) => {
602
+ const url = shape.props.url;
603
+ const host = new URL(url).host.replace("www.", "");
604
+ let originalUrl;
605
+ for (const localEmbedDef of EMBED_DEFINITIONS) {
606
+ if (localEmbedDef.hostnames.includes(host)) {
607
+ try {
608
+ originalUrl = localEmbedDef.fromEmbedUrl(url);
609
+ } catch (err) {
610
+ console.warn(err);
611
+ }
612
+ }
613
+ }
614
+ return {
615
+ ...shape,
616
+ props: {
617
+ ...shape.props,
618
+ tmpOldUrl: shape.props.url,
619
+ url: originalUrl ?? ""
620
+ }
621
+ };
622
+ },
623
+ // remove tmpOldUrl property
624
+ down: (shape) => {
625
+ let newUrl = shape.props.tmpOldUrl;
626
+ if (!newUrl || newUrl === "") {
627
+ const url = shape.props.url;
628
+ const host = new URL(url).host.replace("www.", "");
629
+ for (const localEmbedDef of EMBED_DEFINITIONS) {
630
+ if (localEmbedDef.hostnames.includes(host)) {
631
+ try {
632
+ newUrl = localEmbedDef.toEmbedUrl(url);
633
+ } catch (err) {
634
+ console.warn(err);
635
+ }
636
+ }
637
+ }
638
+ }
639
+ const { tmpOldUrl, ...props } = shape.props;
640
+ return {
641
+ ...shape,
642
+ props: {
643
+ ...props,
644
+ url: newUrl ?? ""
645
+ }
646
+ };
647
+ }
648
+ },
649
+ [Versions.RemoveDoesResize]: {
650
+ up: (shape) => {
651
+ const { doesResize: _, ...props } = shape.props;
652
+ return {
653
+ ...shape,
654
+ props: {
655
+ ...props
656
+ }
657
+ };
658
+ },
659
+ down: (shape) => {
660
+ return {
661
+ ...shape,
662
+ props: {
663
+ ...shape.props,
664
+ doesResize: true
665
+ }
666
+ };
667
+ }
668
+ },
669
+ [Versions.RemoveTmpOldUrl]: {
670
+ up: (shape) => {
671
+ const { tmpOldUrl: _, ...props } = shape.props;
672
+ return {
673
+ ...shape,
674
+ props: {
675
+ ...props
676
+ }
677
+ };
678
+ },
679
+ down: (shape) => {
680
+ return {
681
+ ...shape,
682
+ props: {
683
+ ...shape.props
684
+ }
685
+ };
686
+ }
687
+ },
688
+ [Versions.RemovePermissionOverrides]: {
689
+ up: (shape) => {
690
+ const { overridePermissions: _, ...props } = shape.props;
691
+ return {
692
+ ...shape,
693
+ props: {
694
+ ...props
695
+ }
696
+ };
697
+ },
698
+ down: (shape) => {
699
+ return {
700
+ ...shape,
701
+ props: {
702
+ ...shape.props
703
+ }
704
+ };
705
+ }
706
+ }
707
+ }
708
+ });
709
+ //# sourceMappingURL=TLEmbedShape.js.map