@canaryai/cli 0.2.3 → 0.2.4
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.
- package/dist/bin.js +1 -0
- package/dist/bin.js.map +1 -1
- package/dist/{chunk-DXJNFJ3A.js → chunk-6WWHXWCS.js} +3 -2
- package/dist/{chunk-DXJNFJ3A.js.map → chunk-6WWHXWCS.js.map} +1 -1
- package/dist/{chunk-HOYYXZPV.js → chunk-DXIAHB72.js} +3 -2
- package/dist/{chunk-HOYYXZPV.js.map → chunk-DXIAHB72.js.map} +1 -1
- package/dist/chunk-FIQBGAKW.js +373 -0
- package/dist/chunk-FIQBGAKW.js.map +1 -0
- package/dist/{chunk-JMI7WWPF.js → chunk-ILEPYWZX.js} +3 -2
- package/dist/{chunk-JMI7WWPF.js.map → chunk-ILEPYWZX.js.map} +1 -1
- package/dist/{chunk-7R4YFGP6.js → chunk-PWWQGYFG.js} +3 -1
- package/dist/{chunk-7R4YFGP6.js.map → chunk-PWWQGYFG.js.map} +1 -1
- package/dist/chunk-VLFUCAPZ.js +12 -0
- package/dist/{debug-workflow-PMLMWKWI.js → debug-workflow-PT3OUR3V.js} +5 -5
- package/dist/docs-GCYDTEOY.js +270 -0
- package/dist/docs-GCYDTEOY.js.map +1 -0
- package/dist/{feature-flag-D3QTHGL6.js → feature-flag-S5B5GLPP.js} +77 -33
- package/dist/feature-flag-S5B5GLPP.js.map +1 -0
- package/dist/index.js +26 -12
- package/dist/index.js.map +1 -1
- package/dist/{issues-6MHRFKTU.js → issues-4ZEDHPLW.js} +5 -4
- package/dist/{issues-6MHRFKTU.js.map → issues-4ZEDHPLW.js.map} +1 -1
- package/dist/{knobs-ED6LXBVM.js → knobs-RKUVK3HC.js} +5 -4
- package/dist/{knobs-ED6LXBVM.js.map → knobs-RKUVK3HC.js.map} +1 -1
- package/dist/{local-browser-YSE3XCUW.js → local-browser-J6WGFLVD.js} +5 -5
- package/dist/mcp-HGYBMDYZ.js +687 -0
- package/dist/mcp-HGYBMDYZ.js.map +1 -0
- package/dist/{psql-U5LF6ELS.js → psql-WVIHMC6A.js} +4 -3
- package/dist/{psql-U5LF6ELS.js.map → psql-WVIHMC6A.js.map} +1 -1
- package/dist/record-X4SVNYP3.js +334 -0
- package/dist/record-X4SVNYP3.js.map +1 -0
- package/dist/{redis-PBQZGU6T.js → redis-RGHECKV5.js} +4 -3
- package/dist/{redis-PBQZGU6T.js.map → redis-RGHECKV5.js.map} +1 -1
- package/dist/{release-QBSP474D.js → release-ZOD4Y2BF.js} +4 -3
- package/dist/{release-QBSP474D.js.map → release-ZOD4Y2BF.js.map} +1 -1
- package/dist/runner/preload.js +3 -2
- package/dist/runner/preload.js.map +1 -1
- package/dist/test.js +3 -2
- package/dist/test.js.map +1 -1
- package/package.json +2 -2
- package/dist/chunk-OE6O7H45.js +0 -92
- package/dist/chunk-OE6O7H45.js.map +0 -1
- package/dist/chunk-PLDDJCW6.js +0 -49
- package/dist/chunk-ZTWHPIXU.js +0 -42798
- package/dist/chunk-ZTWHPIXU.js.map +0 -1
- package/dist/dist-6NXLJYRZ.js +0 -335
- package/dist/dist-6NXLJYRZ.js.map +0 -1
- package/dist/feature-flag-D3QTHGL6.js.map +0 -1
- package/dist/mcp-LKHFYMA6.js +0 -385
- package/dist/mcp-LKHFYMA6.js.map +0 -1
- package/dist/pdf-extract-YIDRKYUD.js +0 -12
- package/dist/pdf-extract-YIDRKYUD.js.map +0 -1
- package/dist/pdfjs-44AOKLEM.js +0 -35242
- package/dist/pdfjs-44AOKLEM.js.map +0 -1
- /package/dist/{chunk-PLDDJCW6.js.map → chunk-VLFUCAPZ.js.map} +0 -0
- /package/dist/{debug-workflow-PMLMWKWI.js.map → debug-workflow-PT3OUR3V.js.map} +0 -0
- /package/dist/{local-browser-YSE3XCUW.js.map → local-browser-J6WGFLVD.js.map} +0 -0
package/dist/dist-6NXLJYRZ.js
DELETED
|
@@ -1,335 +0,0 @@
|
|
|
1
|
-
import "./chunk-PLDDJCW6.js";
|
|
2
|
-
|
|
3
|
-
// ../../node_modules/.bun/unpdf@1.4.0/node_modules/unpdf/dist/index.mjs
|
|
4
|
-
var resolvedModule;
|
|
5
|
-
var isNode = globalThis.process?.release?.name === "node";
|
|
6
|
-
var isBrowser = typeof window !== "undefined";
|
|
7
|
-
async function getDocumentProxy(data, options = {}) {
|
|
8
|
-
const { getDocument } = await getResolvedPDFJS();
|
|
9
|
-
const pdf = await getDocument({
|
|
10
|
-
data,
|
|
11
|
-
isEvalSupported: false,
|
|
12
|
-
// See: https://github.com/mozilla/pdf.js/issues/4244#issuecomment-1479534301
|
|
13
|
-
useSystemFonts: true,
|
|
14
|
-
...options
|
|
15
|
-
}).promise;
|
|
16
|
-
return pdf;
|
|
17
|
-
}
|
|
18
|
-
async function getResolvedPDFJS() {
|
|
19
|
-
if (!resolvedModule) {
|
|
20
|
-
await resolvePDFJSImport();
|
|
21
|
-
}
|
|
22
|
-
return resolvedModule;
|
|
23
|
-
}
|
|
24
|
-
async function resolvePDFJSImport(pdfjsResolver, { reload = false } = {}) {
|
|
25
|
-
if (resolvedModule && !reload) {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
if (pdfjsResolver) {
|
|
29
|
-
try {
|
|
30
|
-
resolvedModule = await interopDefault(pdfjsResolver());
|
|
31
|
-
return;
|
|
32
|
-
} catch (error) {
|
|
33
|
-
throw new Error(`PDF.js could not be resolved: ${error}`);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
try {
|
|
37
|
-
resolvedModule = await import("./pdfjs-44AOKLEM.js");
|
|
38
|
-
} catch (error) {
|
|
39
|
-
throw new Error(`Serverless PDF.js bundle could not be resolved: ${error}`);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
function isPDFDocumentProxy(data) {
|
|
43
|
-
return typeof data === "object" && data !== null && "_pdfInfo" in data;
|
|
44
|
-
}
|
|
45
|
-
async function interopDefault(m) {
|
|
46
|
-
const resolved = await m;
|
|
47
|
-
return resolved.default || resolved;
|
|
48
|
-
}
|
|
49
|
-
var resolvedCanvasModule;
|
|
50
|
-
var BaseCanvasFactory = class {
|
|
51
|
-
#enableHWA = false;
|
|
52
|
-
constructor({ enableHWA = false } = {}) {
|
|
53
|
-
this.#enableHWA = enableHWA;
|
|
54
|
-
}
|
|
55
|
-
create(width, height) {
|
|
56
|
-
const canvas = this._createCanvas(width, height);
|
|
57
|
-
return {
|
|
58
|
-
canvas,
|
|
59
|
-
context: canvas.getContext("2d", {
|
|
60
|
-
willReadFrequently: !this.#enableHWA
|
|
61
|
-
})
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
reset({ canvas }, width, height) {
|
|
65
|
-
if (!canvas) {
|
|
66
|
-
throw new Error("Canvas is not specified");
|
|
67
|
-
}
|
|
68
|
-
canvas.width = width;
|
|
69
|
-
canvas.height = height;
|
|
70
|
-
}
|
|
71
|
-
destroy(context) {
|
|
72
|
-
if (!context.canvas) {
|
|
73
|
-
throw new Error("Canvas is not specified");
|
|
74
|
-
}
|
|
75
|
-
context.canvas.width = 0;
|
|
76
|
-
context.canvas.height = 0;
|
|
77
|
-
context.canvas = void 0;
|
|
78
|
-
context.context = void 0;
|
|
79
|
-
}
|
|
80
|
-
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
81
|
-
_createCanvas(width, height) {
|
|
82
|
-
throw new Error("Not implemented");
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
var DOMCanvasFactory = class extends BaseCanvasFactory {
|
|
86
|
-
_document;
|
|
87
|
-
constructor({ ownerDocument = globalThis.document, enableHWA = false } = {}) {
|
|
88
|
-
super({ enableHWA });
|
|
89
|
-
this._document = ownerDocument;
|
|
90
|
-
}
|
|
91
|
-
_createCanvas(width, height) {
|
|
92
|
-
const canvas = this._document.createElement("canvas");
|
|
93
|
-
canvas.width = width;
|
|
94
|
-
canvas.height = height;
|
|
95
|
-
return canvas;
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
var NodeCanvasFactory = class extends BaseCanvasFactory {
|
|
99
|
-
constructor({ enableHWA = false } = {}) {
|
|
100
|
-
super({ enableHWA });
|
|
101
|
-
}
|
|
102
|
-
_createCanvas(width, height) {
|
|
103
|
-
if (!resolvedCanvasModule) {
|
|
104
|
-
throw new Error("@napi-rs/canvas module is not resolved");
|
|
105
|
-
}
|
|
106
|
-
return resolvedCanvasModule.createCanvas(width, height);
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
async function resolveCanvasModule(canvasImport) {
|
|
110
|
-
resolvedCanvasModule ??= await interopDefault(canvasImport());
|
|
111
|
-
}
|
|
112
|
-
function injectCanvasConstructors() {
|
|
113
|
-
if (!resolvedCanvasModule)
|
|
114
|
-
return;
|
|
115
|
-
if (typeof globalThis.DOMMatrix === "undefined")
|
|
116
|
-
globalThis.DOMMatrix = resolvedCanvasModule.DOMMatrix;
|
|
117
|
-
if (typeof globalThis.ImageData === "undefined")
|
|
118
|
-
globalThis.ImageData = resolvedCanvasModule.ImageData;
|
|
119
|
-
if (typeof globalThis.Path2D === "undefined")
|
|
120
|
-
globalThis.Path2D = resolvedCanvasModule.Path2D;
|
|
121
|
-
}
|
|
122
|
-
async function extractImages$1(data, pageNumber) {
|
|
123
|
-
const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);
|
|
124
|
-
if (pageNumber < 1 || pageNumber > pdf.numPages) {
|
|
125
|
-
throw new Error(`Invalid page number. Must be between 1 and ${pdf.numPages}.`);
|
|
126
|
-
}
|
|
127
|
-
const page = await pdf.getPage(pageNumber);
|
|
128
|
-
const operatorList = await page.getOperatorList();
|
|
129
|
-
const { OPS } = await getResolvedPDFJS();
|
|
130
|
-
const images = [];
|
|
131
|
-
for (let i = 0; i < operatorList.fnArray.length; i++) {
|
|
132
|
-
const op = operatorList.fnArray[i];
|
|
133
|
-
if (op !== OPS.paintImageXObject) {
|
|
134
|
-
continue;
|
|
135
|
-
}
|
|
136
|
-
const imageKey = operatorList.argsArray[i][0];
|
|
137
|
-
const image = await new Promise(
|
|
138
|
-
(resolve) => (imageKey.startsWith("g_") ? page.commonObjs : page.objs).get(imageKey, resolve)
|
|
139
|
-
);
|
|
140
|
-
if (!image || !image.data || !image.width || !image.height) {
|
|
141
|
-
continue;
|
|
142
|
-
}
|
|
143
|
-
const { width, height, data: data2 } = image;
|
|
144
|
-
const calculatedChannels = data2.length / (width * height);
|
|
145
|
-
if (![1, 3, 4].includes(calculatedChannels)) {
|
|
146
|
-
continue;
|
|
147
|
-
}
|
|
148
|
-
const channels = calculatedChannels;
|
|
149
|
-
images.push({
|
|
150
|
-
data: data2,
|
|
151
|
-
width,
|
|
152
|
-
height,
|
|
153
|
-
channels,
|
|
154
|
-
key: imageKey
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
return images;
|
|
158
|
-
}
|
|
159
|
-
async function renderPageAsImage$1(data, pageNumber, options = {}) {
|
|
160
|
-
const CanvasFactory = await createIsomorphicCanvasFactory(options.canvasImport);
|
|
161
|
-
const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data, { CanvasFactory });
|
|
162
|
-
const page = await pdf.getPage(pageNumber);
|
|
163
|
-
if (pageNumber < 1 || pageNumber > pdf.numPages) {
|
|
164
|
-
throw new Error(`Invalid page number. Must be between 1 and ${pdf.numPages}.`);
|
|
165
|
-
}
|
|
166
|
-
const defaultViewport = page.getViewport({ scale: 1 });
|
|
167
|
-
let scale = options.scale || 1;
|
|
168
|
-
if (options.width) {
|
|
169
|
-
scale = options.width / defaultViewport.width;
|
|
170
|
-
} else if (options.height) {
|
|
171
|
-
scale = options.height / defaultViewport.height;
|
|
172
|
-
}
|
|
173
|
-
const viewport = page.getViewport({ scale: Math.max(0, scale) });
|
|
174
|
-
const drawingContext = new CanvasFactory().create(viewport.width, viewport.height);
|
|
175
|
-
await page.render({
|
|
176
|
-
canvas: drawingContext.canvas,
|
|
177
|
-
canvasContext: drawingContext.context,
|
|
178
|
-
viewport
|
|
179
|
-
}).promise;
|
|
180
|
-
const dataUrl = drawingContext.canvas.toDataURL();
|
|
181
|
-
if (options.toDataURL) {
|
|
182
|
-
return dataUrl;
|
|
183
|
-
}
|
|
184
|
-
const response = await fetch(dataUrl);
|
|
185
|
-
return await response.arrayBuffer();
|
|
186
|
-
}
|
|
187
|
-
async function createIsomorphicCanvasFactory(canvasImport) {
|
|
188
|
-
if (isBrowser)
|
|
189
|
-
return DOMCanvasFactory;
|
|
190
|
-
if (isNode) {
|
|
191
|
-
if (!canvasImport) {
|
|
192
|
-
throw new Error('Parameter "canvasImport" is required in Node.js environment.');
|
|
193
|
-
}
|
|
194
|
-
await resolveCanvasModule(canvasImport);
|
|
195
|
-
injectCanvasConstructors();
|
|
196
|
-
return NodeCanvasFactory;
|
|
197
|
-
}
|
|
198
|
-
throw new Error("Unsupported environment for canvas creation.");
|
|
199
|
-
}
|
|
200
|
-
async function extractLinks$1(data) {
|
|
201
|
-
const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);
|
|
202
|
-
const pageLinks = await Promise.all(
|
|
203
|
-
Array.from({ length: pdf.numPages }, (_, i) => getPageLinks(pdf, i + 1))
|
|
204
|
-
);
|
|
205
|
-
return {
|
|
206
|
-
totalPages: pdf.numPages,
|
|
207
|
-
links: pageLinks.flat()
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
async function getPageLinks(document, pageNumber) {
|
|
211
|
-
const page = await document.getPage(pageNumber);
|
|
212
|
-
const annotations = await page.getAnnotations();
|
|
213
|
-
const links = [];
|
|
214
|
-
for (const annotation of annotations) {
|
|
215
|
-
if (annotation.subtype === "Link" && annotation.url) {
|
|
216
|
-
links.push(annotation.url);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
return links;
|
|
220
|
-
}
|
|
221
|
-
var XMP_DATE_PROPERTIES = [
|
|
222
|
-
"xmp:createdate",
|
|
223
|
-
"xmp:modifydate",
|
|
224
|
-
"xmp:metadatadate",
|
|
225
|
-
"xap:createdate",
|
|
226
|
-
"xap:modifydate",
|
|
227
|
-
"xap:metadatadate"
|
|
228
|
-
];
|
|
229
|
-
async function getMeta$1(data, options = {}) {
|
|
230
|
-
const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);
|
|
231
|
-
const meta = await pdf.getMetadata();
|
|
232
|
-
const info = meta?.info || {};
|
|
233
|
-
if (options.parseDates) {
|
|
234
|
-
const { PDFDateString } = await getResolvedPDFJS();
|
|
235
|
-
if (info?.CreationDate) {
|
|
236
|
-
info.CreationDate = PDFDateString.toDateObject(info?.CreationDate);
|
|
237
|
-
}
|
|
238
|
-
if (info?.ModDate) {
|
|
239
|
-
info.ModDate = PDFDateString.toDateObject(info?.ModDate);
|
|
240
|
-
}
|
|
241
|
-
if (meta.metadata) {
|
|
242
|
-
meta.metadata = new Proxy(meta.metadata, {
|
|
243
|
-
get(target, prop) {
|
|
244
|
-
if (prop === "get") {
|
|
245
|
-
return (name) => {
|
|
246
|
-
const value = target.get(name);
|
|
247
|
-
if (XMP_DATE_PROPERTIES.includes(name) && value) {
|
|
248
|
-
return parseISODateString(value);
|
|
249
|
-
}
|
|
250
|
-
return value;
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
return target[prop];
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
return {
|
|
259
|
-
info,
|
|
260
|
-
metadata: meta?.metadata || {}
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
function parseISODateString(isoDateString) {
|
|
264
|
-
if (!isoDateString)
|
|
265
|
-
return;
|
|
266
|
-
const parsedDate = Date.parse(isoDateString);
|
|
267
|
-
if (!Number.isNaN(parsedDate)) {
|
|
268
|
-
return new Date(parsedDate);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
async function extractText$1(data, options = {}) {
|
|
272
|
-
const { mergePages = false } = options;
|
|
273
|
-
const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);
|
|
274
|
-
const texts = await Promise.all(
|
|
275
|
-
Array.from({ length: pdf.numPages }, (_, i) => getPageText(pdf, i + 1))
|
|
276
|
-
);
|
|
277
|
-
return {
|
|
278
|
-
totalPages: pdf.numPages,
|
|
279
|
-
text: mergePages ? texts.join("\n").replace(/\s+/g, " ") : texts
|
|
280
|
-
};
|
|
281
|
-
}
|
|
282
|
-
async function getPageText(document, pageNumber) {
|
|
283
|
-
const page = await document.getPage(pageNumber);
|
|
284
|
-
const content = await page.getTextContent();
|
|
285
|
-
return content.items.filter((item) => item.str != null).map((item) => item.str + (item.hasEOL ? "\n" : "")).join("");
|
|
286
|
-
}
|
|
287
|
-
async function definePDFJSModule(pdfjs) {
|
|
288
|
-
await resolvePDFJSImport(pdfjs, { reload: true });
|
|
289
|
-
}
|
|
290
|
-
async function configureUnPDF(options) {
|
|
291
|
-
await resolvePDFJSImport(options.pdfjs, { reload: true });
|
|
292
|
-
}
|
|
293
|
-
var getMeta = async (...args) => {
|
|
294
|
-
await resolvePDFJSImport();
|
|
295
|
-
return await getMeta$1(...args);
|
|
296
|
-
};
|
|
297
|
-
var extractText = async (...args) => {
|
|
298
|
-
await resolvePDFJSImport();
|
|
299
|
-
return await extractText$1(...args);
|
|
300
|
-
};
|
|
301
|
-
var extractImages = async (...args) => {
|
|
302
|
-
await resolvePDFJSImport();
|
|
303
|
-
return await extractImages$1(...args);
|
|
304
|
-
};
|
|
305
|
-
var renderPageAsImage = async (...args) => {
|
|
306
|
-
await resolvePDFJSImport();
|
|
307
|
-
return await renderPageAsImage$1(...args);
|
|
308
|
-
};
|
|
309
|
-
var extractLinks = async (...args) => {
|
|
310
|
-
await resolvePDFJSImport();
|
|
311
|
-
return await extractLinks$1(...args);
|
|
312
|
-
};
|
|
313
|
-
export {
|
|
314
|
-
configureUnPDF,
|
|
315
|
-
createIsomorphicCanvasFactory,
|
|
316
|
-
definePDFJSModule,
|
|
317
|
-
extractImages,
|
|
318
|
-
extractLinks,
|
|
319
|
-
extractText,
|
|
320
|
-
getDocumentProxy,
|
|
321
|
-
getMeta,
|
|
322
|
-
getResolvedPDFJS,
|
|
323
|
-
renderPageAsImage,
|
|
324
|
-
resolvePDFJSImport
|
|
325
|
-
};
|
|
326
|
-
/*! Bundled license information:
|
|
327
|
-
|
|
328
|
-
unpdf/dist/index.mjs:
|
|
329
|
-
(**
|
|
330
|
-
* Derived from the PDF.js project by the Mozilla Foundation.
|
|
331
|
-
* @see https://github.com/mozilla/pdf.js/blob/b8de9a372f9bbf7e33adb362eeae5ef1919dba73/src/display/canvas_factory.js#L18
|
|
332
|
-
* @license Apache-2.0
|
|
333
|
-
*)
|
|
334
|
-
*/
|
|
335
|
-
//# sourceMappingURL=dist-6NXLJYRZ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.bun/unpdf@1.4.0/node_modules/unpdf/dist/index.mjs"],"sourcesContent":["let resolvedModule;\nconst isNode = globalThis.process?.release?.name === \"node\";\nconst isBrowser = typeof window !== \"undefined\";\nasync function getDocumentProxy(data, options = {}) {\n const { getDocument } = await getResolvedPDFJS();\n const pdf = await getDocument({\n data,\n isEvalSupported: false,\n // See: https://github.com/mozilla/pdf.js/issues/4244#issuecomment-1479534301\n useSystemFonts: true,\n ...options\n }).promise;\n return pdf;\n}\nasync function getResolvedPDFJS() {\n if (!resolvedModule) {\n await resolvePDFJSImport();\n }\n return resolvedModule;\n}\nasync function resolvePDFJSImport(pdfjsResolver, { reload = false } = {}) {\n if (resolvedModule && !reload) {\n return;\n }\n if (pdfjsResolver) {\n try {\n resolvedModule = await interopDefault(pdfjsResolver());\n return;\n } catch (error) {\n throw new Error(`PDF.js could not be resolved: ${error}`);\n }\n }\n try {\n resolvedModule = await import('unpdf/pdfjs');\n } catch (error) {\n throw new Error(`Serverless PDF.js bundle could not be resolved: ${error}`);\n }\n}\nfunction isPDFDocumentProxy(data) {\n return typeof data === \"object\" && data !== null && \"_pdfInfo\" in data;\n}\nasync function interopDefault(m) {\n const resolved = await m;\n return resolved.default || resolved;\n}\n\nlet resolvedCanvasModule;\n/**\n * Derived from the PDF.js project by the Mozilla Foundation.\n * @see https://github.com/mozilla/pdf.js/blob/b8de9a372f9bbf7e33adb362eeae5ef1919dba73/src/display/canvas_factory.js#L18\n * @license Apache-2.0\n */\nclass BaseCanvasFactory {\n #enableHWA = false;\n constructor({ enableHWA = false } = {}) {\n this.#enableHWA = enableHWA;\n }\n create(width, height) {\n const canvas = this._createCanvas(width, height);\n return {\n canvas,\n context: canvas.getContext(\"2d\", {\n willReadFrequently: !this.#enableHWA\n })\n };\n }\n reset({ canvas }, width, height) {\n if (!canvas) {\n throw new Error(\"Canvas is not specified\");\n }\n canvas.width = width;\n canvas.height = height;\n }\n destroy(context) {\n if (!context.canvas) {\n throw new Error(\"Canvas is not specified\");\n }\n context.canvas.width = 0;\n context.canvas.height = 0;\n context.canvas = void 0;\n context.context = void 0;\n }\n // eslint-disable-next-line unused-imports/no-unused-vars\n _createCanvas(width, height) {\n throw new Error(\"Not implemented\");\n }\n}\n/**\n * Derived from the PDF.js project by the Mozilla Foundation.\n * @see https://github.com/mozilla/pdf.js/blob/b8de9a372f9bbf7e33adb362eeae5ef1919dba73/src/display/canvas_factory.js#L18\n * @license Apache-2.0\n */\nclass DOMCanvasFactory extends BaseCanvasFactory {\n _document;\n constructor({ ownerDocument = globalThis.document, enableHWA = false } = {}) {\n super({ enableHWA });\n this._document = ownerDocument;\n }\n _createCanvas(width, height) {\n const canvas = this._document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n return canvas;\n }\n}\nclass NodeCanvasFactory extends BaseCanvasFactory {\n constructor({ enableHWA = false } = {}) {\n super({ enableHWA });\n }\n _createCanvas(width, height) {\n if (!resolvedCanvasModule) {\n throw new Error(\"@napi-rs/canvas module is not resolved\");\n }\n return resolvedCanvasModule.createCanvas(width, height);\n }\n}\nasync function resolveCanvasModule(canvasImport) {\n resolvedCanvasModule ??= await interopDefault(canvasImport());\n}\nfunction injectCanvasConstructors() {\n if (!resolvedCanvasModule)\n return;\n if (typeof globalThis.DOMMatrix === \"undefined\")\n globalThis.DOMMatrix = resolvedCanvasModule.DOMMatrix;\n if (typeof globalThis.ImageData === \"undefined\")\n globalThis.ImageData = resolvedCanvasModule.ImageData;\n if (typeof globalThis.Path2D === \"undefined\")\n globalThis.Path2D = resolvedCanvasModule.Path2D;\n}\n\nasync function extractImages$1(data, pageNumber) {\n const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);\n if (pageNumber < 1 || pageNumber > pdf.numPages) {\n throw new Error(`Invalid page number. Must be between 1 and ${pdf.numPages}.`);\n }\n const page = await pdf.getPage(pageNumber);\n const operatorList = await page.getOperatorList();\n const { OPS } = await getResolvedPDFJS();\n const images = [];\n for (let i = 0; i < operatorList.fnArray.length; i++) {\n const op = operatorList.fnArray[i];\n if (op !== OPS.paintImageXObject) {\n continue;\n }\n const imageKey = operatorList.argsArray[i][0];\n const image = await new Promise(\n (resolve) => (imageKey.startsWith(\"g_\") ? page.commonObjs : page.objs).get(imageKey, resolve)\n );\n if (!image || !image.data || !image.width || !image.height) {\n continue;\n }\n const { width, height, data: data2 } = image;\n const calculatedChannels = data2.length / (width * height);\n if (![1, 3, 4].includes(calculatedChannels)) {\n continue;\n }\n const channels = calculatedChannels;\n images.push({\n data: data2,\n width,\n height,\n channels,\n key: imageKey\n });\n }\n return images;\n}\nasync function renderPageAsImage$1(data, pageNumber, options = {}) {\n const CanvasFactory = await createIsomorphicCanvasFactory(options.canvasImport);\n const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data, { CanvasFactory });\n const page = await pdf.getPage(pageNumber);\n if (pageNumber < 1 || pageNumber > pdf.numPages) {\n throw new Error(`Invalid page number. Must be between 1 and ${pdf.numPages}.`);\n }\n const defaultViewport = page.getViewport({ scale: 1 });\n let scale = options.scale || 1;\n if (options.width) {\n scale = options.width / defaultViewport.width;\n } else if (options.height) {\n scale = options.height / defaultViewport.height;\n }\n const viewport = page.getViewport({ scale: Math.max(0, scale) });\n const drawingContext = new CanvasFactory().create(viewport.width, viewport.height);\n await page.render({\n canvas: drawingContext.canvas,\n canvasContext: drawingContext.context,\n viewport\n }).promise;\n const dataUrl = drawingContext.canvas.toDataURL();\n if (options.toDataURL) {\n return dataUrl;\n }\n const response = await fetch(dataUrl);\n return await response.arrayBuffer();\n}\nasync function createIsomorphicCanvasFactory(canvasImport) {\n if (isBrowser)\n return DOMCanvasFactory;\n if (isNode) {\n if (!canvasImport) {\n throw new Error('Parameter \"canvasImport\" is required in Node.js environment.');\n }\n await resolveCanvasModule(canvasImport);\n injectCanvasConstructors();\n return NodeCanvasFactory;\n }\n throw new Error(\"Unsupported environment for canvas creation.\");\n}\n\nasync function extractLinks$1(data) {\n const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);\n const pageLinks = await Promise.all(\n Array.from({ length: pdf.numPages }, (_, i) => getPageLinks(pdf, i + 1))\n );\n return {\n totalPages: pdf.numPages,\n links: pageLinks.flat()\n };\n}\nasync function getPageLinks(document, pageNumber) {\n const page = await document.getPage(pageNumber);\n const annotations = await page.getAnnotations();\n const links = [];\n for (const annotation of annotations) {\n if (annotation.subtype === \"Link\" && annotation.url) {\n links.push(annotation.url);\n }\n }\n return links;\n}\n\nconst XMP_DATE_PROPERTIES = [\n \"xmp:createdate\",\n \"xmp:modifydate\",\n \"xmp:metadatadate\",\n \"xap:createdate\",\n \"xap:modifydate\",\n \"xap:metadatadate\"\n];\nasync function getMeta$1(data, options = {}) {\n const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);\n const meta = await pdf.getMetadata();\n const info = meta?.info || {};\n if (options.parseDates) {\n const { PDFDateString } = await getResolvedPDFJS();\n if (info?.CreationDate) {\n info.CreationDate = PDFDateString.toDateObject(info?.CreationDate);\n }\n if (info?.ModDate) {\n info.ModDate = PDFDateString.toDateObject(info?.ModDate);\n }\n if (meta.metadata) {\n meta.metadata = new Proxy(meta.metadata, {\n get(target, prop) {\n if (prop === \"get\") {\n return (name) => {\n const value = target.get(name);\n if (XMP_DATE_PROPERTIES.includes(name) && value) {\n return parseISODateString(value);\n }\n return value;\n };\n }\n return target[prop];\n }\n });\n }\n }\n return {\n info,\n metadata: meta?.metadata || {}\n };\n}\nfunction parseISODateString(isoDateString) {\n if (!isoDateString)\n return;\n const parsedDate = Date.parse(isoDateString);\n if (!Number.isNaN(parsedDate)) {\n return new Date(parsedDate);\n }\n}\n\nasync function extractText$1(data, options = {}) {\n const { mergePages = false } = options;\n const pdf = isPDFDocumentProxy(data) ? data : await getDocumentProxy(data);\n const texts = await Promise.all(\n Array.from({ length: pdf.numPages }, (_, i) => getPageText(pdf, i + 1))\n );\n return {\n totalPages: pdf.numPages,\n text: mergePages ? texts.join(\"\\n\").replace(/\\s+/g, \" \") : texts\n };\n}\nasync function getPageText(document, pageNumber) {\n const page = await document.getPage(pageNumber);\n const content = await page.getTextContent();\n return content.items.filter((item) => item.str != null).map((item) => item.str + (item.hasEOL ? \"\\n\" : \"\")).join(\"\");\n}\n\nasync function definePDFJSModule(pdfjs) {\n await resolvePDFJSImport(pdfjs, { reload: true });\n}\nasync function configureUnPDF(options) {\n await resolvePDFJSImport(options.pdfjs, { reload: true });\n}\n\nconst getMeta = async (...args) => {\n await resolvePDFJSImport();\n return await getMeta$1(...args);\n};\nconst extractText = async (...args) => {\n await resolvePDFJSImport();\n return await extractText$1(...args);\n};\nconst extractImages = async (...args) => {\n await resolvePDFJSImport();\n return await extractImages$1(...args);\n};\nconst renderPageAsImage = async (...args) => {\n await resolvePDFJSImport();\n return await renderPageAsImage$1(...args);\n};\nconst extractLinks = async (...args) => {\n await resolvePDFJSImport();\n return await extractLinks$1(...args);\n};\n\nexport { configureUnPDF, createIsomorphicCanvasFactory, definePDFJSModule, extractImages, extractLinks, extractText, getDocumentProxy, getMeta, getResolvedPDFJS, renderPageAsImage, resolvePDFJSImport };\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/feature-flag.ts"],"sourcesContent":["/**\n * CLI Feature Flag Management\n *\n * Allows superadmins to manage feature flags via the CLI.\n */\n\nimport process from \"node:process\";\nimport { resolveConfig, getArgValue, hasFlag } from \"./auth.js\";\nimport {\n type LifecycleStage,\n toLifecycleLabel,\n parseLifecycleStage,\n apiRequest,\n fetchList,\n} from \"./cli-helpers.js\";\n\ntype FeatureFlag = {\n id: string;\n name: string;\n description: string | null;\n lifecycleStage: LifecycleStage;\n finalValue: boolean | null;\n createdAt: string;\n organizations?: Array<{\n gateId: string;\n orgId: string;\n orgName: string;\n createdAt: string;\n }>;\n};\n\ntype FlagApiResponse = {\n ok: boolean;\n error?: string;\n flag?: FeatureFlag;\n};\n\nfunction fetchFlags(apiUrl: string, token: string): Promise<FeatureFlag[]> {\n return fetchList<FeatureFlag>(apiUrl, token, \"/superadmin/feature-flags\", \"flags\");\n}\n\nasync function handleList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const jsonOutput = hasFlag(argv, \"--json\");\n const flags = await fetchFlags(apiUrl, token);\n\n if (jsonOutput) {\n console.log(JSON.stringify(flags, null, 2));\n return;\n }\n\n if (flags.length === 0) {\n console.log(\"No feature flags found.\");\n return;\n }\n\n for (const flag of flags) {\n const orgCount = flag.organizations?.length ?? 0;\n const lifecycle = `lifecycle=${toLifecycleLabel(flag.lifecycleStage)}`;\n const finalValue =\n flag.lifecycleStage === \"active\" ? \"\" : ` final=${flag.finalValue === true ? \"true\" : \"false\"}`;\n console.log(` ${flag.name} ${flag.description ?? \"\"} (${lifecycle}${finalValue}) [orgs=${orgCount}]`);\n }\n}\n\nasync function handleCreate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag create <name> [--description <text>]\");\n process.exit(1);\n }\n\n const description = getArgValue(argv, \"--description\") ?? null;\n const result = await apiRequest<FlagApiResponse>(apiUrl, token, \"POST\", \"/superadmin/feature-flags\", {\n name,\n description,\n });\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Created feature flag: ${name}`);\n}\n\nasync function handleDelete(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag delete <name>\");\n process.exit(1);\n }\n\n const result = await apiRequest<FlagApiResponse>(\n apiUrl, token, \"DELETE\", `/superadmin/feature-flags/${encodeURIComponent(name)}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Deleted feature flag: ${name}`);\n}\n\nasync function handleEnable(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n const orgId = getArgValue(argv, \"--org\");\n\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag enable <name> --org <orgId>\");\n process.exit(1);\n }\n\n if (!orgId) {\n console.error(\"Error: Missing --org <orgId>.\");\n console.error(\"Usage: canary feature-flag enable <name> --org <orgId>\");\n process.exit(1);\n }\n\n const result = await apiRequest<FlagApiResponse>(\n apiUrl, token, \"POST\",\n `/superadmin/feature-flags/${encodeURIComponent(name)}/organizations/${encodeURIComponent(orgId)}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Enabled ${name} for org ${orgId}`);\n}\n\nasync function handleDisable(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n const orgId = getArgValue(argv, \"--org\");\n\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag disable <name> --org <orgId>\");\n process.exit(1);\n }\n\n if (!orgId) {\n console.error(\"Error: Missing --org <orgId>.\");\n console.error(\"Usage: canary feature-flag disable <name> --org <orgId>\");\n process.exit(1);\n }\n\n const result = await apiRequest<FlagApiResponse>(\n apiUrl, token, \"DELETE\",\n `/superadmin/feature-flags/${encodeURIComponent(name)}/organizations/${encodeURIComponent(orgId)}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Disabled ${name} for org ${orgId}`);\n}\n\nasync function handleLifecycle(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag lifecycle <name> --stage <active|deprecated|ready_for_cleanup> [--final-value true|false]\");\n process.exit(1);\n }\n\n const stage = parseLifecycleStage(argv);\n const rawFinalValue = getArgValue(argv, \"--final-value\");\n const clearFinalValue = hasFlag(argv, \"--clear-final-value\");\n\n if (rawFinalValue !== undefined && clearFinalValue) {\n console.error(\"Error: use either --final-value or --clear-final-value, not both.\");\n process.exit(1);\n }\n\n let finalValue: boolean | undefined = undefined;\n\n if (stage === \"active\") {\n if (rawFinalValue !== undefined) {\n console.error(\"Error: active stage does not accept --final-value.\");\n process.exit(1);\n }\n finalValue = undefined;\n } else {\n if (clearFinalValue) {\n console.error(\"Error: --clear-final-value can only be used with --stage active.\");\n process.exit(1);\n }\n if (!rawFinalValue) {\n console.error(\"Error: --final-value true|false is required for deprecated or ready_for_cleanup.\");\n process.exit(1);\n }\n if (rawFinalValue !== \"true\" && rawFinalValue !== \"false\") {\n console.error(\"Error: --final-value must be true or false.\");\n process.exit(1);\n }\n finalValue = rawFinalValue === \"true\";\n }\n\n const result = await apiRequest<FlagApiResponse>(\n apiUrl, token, \"POST\",\n `/superadmin/feature-flags/${encodeURIComponent(name)}/lifecycle`,\n { stage, finalValue }\n );\n\n if (!result.ok || !result.flag) {\n console.error(`Error: ${result.error ?? \"Failed to update lifecycle\"}`);\n process.exit(1);\n }\n\n const final =\n result.flag.lifecycleStage === \"active\"\n ? \"(none)\"\n : result.flag.finalValue === true\n ? \"true\"\n : \"false\";\n console.log(`Updated lifecycle for ${name}: stage=${toLifecycleLabel(result.flag.lifecycleStage)}, final=${final}`);\n}\n\nfunction printFeatureFlagHelp(): void {\n console.log(\n [\n \"Usage: canary feature-flag <sub-command> [options]\",\n \"\",\n \"Sub-commands:\",\n \" list List all feature flags\",\n \" create <name> [--description <text>] Create a new flag\",\n \" delete <name> Delete a flag and all its gates\",\n \" enable <name> --org <orgId> Enable a flag for an organization\",\n \" disable <name> --org <orgId> Disable a flag for an organization\",\n \" lifecycle <name> --stage <stage> [--final-value true|false]\",\n \" Mark lifecycle + final value\",\n \"\",\n \"Stages: active, deprecated, ready_for_cleanup\",\n \"\",\n \"Options:\",\n \" --final-value <true|false> Final value for deprecated/ready_for_cleanup\",\n \" --clear-final-value Clear final value (only valid with --stage active)\",\n \" --env <env> Target environment (prod, dev, local)\",\n \" --json Output as JSON (list only)\",\n \" --api-url <url> API URL override (takes precedence over --env)\",\n \" --token <key> API token override\",\n ].join(\"\\n\")\n );\n}\n\nexport async function runFeatureFlag(argv: string[]): Promise<void> {\n const [subCommand, ...rest] = argv;\n\n if (!subCommand || subCommand === \"help\" || hasFlag(argv, \"--help\", \"-h\")) {\n printFeatureFlagHelp();\n return;\n }\n\n const { apiUrl, token } = await resolveConfig(argv);\n\n switch (subCommand) {\n case \"list\":\n await handleList(rest, apiUrl, token);\n break;\n case \"create\":\n await handleCreate(rest, apiUrl, token);\n break;\n case \"delete\":\n await handleDelete(rest, apiUrl, token);\n break;\n case \"enable\":\n await handleEnable(rest, apiUrl, token);\n break;\n case \"disable\":\n await handleDisable(rest, apiUrl, token);\n break;\n case \"lifecycle\":\n await handleLifecycle(rest, apiUrl, token);\n break;\n default:\n console.error(`Unknown sub-command: ${subCommand}`);\n printFeatureFlagHelp();\n process.exit(1);\n }\n}\n"],"mappings":"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","names":[]}
|